From 28ec0ae7f25df8ad2242ac343f67673729d21ff8 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Tue, 10 Sep 2024 00:40:58 +0200 Subject: [PATCH] Vitest --- .vscode/settings.json | 5 +- eslint.config.js | 25 +- jest.config.ts | 67 - package-lock.json | 7542 +++++++---------- package.json | 31 +- src/data/bucket/fill_bucket.test.ts | 1 + src/data/bucket/line_bucket.test.ts | 3 +- src/data/bucket/symbol_bucket.test.ts | 7 +- src/data/dem_data.test.ts | 3 +- src/data/feature_position_map.test.ts | 1 + src/data/load_geometry.test.ts | 1 + src/data/segment.test.ts | 1 + src/geo/edge_insets.test.ts | 2 +- src/geo/lng_lat.test.ts | 1 + src/geo/lng_lat_bounds.test.ts | 1 + src/geo/mercator_coordinate.test.ts | 1 + .../projection/globe_covering_tiles.test.ts | 1 + src/geo/projection/globe_transform.test.ts | 1 + src/geo/projection/globe_utils.test.ts | 1 + src/geo/projection/mercator_transform.test.ts | 1 + src/geo/projection/mercator_utils.test.ts | 1 + src/geo/transform_helper.test.ts | 1 + src/gl/render_pool.test.ts | 3 +- src/gl/state.test.ts | 1 + src/gl/vertex_buffer.test.ts | 5 +- src/index.test.ts | 1 + src/render/draw_custom.test.ts | 15 +- src/render/draw_debug.test.ts | 3 +- src/render/draw_fill.test.ts | 23 +- src/render/draw_symbol.test.ts | 31 +- src/render/fill_large_mesh_arrays.test.ts | 1 + src/render/glyph_manager.test.ts | 11 +- src/render/line_atlas.test.ts | 1 + src/render/painter.test.ts | 1 + src/render/render_to_texture.test.ts | 3 +- src/render/subdivision.test.ts | 1 + src/render/terrain.test.ts | 13 +- src/render/uniform_binding.test.ts | 1 + ...pdate_pattern_positions_in_program.test.ts | 3 +- src/shaders/encode_attribute.test.ts | 1 + src/source/canvas_source.test.ts | 5 +- src/source/geojson_source.test.ts | 7 +- src/source/geojson_source_diff.test.ts | 1 + src/source/geojson_worker_source.test.ts | 15 +- src/source/geojson_wrapper.test.ts | 1 + src/source/image_source.test.ts | 7 +- src/source/query_features.test.ts | 1 + src/source/raster_dem_tile_source.test.ts | 5 +- .../raster_dem_tile_worker_source.test.ts | 1 + src/source/raster_tile_source.test.ts | 7 +- .../rtl_text_plugin_main_thread.test.ts | 21 +- src/source/rtl_text_plugin_worker.test.ts | 35 +- src/source/source.test.ts | 9 +- src/source/source_cache.test.ts | 47 +- src/source/terrain_source_cache.test.ts | 1 + src/source/tile.test.ts | 3 +- src/source/tile.ts | 2 +- src/source/tile_cache.test.ts | 1 + src/source/tile_id.test.ts | 1 + src/source/vector_tile_source.test.ts | 13 +- src/source/vector_tile_worker_source.test.ts | 23 +- src/source/video_source.test.ts | 1 + src/source/worker.test.ts | 5 +- src/source/worker_tile.test.ts | 7 +- src/style/format_section_override.test.ts | 1 + src/style/light.test.ts | 7 +- src/style/load_glyph_range.test.ts | 3 +- src/style/load_sprite.test.ts | 19 +- src/style/query_utils.test.ts | 1 + src/style/sky.test.ts | 7 +- src/style/style.test.ts | 157 +- src/style/style_layer.test.ts | 1 + .../style_layer/fill_style_layer.test.ts | 1 + .../style_layer/line_style_layer.test.ts | 1 + src/style/style_layer/overlap_mode.test.ts | 1 + .../style_layer/variable_text_anchor.test.ts | 1 + src/style/style_layer_index.test.ts | 1 + src/symbol/anchor.test.ts | 1 + src/symbol/check_max_angle.test.ts | 1 + src/symbol/clip_line.test.ts | 1 + src/symbol/collision_feature.test.ts | 1 + src/symbol/collision_index.test.ts | 3 +- src/symbol/cross_tile_symbol_index.test.ts | 5 +- src/symbol/get_anchors.test.ts | 1 + src/symbol/grid_index.test.ts | 1 + src/symbol/merge_lines.test.ts | 1 + src/symbol/path_interpolator.test.ts | 1 + src/symbol/projection.test.ts | 1 + src/symbol/quads.test.ts | 1 + src/symbol/shaping.test.ts | 1 + src/symbol/symbol_style_layer.test.ts | 1 + src/ui/camera.test.ts | 93 +- src/ui/control/attribution_control.test.ts | 13 +- src/ui/control/fullscreen_control.test.ts | 5 +- src/ui/control/geolocate_control.test.ts | 15 +- src/ui/control/logo_control.test.ts | 1 + src/ui/control/navigation_control.test.ts | 27 +- src/ui/control/scale_control.test.ts | 1 + src/ui/control/terrain_control.test.ts | 1 + src/ui/handler/box_zoom.test.ts | 27 +- src/ui/handler/cooperative_gestures.test.ts | 31 +- src/ui/handler/dblclick_zoom.test.ts | 15 +- src/ui/handler/drag_pan.test.ts | 79 +- src/ui/handler/drag_rotate.test.ts | 195 +- src/ui/handler/keyboard.test.ts | 19 +- src/ui/handler/map_event.test.ts | 23 +- .../handler/mouse_handler_interface.test.ts | 1 + src/ui/handler/mouse_rotate.test.ts | 3 +- ...inger_touch_drag_handler_interface.test.ts | 1 + src/ui/handler/scroll_zoom.test.ts | 35 +- src/ui/handler/tap_drag_zoom.test.ts | 8 +- src/ui/handler/two_fingers_touch.test.ts | 33 +- src/ui/hash.test.ts | 2 + src/ui/map_tests/map_animation.test.ts | 1 + src/ui/map_tests/map_basic.test.ts | 7 +- src/ui/map_tests/map_bounds.test.ts | 1 + .../map_calculate_camera_options.test.ts | 13 +- src/ui/map_tests/map_canvas.test.ts | 17 +- src/ui/map_tests/map_control.test.ts | 3 +- src/ui/map_tests/map_disable_handlers.test.ts | 1 + src/ui/map_tests/map_events.test.ts | 261 +- src/ui/map_tests/map_feature_state.test.ts | 1 + src/ui/map_tests/map_images.test.ts | 1 + src/ui/map_tests/map_is_moving.test.ts | 7 +- src/ui/map_tests/map_is_rotating.test.ts | 3 +- src/ui/map_tests/map_is_zooming.test.ts | 5 +- src/ui/map_tests/map_layer.test.ts | 1 + src/ui/map_tests/map_options.test.ts | 7 +- src/ui/map_tests/map_pitch.test.ts | 1 + src/ui/map_tests/map_pixel_ratio.test.ts | 1 + .../map_query_rendered_features.test.ts | 11 +- src/ui/map_tests/map_render.test.ts | 3 +- .../map_request_render_frame.test.ts | 9 +- src/ui/map_tests/map_resize.test.ts | 22 +- src/ui/map_tests/map_sky.test.ts | 6 +- src/ui/map_tests/map_style.test.ts | 23 +- src/ui/map_tests/map_terrian.test.ts | 5 +- src/ui/map_tests/map_webgl.test.ts | 5 +- src/ui/map_tests/map_world_copies.test.ts | 1 + src/ui/map_tests/map_zoom.test.ts | 1 + src/ui/marker.test.ts | 47 +- src/ui/popup.test.ts | 27 +- src/util/actor.test.ts | 13 +- src/util/ajax.test.ts | 5 +- src/util/browser.test.ts | 1 + src/util/color_ramp.test.ts | 1 + src/util/dispatcher.test.ts | 3 +- src/util/evented.test.ts | 21 +- src/util/find_pole_of_inaccessibility.test.ts | 1 + src/util/geolocation_support.test.ts | 3 +- src/util/image_request.test.ts | 11 +- src/util/is_char_in_unicode_block.test.ts | 9 +- src/util/offscreen_canvas_distorted.test.ts | 3 +- src/util/primitives.test.ts | 1 + src/util/resolve_tokens.test.ts | 1 + src/util/script_detection.test.ts | 1 + src/util/smart_wrap.test.ts | 1 + src/util/struct_array.test.ts | 1 + src/util/style.test.ts | 1 + src/util/task_queue.test.ts | 25 +- src/util/test/util.ts | 31 +- src/util/throttle.test.ts | 1 + src/util/transferable_grid_index.test.ts | 1 + src/util/util.test.ts | 9 +- src/util/web_worker_transfer.test.ts | 1 + src/util/web_worker_transfer.ts | 2 +- src/util/worker_pool.test.ts | 1 + src/util/world_bounds.test.ts | 1 + test/build/dev.test.ts | 1 + test/build/import.test.ts | 1 + test/build/min.test.ts | 1 + test/build/sourcemaps.test.ts | 1 + test/integration/browser/browser.test.ts | 45 +- test/integration/query/query.test.ts | 7 +- .../symbol-shaping/shaping.test.ts | 1 + tsconfig.json | 3 +- vitest.config.build.ts | 20 + vitest.config.integration.ts | 20 + vitest.config.unit.ts | 28 + 179 files changed, 4259 insertions(+), 5393 deletions(-) delete mode 100644 jest.config.ts create mode 100644 vitest.config.build.ts create mode 100644 vitest.config.integration.ts create mode 100644 vitest.config.unit.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index f6af330321..61dcf02fb9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,6 +14,5 @@ }, "[typescriptreact]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" - }, - "jest.jestCommandLine": "jest", -} \ No newline at end of file + } +} diff --git a/eslint.config.js b/eslint.config.js index 9590d35e19..d956bfb8a9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,7 +1,7 @@ import typescriptEslint from '@typescript-eslint/eslint-plugin'; import stylisticTs from '@stylistic/eslint-plugin-ts' import tsdoc from 'eslint-plugin-tsdoc'; -import jest from 'eslint-plugin-jest'; +import vitest from 'eslint-plugin-vitest'; import globals from 'globals'; import tsParser from '@typescript-eslint/parser'; import react from 'eslint-plugin-react'; @@ -18,7 +18,7 @@ export default [ '@typescript-eslint': typescriptEslint, '@stylistic': stylisticTs, tsdoc, - jest, + vitest, }, linterOptions: { @@ -99,23 +99,7 @@ export default [ max: 1, }], - 'tsdoc/syntax': 'warn', - 'jest/no-commented-out-tests': 'error', - 'jest/no-disabled-tests': 'warn', - 'jest/no-focused-tests': 'error', - 'jest/prefer-to-contain': 'warn', - 'jest/prefer-to-have-length': 'warn', - 'jest/valid-expect': 'error', - 'jest/prefer-to-be': 'warn', - 'jest/no-alias-methods': 'warn', - 'jest/no-interpolation-in-snapshots': 'warn', - - 'jest/no-large-snapshots': ['warn', { - maxSize: 50, - inlineMaxSize: 20, - }], - - 'jest/no-deprecated-functions': 'warn', + 'tsdoc/syntax': 'warn' }, }, { @@ -153,5 +137,4 @@ export default [ }, }, }, - -]; \ No newline at end of file +]; diff --git a/jest.config.ts b/jest.config.ts deleted file mode 100644 index 58baa44515..0000000000 --- a/jest.config.ts +++ /dev/null @@ -1,67 +0,0 @@ -import type {Config} from 'jest'; - -const sharedConfig = { - transform: { - // use typescript to convert from esm to cjs - '[.](m|c)?(ts|js)(x)?$': ['ts-jest', { - 'isolatedModules': true, - 'tsconfig': 'tsconfig.jest.json' - }], - }, - // any tests that operate on dist files shouldn't compile them again. - transformIgnorePatterns: ['/dist'], - modulePathIgnorePatterns: ['/dist'] -} as Partial; - -const config: Config = { - coverageProvider: 'v8', - reporters: [ - 'github-actions', - 'jest-junit', - ['jest-monocart-coverage', { - name: 'MapLibre Unit Coverage Report', - - reports: [ - ['codecov'] - ], - - sourceFilter: (sourcePath) => { - return !sourcePath.includes('node_modules/') && sourcePath.search(/src\//) !== -1; - }, - - outputDir: './coverage/jest' - }] - ], - projects: [ - { - displayName: 'unit', - testEnvironment: 'jsdom', - setupFiles: [ - 'jest-webgl-canvas-mock', - './test/unit/lib/web_worker_mock.ts' - ], - testMatch: [ - '/src/**/*.test.{ts,js}' - ], - ...sharedConfig - }, - { - displayName: 'integration', - testEnvironment: 'node', - testMatch: [ - '/test/integration/**/*.test.{ts,js}', - ], - ...sharedConfig, - }, - { - displayName: 'build', - testEnvironment: 'node', - testMatch: [ - '/test/build/**/*.test.{ts,js}', - ], - ...sharedConfig, - }, - ] -}; - -export default config; diff --git a/package-lock.json b/package-lock.json index 6c5eabfc91..22fae421a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,6 @@ "@types/eslint": "^9.6.1", "@types/gl": "^6.0.5", "@types/glob": "^8.1.0", - "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.7", "@types/minimist": "^1.2.5", "@types/murmurhash-js": "^1.0.6", @@ -71,6 +70,7 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.12.2", "@typescript-eslint/parser": "^8.12.2", + "@vitest/coverage-v8": "^2.0.5", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -85,18 +85,13 @@ "eslint": "^9.13.0", "eslint-plugin-html": "^8.1.2", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jest": "^28.8.3", "eslint-plugin-react": "^7.37.2", "eslint-plugin-tsdoc": "0.3.0", + "eslint-plugin-vitest": "^0.5.4", "expect": "^29.7.0", "glob": "^11.0.0", "globals": "^15.11.0", "is-builtin-module": "^4.0.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-junit": "^16.0.0", - "jest-monocart-coverage": "^1.1.1", - "jest-webgl-canvas-mock": "^2.5.3", "jsdom": "^25.0.1", "junit-report-builder": "^5.1.1", "minimist": "^1.2.8", @@ -124,13 +119,14 @@ "st": "^3.0.1", "stylelint": "^16.10.0", "stylelint-config-standard": "^36.0.1", - "ts-jest": "^29.2.5", "ts-node": "^10.9.2", "tslib": "^2.8.0", "typedoc": "^0.26.10", "typedoc-plugin-markdown": "^4.2.9", "typedoc-plugin-missing-exports": "^3.0.0", - "typescript": "^5.6.3" + "typescript": "^5.6.3", + "vitest": "^2.0.0", + "vitest-webgl-canvas-mock": "^1.1.0" }, "engines": { "node": ">=16.14.0", @@ -150,24 +146,14 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -221,221 +207,22 @@ "node": ">=4" } }, - "node_modules/@babel/compat-data": { - "version": "7.18.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.18.9", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, "engines": { "node": ">=6.9.0" } @@ -490,10 +277,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", + "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -501,350 +292,141 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.15.5.tgz", + "integrity": "sha512-Su1gnTBbE7ouMQvM4DISUmP6sZiFyQRE+ODvjBzW+c/x9ZLbVp+2hBEEmxFSn5fdZCJzPOMwzwsjlLYykb9iUg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@cspell/dict-ada": "^4.0.5", + "@cspell/dict-al": "^1.0.3", + "@cspell/dict-aws": "^4.0.7", + "@cspell/dict-bash": "^4.1.8", + "@cspell/dict-companies": "^3.1.7", + "@cspell/dict-cpp": "^5.1.23", + "@cspell/dict-cryptocurrencies": "^5.0.3", + "@cspell/dict-csharp": "^4.0.5", + "@cspell/dict-css": "^4.0.16", + "@cspell/dict-dart": "^2.2.4", + "@cspell/dict-django": "^4.1.3", + "@cspell/dict-docker": "^1.1.11", + "@cspell/dict-dotnet": "^5.0.8", + "@cspell/dict-elixir": "^4.0.6", + "@cspell/dict-en_us": "^4.3.26", + "@cspell/dict-en-common-misspellings": "^2.0.7", + "@cspell/dict-en-gb": "1.1.33", + "@cspell/dict-filetypes": "^3.0.8", + "@cspell/dict-flutter": "^1.0.3", + "@cspell/dict-fonts": "^4.0.3", + "@cspell/dict-fsharp": "^1.0.4", + "@cspell/dict-fullstack": "^3.2.3", + "@cspell/dict-gaming-terms": "^1.0.8", + "@cspell/dict-git": "^3.0.3", + "@cspell/dict-golang": "^6.0.16", + "@cspell/dict-google": "^1.0.4", + "@cspell/dict-haskell": "^4.0.4", + "@cspell/dict-html": "^4.0.10", + "@cspell/dict-html-symbol-entities": "^4.0.3", + "@cspell/dict-java": "^5.0.10", + "@cspell/dict-julia": "^1.0.4", + "@cspell/dict-k8s": "^1.0.9", + "@cspell/dict-latex": "^4.0.3", + "@cspell/dict-lorem-ipsum": "^4.0.3", + "@cspell/dict-lua": "^4.0.6", + "@cspell/dict-makefile": "^1.0.3", + "@cspell/dict-markdown": "^2.0.7", + "@cspell/dict-monkeyc": "^1.0.9", + "@cspell/dict-node": "^5.0.4", + "@cspell/dict-npm": "^5.1.8", + "@cspell/dict-php": "^4.0.13", + "@cspell/dict-powershell": "^5.0.13", + "@cspell/dict-public-licenses": "^2.0.11", + "@cspell/dict-python": "^4.2.12", + "@cspell/dict-r": "^2.0.4", + "@cspell/dict-ruby": "^5.0.7", + "@cspell/dict-rust": "^4.0.9", + "@cspell/dict-scala": "^5.0.6", + "@cspell/dict-software-terms": "^4.1.12", + "@cspell/dict-sql": "^2.1.8", + "@cspell/dict-svelte": "^1.0.5", + "@cspell/dict-swift": "^2.0.4", + "@cspell/dict-terraform": "^1.0.5", + "@cspell/dict-typescript": "^3.1.11", + "@cspell/dict-vue": "^3.0.3" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", + "node_modules/@cspell/cspell-json-reporter": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.15.5.tgz", + "integrity": "sha512-yXd7KDBfUkA6y+MrOqK3q/UWorZgLIgyCZoFb0Pj67OU2ZMtgJ1VGFXAdzpKAEgEmdcblyoFzHkleYbg08qS6g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@cspell/cspell-types": "8.15.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", + "node_modules/@cspell/cspell-pipe": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.15.5.tgz", + "integrity": "sha512-X8QY73060hkR8040jabNJsvydeTG0owpqr9S0QJDdhG1z8uzenNcwR3hfwaIwQq5d6sIKcDFZY5qrO4x6eEAMw==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", + "node_modules/@cspell/cspell-resolver": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.15.5.tgz", + "integrity": "sha512-ejzUGLEwI8TQWXovQzzvAgSNToRrQe3h97YrH2XaB9rZDKkeA7dIBZDQ/OgOfidO+ZAsPIOxdHai3CBzEHYX3A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "global-directory": "^4.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "node_modules/@cspell/cspell-service-bus": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.15.5.tgz", + "integrity": "sha512-zZJRRvNhvUJntnw8sX4J5gE4uIHpX2oe+Tqs3lu2vRwogadNEXE4QNJbEQyQqgMePgmqULtRdxSBzG4wy4HoQg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", + "node_modules/@cspell/cspell-types": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.15.5.tgz", + "integrity": "sha512-bMRq9slD/D0vXckxe9vubG02HXrV4cASo6Ytkaw8rTfxMKpkBgxJWjFWphCFLOCICD71q45fUSg+W5vCp83f/Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspell/cspell-bundled-dicts": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.15.5.tgz", - "integrity": "sha512-Su1gnTBbE7ouMQvM4DISUmP6sZiFyQRE+ODvjBzW+c/x9ZLbVp+2hBEEmxFSn5fdZCJzPOMwzwsjlLYykb9iUg==", - "dev": true, - "dependencies": { - "@cspell/dict-ada": "^4.0.5", - "@cspell/dict-al": "^1.0.3", - "@cspell/dict-aws": "^4.0.7", - "@cspell/dict-bash": "^4.1.8", - "@cspell/dict-companies": "^3.1.7", - "@cspell/dict-cpp": "^5.1.23", - "@cspell/dict-cryptocurrencies": "^5.0.3", - "@cspell/dict-csharp": "^4.0.5", - "@cspell/dict-css": "^4.0.16", - "@cspell/dict-dart": "^2.2.4", - "@cspell/dict-django": "^4.1.3", - "@cspell/dict-docker": "^1.1.11", - "@cspell/dict-dotnet": "^5.0.8", - "@cspell/dict-elixir": "^4.0.6", - "@cspell/dict-en_us": "^4.3.26", - "@cspell/dict-en-common-misspellings": "^2.0.7", - "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.8", - "@cspell/dict-flutter": "^1.0.3", - "@cspell/dict-fonts": "^4.0.3", - "@cspell/dict-fsharp": "^1.0.4", - "@cspell/dict-fullstack": "^3.2.3", - "@cspell/dict-gaming-terms": "^1.0.8", - "@cspell/dict-git": "^3.0.3", - "@cspell/dict-golang": "^6.0.16", - "@cspell/dict-google": "^1.0.4", - "@cspell/dict-haskell": "^4.0.4", - "@cspell/dict-html": "^4.0.10", - "@cspell/dict-html-symbol-entities": "^4.0.3", - "@cspell/dict-java": "^5.0.10", - "@cspell/dict-julia": "^1.0.4", - "@cspell/dict-k8s": "^1.0.9", - "@cspell/dict-latex": "^4.0.3", - "@cspell/dict-lorem-ipsum": "^4.0.3", - "@cspell/dict-lua": "^4.0.6", - "@cspell/dict-makefile": "^1.0.3", - "@cspell/dict-markdown": "^2.0.7", - "@cspell/dict-monkeyc": "^1.0.9", - "@cspell/dict-node": "^5.0.4", - "@cspell/dict-npm": "^5.1.8", - "@cspell/dict-php": "^4.0.13", - "@cspell/dict-powershell": "^5.0.13", - "@cspell/dict-public-licenses": "^2.0.11", - "@cspell/dict-python": "^4.2.12", - "@cspell/dict-r": "^2.0.4", - "@cspell/dict-ruby": "^5.0.7", - "@cspell/dict-rust": "^4.0.9", - "@cspell/dict-scala": "^5.0.6", - "@cspell/dict-software-terms": "^4.1.12", - "@cspell/dict-sql": "^2.1.8", - "@cspell/dict-svelte": "^1.0.5", - "@cspell/dict-swift": "^2.0.4", - "@cspell/dict-terraform": "^1.0.5", - "@cspell/dict-typescript": "^3.1.11", - "@cspell/dict-vue": "^3.0.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-json-reporter": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.15.5.tgz", - "integrity": "sha512-yXd7KDBfUkA6y+MrOqK3q/UWorZgLIgyCZoFb0Pj67OU2ZMtgJ1VGFXAdzpKAEgEmdcblyoFzHkleYbg08qS6g==", - "dev": true, - "dependencies": { - "@cspell/cspell-types": "8.15.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-pipe": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.15.5.tgz", - "integrity": "sha512-X8QY73060hkR8040jabNJsvydeTG0owpqr9S0QJDdhG1z8uzenNcwR3hfwaIwQq5d6sIKcDFZY5qrO4x6eEAMw==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-resolver": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.15.5.tgz", - "integrity": "sha512-ejzUGLEwI8TQWXovQzzvAgSNToRrQe3h97YrH2XaB9rZDKkeA7dIBZDQ/OgOfidO+ZAsPIOxdHai3CBzEHYX3A==", - "dev": true, - "dependencies": { - "global-directory": "^4.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-service-bus": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.15.5.tgz", - "integrity": "sha512-zZJRRvNhvUJntnw8sX4J5gE4uIHpX2oe+Tqs3lu2vRwogadNEXE4QNJbEQyQqgMePgmqULtRdxSBzG4wy4HoQg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-types": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.15.5.tgz", - "integrity": "sha512-bMRq9slD/D0vXckxe9vubG02HXrV4cASo6Ytkaw8rTfxMKpkBgxJWjFWphCFLOCICD71q45fUSg+W5vCp83f/Q==", - "dev": true, - "engines": { - "node": ">=18" + "engines": { + "node": ">=18" } }, "node_modules/@cspell/dict-ada": { @@ -1347,603 +929,701 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" } }, - "node_modules/@eslint/core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", - "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/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 + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/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==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@eslint/js": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", - "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", - "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "levn": "^0.4.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" } }, - "node_modules/@humanfs/core": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", - "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": ">=12" } }, - "node_modules/@humanfs/node": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", - "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@humanfs/core": "^0.19.0", - "@humanwhocodes/retry": "^0.3.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": ">=12" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=12" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=12" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { - "jest-get-type": "^29.6.3" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@eslint/eslintrc/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 + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@eslint/eslintrc/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, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "argparse": "^2.0.1" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@eslint/js": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "levn": "^0.4.1" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.18.0" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@jest/transform": { + "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "license": "MIT" + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, "node_modules/@jest/types": { "version": "29.6.3", @@ -1963,13 +1643,15 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "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" @@ -1985,7 +1667,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { @@ -2003,18 +1687,21 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@mapbox/geojson-rewind": { @@ -2235,6 +1922,7 @@ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.0.tgz", "integrity": "sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "debug": "^4.3.6", "extract-zip": "^2.0.1", @@ -2455,6 +2143,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2468,6 +2157,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2481,6 +2171,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2494,6 +2185,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2507,6 +2199,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2520,6 +2213,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2533,6 +2227,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2546,6 +2241,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2559,6 +2255,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2572,6 +2269,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2585,6 +2283,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2598,6 +2297,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2611,6 +2311,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2624,6 +2325,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2637,6 +2339,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2650,6 +2353,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2663,6 +2367,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2676,6 +2381,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2756,24 +2462,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" - } - }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", @@ -2809,19 +2497,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@trysound/sax": { "version": "0.2.0", @@ -2852,47 +2533,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, "node_modules/@types/benchmark": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", @@ -3141,7 +2781,8 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@types/diff/-/diff-6.0.0.tgz", "integrity": "sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/earcut": { "version": "2.1.4", @@ -3194,15 +2835,6 @@ "@types/node": "*" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -3233,16 +2865,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, "node_modules/@types/jsdom": { "version": "21.1.7", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", @@ -3319,6 +2941,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.5.tgz", "integrity": "sha512-5iYk6AMPtsMbkZqCO1UGF9W5L38twq11S2pYWkybGHH2ogPUvXWNlQqJBzuEZWKj/WRH+QTeiv6ySWqJtvIEgA==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.19.8" } @@ -3450,6 +3073,7 @@ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -3460,6 +3084,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz", "integrity": "sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.12.2", @@ -3493,6 +3118,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.12.2.tgz", "integrity": "sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "8.12.2", "@typescript-eslint/types": "8.12.2", @@ -3521,6 +3147,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz", "integrity": "sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.12.2", "@typescript-eslint/visitor-keys": "8.12.2" @@ -3538,6 +3165,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz", "integrity": "sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.12.2", "@typescript-eslint/utils": "8.12.2", @@ -3562,6 +3190,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.12.2.tgz", "integrity": "sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3575,6 +3204,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz", "integrity": "sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "8.12.2", "@typescript-eslint/visitor-keys": "8.12.2", @@ -3603,6 +3233,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3612,6 +3243,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3627,6 +3259,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.12.2.tgz", "integrity": "sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.12.2", @@ -3649,6 +3282,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz", "integrity": "sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.12.2", "eslint-visitor-keys": "^3.4.3" @@ -3667,12 +3301,290 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/abab": { - "version": "2.0.6", + "node_modules/@vitest/coverage-v8": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.4.tgz", + "integrity": "sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==", "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/abbrev": { + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.7.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.4", + "vitest": "2.1.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/coverage-v8/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitest/coverage-v8/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz", + "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz", + "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", + "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz", + "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.4", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz", + "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.4", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz", + "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", + "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.4", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { "version": "1.1.1", "dev": true, "license": "ISC" @@ -3689,15 +3601,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -3767,33 +3670,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "3.0.1", "dev": true, @@ -3859,14 +3735,6 @@ "dev": true, "license": "MIT" }, - "node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -4031,11 +3899,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -4140,114 +4019,28 @@ "version": "1.6.7", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } + "license": "Apache-2.0" }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", + "node_modules/balanced-match": { + "version": "1.0.2", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", - "dev": true, - "optional": true + "license": "Apache-2.0", + "optional": true }, "node_modules/bare-fs": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.0.0", @@ -4260,6 +4053,7 @@ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, + "license": "Apache-2.0", "optional": true }, "node_modules/bare-path": { @@ -4267,6 +4061,7 @@ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "bare-os": "^2.1.0" @@ -4277,6 +4072,7 @@ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "streamx": "^2.20.0" @@ -4306,6 +4102,7 @@ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -4385,26 +4182,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, "node_modules/btoa": { "version": "1.2.1", "dev": true, @@ -4435,6 +4212,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4445,6 +4223,7 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -4466,6 +4245,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -4493,14 +4282,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -4558,6 +4339,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -4630,15 +4428,6 @@ "dev": true, "license": "MIT" }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", @@ -4659,6 +4448,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/chokidar": { "version": "3.5.3", "dev": true, @@ -4698,6 +4497,7 @@ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", "dev": true, + "license": "Apache-2.0", "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "10.0.0", @@ -4712,12 +4512,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, "node_modules/clear-module": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", @@ -4783,22 +4577,6 @@ "node": ">=8" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, "node_modules/color-convert": { "version": "1.9.3", "dev": true, @@ -4967,27 +4745,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/create-require": { "version": "1.1.1", "dev": true, @@ -5445,27 +5202,6 @@ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true }, - "node_modules/cssom": { - "version": "0.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "dev": true, - "license": "MIT" - }, "node_modules/csstype": { "version": "3.0.10", "dev": true, @@ -5852,21 +5588,9 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "dev": true, "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, "engines": { - "node": ">=12" + "node": ">= 14" } }, "node_modules/data-view-buffer": { @@ -5954,18 +5678,14 @@ "node": ">=8" } }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/deep-is": { @@ -6020,6 +5740,7 @@ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, + "license": "MIT", "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -6078,15 +5799,6 @@ "node": ">=0.10" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -6104,7 +5816,8 @@ "version": "0.0.1376096", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1376096.tgz", "integrity": "sha512-asCCFvz+8QkGghdWdt4AhUUsxlJC8mJRn4c5+713mg+2K0ZdNOHRRdKPaMRXAcbGiaXMc0FLALKD+f58zI3lsw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/diff": { "version": "7.0.0", @@ -6160,17 +5873,6 @@ ], "license": "BSD-2-Clause" }, - "node_modules/domexception": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -6237,1658 +5939,1193 @@ "resolved": "https://registry.npmjs.org/eight-colors/-/eight-colors-1.3.1.tgz", "integrity": "sha512-7nXPYDeKh6DgJDR/mpt2G7N/hCNSGwwoPVmoI3+4TEwOb07VFN1WMPG0DFf6nMEjrkgdj8Og7l7IaEEk3VE6Zg==", "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", - "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "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, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", - "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.4", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", - "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.7.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.13.0", - "@eslint/plugin-kit": "^0.2.0", - "@humanfs/node": "^0.16.5", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.1.0", - "eslint-visitor-keys": "^4.1.0", - "espree": "^10.2.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-html": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.2.tgz", - "integrity": "sha512-pbRchDV2SmqbCi/Ev/q3aAikzG9BcFe0IjjqjtMn8eTLq71ZUggyJB6CDmuwGAXmYZHrXI12XTfCqvgcnPRqGw==", - "dev": true, - "dependencies": { - "htmlparser2": "^9.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eslint-plugin-html/node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "28.8.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz", - "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "engines": { - "node": "^16.10.0 || ^18.12.0 || >=20.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", - "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.1.0", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "jake": "^10.8.5" }, "bin": { - "resolve": "bin/resolve" + "ejs": "bin/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/electron-to-chromium": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "license": "MIT" }, - "node_modules/eslint-plugin-tsdoc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.3.0.tgz", - "integrity": "sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.15.0", - "@microsoft/tsdoc-config": "0.17.0" + "once": "^1.4.0" } }, - "node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=0.12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6" } }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/error-ex": { + "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "is-arrayish": "^0.2.1" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "dev": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", + "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": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", + "node_modules/es-iterator-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", "dev": true, - "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" + "es-errors": "^1.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "hasown": "^2.0.0" } }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "node_modules/es-to-primitive": { + "version": "1.2.1", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" }, - "funding": { - "url": "https://opencollective.com/eslint" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/esprima": { - "version": "4.0.1", + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/escape-html": { + "version": "1.0.3", "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } + "license": "MIT" }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/escape-string-regexp": { + "version": "1.0.5", "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=0.8.0" } }, - "node_modules/estraverse": { - "version": "5.3.0", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, "engines": { - "node": ">=4.0" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "license": "BSD-2-Clause", + "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/eslint": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.13.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/execa/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==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/execa/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/execa/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "debug": "^3.2.7" }, "engines": { - "node": ">=8" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/eslint-plugin-html": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.2.tgz", + "integrity": "sha512-pbRchDV2SmqbCi/Ev/q3aAikzG9BcFe0IjjqjtMn8eTLq71ZUggyJB6CDmuwGAXmYZHrXI12XTfCqvgcnPRqGw==", "dev": true, + "dependencies": { + "htmlparser2": "^9.1.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=16.0.0" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "node_modules/eslint-plugin-html/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "ms": "^2.1.1" } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", "dev": true, + "license": "Apache-2.0", "dependencies": { - "pump": "^3.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-equals": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", - "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=6.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/fast-json-stable-stringify": { + "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">= 4.9.1" + "node": ">=0.10.0" } }, - "node_modules/fastq": { - "version": "1.13.0", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "license": "ISC", "dependencies": { - "reusify": "^1.0.4" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "bser": "2.1.1" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/fd": { - "version": "0.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/eslint-plugin-tsdoc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.3.0.tgz", + "integrity": "sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==", "dev": true, "dependencies": { - "pend": "~1.2.0" + "@microsoft/tsdoc": "0.15.0", + "@microsoft/tsdoc-config": "0.17.0" } }, - "node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "node_modules/eslint-plugin-vitest": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.5.4.tgz", + "integrity": "sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^7.7.1" + }, + "engines": { + "node": "^18.0.0 || >= 20.0.0" + }, "peerDependencies": { - "picomatch": "^3 || ^4" + "eslint": "^8.57.0 || ^9.0.0", + "vitest": "*" }, "peerDependenciesMeta": { - "picomatch": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "vitest": { "optional": true } } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "to-regex-range": "^5.0.1" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/find-up": { - "version": "4.1.0", + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "dev": true, + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=16" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/eslint-plugin-vitest/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "balanced-match": "^1.0.0" } }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "node_modules/eslint-plugin-vitest/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/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==", + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/foreground-child/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/foreground-child/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/foreground-child/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/eslint" } }, - "node_modules/form-data": { - "version": "2.5.1", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", "dev": true, + "license": "ISC", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=14.14" + "node": ">=10.13.0" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", "dev": true, "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/fsevents": { - "version": "2.3.2", + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/gauge": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "4.0.0", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^3.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "node_modules/gensequence": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-7.0.0.tgz", - "integrity": "sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=18" + "node": ">=4.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", + "node_modules/estraverse": { + "version": "5.3.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=6.9.0" + "node": ">=4.0" } }, - "node_modules/geojson-vt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" }, - "node_modules/get-caller-file": { - "version": "2.0.5", + "node_modules/esutils": { + "version": "2.0.3", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/get-package-type": { - "version": "0.1.0", + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, - "engines": { - "node": ">=12" + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 10.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "pump": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", "dev": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, "engines": { - "node": ">= 14" + "node": ">=6.0.0" } }, - "node_modules/gl-matrix": { - "version": "3.4.3", + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, "license": "MIT" }, - "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6.0" } }, - "node_modules/glob-parent": { - "version": "5.1.2", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } + "license": "MIT" }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 4.9.1" } }, - "node_modules/glob/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/fastq": { + "version": "1.13.0", "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "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==", + "node_modules/fd": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "pend": "~1.2.0" } }, - "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==", + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "global-prefix": "^3.0.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/global-modules/node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "node_modules/filelist": { + "version": "1.0.3", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" + "minimatch": "^5.0.1" } }, - "node_modules/global-modules/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/global-modules/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "balanced-match": "^1.0.0" } }, - "node_modules/global-prefix": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", - "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "node_modules/filelist/node_modules/minimatch": { + "version": "5.0.1", + "dev": true, + "license": "ISC", "dependencies": { - "ini": "^4.1.3", - "kind-of": "^6.0.3", - "which": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "engines": { - "node": ">=16" + "node": ">=10" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "to-regex-range": "^5.0.1" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/globals": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", - "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", "dev": true, "engines": { "node": ">=18" @@ -7897,575 +7134,540 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16" } }, - "node_modules/globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-callable": "^1.1.3" } }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gzip-size": { - "version": "6.0.0", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, - "license": "MIT", "dependencies": { - "duplexer": "^0.1.2" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/has-flag": { - "version": "4.0.0", + "node_modules/foreground-child/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==", "dev": true, - "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/has-own-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "node_modules/foreground-child/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/foreground-child/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "shebang-regex": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/foreground-child/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/form-data": { + "version": "2.5.1", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.12" } }, - "node_modules/has-unicode": { - "version": "2.0.1", + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, - "license": "ISC" + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "function-bind": "^1.1.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14.14" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", - "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "node_modules/fs-minipass": { + "version": "2.1.0", "dev": true, + "license": "ISC", "dependencies": { - "@types/hast": "^3.0.0" + "minipass": "^3.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 8" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", + "node_modules/fs.realpath": { + "version": "1.0.0", "dev": true, "license": "ISC" }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "engines": { - "node": ">=8" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/htmlparser2": { - "version": "8.0.1", + "node_modules/functions-have-names": { + "version": "1.2.3", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", + "node_modules/gauge": { + "version": "3.0.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1 || ^2.0.0", + "strip-ansi": "^3.0.1 || ^4.0.0", + "wide-align": "^1.1.2" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", + "node_modules/gauge/node_modules/strip-ansi": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/gensequence": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-7.0.0.tgz", + "integrity": "sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=18" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", + "node_modules/geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, "engines": { - "node": ">= 4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-fresh": { - "version": "3.3.0", + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, + "node_modules/get-stream": { + "version": "6.0.1", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", "dev": true, "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 14" } }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } + "node_modules/gl-matrix": { + "version": "3.4.3", + "license": "MIT" }, - "node_modules/inherits": { - "version": "2.0.4", + "node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "node_modules/glob-parent": { + "version": "5.1.2", "dev": true, + "license": "ISC", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 6" } }, - "node_modules/internmap": { - "version": "2.0.3", + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 12" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "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, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "ini": "4.1.1" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", + "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": "MIT" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/is-async-function": { + "node_modules/global-modules": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "global-prefix": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/is-bigint": { - "version": "1.0.4", + "node_modules/global-modules/node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, - "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", + "node_modules/global-modules/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/global-modules/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "which": "bin/which" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "dev": true, - "license": "MIT", + "node_modules/global-prefix": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "ini": "^4.1.3", + "kind-of": "^6.0.3", + "which": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/is-builtin-module": { + "node_modules/global-prefix/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/global-prefix/node_modules/which": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-4.0.0.tgz", - "integrity": "sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==", - "dev": true, + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dependencies": { - "builtin-modules": "^4.0.0" + "isexe": "^3.1.1" }, - "engines": { - "node": ">=18.20" + "bin": { + "node-which": "bin/which.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.7", + "node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "hasown": "^2.0.2" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8474,116 +7676,109 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "node_modules/globby": { + "version": "11.1.0", "dev": true, + "license": "MIT", "dependencies": { - "is-typed-array": "^1.1.13" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-date-object": { - "version": "1.0.5", + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", + "node_modules/graceful-fs": { + "version": "4.2.9", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "6.0.0", "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" + "dependencies": { + "duplexer": "^0.1.2" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { + "node_modules/has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", + "node_modules/has-flag": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -8592,16 +7787,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-module": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/has-symbols": { + "version": "1.0.3", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8609,21 +7798,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -8632,1120 +7813,886 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", + "node_modules/has-unicode": { + "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/is-reference": { - "version": "1.2.1", + "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": { - "@types/estree": "*" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "@types/hast": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true, - "engines": { - "node": ">=8" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-string": { - "version": "1.0.7", + "node_modules/htmlparser2": { + "version": "8.0.1", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, - "node_modules/is-symbol": { - "version": "1.0.4", + "node_modules/https-proxy-agent": { + "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "node_modules/iconv-lite": { + "version": "0.6.3", "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/is-weakref": { - "version": "1.0.2", + "node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, + "node": ">=4" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-wsl": { - "version": "2.2.0", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "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 + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "node_modules/isexe": { - "version": "2.0.0", + "node_modules/inherits": { + "version": "2.0.4", "dev": true, "license": "ISC" }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", + "node_modules/internmap": { + "version": "2.0.3", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=12" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": ">=10" + "node": ">= 12" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { - "semver": "^7.5.3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/is-bigint": { + "version": "1.0.4", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "node_modules/is-binary-path": { + "version": "2.1.0", "dev": true, + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "node_modules/is-boolean-object": { + "version": "1.1.2", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "node_modules/is-builtin-module": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-4.0.0.tgz", + "integrity": "sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==", "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" + "builtin-modules": "^4.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=18.20" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jake": { - "version": "10.8.5", + "node_modules/is-callable": { + "version": "1.2.7", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" + "hasown": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" + "is-typed-array": "^1.1.13" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "node_modules/is-date-object": { + "version": "1.0.5", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "node_modules/is-docker": { + "version": "2.2.1", "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, + "license": "MIT", "bin": { - "jest": "bin/jest.js" + "is-docker": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "node_modules/is-extglob": { + "version": "2.1.1", "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "node_modules/is-module": { + "version": "1.0.0", "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.12.0" } }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "node_modules/is-number-object": { + "version": "1.0.7", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-environment-jsdom/node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jest-environment-jsdom/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, - "node_modules/jest-environment-jsdom/node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "node_modules/is-reference": { + "version": "1.2.1", "dev": true, + "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "@types/estree": "*" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "call-bind": "^1.0.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "node_modules/is-string": { + "version": "1.0.7", "dev": true, + "license": "MIT", "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "node_modules/is-symbol": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "which-typed-array": "^1.1.14" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "node_modules/is-weakref": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-monocart-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jest-monocart-coverage/-/jest-monocart-coverage-1.1.1.tgz", - "integrity": "sha512-aF3hhJ1MjsBp9MGc0WzHKBZV8EVhut2VajZRG8ivhDptJvih2DSWPd+cexVEY8Ayfeq/EXF26+PVqdkrRvgJnA==", + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "monocart-coverage-reports": "^2.8.7" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" }, - "peerDependencies": { - "@jest/reporters": "*" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "node_modules/is-wsl": { + "version": "2.2.0", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "is-docker": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "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 + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" } }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": "*" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "node_modules/jake": { + "version": "10.8.5", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-util": { + "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate": { + "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", "chalk": "^4.0.0", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "leven": "^3.1.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { + "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-webgl-canvas-mock": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/jest-webgl-canvas-mock/-/jest-webgl-canvas-mock-2.5.3.tgz", - "integrity": "sha512-aE5ym/VV8hpJgsu/zzmvJ/bhD4vnfAM9TY6TRQxQAy9lo3hxtNfa2rbLFt3Qx31spQd5fhlQHO58Aey6oFDxAA==", - "dev": true, - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/jest-worker": { + "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/jju": { @@ -9759,23 +8706,12 @@ "dev": true, "license": "MIT" }, - "node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsdom": { "version": "25.0.1", @@ -9984,17 +8920,6 @@ "node": ">=18" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -10027,17 +8952,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonfile": { "version": "6.1.0", "dev": true, @@ -10110,30 +9024,12 @@ "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/known-css-properties": { "version": "0.34.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", "dev": true }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10195,17 +9091,6 @@ "node": ">=4" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/lodash": { "version": "4.17.21", "dev": true, @@ -10269,11 +9154,19 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -10291,22 +9184,26 @@ "dev": true }, "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } }, "node_modules/make-dir": { "version": "3.1.0", @@ -10335,15 +9232,6 @@ "dev": true, "license": "ISC" }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -10429,12 +9317,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "dev": true, @@ -10587,15 +9469,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "2.1.0", "dev": true, @@ -10653,7 +9526,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mkdirp": { "version": "1.0.4", @@ -10709,19 +9583,6 @@ "integrity": "sha512-v8W5hJLcWMIxLCcSi/MHh+VeefI+ycFmGz23Froer9QzWjrbg4J3gFJBuI/T1VLNoYxF47bVPPxq8ZlNX4gVCw==", "dev": true }, - "node_modules/moo-color": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.1.4" - } - }, - "node_modules/moo-color/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10773,6 +9634,7 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -10849,14 +9711,8 @@ "license": "MIT", "dependencies": { "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "webidl-conversions": "^3.0.0" + } }, "node_modules/node-releases": { "version": "2.0.18", @@ -10975,27 +9831,6 @@ "node": ">=4" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/npmlog": { "version": "5.0.1", "dev": true, @@ -11138,21 +9973,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/oniguruma-to-js": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", @@ -11212,46 +10032,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pac-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -11271,6 +10057,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -11283,6 +10070,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -11296,6 +10084,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -11309,6 +10098,7 @@ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, + "license": "MIT", "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -11339,6 +10129,22 @@ "node": ">=6" } }, + "node_modules/parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-color/node_modules/color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", + "dev": true + }, "node_modules/parse-json": { "version": "4.0.0", "dev": true, @@ -11443,6 +10249,23 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/pbf": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", @@ -11501,7 +10324,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.0", @@ -11532,14 +10356,6 @@ "node": ">=0.10" } }, - "node_modules/pirates": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/pixelmatch": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-6.0.0.tgz", @@ -11552,18 +10368,6 @@ "pixelmatch": "bin/pixelmatch" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/platform": { "version": "1.3.6", "dev": true, @@ -12285,23 +11089,11 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "dev": true, @@ -12336,6 +11128,7 @@ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -12355,6 +11148,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -12367,6 +11161,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -12380,6 +11175,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -12392,23 +11188,20 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pseudomap": { "version": "1.0.2", "dev": true, "license": "ISC" }, - "node_modules/psl": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -12438,6 +11231,7 @@ "integrity": "sha512-8+ALGQgwXd3P/tGcuSsxTPGDaOQIjcDIm04I5hpWZv/PiN5q8bQNHRUyfYrifT+flnM9aTWCP7tLEzuB6SlIgA==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.4.0", "chromium-bidi": "0.8.0", @@ -12458,6 +11252,7 @@ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.6.1.tgz", "integrity": "sha512-DoNLAzQfGklPauEn33N4h9cM9GubJSINEn+AUMwAXwW159Y9JLk5y34Jsbv4c7kG8P0puOYWV9leu2siMZ/QpQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.4.0", "chromium-bidi": "0.8.0", @@ -12474,7 +11269,8 @@ "version": "0.0.1354347", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz", "integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/puppeteer/node_modules/devtools-protocol": { "version": "0.0.1354347", @@ -12482,27 +11278,6 @@ "integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==", "dev": true }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/querystringify": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "dev": true, @@ -12526,7 +11301,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/quickselect": { "version": "3.0.0", @@ -12728,11 +11504,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -12750,18 +11521,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "dev": true, @@ -12777,15 +11536,6 @@ "protocol-buffers-schema": "^3.3.1" } }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -12838,6 +11588,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz", "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -13116,6 +11867,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "3.0.7", "dev": true, @@ -13150,12 +11908,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "dev": true, @@ -13228,6 +11980,7 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -13244,6 +11997,7 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -13258,6 +12012,7 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", @@ -13272,6 +12027,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -13480,11 +12236,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/st": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/st/-/st-3.0.1.tgz", @@ -13556,11 +12307,26 @@ "node": ">=8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true, + "license": "MIT" + }, "node_modules/streamx": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", "dev": true, + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -13597,19 +12363,6 @@ ], "license": "MIT" }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/string-width": { "version": "2.1.1", "dev": true, @@ -13821,15 +12574,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -14259,6 +13003,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -14273,6 +13018,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, + "license": "MIT", "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -14303,43 +13049,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/text-decoder": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/text-table": { "version": "0.2.0", @@ -14350,7 +13065,22 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true, + "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.10", @@ -14365,10 +13095,40 @@ "node": ">=12.0.0" } }, - "node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + "node_modules/tinypool": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } }, "node_modules/tldts": { "version": "6.1.47", @@ -14388,20 +13148,6 @@ "integrity": "sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==", "dev": true }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14414,33 +13160,6 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -14463,62 +13182,6 @@ "typescript": ">=4.2.0" } }, - "node_modules/ts-jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", - "dev": true, - "dependencies": { - "bs-logger": "^0.2.6", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.6.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "21.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -14697,7 +13360,8 @@ "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/typedoc": { "version": "0.26.10", @@ -14804,6 +13468,7 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -14813,7 +13478,8 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/unicorn-magic": { "version": "0.1.0", @@ -14895,14 +13561,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -14941,60 +13599,23 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/urlpattern-polyfill": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", "dev": true, "license": "MIT" }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "dev": true, "license": "MIT" }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, @@ -15032,6 +13653,165 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vite": { + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", + "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz", + "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz", + "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.4", + "@vitest/mocker": "2.1.4", + "@vitest/pretty-format": "^2.1.4", + "@vitest/runner": "2.1.4", + "@vitest/snapshot": "2.1.4", + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.4", + "@vitest/ui": "2.1.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest-webgl-canvas-mock": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vitest-webgl-canvas-mock/-/vitest-webgl-canvas-mock-1.1.0.tgz", + "integrity": "sha512-F/5+XvBs7cSZPe41IGQTbSjNimB4NntPnRqv4eWb42voFKQINH8y2xZkibNUxYJCGIuDFsYp1lDQgTvWLahSzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssfontparser": "^1.2.1", + "parse-color": "^1.0.0" + } + }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", @@ -15053,27 +13833,6 @@ "pbf": "^3.2.1" } }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -15083,38 +13842,6 @@ "node": ">=12" } }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/which": { "version": "2.0.2", "dev": true, @@ -15207,6 +13934,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "dev": true, @@ -15361,18 +14105,6 @@ "dev": true, "license": "ISC" }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -15406,21 +14138,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", @@ -15520,6 +14237,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/package.json b/package.json index 417d9744ad..3904c4e412 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,6 @@ "@types/eslint": "^9.6.1", "@types/gl": "^6.0.5", "@types/glob": "^8.1.0", - "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.7", "@types/minimist": "^1.2.5", "@types/murmurhash-js": "^1.0.6", @@ -79,6 +78,7 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.12.2", "@typescript-eslint/parser": "^8.12.2", + "@vitest/coverage-v8": "^2.0.5", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -93,18 +93,13 @@ "eslint": "^9.13.0", "eslint-plugin-html": "^8.1.2", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jest": "^28.8.3", "eslint-plugin-react": "^7.37.2", "eslint-plugin-tsdoc": "0.3.0", + "eslint-plugin-vitest": "^0.5.4", "expect": "^29.7.0", "glob": "^11.0.0", "globals": "^15.11.0", "is-builtin-module": "^4.0.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-junit": "^16.0.0", - "jest-monocart-coverage": "^1.1.1", - "jest-webgl-canvas-mock": "^2.5.3", "jsdom": "^25.0.1", "junit-report-builder": "^5.1.1", "minimist": "^1.2.8", @@ -132,13 +127,14 @@ "st": "^3.0.1", "stylelint": "^16.10.0", "stylelint-config-standard": "^36.0.1", - "ts-jest": "^29.2.5", "ts-node": "^10.9.2", "tslib": "^2.8.0", "typedoc": "^0.26.10", "typedoc-plugin-markdown": "^4.2.9", "typedoc-plugin-missing-exports": "^3.0.0", - "typescript": "^5.6.3" + "typescript": "^5.6.3", + "vitest": "^2.0.0", + "vitest-webgl-canvas-mock": "^1.1.0" }, "scripts": { "generate-dist-package": "node --no-warnings --loader ts-node/esm build/generate-dist-package.js", @@ -165,16 +161,15 @@ "start-bench": "run-p watch-css watch-benchmarks start-server", "lint": "eslint", "lint-css": "stylelint **/*.css --fix -f verbose", - "test": "run-p lint lint-css test-render jest", - "jest": "jest", - "test-build": "jest --selectProjects=build --reporters=default", - "test-build-ci": "jest --selectProjects=build", - "test-integration": "jest --selectProjects=integration --reporters=default", - "test-integration-ci": "jest --coverage --selectProjects=integration", + "test": "run-p lint lint-css test-render vitest", + "test-unit": "vitest run --config vitest.config.unit.ts", + "test-unit-ci": "vitest run --config vitest.config.unit.ts --coverage", + "test-integration": "vitest run --config vitest.config.integration.ts", + "test-integration-ci": "vitest run --config vitest.config.integration.ts --coverage", + "test-build": "vitest run --config vitest.config.build.ts", + "test-build-ci": "vitest run --config vitest.config.build.ts --coverage", + "test-watch-roots": "vitest --config vitest.config.unit.ts --watch", "test-render": "node --no-warnings --loader ts-node/esm test/integration/render/run_render_tests.ts", - "test-unit": "jest --selectProjects=unit --reporters=default", - "test-unit-ci": "jest --coverage --selectProjects unit", - "test-watch-roots": "jest --watch", "codegen": "run-p --print-label generate-dist-package generate-style-code generate-struct-arrays generate-shaders && npm run generate-typings", "benchmark": "node --no-warnings --loader ts-node/esm test/bench/run-benchmarks.ts", "gl-stats": "node --no-warnings --loader ts-node/esm test/bench/gl-stats.ts", diff --git a/src/data/bucket/fill_bucket.test.ts b/src/data/bucket/fill_bucket.test.ts index 6480a46caf..11c019a242 100644 --- a/src/data/bucket/fill_bucket.test.ts +++ b/src/data/bucket/fill_bucket.test.ts @@ -1,3 +1,4 @@ +import {test, expect} from 'vitest'; import fs from 'fs'; import path from 'path'; diff --git a/src/data/bucket/line_bucket.test.ts b/src/data/bucket/line_bucket.test.ts index 18d0a4620e..2a4024234f 100644 --- a/src/data/bucket/line_bucket.test.ts +++ b/src/data/bucket/line_bucket.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import fs from 'fs'; import path from 'path'; import Protobuf from 'pbf'; @@ -104,7 +105,7 @@ describe('LineBucket', () => { }); test('LineBucket segmentation', () => { - jest.spyOn(console, 'warn').mockImplementation(() => { }); + vi.spyOn(console, 'warn').mockImplementation(() => { }); // Stub MAX_VERTEX_ARRAY_LENGTH so we can test features // breaking across array groups without tests taking a _long_ time. diff --git a/src/data/bucket/symbol_bucket.test.ts b/src/data/bucket/symbol_bucket.test.ts index 60d949ad55..70c150f8fc 100644 --- a/src/data/bucket/symbol_bucket.test.ts +++ b/src/data/bucket/symbol_bucket.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import fs from 'fs'; import path from 'path'; import Protobuf from 'pbf'; @@ -111,7 +112,7 @@ describe('SymbolBucket', () => { }); test('SymbolBucket integer overflow', () => { - const spy = jest.spyOn(console, 'warn').mockImplementation(() => { }); + const spy = vi.spyOn(console, 'warn').mockImplementation(() => { }); SymbolBucket.MAX_GLYPHS = 5; const bucket = bucketSetup() as any as SymbolBucket; @@ -131,7 +132,7 @@ describe('SymbolBucket', () => { }); test('SymbolBucket image undefined sdf', () => { - const spy = jest.spyOn(console, 'warn').mockImplementation(() => { }); + const spy = vi.spyOn(console, 'warn').mockImplementation(() => { }); spy.mockReset(); const imageMap = { @@ -173,7 +174,7 @@ describe('SymbolBucket', () => { }); test('SymbolBucket image mismatched sdf', () => { - const spy = jest.spyOn(console, 'warn').mockImplementation(() => { }); + const spy = vi.spyOn(console, 'warn').mockImplementation(() => { }); spy.mockReset(); const imageMap = { diff --git a/src/data/dem_data.test.ts b/src/data/dem_data.test.ts index 79cf1cb9cb..ee579ab4a3 100644 --- a/src/data/dem_data.test.ts +++ b/src/data/dem_data.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {DEMData} from './dem_data'; import {RGBAImage} from '../util/image'; import {serialize, deserialize} from '../util/web_worker_transfer'; @@ -41,7 +42,7 @@ describe('DEMData', () => { }); test('otherEncoding', () => { - const spyOnWarnConsole = jest.spyOn(console, 'warn').mockImplementation(); + const spyOnWarnConsole = vi.spyOn(console, 'warn').mockImplementation(() => {}); const imageData0 = createMockImage(4, 4); new DEMData('0', imageData0, 'otherEncoding' as any); diff --git a/src/data/feature_position_map.test.ts b/src/data/feature_position_map.test.ts index 31a1cff7d4..ae97996cc4 100644 --- a/src/data/feature_position_map.test.ts +++ b/src/data/feature_position_map.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {FeaturePositionMap} from './feature_position_map'; import {serialize, deserialize} from '../util/web_worker_transfer'; diff --git a/src/data/load_geometry.test.ts b/src/data/load_geometry.test.ts index 40d44d6e61..b22d01aaf1 100644 --- a/src/data/load_geometry.test.ts +++ b/src/data/load_geometry.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import fs from 'fs'; import path from 'path'; import Protobuf from 'pbf'; diff --git a/src/data/segment.test.ts b/src/data/segment.test.ts index 55fae180bb..21ea64b484 100644 --- a/src/data/segment.test.ts +++ b/src/data/segment.test.ts @@ -1,3 +1,4 @@ +import {describe, expect, test} from 'vitest'; import {FillLayoutArray, TriangleIndexArray} from './array_types.g'; import {SegmentVector} from './segment'; diff --git a/src/geo/edge_insets.test.ts b/src/geo/edge_insets.test.ts index d9379515c8..15e0899f86 100644 --- a/src/geo/edge_insets.test.ts +++ b/src/geo/edge_insets.test.ts @@ -1,4 +1,4 @@ -import expect from 'expect'; +import {describe, test, expect} from 'vitest'; import {EdgeInsets} from '../geo/edge_insets'; describe('EdgeInsets', () => { diff --git a/src/geo/lng_lat.test.ts b/src/geo/lng_lat.test.ts index 79039d35ea..a48d98a026 100644 --- a/src/geo/lng_lat.test.ts +++ b/src/geo/lng_lat.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {LngLat} from '../geo/lng_lat'; describe('LngLat', () => { diff --git a/src/geo/lng_lat_bounds.test.ts b/src/geo/lng_lat_bounds.test.ts index 85f812dd95..c14154f2d1 100644 --- a/src/geo/lng_lat_bounds.test.ts +++ b/src/geo/lng_lat_bounds.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {LngLat} from './lng_lat'; import {LngLatBounds} from './lng_lat_bounds'; diff --git a/src/geo/mercator_coordinate.test.ts b/src/geo/mercator_coordinate.test.ts index 305bb49235..9926924984 100644 --- a/src/geo/mercator_coordinate.test.ts +++ b/src/geo/mercator_coordinate.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {LngLat} from './lng_lat'; import {MercatorCoordinate, mercatorScale} from './mercator_coordinate'; diff --git a/src/geo/projection/globe_covering_tiles.test.ts b/src/geo/projection/globe_covering_tiles.test.ts index ff897df082..56987ba458 100644 --- a/src/geo/projection/globe_covering_tiles.test.ts +++ b/src/geo/projection/globe_covering_tiles.test.ts @@ -1,3 +1,4 @@ +import {describe, expect, test} from 'vitest'; import {Aabb} from '../../util/primitives'; import {expectToBeCloseToArray} from '../../util/test/util'; import {getTileAABB} from './globe_covering_tiles'; diff --git a/src/geo/projection/globe_transform.test.ts b/src/geo/projection/globe_transform.test.ts index 18738697a7..95c6b9669a 100644 --- a/src/geo/projection/globe_transform.test.ts +++ b/src/geo/projection/globe_transform.test.ts @@ -8,6 +8,7 @@ import {angularCoordinatesRadiansToVector, mercatorCoordinatesToAngularCoordinat import {expectToBeCloseToArray, getGlobeProjectionMock, sleep} from '../../util/test/util'; import {MercatorCoordinate} from '../mercator_coordinate'; import {tileCoordinatesToLocation} from './mercator_utils'; +import {describe, expect, test} from 'vitest'; function testPlaneAgainstLngLat(lngDegrees: number, latDegrees: number, plane: Array) { const lat = latDegrees / 180.0 * Math.PI; diff --git a/src/geo/projection/globe_utils.test.ts b/src/geo/projection/globe_utils.test.ts index 2aacd0e8bf..d3d46540a6 100644 --- a/src/geo/projection/globe_utils.test.ts +++ b/src/geo/projection/globe_utils.test.ts @@ -1,3 +1,4 @@ +import {describe, expect, test} from 'vitest'; import {LngLat} from '../lng_lat'; import {getGlobeCircumferencePixels, getZoomAdjustment, globeDistanceOfLocationsPixels} from './globe_utils'; diff --git a/src/geo/projection/mercator_transform.test.ts b/src/geo/projection/mercator_transform.test.ts index 10487f4c41..d6f68b5e9c 100644 --- a/src/geo/projection/mercator_transform.test.ts +++ b/src/geo/projection/mercator_transform.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {LngLat} from '../lng_lat'; import {OverscaledTileID, CanonicalTileID, UnwrappedTileID} from '../../source/tile_id'; diff --git a/src/geo/projection/mercator_utils.test.ts b/src/geo/projection/mercator_utils.test.ts index 44b302e3ce..3aeb1db689 100644 --- a/src/geo/projection/mercator_utils.test.ts +++ b/src/geo/projection/mercator_utils.test.ts @@ -8,6 +8,7 @@ import {CanonicalTileID, OverscaledTileID} from '../../source/tile_id'; import {EXTENT} from '../../data/extent'; import {expectToBeCloseToArray} from '../../util/test/util'; import type {ProjectionData} from './projection_data'; +import {describe, expect, test} from 'vitest'; describe('mercator utils', () => { test('projectToWorldCoordinates basic', () => { diff --git a/src/geo/transform_helper.test.ts b/src/geo/transform_helper.test.ts index 5a1fdcbbec..3383709bc5 100644 --- a/src/geo/transform_helper.test.ts +++ b/src/geo/transform_helper.test.ts @@ -1,3 +1,4 @@ +import {describe, expect, test} from 'vitest'; import {LngLat} from './lng_lat'; import {LngLatBounds} from './lng_lat_bounds'; import {scaleZoom, TransformHelper, zoomScale} from './transform_helper'; diff --git a/src/gl/render_pool.test.ts b/src/gl/render_pool.test.ts index a864c48bf9..0c1c4ea64b 100644 --- a/src/gl/render_pool.test.ts +++ b/src/gl/render_pool.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {Context} from './context'; import {RenderPool} from './render_pool'; @@ -6,7 +7,7 @@ describe('render pool', () => { function createAndFillPool(): RenderPool { const gl = document.createElement('canvas').getContext('webgl'); - jest.spyOn(gl, 'checkFramebufferStatus').mockReturnValue(gl.FRAMEBUFFER_COMPLETE); + vi.spyOn(gl, 'checkFramebufferStatus').mockReturnValue(gl.FRAMEBUFFER_COMPLETE); const pool = new RenderPool(new Context(gl), POOL_SIZE, 512); for (let i = 0; i < POOL_SIZE; i++) { pool.useObject(pool.getOrCreateFreeObject()); diff --git a/src/gl/state.test.ts b/src/gl/state.test.ts index 82037f50fc..465eef3d83 100644 --- a/src/gl/state.test.ts +++ b/src/gl/state.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {IValue, ClearColor, ClearDepth, ClearStencil, ColorMask, DepthMask, StencilMask, StencilFunc, StencilOp, StencilTest, DepthRange, DepthTest, DepthFunc, Blend, BlendFunc, BlendColor, ProgramValue, ActiveTextureUnit, Viewport, BindFramebuffer, BindRenderbuffer, BindTexture, BindVertexBuffer, BindElementBuffer, BindVertexArray, PixelStoreUnpack, PixelStoreUnpackPremultiplyAlpha} from './value'; import {Context} from './context'; import {Color} from '@maplibre/maplibre-gl-style-spec'; diff --git a/src/gl/vertex_buffer.test.ts b/src/gl/vertex_buffer.test.ts index e6a2df5082..a375632782 100644 --- a/src/gl/vertex_buffer.test.ts +++ b/src/gl/vertex_buffer.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {VertexBuffer} from './vertex_buffer'; import {StructArrayLayout3i6} from '../data/array_types.g'; import {Context} from '../gl/context'; @@ -37,7 +38,7 @@ describe('VertexBuffer', () => { const context = new Context(gl); const array = new TestArray(); const buffer = new VertexBuffer(context, array, attributes); - const spy = jest.spyOn(context.gl, 'enableVertexAttribArray').mockImplementation(() => {}); + const spy = vi.spyOn(context.gl, 'enableVertexAttribArray').mockImplementation(() => {}); buffer.enableAttributes(context.gl, {attributes: {map: 5, box: 6}} as any); expect(spy.mock.calls).toEqual([[5], [6]]); }); @@ -46,7 +47,7 @@ describe('VertexBuffer', () => { const context = new Context(gl); const array = new TestArray(); const buffer = new VertexBuffer(context, array, attributes); - const spy = jest.spyOn(context.gl, 'vertexAttribPointer').mockImplementation(() => {}); + const spy = vi.spyOn(context.gl, 'vertexAttribPointer').mockImplementation(() => {}); buffer.setVertexAttribPointers(context.gl, {attributes: {map: 5, box: 6}} as any, 50); expect(spy.mock.calls).toEqual([ [5, 1, context.gl['SHORT'], false, 6, 300], diff --git a/src/index.test.ts b/src/index.test.ts index 121614b75d..ea2ebd4f24 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterAll, test, expect} from 'vitest'; import {config} from './util/config'; import {addProtocol, getWorkerCount, removeProtocol, getVersion} from './index'; import {getJSON, getArrayBuffer} from './util/ajax'; diff --git a/src/render/draw_custom.test.ts b/src/render/draw_custom.test.ts index 47f7217e70..04ab3ad886 100644 --- a/src/render/draw_custom.test.ts +++ b/src/render/draw_custom.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi, Mock} from 'vitest'; import {OverscaledTileID} from '../source/tile_id'; import {SourceCache} from '../source/source_cache'; import {Tile} from '../source/tile'; @@ -8,12 +9,12 @@ import {CustomStyleLayer} from '../style/style_layer/custom_style_layer'; import {MercatorTransform} from '../geo/projection/mercator_transform'; import {MercatorProjection} from '../geo/projection/mercator'; -jest.mock('./painter'); -jest.mock('./program'); -jest.mock('../source/source_cache'); -jest.mock('../source/tile'); -jest.mock('../data/bucket/symbol_bucket'); -jest.mock('../symbol/projection'); +vi.mock('./painter'); +vi.mock('./program'); +vi.mock('../source/source_cache'); +vi.mock('../source/tile'); +vi.mock('../data/bucket/symbol_bucket'); +vi.mock('../symbol/projection'); describe('drawCustom', () => { test('should return custom render method inputs', () => { @@ -46,7 +47,7 @@ describe('drawCustom', () => { bind: () => { } } as any; const sourceCacheMock = new SourceCache(null, null, null); - (sourceCacheMock.getTile as jest.Mock).mockReturnValue(tile); + (sourceCacheMock.getTile as Mock).mockReturnValue(tile); sourceCacheMock.map = {showCollisionBoxes: false} as any as Map; let result; diff --git a/src/render/draw_debug.test.ts b/src/render/draw_debug.test.ts index ec19eff3c9..295af3c107 100644 --- a/src/render/draw_debug.test.ts +++ b/src/render/draw_debug.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {SourceCache} from '../source/source_cache'; import {RasterSourceSpecification, SourceSpecification, VectorSourceSpecification} from '@maplibre/maplibre-gl-style-spec'; import {Style} from '../style/style'; @@ -5,7 +6,7 @@ import {FillStyleLayer} from '../style/style_layer/fill_style_layer'; import {RasterStyleLayer} from '../style/style_layer/raster_style_layer'; import {selectDebugSource} from './draw_debug'; -jest.mock('../style/style'); +vi.mock('../style/style'); const zoom = 14; diff --git a/src/render/draw_fill.test.ts b/src/render/draw_fill.test.ts index aef5b2e811..3d9e6ab91a 100644 --- a/src/render/draw_fill.test.ts +++ b/src/render/draw_fill.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi, Mock} from 'vitest'; import {mat4} from 'gl-matrix'; import {OverscaledTileID} from '../source/tile_id'; import {SourceCache} from '../source/source_cache'; @@ -16,12 +17,12 @@ import {FillBucket} from '../data/bucket/fill_bucket'; import {ProgramConfiguration, ProgramConfigurationSet} from '../data/program_configuration'; import type {ProjectionData} from '../geo/projection/projection_data'; -jest.mock('./painter'); -jest.mock('./program'); -jest.mock('../source/source_cache'); -jest.mock('../source/tile'); -jest.mock('../data/bucket/symbol_bucket'); -jest.mock('../symbol/projection'); +vi.mock('./painter'); +vi.mock('./program'); +vi.mock('../source/source_cache'); +vi.mock('../source/tile'); +vi.mock('../data/bucket/symbol_bucket'); +vi.mock('../symbol/projection'); describe('drawFill', () => { test('should call programConfiguration.setConstantPatternPositions for transitioning fill-pattern', () => { @@ -30,12 +31,12 @@ describe('drawFill', () => { const layer: FillStyleLayer = constructMockLayer(); const programMock = new Program(null as any, null as any, null as any, null as any, null as any, null as any, null as any, null as any); - (painterMock.useProgram as jest.Mock).mockReturnValue(programMock); + (painterMock.useProgram as Mock).mockReturnValue(programMock); const mockTile = constructMockTile(layer); const sourceCacheMock = new SourceCache(null as any, null as any, null as any); - (sourceCacheMock.getTile as jest.Mock).mockReturnValue(mockTile); + (sourceCacheMock.getTile as Mock).mockReturnValue(mockTile); sourceCacheMock.map = {showCollisionBoxes: false} as any as Map; drawFill(painterMock, sourceCacheMock, layer, [mockTile.tileID]); @@ -130,8 +131,8 @@ describe('drawFill', () => { const bucketMock = constructMockBucket(layer); - (tile.getBucket as jest.Mock).mockReturnValue(bucketMock); - (tile.patternsLoaded as jest.Mock).mockReturnValue(true); + (tile.getBucket as Mock).mockReturnValue(bucketMock); + (tile.patternsLoaded as Mock).mockReturnValue(true); return tile; } @@ -143,7 +144,7 @@ describe('drawFill', () => { const mockProgramConfigurations: ProgramConfigurationSet = {} as any; const mockProgramConfiguration: ProgramConfiguration = {} as any; mockProgramConfiguration.updatePaintBuffers = () => {}; - mockProgramConfiguration.setConstantPatternPositions = jest.fn(); + mockProgramConfiguration.setConstantPatternPositions = vi.fn(); mockProgramConfigurations.get = () => mockProgramConfiguration; diff --git a/src/render/draw_symbol.test.ts b/src/render/draw_symbol.test.ts index 734edc3e3f..ee5b551a2e 100644 --- a/src/render/draw_symbol.test.ts +++ b/src/render/draw_symbol.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi, Mock} from 'vitest'; import {mat4} from 'gl-matrix'; import {OverscaledTileID} from '../source/tile_id'; import {SymbolBucket} from '../data/bucket/symbol_bucket'; @@ -17,13 +18,13 @@ import {Style} from '../style/style'; import {MercatorProjection} from '../geo/projection/mercator'; import type {ProjectionData} from '../geo/projection/projection_data'; -jest.mock('./painter'); -jest.mock('./program'); -jest.mock('../source/source_cache'); -jest.mock('../source/tile'); -jest.mock('../data/bucket/symbol_bucket'); -jest.mock('../symbol/projection'); -(symbolProjection.getPitchedLabelPlaneMatrix as jest.Mock).mockReturnValue(mat4.create()); +vi.mock('./painter'); +vi.mock('./program'); +vi.mock('../source/source_cache'); +vi.mock('../source/tile'); +vi.mock('../data/bucket/symbol_bucket'); +vi.mock('../symbol/projection'); +(symbolProjection.getPitchedLabelPlaneMatrix as Mock).mockReturnValue(mat4.create()); function createMockTransform() { return { @@ -85,7 +86,7 @@ describe('drawSymbol', () => { const tileId = new OverscaledTileID(1, 0, 1, 0, 0); tileId.terrainRttPosMatrix = mat4.create(); const programMock = new Program(null, null, null, null, null, null, null, null); - (painterMock.useProgram as jest.Mock).mockReturnValue(programMock); + (painterMock.useProgram as Mock).mockReturnValue(programMock); const bucketMock = new SymbolBucket(null); bucketMock.icon = { programConfigurations: { @@ -147,7 +148,7 @@ describe('drawSymbol', () => { const tileId = new OverscaledTileID(1, 0, 1, 0, 0); tileId.terrainRttPosMatrix = mat4.create(); const programMock = new Program(null, null, null, null, null, null, null, null); - (painterMock.useProgram as jest.Mock).mockReturnValue(programMock); + (painterMock.useProgram as Mock).mockReturnValue(programMock); const bucketMock = new SymbolBucket(null); bucketMock.icon = { programConfigurations: { @@ -167,16 +168,16 @@ describe('drawSymbol', () => { tile.imageAtlasTexture = { bind: () => { } } as any; - (tile.getBucket as jest.Mock).mockReturnValue(bucketMock); + (tile.getBucket as Mock).mockReturnValue(bucketMock); const sourceCacheMock = new SourceCache(null, null, null); - (sourceCacheMock.getTile as jest.Mock).mockReturnValue(tile); + (sourceCacheMock.getTile as Mock).mockReturnValue(tile); sourceCacheMock.map = {showCollisionBoxes: false} as any as Map; painterMock.style = { map: {}, projection: new MercatorProjection() } as any as Style; - const spy = jest.spyOn(symbolProjection, 'updateLineLabels'); + const spy = vi.spyOn(symbolProjection, 'updateLineLabels'); drawSymbols(painterMock, sourceCacheMock, layer, [tileId], null); expect(spy.mock.calls[0][7]).toBeFalsy(); // rotateToLine === false @@ -213,7 +214,7 @@ describe('drawSymbol', () => { const tileId = new OverscaledTileID(1, 0, 1, 0, 0); tileId.terrainRttPosMatrix = mat4.create(); const programMock = new Program(null, null, null, null, null, null, null, null); - (painterMock.useProgram as jest.Mock).mockReturnValue(programMock); + (painterMock.useProgram as Mock).mockReturnValue(programMock); const bucketMock = new SymbolBucket(null); bucketMock.icon = { programConfigurations: { @@ -233,9 +234,9 @@ describe('drawSymbol', () => { tile.imageAtlasTexture = { bind: () => { } } as any; - (tile.getBucket as jest.Mock).mockReturnValue(bucketMock); + (tile.getBucket as Mock).mockReturnValue(bucketMock); const sourceCacheMock = new SourceCache(null, null, null); - (sourceCacheMock.getTile as jest.Mock).mockReturnValue(tile); + (sourceCacheMock.getTile as Mock).mockReturnValue(tile); sourceCacheMock.map = {showCollisionBoxes: false} as any as Map; drawSymbols(painterMock, sourceCacheMock, layer, [tileId], null); diff --git a/src/render/fill_large_mesh_arrays.test.ts b/src/render/fill_large_mesh_arrays.test.ts index 3a647df956..e6dd71e513 100644 --- a/src/render/fill_large_mesh_arrays.test.ts +++ b/src/render/fill_large_mesh_arrays.test.ts @@ -2,6 +2,7 @@ import {FillLayoutArray, LineIndexArray, TriangleIndexArray} from '../data/array import {SegmentVector} from '../data/segment'; import {fillLargeMeshArrays} from './fill_large_mesh_arrays'; import {SimpleMesh, getGridMesh, getGridMeshRandom} from '../../test/unit/lib/mesh_utils'; +import {describe, expect, test} from 'vitest'; describe('fillArrays', () => { test('Mesh comparison works', () => { diff --git a/src/render/glyph_manager.test.ts b/src/render/glyph_manager.test.ts index 05d07f2fed..e469e5974a 100644 --- a/src/render/glyph_manager.test.ts +++ b/src/render/glyph_manager.test.ts @@ -1,3 +1,4 @@ +import {describe, afterEach, test, expect, vi} from 'vitest'; import {parseGlyphPbf} from '../style/parse_glyph_pbf'; import {GlyphManager} from './glyph_manager'; import fs from 'fs'; @@ -12,7 +13,7 @@ describe('GlyphManager', () => { const identityTransform = ((url) => ({url})) as any as RequestManager; const createLoadGlyphRangeStub = () => { - return jest.spyOn(GlyphManager, 'loadGlyphRange').mockImplementation((stack, range, urlTemplate, transform) => { + return vi.spyOn(GlyphManager, 'loadGlyphRange').mockImplementation((stack, range, urlTemplate, transform) => { expect(stack).toBe('Arial Unicode MS'); expect(range).toBe(0); expect(urlTemplate).toBe('https://localhost/fonts/v1/{fontstack}/{range}.pbf'); @@ -28,7 +29,7 @@ describe('GlyphManager', () => { }; afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); test('GlyphManager requests 0-255 PBF', async () => { @@ -56,7 +57,7 @@ describe('GlyphManager', () => { }); test('GlyphManager requests remote CJK PBF', async () => { - jest.spyOn(GlyphManager, 'loadGlyphRange').mockImplementation((_stack, _range, _urlTemplate, _transform) => { + vi.spyOn(GlyphManager, 'loadGlyphRange').mockImplementation((_stack, _range, _urlTemplate, _transform) => { return Promise.resolve(GLYPHS); }); @@ -67,7 +68,7 @@ describe('GlyphManager', () => { }); test('GlyphManager does not cache CJK chars that should be rendered locally', async () => { - jest.spyOn(GlyphManager, 'loadGlyphRange').mockImplementation((_stack, range, _urlTemplate, _transform) => { + vi.spyOn(GlyphManager, 'loadGlyphRange').mockImplementation((_stack, range, _urlTemplate, _transform) => { const overlappingGlyphs = {}; const start = range * 256; const end = start + 256; @@ -134,7 +135,7 @@ describe('GlyphManager', () => { test('GlyphManager caches locally generated glyphs', async () => { const manager = createGlyphManager('sans-serif'); - const drawSpy = GlyphManager.TinySDF.prototype.draw = jest.fn().mockImplementation(() => { + const drawSpy = GlyphManager.TinySDF.prototype.draw = vi.fn().mockImplementation(() => { return {data: new Uint8ClampedArray(60 * 60)} as any; }); diff --git a/src/render/line_atlas.test.ts b/src/render/line_atlas.test.ts index a672500c05..7c740d2cbc 100644 --- a/src/render/line_atlas.test.ts +++ b/src/render/line_atlas.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {LineAtlas} from './line_atlas'; describe('LineAtlas', () => { diff --git a/src/render/painter.test.ts b/src/render/painter.test.ts index afb2972f5b..5041e29a90 100644 --- a/src/render/painter.test.ts +++ b/src/render/painter.test.ts @@ -1,3 +1,4 @@ +import {test} from 'vitest'; import {Painter} from './painter'; import {MercatorTransform} from '../geo/projection/mercator_transform'; import {Style} from '../style/style'; diff --git a/src/render/render_to_texture.test.ts b/src/render/render_to_texture.test.ts index 0f807ce680..5ebb3bfb94 100644 --- a/src/render/render_to_texture.test.ts +++ b/src/render/render_to_texture.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {RenderToTexture} from './render_to_texture'; import type {Painter} from './painter'; import type {LineStyleLayer} from '../style/style_layer/line_style_layer'; @@ -19,7 +20,7 @@ import {DepthMode} from '../gl/depth_mode'; describe('render to texture', () => { const gl = document.createElement('canvas').getContext('webgl'); - jest.spyOn(gl, 'checkFramebufferStatus').mockReturnValue(gl.FRAMEBUFFER_COMPLETE); + vi.spyOn(gl, 'checkFramebufferStatus').mockReturnValue(gl.FRAMEBUFFER_COMPLETE); const backgroundLayer = { id: 'maine-background', type: 'background', diff --git a/src/render/subdivision.test.ts b/src/render/subdivision.test.ts index fd1162bfbb..a23057d9f5 100644 --- a/src/render/subdivision.test.ts +++ b/src/render/subdivision.test.ts @@ -2,6 +2,7 @@ import Point from '@mapbox/point-geometry'; import {EXTENT} from '../data/extent'; import {scanlineTriangulateVertexRing, subdividePolygon, subdivideVertexLine} from './subdivision'; import {CanonicalTileID} from '../source/tile_id'; +import {describe, expect, test} from 'vitest'; /** * With this granularity, all geometry should be subdivided along axes divisible by 4. diff --git a/src/render/terrain.test.ts b/src/render/terrain.test.ts index 5d0c3f5e52..809481c7d6 100644 --- a/src/render/terrain.test.ts +++ b/src/render/terrain.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import Point from '@mapbox/point-geometry'; import {Terrain} from './terrain'; import {Context} from '../gl/context'; @@ -17,8 +18,8 @@ describe('Terrain', () => { beforeEach(() => { gl = document.createElement('canvas').getContext('webgl'); - jest.spyOn(gl, 'checkFramebufferStatus').mockReturnValue(gl.FRAMEBUFFER_COMPLETE); - jest.spyOn(gl, 'readPixels').mockImplementation((_1, _2, _3, _4, _5, _6, rgba) => { + vi.spyOn(gl, 'checkFramebufferStatus').mockReturnValue(gl.FRAMEBUFFER_COMPLETE); + vi.spyOn(gl, 'readPixels').mockImplementation((_1, _2, _3, _4, _5, _6, rgba) => { rgba[0] = 0; rgba[1] = 0; rgba[2] = 255; @@ -27,7 +28,7 @@ describe('Terrain', () => { }); afterEach(() => { - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); test('pointCoordinate should not return null', () => { @@ -38,7 +39,7 @@ describe('Terrain', () => { height: 1, pixelRatio: 1, transform: {center: {lng: 0}}, - maybeDrawDepthAndCoords: jest.fn(), + maybeDrawDepthAndCoords: vi.fn(), } as any as Painter; const sourceCache = {} as SourceCache; const getTileByID = (tileID) : Tile => { @@ -72,7 +73,7 @@ describe('Terrain', () => { context: new Context(gl), width: WORLD_WIDTH, height: 1, - maybeDrawDepthAndCoords: jest.fn(), + maybeDrawDepthAndCoords: vi.fn(), pixelRatio, } as any as Painter; const sourceCache = {} as SourceCache; @@ -88,7 +89,7 @@ describe('Terrain', () => { }; terrain.getElevation = () => 0; terrain.coordsIndex = Object.keys(tileIdsToWraps); - jest.spyOn(gl, 'readPixels').mockImplementation((x, _2, _3, _4, _5, _6, rgba) => { + vi.spyOn(gl, 'readPixels').mockImplementation((x, _2, _3, _4, _5, _6, rgba) => { rgba[0] = 0; rgba[1] = 0; rgba[2] = 0; diff --git a/src/render/uniform_binding.test.ts b/src/render/uniform_binding.test.ts index a80a15e3fe..164a479fd8 100644 --- a/src/render/uniform_binding.test.ts +++ b/src/render/uniform_binding.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {mat4} from 'gl-matrix'; import {Context} from '../gl/context'; import { diff --git a/src/render/update_pattern_positions_in_program.test.ts b/src/render/update_pattern_positions_in_program.test.ts index c390ffc136..84a20626a2 100644 --- a/src/render/update_pattern_positions_in_program.test.ts +++ b/src/render/update_pattern_positions_in_program.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {Tile} from '../source/tile'; import {OverscaledTileID} from '../source/tile_id'; import {updatePatternPositionsInProgram} from './update_pattern_positions_in_program'; @@ -17,7 +18,7 @@ interface MockProgramConfiguration extends ProgramConfiguration { function constructMockProgramConfiguration(): MockProgramConfiguration { const mockProgramConfiguration: MockProgramConfiguration = {patternPositions: {}} as any; - mockProgramConfiguration.updatePaintBuffers = jest.fn(); + mockProgramConfiguration.updatePaintBuffers = vi.fn(); mockProgramConfiguration.setConstantPatternPositions = (posFrom: ImagePosition, posTo: ImagePosition) => { // this does not exist on ProgramConfiguration but we want to test the resulting output mockProgramConfiguration.patternPositions = {posFrom: posFrom.paddedRect, posTo: posTo.paddedRect}; diff --git a/src/shaders/encode_attribute.test.ts b/src/shaders/encode_attribute.test.ts index e9c3794982..6be98881d8 100644 --- a/src/shaders/encode_attribute.test.ts +++ b/src/shaders/encode_attribute.test.ts @@ -1,3 +1,4 @@ +import {test, expect} from 'vitest'; import {packUint8ToFloat} from './encode_attribute'; test('packUint8ToFloat', () => { diff --git a/src/source/canvas_source.test.ts b/src/source/canvas_source.test.ts index 5b52861920..6ab2f7ba4e 100644 --- a/src/source/canvas_source.test.ts +++ b/src/source/canvas_source.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {CanvasSource} from '../source/canvas_source'; import {IReadonlyTransform} from '../geo/transform_interface'; import {Event, Evented} from '../util/evented'; @@ -70,7 +71,7 @@ describe('CanvasSource', () => { })); test('self-validates', () => { - const stub = jest.spyOn(console, 'error').mockImplementation(() => {}); + const stub = vi.spyOn(console, 'error').mockImplementation(() => {}); createSource({coordinates: []}); expect(stub).toHaveBeenCalled(); stub.mockReset(); @@ -197,7 +198,7 @@ describe('CanvasSource', () => { }); -describe('CanvasSource#serialize', () => { +test('CanvasSource#serialize', () => { const source = createSource(); const serialized = source.serialize(); diff --git a/src/source/geojson_source.test.ts b/src/source/geojson_source.test.ts index 1ad4b27958..3a7b917a57 100644 --- a/src/source/geojson_source.test.ts +++ b/src/source/geojson_source.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {Tile} from './tile'; import {OverscaledTileID} from './tile_id'; import {GeoJSONSource, GeoJSONSourceOptions} from './geojson_source'; @@ -64,7 +65,7 @@ describe('GeoJSONSource#constructor', () => { } } as any; test('warn if maxzoom <= clusterMaxZoom', () => { - const warn = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); const source = new GeoJSONSource('id', {data: hawkHill, maxzoom: 4, clusterMaxZoom: 4} as GeoJSONSourceOptions, mockDispatcher, undefined); source.map = mapStub; @@ -302,7 +303,7 @@ describe('GeoJSONSource#update', () => { })); test('forwards Supercluster options with worker request, ignore max zoom of source', () => new Promise(done => { - jest.spyOn(console, 'warn').mockImplementation(() => {}); + vi.spyOn(console, 'warn').mockImplementation(() => {}); const mockDispatcher = wrapDispatcher({ sendAsync(message) { expect(message.type).toBe(MessageType.loadData); @@ -336,7 +337,7 @@ describe('GeoJSONSource#update', () => { transformRequest: (url) => { return {url}; } } } as any; - const transformSpy = jest.spyOn(mapStub._requestManager, 'transformRequest'); + const transformSpy = vi.spyOn(mapStub._requestManager, 'transformRequest'); const source = new GeoJSONSource('id', {data: 'https://example.com/data.geojson'} as GeoJSONSourceOptions, mockDispatcher, undefined); source.onAdd(mapStub); expect(transformSpy).toHaveBeenCalledTimes(1); diff --git a/src/source/geojson_source_diff.test.ts b/src/source/geojson_source_diff.test.ts index 6625b69222..faa03e2a6b 100644 --- a/src/source/geojson_source_diff.test.ts +++ b/src/source/geojson_source_diff.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect} from 'vitest'; import {setPerformance} from '../util/test/util'; import {type GeoJSONFeatureId, isUpdateableGeoJSON, toUpdateable, applySourceDiff} from './geojson_source_diff'; diff --git a/src/source/geojson_worker_source.test.ts b/src/source/geojson_worker_source.test.ts index 7d7d1d94ae..96b92715bf 100644 --- a/src/source/geojson_worker_source.test.ts +++ b/src/source/geojson_worker_source.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {GeoJSONWorkerSource, LoadGeoJSONParameters} from './geojson_worker_source'; import {StyleLayerIndex} from '../style/style_layer_index'; import {OverscaledTileID} from './tile_id'; @@ -25,7 +26,7 @@ describe('reloadTile', () => { ] as LayerSpecification[]; const layerIndex = new StyleLayerIndex(layers); const source = new GeoJSONWorkerSource(actor, layerIndex, []); - const spy = jest.spyOn(source, 'loadVectorTile'); + const spy = vi.spyOn(source, 'loadVectorTile'); const geoJson = { 'type': 'Feature', 'geometry': { @@ -106,7 +107,7 @@ describe('resourceTiming', () => { secureConnectionStart: 0 } as any as PerformanceEntry; - window.performance.getEntriesByName = jest.fn().mockReturnValue([exampleResourceTiming]); + window.performance.getEntriesByName = vi.fn().mockReturnValue([exampleResourceTiming]); const layerIndex = new StyleLayerIndex(layers); const source = new GeoJSONWorkerSource(actor, layerIndex, []); @@ -121,12 +122,12 @@ describe('resourceTiming', () => { const sampleMarks = [100, 350]; const marks = {}; const measures = {}; - window.performance.getEntriesByName = jest.fn().mockImplementation((name) => { return measures[name] || []; }); - jest.spyOn(perf, 'mark').mockImplementation((name) => { + window.performance.getEntriesByName = vi.fn().mockImplementation((name) => { return measures[name] || []; }); + vi.spyOn(perf, 'mark').mockImplementation((name) => { marks[name] = sampleMarks.shift(); return null; }); - window.performance.measure = jest.fn().mockImplementation((name, start, end) => { + window.performance.measure = vi.fn().mockImplementation((name, start, end) => { measures[name] = measures[name] || []; measures[name].push({ duration: marks[end] - marks[start], @@ -136,8 +137,8 @@ describe('resourceTiming', () => { }); return null; }); - jest.spyOn(perf, 'clearMarks').mockImplementation(() => { return null; }); - jest.spyOn(perf, 'clearMeasures').mockImplementation(() => { return null; }); + vi.spyOn(perf, 'clearMarks').mockImplementation(() => { return null; }); + vi.spyOn(perf, 'clearMeasures').mockImplementation(() => { return null; }); const layerIndex = new StyleLayerIndex(layers); const source = new GeoJSONWorkerSource(actor, layerIndex, []); diff --git a/src/source/geojson_wrapper.test.ts b/src/source/geojson_wrapper.test.ts index b0f37a28a3..904dce4949 100644 --- a/src/source/geojson_wrapper.test.ts +++ b/src/source/geojson_wrapper.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {GeoJSONWrapper} from './geojson_wrapper'; describe('geojsonwrapper', () => { diff --git a/src/source/image_source.test.ts b/src/source/image_source.test.ts index 89055418e5..e0daed2092 100644 --- a/src/source/image_source.test.ts +++ b/src/source/image_source.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {ImageSource} from './image_source'; import {Evented} from '../util/evented'; import {IReadonlyTransform} from '../geo/transform_interface'; @@ -74,7 +75,7 @@ describe('ImageSource', () => { test('transforms url request', () => { const source = createSource({url: '/image.png'}); const map = new StubMap() as any; - const spy = jest.spyOn(map._requestManager, 'transformRequest'); + const spy = vi.spyOn(map._requestManager, 'transformRequest'); source.onAdd(map); server.respond(); expect(spy).toHaveBeenCalledTimes(1); @@ -85,7 +86,7 @@ describe('ImageSource', () => { test('updates url from updateImage', () => { const source = createSource({url: '/image.png'}); const map = new StubMap() as any; - const spy = jest.spyOn(map._requestManager, 'transformRequest'); + const spy = vi.spyOn(map._requestManager, 'transformRequest'); source.onAdd(map); server.respond(); expect(spy).toHaveBeenCalledTimes(1); @@ -201,7 +202,7 @@ describe('ImageSource', () => { map.on('error', () => {}); source.onAdd(map); - const spy = jest.spyOn(server.requests[0] as any, 'abort'); + const spy = vi.spyOn(server.requests[0] as any, 'abort'); source.updateImage({url: '/image2.png'}); expect(spy).toHaveBeenCalled(); diff --git a/src/source/query_features.test.ts b/src/source/query_features.test.ts index 08897a59b2..1ec783fdab 100644 --- a/src/source/query_features.test.ts +++ b/src/source/query_features.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import { queryRenderedFeatures, querySourceFeatures diff --git a/src/source/raster_dem_tile_source.test.ts b/src/source/raster_dem_tile_source.test.ts index b913e9afa1..b5ba1ee316 100644 --- a/src/source/raster_dem_tile_source.test.ts +++ b/src/source/raster_dem_tile_source.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi, it} from 'vitest'; import {fakeServer, FakeServer} from 'nise'; import {RasterDEMTileSource} from './raster_dem_tile_source'; import {OverscaledTileID} from './tile_id'; @@ -40,7 +41,7 @@ describe('RasterDEMTileSource', () => { tiles: ['http://example.com/{z}/{x}/{y}.pngraw'], bounds: [-47, -7, -45, -5] })); - const transformSpy = jest.fn().mockImplementation((url) => { + const transformSpy = vi.fn().mockImplementation((url) => { return {url}; }); @@ -60,7 +61,7 @@ describe('RasterDEMTileSource', () => { bounds: [-47, -7, -45, -5] })); const source = createSource({url: '/source.json'}); - const transformSpy = jest.spyOn(source.map._requestManager, 'transformRequest'); + const transformSpy = vi.spyOn(source.map._requestManager, 'transformRequest'); const promise = waitForMetadataEvent(source); server.respond(); await promise; diff --git a/src/source/raster_dem_tile_worker_source.test.ts b/src/source/raster_dem_tile_worker_source.test.ts index f76e2e68a5..a63c6df1ea 100644 --- a/src/source/raster_dem_tile_worker_source.test.ts +++ b/src/source/raster_dem_tile_worker_source.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {RasterDEMTileWorkerSource} from './raster_dem_tile_worker_source'; import {DEMData} from '../data/dem_data'; import {WorkerDEMTileParameters} from './worker_source'; diff --git a/src/source/raster_tile_source.test.ts b/src/source/raster_tile_source.test.ts index be8346886a..2673cf2b6e 100644 --- a/src/source/raster_tile_source.test.ts +++ b/src/source/raster_tile_source.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi, it} from 'vitest'; import {RasterTileSource} from './raster_tile_source'; import {OverscaledTileID} from './tile_id'; import {RequestManager} from '../util/request_manager'; @@ -39,7 +40,7 @@ describe('RasterTileSource', () => { tiles: ['http://example.com/{z}/{x}/{y}.png'], bounds: [-47, -7, -45, -5] })); - const transformSpy = jest.fn().mockImplementation((url) => { + const transformSpy = vi.fn().mockImplementation((url) => { return {url}; }); @@ -113,7 +114,7 @@ describe('RasterTileSource', () => { bounds: [-47, -7, -45, -5] })); const source = createSource({url: '/source.json'}); - const transformSpy = jest.spyOn(source.map._requestManager, 'transformRequest'); + const transformSpy = vi.spyOn(source.map._requestManager, 'transformRequest'); source.on('data', (e) => { if (e.sourceDataType === 'metadata') { const tile = { @@ -145,7 +146,7 @@ describe('RasterTileSource', () => { source.map.painter = {context: {}, getTileTexture: () => { return {update: () => {}}; }} as any; source.map._refreshExpiredTiles = false; - const imageConstructorSpy = jest.spyOn(global, 'Image'); + const imageConstructorSpy = vi.spyOn(global, 'Image'); source.on('data', (e) => { if (e.sourceDataType === 'metadata') { const tile = { diff --git a/src/source/rtl_text_plugin_main_thread.test.ts b/src/source/rtl_text_plugin_main_thread.test.ts index 22e4fb62cd..7ec1ff21c2 100644 --- a/src/source/rtl_text_plugin_main_thread.test.ts +++ b/src/source/rtl_text_plugin_main_thread.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, it, afterEach, expect, vi} from 'vitest'; import {FakeServer, fakeServer} from 'nise'; import {rtlMainThreadPluginFactory} from './rtl_text_plugin_main_thread'; import {sleep} from '../util/test/util'; @@ -9,7 +10,7 @@ const rtlMainThreadPlugin = rtlMainThreadPluginFactory(); describe('RTLMainThreadPlugin', () => { let server: FakeServer; - let broadcastSpy: jest.SpyInstance; + let broadcastSpy: ReturnType; const url = 'http://example.com/plugin'; const failedToLoadMessage = `RTL Text Plugin failed to import scripts from ${url}`; const SyncRTLPluginStateMessageName = MessageType.syncRTLPluginState; @@ -19,7 +20,7 @@ describe('RTLMainThreadPlugin', () => { global.fetch = null; // Reset the singleton instance before each test rtlMainThreadPlugin.clearRTLTextPlugin(); - broadcastSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(() => { return Promise.resolve({} as any); }); + broadcastSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(() => { return Promise.resolve({} as any); }); }); function broadcastMockSuccess(message: MessageType, payload: PluginState): Promise { @@ -67,7 +68,7 @@ describe('RTLMainThreadPlugin', () => { }); it('should set the RTL text plugin and download it', async () => { - broadcastSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccess as any); + broadcastSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccess as any); await rtlMainThreadPlugin.setRTLTextPlugin(url); expect(rtlMainThreadPlugin.url).toEqual(url); expect(rtlMainThreadPlugin.status).toBe('loaded'); @@ -85,13 +86,13 @@ describe('RTLMainThreadPlugin', () => { }); it('should throw if the plugin url is not set', async () => { - const spy = jest.spyOn(browser, 'resolveURL').mockImplementation(() => { return ''; }); + const spy = vi.spyOn(browser, 'resolveURL').mockImplementation(() => { return ''; }); await expect(rtlMainThreadPlugin.setRTLTextPlugin(null)).rejects.toThrow('requested url null is invalid'); spy.mockRestore(); }); it('should be in error state if download fails', async () => { - broadcastSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockFailure as any); + broadcastSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockFailure as any); const resultPromise = rtlMainThreadPlugin.setRTLTextPlugin(url); await expect(resultPromise).rejects.toBe(failedToLoadMessage); expect(rtlMainThreadPlugin.url).toEqual(url); @@ -100,7 +101,7 @@ describe('RTLMainThreadPlugin', () => { it('should lazy load the plugin if deferred', async () => { // use success spy to make sure test case does not throw exception - const deferredSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccessDefer as any); + const deferredSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccessDefer as any); await rtlMainThreadPlugin.setRTLTextPlugin(url, true); expect(deferredSpy).toHaveBeenCalledTimes(1); expect(deferredSpy).toHaveBeenCalledWith(SyncRTLPluginStateMessageName, {pluginStatus: 'deferred', pluginURL: url}); @@ -108,7 +109,7 @@ describe('RTLMainThreadPlugin', () => { deferredSpy.mockRestore(); // this is really a fire and forget - broadcastSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccess as any); + broadcastSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccess as any); rtlMainThreadPlugin.lazyLoad(); await sleep(1); @@ -134,7 +135,7 @@ describe('RTLMainThreadPlugin', () => { }); it('should immediately download if RTL plugin was already requested, ignoring deferred:true', async () => { - broadcastSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccess as any); + broadcastSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccess as any); rtlMainThreadPlugin.lazyLoad(); expect(rtlMainThreadPlugin.status).toBe('requested'); await sleep(1); @@ -153,14 +154,14 @@ describe('RTLMainThreadPlugin', () => { }); it('should be in error state if lazyLoad fails', async () => { - broadcastSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccessDefer); + broadcastSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockSuccessDefer); const resultPromise = rtlMainThreadPlugin.setRTLTextPlugin(url, true); await expect(resultPromise).resolves.toBeUndefined(); expect(rtlMainThreadPlugin.status).toBe('deferred'); // the next one should fail - broadcastSpy = jest.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockFailure as any); + broadcastSpy = vi.spyOn(Dispatcher.prototype, 'broadcast').mockImplementation(broadcastMockFailure as any); await expect(rtlMainThreadPlugin._requestImport()).rejects.toBe(failedToLoadMessage); expect(rtlMainThreadPlugin.url).toEqual(url); diff --git a/src/source/rtl_text_plugin_worker.test.ts b/src/source/rtl_text_plugin_worker.test.ts index 39993aed4e..4a7de367d9 100644 --- a/src/source/rtl_text_plugin_worker.test.ts +++ b/src/source/rtl_text_plugin_worker.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, describe, expect, test, vi} from 'vitest'; import {PluginState} from './rtl_text_plugin_status'; import {rtlWorkerPlugin} from './rtl_text_plugin_worker'; @@ -11,9 +12,9 @@ describe('RTLWorkerPlugin', () => { test('should throw if already parsed', () => { const rtlTextPlugin = { - applyArabicShaping: jest.fn(), - processBidirectionalText: jest.fn(), - processStyledBidirectionalText: jest.fn(), + applyArabicShaping: vi.fn(), + processBidirectionalText: vi.fn(), + processStyledBidirectionalText: vi.fn(), }; rtlWorkerPlugin.setMethods(rtlTextPlugin); @@ -31,7 +32,7 @@ describe('RTLWorkerPlugin', () => { pluginStatus: 'deferred' }; - await rtlWorkerPlugin.syncState(mockMessage, jest.fn()); + await rtlWorkerPlugin.syncState(mockMessage, vi.fn()); expect(rtlWorkerPlugin.getRTLTextPluginStatus()).toBe('deferred'); }); @@ -41,16 +42,16 @@ describe('RTLWorkerPlugin', () => { rtlWorkerPlugin.pluginURL = originalUrl; rtlWorkerPlugin.pluginStatus = 'loaded'; rtlWorkerPlugin.setMethods({ - applyArabicShaping: jest.fn(), - processBidirectionalText: jest.fn(), - processStyledBidirectionalText: jest.fn(), + applyArabicShaping: vi.fn(), + processBidirectionalText: vi.fn(), + processStyledBidirectionalText: vi.fn(), }); const mockMessage: PluginState = { pluginURL: 'https://somehost/somescript2', pluginStatus: 'loading' }; - const workerResult: PluginState = await await rtlWorkerPlugin.syncState(mockMessage, jest.fn()); + const workerResult: PluginState = await await rtlWorkerPlugin.syncState(mockMessage, vi.fn()); expect(rtlWorkerPlugin.getRTLTextPluginStatus()).toBe('loaded'); expect(rtlWorkerPlugin.pluginURL).toBe(originalUrl); @@ -61,11 +62,11 @@ describe('RTLWorkerPlugin', () => { test('should do a full cycle of rtl loading synchronously', async () => { const originalUrl = 'https://somehost/somescript1'; - const loadScriptsMock = jest.fn().mockImplementation((_) => { + const loadScriptsMock = vi.fn().mockImplementation((_) => { rtlWorkerPlugin.setMethods({ - applyArabicShaping: jest.fn(), - processBidirectionalText: jest.fn(), - processStyledBidirectionalText: jest.fn(), + applyArabicShaping: vi.fn(), + processBidirectionalText: vi.fn(), + processStyledBidirectionalText: vi.fn(), }); }); @@ -82,12 +83,12 @@ describe('RTLWorkerPlugin', () => { test('should do a full cycle of rtl loading asynchronously', async () => { const originalUrl = 'https://somehost/somescript1'; - const loadScriptsMock = jest.fn().mockImplementation((_) => { + const loadScriptsMock = vi.fn().mockImplementation((_) => { setTimeout(() => { rtlWorkerPlugin.setMethods({ - applyArabicShaping: jest.fn(), - processBidirectionalText: jest.fn(), - processStyledBidirectionalText: jest.fn(), + applyArabicShaping: vi.fn(), + processBidirectionalText: vi.fn(), + processStyledBidirectionalText: vi.fn(), }); }, 10); }); @@ -105,7 +106,7 @@ describe('RTLWorkerPlugin', () => { test('should fail loading on timeout', async () => { const originalUrl = 'https://somehost/somescript1'; - const loadScriptsMock = jest.fn().mockImplementation(() => {}); + const loadScriptsMock = vi.fn().mockImplementation(() => {}); (rtlWorkerPlugin as any).TIMEOUT = 1; diff --git a/src/source/source.test.ts b/src/source/source.test.ts index 7f6592b85e..3163fdf0ff 100644 --- a/src/source/source.test.ts +++ b/src/source/source.test.ts @@ -1,12 +1,13 @@ +import {describe, test, expect, vi} from 'vitest'; import {Dispatcher} from '../util/dispatcher'; import {SourceClass, addSourceType, create} from './source'; describe('addSourceType', () => { test('adds factory function without a worker url does not dispatch to worker', async () => { - const sourceType = jest.fn().mockImplementation(function (id) { this.id = id; }) as SourceClass; + const sourceType = vi.fn().mockImplementation(function (id) { this.id = id; }) as SourceClass; // expect no call to load worker source - const spy = jest.spyOn(Dispatcher.prototype, 'broadcast'); + const spy = vi.spyOn(Dispatcher.prototype, 'broadcast'); await addSourceType('foo', sourceType); expect(spy).not.toHaveBeenCalled(); @@ -16,10 +17,10 @@ describe('addSourceType', () => { }); test('create a custom source without an id throws', async () => { - const sourceType = jest.fn() as SourceClass; + const sourceType = vi.fn() as SourceClass; // expect no call to load worker source - const spy = jest.spyOn(Dispatcher.prototype, 'broadcast'); + const spy = vi.spyOn(Dispatcher.prototype, 'broadcast'); await addSourceType('foo2', sourceType); expect(spy).not.toHaveBeenCalled(); diff --git a/src/source/source_cache.test.ts b/src/source/source_cache.test.ts index 2810efbd69..ef0dd0f070 100644 --- a/src/source/source_cache.test.ts +++ b/src/source/source_cache.test.ts @@ -1,3 +1,4 @@ +import {describe, afterEach, test, expect, vi} from 'vitest'; import {SourceCache} from './source_cache'; import {Map} from '../ui/map'; import {Source, addSourceType} from './source'; @@ -99,7 +100,7 @@ function createSourceCache(options?, used?) { } afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); describe('SourceCache#addTile', () => { @@ -135,7 +136,7 @@ describe('SourceCache#addTile', () => { expect(updateFeaturesSpy).toHaveBeenCalledTimes(1); done(); }); - updateFeaturesSpy = jest.spyOn(tile, 'setFeatureState'); + updateFeaturesSpy = vi.spyOn(tile, 'setFeatureState'); tile.state = 'loaded'; }; sourceCache.onAdd(undefined); @@ -179,7 +180,7 @@ describe('SourceCache#addTile', () => { sourceCache.updateCacheSize(tr); const tile = sourceCache._addTile(tileID); - const updateFeaturesSpy = jest.spyOn(tile, 'setFeatureState'); + const updateFeaturesSpy = vi.spyOn(tile, 'setFeatureState'); sourceCache._removeTile(tileID.key); sourceCache._addTile(tileID); @@ -292,7 +293,7 @@ describe('SourceCache#removeTile', () => { sourceCache._source.loadTile = async (tile) => { tile.state = 'loaded'; }; - sourceCache._source.unloadTile = jest.fn(); + sourceCache._source.unloadTile = vi.fn(); const tr = new MercatorTransform(); tr.resize(512, 512); @@ -362,14 +363,14 @@ describe('SourceCache#removeTile', () => { }; const tileID = new OverscaledTileID(0, 0, 0, 0, 0); sourceCache._addTile(tileID); - const onAbort = jest.fn(); + const onAbort = vi.fn(); sourceCache.once('dataabort', onAbort); sourceCache._removeTile(tileID.key); expect(onAbort).toHaveBeenCalledTimes(0); }); test('does not fire data event when the tile has already been aborted', () => { - const onData = jest.fn(); + const onData = vi.fn(); const sourceCache = createSourceCache(); sourceCache._source.loadTile = async (tile) => { sourceCache.once('dataabort', () => { @@ -513,7 +514,7 @@ describe('SourceCache / Source lifecycle', () => { tile.state = tile.tileID.canonical.z === 1 ? 'errored' : 'loaded'; }; - const reloadTileSpy = jest.spyOn(sourceCache, '_reloadTile'); + const reloadTileSpy = vi.spyOn(sourceCache, '_reloadTile'); sourceCache.on('data', (e) => { if (e.dataType === 'source' && e.sourceDataType === 'metadata') { sourceCache.update(transform); @@ -539,7 +540,7 @@ describe('SourceCache / Source lifecycle', () => { tile.state = tile.tileID.canonical.z === 1 ? 'errored' : 'loaded'; }; - const reloadTileSpy = jest.spyOn(sourceCache, '_reloadTile'); + const reloadTileSpy = vi.spyOn(sourceCache, '_reloadTile'); sourceCache.on('data', (e) => { if (e.dataType === 'source' && e.sourceDataType === 'metadata') { sourceCache.update(transform); @@ -807,7 +808,7 @@ describe('SourceCache#update', () => { const start = Date.now(); let time = start; - jest.spyOn(browser, 'now').mockImplementation(() => time); + vi.spyOn(browser, 'now').mockImplementation(() => time); const sourceCache = createSourceCache(); sourceCache._source.loadTile = async (tile) => { @@ -917,7 +918,7 @@ describe('SourceCache#_updateRetainedTiles', () => { tile.state = stateCache[tile.tileID.key] || 'errored'; }; - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); const idealTile = new OverscaledTileID(1, 0, 1, 1, 1); stateCache[idealTile.key] = 'loaded'; sourceCache._updateRetainedTiles([idealTile], 1); @@ -969,8 +970,8 @@ describe('SourceCache#_updateRetainedTiles', () => { tile.state = stateCache[tile.tileID.key] || 'errored'; }; - jest.spyOn(sourceCache, '_addTile'); - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + vi.spyOn(sourceCache, '_addTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); const idealTiles = [new OverscaledTileID(1, 0, 1, 1, 1), new OverscaledTileID(1, 0, 1, 0, 1)]; stateCache[idealTiles[0].key] = 'loaded'; @@ -1005,8 +1006,8 @@ describe('SourceCache#_updateRetainedTiles', () => { sourceCache._tiles[new OverscaledTileID(1, 0, 1, 1, 0).key] = new Tile(new OverscaledTileID(1, 0, 1, 1, 0), undefined); sourceCache._tiles[new OverscaledTileID(1, 0, 1, 1, 0).key].state = 'loaded'; - const addTileSpy = jest.spyOn(sourceCache, '_addTile'); - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const addTileSpy = vi.spyOn(sourceCache, '_addTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); sourceCache._updateRetainedTiles([idealTile], 2); expect(getTileSpy.mock.calls.map((c) => { return c[0]; })).toEqual([ @@ -1036,8 +1037,8 @@ describe('SourceCache#_updateRetainedTiles', () => { sourceCache._tiles[parentTile.key] = new Tile(parentTile, undefined); sourceCache._tiles[parentTile.key].state = 'loaded'; - const addTileSpy = jest.spyOn(sourceCache, '_addTile'); - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const addTileSpy = vi.spyOn(sourceCache, '_addTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); const retained = sourceCache._updateRetainedTiles([idealTile], 1); @@ -1080,7 +1081,7 @@ describe('SourceCache#_updateRetainedTiles', () => { sourceCache._tiles[t.key].state = 'loaded'; }); - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); const retained = sourceCache._updateRetainedTiles([idealTile], 2); // parent tile isn't requested because all covering children are loaded expect(getTileSpy).not.toHaveBeenCalled(); @@ -1099,7 +1100,7 @@ describe('SourceCache#_updateRetainedTiles', () => { sourceCache._tiles[t.key].state = 'loaded'; }); - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); let retained = sourceCache._updateRetainedTiles([idealTile], 1); expect(getTileSpy.mock.calls.map((c) => { return c[0]; })).toEqual([ // parent @@ -1143,7 +1144,7 @@ describe('SourceCache#_updateRetainedTiles', () => { sourceCache._tiles[t.key].state = 'loaded'; }); - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); const retained = sourceCache._updateRetainedTiles([idealTile], 2); sleep(10); @@ -1164,7 +1165,7 @@ describe('SourceCache#_updateRetainedTiles', () => { }; const idealTile = new OverscaledTileID(2, 0, 2, 0, 0); - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); const retained = sourceCache._updateRetainedTiles([idealTile], 2); expect(getTileSpy.mock.calls.map((c) => { return c[0]; })).toEqual([ @@ -1189,7 +1190,7 @@ describe('SourceCache#_updateRetainedTiles', () => { }; const idealTiles = [new OverscaledTileID(8, 0, 8, 0, 0), new OverscaledTileID(8, 0, 8, 1, 0)]; - const getTileSpy = jest.spyOn(sourceCache, 'getTile'); + const getTileSpy = vi.spyOn(sourceCache, 'getTile'); sourceCache._updateRetainedTiles(idealTiles, 8); expect(getTileSpy.mock.calls.map((c) => { return c[0]; })).toEqual([ // parent tile ascent @@ -1978,7 +1979,7 @@ describe('SourceCache sets max cache size correctly', () => { describe('SourceCache#onRemove', () => { test('clears tiles', () => { const sourceCache = createSourceCache(); - jest.spyOn(sourceCache, 'clearTiles'); + vi.spyOn(sourceCache, 'clearTiles'); sourceCache.onRemove(undefined); @@ -1986,7 +1987,7 @@ describe('SourceCache#onRemove', () => { }); test('calls onRemove on source', () => { - const sourceOnRemove = jest.fn(); + const sourceOnRemove = vi.fn(); const sourceCache = createSourceCache({ onRemove: sourceOnRemove }); diff --git a/src/source/terrain_source_cache.test.ts b/src/source/terrain_source_cache.test.ts index 0671907e20..01479f6f9c 100644 --- a/src/source/terrain_source_cache.test.ts +++ b/src/source/terrain_source_cache.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeAll, afterAll, test, expect} from 'vitest'; import {TerrainSourceCache} from './terrain_source_cache'; import {Style} from '../style/style'; import {RequestManager} from '../util/request_manager'; diff --git a/src/source/tile.test.ts b/src/source/tile.test.ts index 1fcf9da0e9..b955ca575f 100644 --- a/src/source/tile.test.ts +++ b/src/source/tile.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {createSymbolBucket} from '../../test/unit/lib/create_symbol_layer'; import {Tile} from '../source/tile'; import {GeoJSONWrapper, Feature} from '../source/geojson_wrapper'; @@ -101,7 +102,7 @@ describe('querySourceFeatures', () => { test('loadVectorData unloads existing data before overwriting it', () => { const tile = new Tile(new OverscaledTileID(1, 0, 1, 1, 1), undefined); tile.state = 'loaded'; - const spy = jest.spyOn(tile, 'unloadVectorData'); + const spy = vi.spyOn(tile, 'unloadVectorData'); const painter = {}; tile.loadVectorData(null, painter); diff --git a/src/source/tile.ts b/src/source/tile.ts index 1727cfece9..a4374b31b4 100644 --- a/src/source/tile.ts +++ b/src/source/tile.ts @@ -179,7 +179,7 @@ export class Tile { } } this.collisionBoxArray = data.collisionBoxArray; - this.buckets = deserializeBucket(data.buckets, painter.style); + this.buckets = deserializeBucket(data.buckets, painter?.style); this.hasSymbolBuckets = false; for (const id in this.buckets) { diff --git a/src/source/tile_cache.test.ts b/src/source/tile_cache.test.ts index 4a6173653b..ab11f14fd9 100644 --- a/src/source/tile_cache.test.ts +++ b/src/source/tile_cache.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {Tile} from './tile'; import {TileCache} from './tile_cache'; import {OverscaledTileID} from './tile_id'; diff --git a/src/source/tile_id.test.ts b/src/source/tile_id.test.ts index bfbb31a689..9cef4e2f65 100644 --- a/src/source/tile_id.test.ts +++ b/src/source/tile_id.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {CanonicalTileID, OverscaledTileID} from '../source/tile_id'; import {MAX_TILE_ZOOM, MIN_TILE_ZOOM} from '../util/util'; diff --git a/src/source/vector_tile_source.test.ts b/src/source/vector_tile_source.test.ts index 3f62ec2321..acefd923e6 100644 --- a/src/source/vector_tile_source.test.ts +++ b/src/source/vector_tile_source.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {fakeServer, type FakeServer} from 'nise'; import {Source} from './source'; import {VectorTileSource} from './vector_tile_source'; @@ -77,7 +78,7 @@ describe('VectorTileSource', () => { test('transforms the request for TileJSON URL', () => { server.respondWith('/source.json', JSON.stringify(fixturesSource)); - const transformSpy = jest.fn().mockImplementation((url) => { + const transformSpy = vi.fn().mockImplementation((url) => { return {url}; }); @@ -173,7 +174,7 @@ describe('VectorTileSource', () => { server.respondWith('/source.json', JSON.stringify(fixturesSource)); const source = createSource({url: '/source.json'}); - const transformSpy = jest.spyOn(source.map._requestManager, 'transformRequest'); + const transformSpy = vi.spyOn(source.map._requestManager, 'transformRequest'); const promise = waitForMetadataEvent(source); server.respond(); await promise; @@ -206,7 +207,7 @@ describe('VectorTileSource', () => { const tile = { tileID: new OverscaledTileID(10, 0, 10, 5, 5), state: 'loading', - loadVectorData: jest.fn(), + loadVectorData: vi.fn(), setExpiryData() {} } as any as Tile; await source.loadTile(tile); @@ -228,7 +229,7 @@ describe('VectorTileSource', () => { const tile = { tileID: new OverscaledTileID(10, 0, 10, 5, 5), state: 'loading', - loadVectorData: jest.fn(), + loadVectorData: vi.fn(), setExpiryData() {} } as any as Tile; await expect(source.loadTile(tile)).rejects.toThrow('Error'); @@ -252,7 +253,7 @@ describe('VectorTileSource', () => { const tile = { tileID: new OverscaledTileID(10, 0, 10, 5, 5), state: 'loading', - loadVectorData: jest.fn(), + loadVectorData: vi.fn(), setExpiryData() {} } as any as Tile; await source.loadTile(tile); @@ -398,7 +399,7 @@ describe('VectorTileSource', () => { }); test('setTiles only clears the cache once the TileJSON has reloaded', async () => { - const clearTiles = jest.fn(); + const clearTiles = vi.fn(); const source = createSource({tiles: ['http://example.com/{z}/{x}/{y}.pbf']}, undefined, clearTiles); source.setTiles(['http://example2.com/{z}/{x}/{y}.pbf']); expect(clearTiles.mock.calls).toHaveLength(0); diff --git a/src/source/vector_tile_worker_source.test.ts b/src/source/vector_tile_worker_source.test.ts index ae56663964..d2d1c9e355 100644 --- a/src/source/vector_tile_worker_source.test.ts +++ b/src/source/vector_tile_worker_source.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import fs from 'fs'; import path from 'path'; import vt from '@mapbox/vector-tile'; @@ -24,7 +25,7 @@ describe('vector tile worker source', () => { afterEach(() => { server.restore(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); test('VectorTileWorkerSource#abortTile aborts pending request', async () => { const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []); @@ -64,7 +65,7 @@ describe('vector tile worker source', () => { test('VectorTileWorkerSource#reloadTile reloads a previously-loaded tile', async () => { const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []); - const parse = jest.fn().mockReturnValue(Promise.resolve({} as WorkerTileResult)); + const parse = vi.fn().mockReturnValue(Promise.resolve({} as WorkerTileResult)); source.loaded = { '0': { @@ -178,7 +179,7 @@ describe('vector tile worker source', () => { const source = new VectorTileWorkerSource(actor, layerIndex, []); source.loadVectorTile = loadVectorData; - const parseWorkerTileMock = jest + const parseWorkerTileMock = vi .spyOn(WorkerTile.prototype, 'parse') .mockImplementation(function(_data, _layerIndex, _availableImages, _actor) { this.status = 'parsing'; @@ -209,7 +210,7 @@ describe('vector tile worker source', () => { test('VectorTileWorkerSource#reloadTile does not reparse tiles with no vectorTile data but does call callback', async () => { const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []); - const parse = jest.fn(); + const parse = vi.fn(); source.loaded = { '0': { @@ -225,7 +226,7 @@ describe('vector tile worker source', () => { test('VectorTileWorkerSource#loadTile returns null for an empty tile', async () => { const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []); source.loadVectorTile = (_params, _abortController) => Promise.resolve(null); - const parse = jest.fn(); + const parse = vi.fn(); server.respondWith(request => { request.respond(200, {'Content-Type': 'application/pbf'}, 'something...'); @@ -246,7 +247,7 @@ describe('vector tile worker source', () => { test('VectorTileWorkerSource#returns a good error message when failing to parse a tile', () => new Promise(done => { const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []); - const parse = jest.fn(); + const parse = vi.fn(); server.respondWith(request => { request.respond(200, {'Content-Type': 'application/pbf'}, 'something...'); @@ -269,7 +270,7 @@ describe('vector tile worker source', () => { test('VectorTileWorkerSource#returns a good error message when failing to parse a gzipped tile', () => new Promise(done => { const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []); - const parse = jest.fn(); + const parse = vi.fn(); server.respondWith(new Uint8Array([0x1f, 0x8b]).buffer); @@ -331,7 +332,7 @@ describe('vector tile worker source', () => { const source = new VectorTileWorkerSource(actor, layerIndex, []); source.loadVectorTile = loadVectorData; - window.performance.getEntriesByName = jest.fn().mockReturnValue([exampleResourceTiming]); + window.performance.getEntriesByName = vi.fn().mockReturnValue([exampleResourceTiming]); const res = await source.loadTile({ source: 'source', @@ -369,12 +370,12 @@ describe('vector tile worker source', () => { const sampleMarks = [100, 350]; const marks = {}; const measures = {}; - window.performance.getEntriesByName = jest.fn().mockImplementation(name => (measures[name] || [])); - window.performance.mark = jest.fn().mockImplementation(name => { + window.performance.getEntriesByName = vi.fn().mockImplementation(name => (measures[name] || [])); + window.performance.mark = vi.fn().mockImplementation(name => { marks[name] = sampleMarks.shift(); return null; }); - window.performance.measure = jest.fn().mockImplementation((name, start, end) => { + window.performance.measure = vi.fn().mockImplementation((name, start, end) => { measures[name] = measures[name] || []; measures[name].push({ duration: marks[end] - marks[start], diff --git a/src/source/video_source.test.ts b/src/source/video_source.test.ts index 11fc9becc6..7851e656f9 100644 --- a/src/source/video_source.test.ts +++ b/src/source/video_source.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {VideoSource} from './video_source'; import {extend} from '../util/util'; import {getMockDispatcher} from '../util/test/util'; diff --git a/src/source/worker.test.ts b/src/source/worker.test.ts index a973ef797d..8edc3c98ee 100644 --- a/src/source/worker.test.ts +++ b/src/source/worker.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {fakeServer} from 'nise'; import Worker from './worker'; import {LayerSpecification} from '@maplibre/maplibre-gl-style-spec'; @@ -39,7 +40,7 @@ describe('Worker RTLTextPlugin', () => { }); test('should call setMethods in plugin', () => { - const spy = jest.spyOn(rtlWorkerPlugin, 'setMethods').mockImplementation(() => {}); + const spy = vi.spyOn(rtlWorkerPlugin, 'setMethods').mockImplementation(() => {}); _self.registerRTLTextPlugin({} as any); @@ -47,7 +48,7 @@ describe('Worker RTLTextPlugin', () => { }); test('should call syncState when rtl message is received', async () => { - const syncStateSpy = jest.spyOn(rtlWorkerPlugin, 'syncState').mockImplementation((_, __) => Promise.resolve({} as any)); + const syncStateSpy = vi.spyOn(rtlWorkerPlugin, 'syncState').mockImplementation((_, __) => Promise.resolve({} as any)); await worker.actor.messageHandlers[MessageType.syncRTLPluginState]('', {} as any) as any; diff --git a/src/source/worker_tile.test.ts b/src/source/worker_tile.test.ts index 0a6e4f6bae..c4d792752a 100644 --- a/src/source/worker_tile.test.ts +++ b/src/source/worker_tile.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {WorkerTile} from '../source/worker_tile'; import {GeoJSONWrapper, Feature} from '../source/geojson_wrapper'; import {OverscaledTileID} from '../source/tile_id'; @@ -81,7 +82,7 @@ describe('worker tile', () => { } } as any as VectorTile; - const spy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const spy = vi.spyOn(console, 'warn').mockImplementation(() => {}); const tile = createWorkerTile(); await tile.parse(data, layerIndex, [], {} as any, SubdivisionGranularitySetting.noSubdivision); @@ -132,7 +133,7 @@ describe('worker tile', () => { } } as any as VectorTile; - const sendAsync = jest.fn().mockImplementation((message: {type: string; data: any}) => { + const sendAsync = vi.fn().mockImplementation((message: {type: string; data: any}) => { const response = message.type === 'getImages' ? {'hello': {width: 1, height: 1, data: new Uint8Array([0])}} : {'StandardFont-Bold': {width: 1, height: 1, data: new Uint8Array([0])}}; @@ -195,7 +196,7 @@ describe('worker tile', () => { } as any as VectorTile; let cancelCount = 0; - const sendAsync = jest.fn().mockImplementation((message: {type: string; data: unknown}, abortController: AbortController) => { + const sendAsync = vi.fn().mockImplementation((message: {type: string; data: unknown}, abortController: AbortController) => { return new Promise((resolve, _reject) => { const res = setTimeout(() => { const response = message.type === 'getImages' ? diff --git a/src/style/format_section_override.test.ts b/src/style/format_section_override.test.ts index e2782c3511..4895d9b428 100644 --- a/src/style/format_section_override.test.ts +++ b/src/style/format_section_override.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {EvaluationContext, FormattedSection, createExpression, StyleExpression, ZoomConstantExpression} from '@maplibre/maplibre-gl-style-spec'; import properties from './style_layer/symbol_style_layer_properties.g'; import {PossiblyEvaluatedPropertyValue} from './properties'; diff --git a/src/style/light.test.ts b/src/style/light.test.ts index f022a7b966..ea3e98b0ea 100644 --- a/src/style/light.test.ts +++ b/src/style/light.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {Light} from './light'; import {Color, latest as styleSpec, LightSpecification} from '@maplibre/maplibre-gl-style-spec'; import {sphericalToCartesian} from '../util/util'; @@ -61,8 +62,8 @@ describe('Light#setLight', () => { test('validates by default', () => { const light = new Light({}); - const lightSpy = jest.spyOn(light, '_validate'); - jest.spyOn(console, 'error').mockImplementation(() => { }); + const lightSpy = vi.spyOn(light, '_validate'); + vi.spyOn(console, 'error').mockImplementation(() => { }); light.setLight({color: 'notacolor'}); light.updateTransitions({transition: false} as any as TransitionParameters); light.recalculate({zoom: 16, zoomHistory: {}, now: 10} as EvaluationParameters); @@ -74,7 +75,7 @@ describe('Light#setLight', () => { test('respects validation option', () => { const light = new Light({}); - const lightSpy = jest.spyOn(light, '_validate'); + const lightSpy = vi.spyOn(light, '_validate'); light.setLight({color: [999]} as any, {validate: false}); light.updateTransitions({transition: false} as any as TransitionParameters); light.recalculate({zoom: 16, zoomHistory: {}, now: 10} as EvaluationParameters); diff --git a/src/style/load_glyph_range.test.ts b/src/style/load_glyph_range.test.ts index f79334a301..9718120fb9 100644 --- a/src/style/load_glyph_range.test.ts +++ b/src/style/load_glyph_range.test.ts @@ -1,3 +1,4 @@ +import {test, expect, vi} from 'vitest'; import fs from 'fs'; import path from 'path'; import {RequestManager} from '../util/request_manager'; @@ -8,7 +9,7 @@ import {bufferToArrayBuffer} from '../util/test/util'; test('loadGlyphRange', async () => { global.fetch = null; - const transform = jest.fn().mockImplementation((url) => { + const transform = vi.fn().mockImplementation((url) => { return {url}; }); diff --git a/src/style/load_sprite.test.ts b/src/style/load_sprite.test.ts index b2ff73fda1..022521383d 100644 --- a/src/style/load_sprite.test.ts +++ b/src/style/load_sprite.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import fs from 'fs'; import path from 'path'; import {RequestManager} from '../util/request_manager'; @@ -38,7 +39,7 @@ describe('loadSprite', () => { let server: FakeServer; beforeEach(() => { - jest.spyOn(util, 'arrayBufferToImageBitmap').mockImplementation(async (_data: ArrayBuffer) => { + vi.spyOn(util, 'arrayBufferToImageBitmap').mockImplementation(async (_data: ArrayBuffer) => { try { const img = await createImageBitmap(new ImageData(1024, 824)); return img; @@ -51,7 +52,7 @@ describe('loadSprite', () => { }); test('backwards compatibility: single string is treated as a URL for the default sprite', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url, type}; }); @@ -82,7 +83,7 @@ describe('loadSprite', () => { }); test('transform of relative url', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url: `http://localhost:9966${url}`, type}; }); @@ -113,7 +114,7 @@ describe('loadSprite', () => { }); test('transform of random Sprite String', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url: 'http://localhost:9966/test/unit/assets/sprite1', type}; }); @@ -144,7 +145,7 @@ describe('loadSprite', () => { }); test('transform of relative URL', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url: `http://localhost:9966${url}`, type}; }); @@ -175,7 +176,7 @@ describe('loadSprite', () => { }); test('array of objects support', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url, type}; }); @@ -216,7 +217,7 @@ describe('loadSprite', () => { }); test('server returns error', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url, type}; }); @@ -231,7 +232,7 @@ describe('loadSprite', () => { }); test('request canceling', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url, type}; }); @@ -254,7 +255,7 @@ describe('loadSprite', () => { }); test('pixelRatio is respected', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url, type}; }); diff --git a/src/style/query_utils.test.ts b/src/style/query_utils.test.ts index 718412e9f7..cd3f7e74da 100644 --- a/src/style/query_utils.test.ts +++ b/src/style/query_utils.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {offsetLine} from './query_utils'; diff --git a/src/style/sky.test.ts b/src/style/sky.test.ts index e8cde2eb9c..fde916f975 100644 --- a/src/style/sky.test.ts +++ b/src/style/sky.test.ts @@ -2,6 +2,7 @@ import {Sky} from './sky'; import {latest as styleSpec, SkySpecification} from '@maplibre/maplibre-gl-style-spec'; import {EvaluationParameters} from './evaluation_parameters'; import {TransitionParameters} from './properties'; +import {describe, expect, test, vi} from 'vitest'; const spec = styleSpec.sky; @@ -60,8 +61,8 @@ describe('Sky#setSky', () => { test('validates by default', () => { const sky = new Sky({}); - const skySpy = jest.spyOn(sky, '_validate'); - jest.spyOn(console, 'error').mockImplementation(() => { }); + const skySpy = vi.spyOn(sky, '_validate'); + vi.spyOn(console, 'error').mockImplementation(() => { }); sky.setSky({'atmosphere-blend': -1}); sky.updateTransitions({transition: false} as any as TransitionParameters); sky.recalculate({zoom: 16, zoomHistory: {}, now: 10} as EvaluationParameters); @@ -73,7 +74,7 @@ describe('Sky#setSky', () => { test('respects validation option', () => { const sky = new Sky({}); - const skySpy = jest.spyOn(sky, '_validate'); + const skySpy = vi.spyOn(sky, '_validate'); sky.setSky({'atmosphere-blend': -1} as any, {validate: false}); sky.updateTransitions({transition: false} as any as TransitionParameters); sky.recalculate({zoom: 16, zoomHistory: {}, now: 10} as EvaluationParameters); diff --git a/src/style/style.test.ts b/src/style/style.test.ts index 81be874364..5b2f2a17bc 100644 --- a/src/style/style.test.ts +++ b/src/style/style.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {Style} from './style'; import {SourceCache} from '../source/source_cache'; import {StyleLayer} from './style_layer'; @@ -55,12 +56,12 @@ function createStyle(map = getStubMap()) { } let server: FakeServer; -let mockConsoleError: jest.SpyInstance; +let mockConsoleError: ReturnType; beforeEach(() => { global.fetch = null; server = fakeServer.create(); - mockConsoleError = jest.spyOn(console, 'error').mockImplementation(() => { }); + mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { }); }); afterEach(() => { @@ -93,8 +94,8 @@ describe('Style', () => { }); await style.once('style.load'); - jest.spyOn(style.sourceCaches['raster'], 'reload'); - jest.spyOn(style.sourceCaches['vector'], 'reload'); + vi.spyOn(style.sourceCaches['raster'], 'reload'); + vi.spyOn(style.sourceCaches['vector'], 'reload'); rtlMainThreadPluginFactory().fire(new Event(RTLPluginLoadedEventName)); @@ -106,7 +107,7 @@ describe('Style', () => { describe('Style#loadURL', () => { test('fires "dataloading"', () => { const style = new Style(getStubMap()); - const spy = jest.fn(); + const spy = vi.fn(); style.on('dataloading', spy); style.loadURL('style.json'); @@ -118,7 +119,7 @@ describe('Style#loadURL', () => { test('transforms style URL before request', () => { const map = getStubMap(); - const spy = jest.spyOn(map._requestManager, 'transformRequest'); + const spy = vi.spyOn(map._requestManager, 'transformRequest'); const style = new Style(map); style.loadURL('style.json'); @@ -151,7 +152,7 @@ describe('Style#loadURL', () => { test('does not fire an error if removed', async () => { const style = new Style(getStubMap()); - const spy = jest.fn(); + const spy = vi.fn(); style.on('error', spy); style.loadURL('style.json'); @@ -187,7 +188,7 @@ describe('Style#loadJSON', () => { test('fires "dataloading" (synchronously)', () => { const style = new Style(getStubMap()); - const spy = jest.fn(); + const spy = vi.fn(); style.on('dataloading', spy); style.loadJSON(createStyleJSON()); @@ -211,7 +212,7 @@ describe('Style#loadJSON', () => { // Stubbing to bypass Web APIs that supported by jsdom: // * `URL.createObjectURL` in ajax.getImage (https://github.com/tmpvar/jsdom/issues/1721) // * `canvas.getContext('2d')` in browser.getImageData - jest.spyOn(browser, 'getImageData'); + vi.spyOn(browser, 'getImageData'); // stub Image so we can invoke 'onload' // https://github.com/jsdom/jsdom/commit/58a7028d0d5b6aacc5b435daee9fd8f9eacbb14c @@ -245,7 +246,7 @@ describe('Style#loadJSON', () => { // Stubbing to bypass Web APIs that supported by jsdom: // * `URL.createObjectURL` in ajax.getImage (https://github.com/tmpvar/jsdom/issues/1721) // * `canvas.getContext('2d')` in browser.getImageData - jest.spyOn(browser, 'getImageData'); + vi.spyOn(browser, 'getImageData'); // stub Image so we can invoke 'onload' // https://github.com/jsdom/jsdom/commit/58a7028d0d5b6aacc5b435daee9fd8f9eacbb14c @@ -331,7 +332,7 @@ describe('Style#loadJSON', () => { test('transforms sprite json and image URLs before request', async () => { const map = getStubMap(); - const transformSpy = jest.spyOn(map._requestManager, 'transformRequest'); + const transformSpy = vi.spyOn(map._requestManager, 'transformRequest'); const style = createStyle(map); style.loadJSON(extend(createStyleJSON(), { @@ -403,7 +404,7 @@ describe('Style#loadJSON', () => { test('sets terrain if defined', async () => { const map = getStubMap(); const style = new Style(map); - map.setTerrain = jest.fn(); + map.setTerrain = vi.fn(); style.loadJSON(createStyleJSON({ sources: {'source-id': createGeoJSONSource()}, terrain: {source: 'source-id', exaggeration: 0.33} @@ -468,7 +469,7 @@ describe('Style#_load', () => { sprite: 'https://example.com/test2' }); - const _loadSpriteSpyOn = jest.spyOn(style, '_loadSprite'); + const _loadSpriteSpyOn = vi.spyOn(style, '_loadSprite'); style._load(nextStyleSpec, {}, prevStyleSpec); expect(_loadSpriteSpyOn).toHaveBeenCalledTimes(1); @@ -483,7 +484,7 @@ describe('Style#_load', () => { const nextStyleSpec = createStyleJSON({sprite: undefined}); - const _loadSpriteSpyOn = jest.spyOn(style, '_loadSprite'); + const _loadSpriteSpyOn = vi.spyOn(style, '_loadSprite'); style._load(nextStyleSpec, {}, prevStyleSpec); expect(_loadSpriteSpyOn).not.toHaveBeenCalled(); @@ -500,7 +501,7 @@ describe('Style#_load', () => { }] }); - const _broadcastSpyOn = jest.spyOn(style.dispatcher, 'broadcast') + const _broadcastSpyOn = vi.spyOn(style.dispatcher, 'broadcast') .mockImplementation((type, data) => { dispatchType = type; dispatchData = data; @@ -530,7 +531,7 @@ describe('Style#_load', () => { type: 'custom' }] }); - const stub = jest.spyOn(console, 'error'); + const stub = vi.spyOn(console, 'error'); style._load(styleSpec, {validate: true}); @@ -582,9 +583,9 @@ describe('Style#_remove', () => { await style.once('style.load'); const sourceCache = style.sourceCaches['source-id']; - jest.spyOn(sourceCache, 'setEventedParent'); - jest.spyOn(sourceCache, 'onRemove'); - jest.spyOn(sourceCache, 'clearTiles'); + vi.spyOn(sourceCache, 'setEventedParent'); + vi.spyOn(sourceCache, 'onRemove'); + vi.spyOn(sourceCache, 'clearTiles'); style._remove(); @@ -596,7 +597,7 @@ describe('Style#_remove', () => { test('deregisters plugin listener', async () => { const style = new Style(getStubMap()); style.loadJSON(createStyleJSON()); - jest.spyOn(rtlMainThreadPluginFactory(), 'off'); + vi.spyOn(rtlMainThreadPluginFactory(), 'off'); await style.once('style.load'); style._remove(); @@ -653,17 +654,17 @@ describe('Style#setState', () => { const style = createStyle(); style.loadJSON(createStyleJSON()); const spys = []; - spys.push(jest.spyOn(style, 'addLayer').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'removeLayer').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setPaintProperty').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLayoutProperty').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setFilter').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'addSource').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'removeSource').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setGeoJSONSourceData').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLayerZoomRange').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLight').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'addLayer').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'removeLayer').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setPaintProperty').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLayoutProperty').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setFilter').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'addSource').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'removeSource').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setGeoJSONSourceData').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLayerZoomRange').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLight').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); await style.once('style.load'); const didChange = style.setState(createStyleJSON()); expect(didChange).toBeFalsy(); @@ -701,21 +702,21 @@ describe('Style#setState', () => { await style.once('style.load'); const spys = []; - spys.push(jest.spyOn(style, 'addLayer').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'removeLayer').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setPaintProperty').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLayoutProperty').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setFilter').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'addSource').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'removeSource').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLayerZoomRange').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLight').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setGeoJSONSourceData').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setGlyphs').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setSprite').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setProjection').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style.map, 'setTerrain').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'addLayer').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'removeLayer').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setPaintProperty').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLayoutProperty').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setFilter').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'addSource').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'removeSource').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLayerZoomRange').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLight').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setGeoJSONSourceData').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setGlyphs').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setSprite').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setProjection').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style.map, 'setTerrain').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); const newStyle = JSON.parse(JSON.stringify(styleJson)) as StyleSpecification; newStyle.layers[0].paint = {'text-color': '#7F7F7F',}; @@ -765,20 +766,20 @@ describe('Style#setState', () => { await style.once('style.load'); const spys = []; - spys.push(jest.spyOn(style, 'addLayer').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'removeLayer').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setPaintProperty').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLayoutProperty').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setFilter').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'addSource').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'removeSource').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLayerZoomRange').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setLight').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setGeoJSONSourceData').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setGlyphs').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setSprite').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style.map, 'setTerrain').mockImplementation((() => {}) as any)); - spys.push(jest.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'addLayer').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'removeLayer').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setPaintProperty').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLayoutProperty').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setFilter').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'addSource').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'removeSource').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLayerZoomRange').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setLight').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setGeoJSONSourceData').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setGlyphs').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setSprite').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style.map, 'setTerrain').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); const newStyleJson = createStyleJSON(); newStyleJson.transition = {duration: 5}; @@ -803,8 +804,8 @@ describe('Style#setState', () => { const promise = style.once('style.load'); server.respond(); await promise; - const spyRemove = jest.spyOn(style, 'removeSource').mockImplementation((() => {}) as any); - const spyAdd = jest.spyOn(style, 'addSource').mockImplementation((() => {}) as any); + const spyRemove = vi.spyOn(style, 'removeSource').mockImplementation((() => {}) as any); + const spyAdd = vi.spyOn(style, 'addSource').mockImplementation((() => {}) as any); style.setState(initial); expect(spyRemove).not.toHaveBeenCalled(); expect(spyAdd).not.toHaveBeenCalled(); @@ -861,8 +862,8 @@ describe('Style#setState', () => { await style.once('style.load'); const geoJSONSource = style.sourceCaches['source-id'].getSource() as GeoJSONSource; - const mockStyleSetGeoJSONSourceDate = jest.spyOn(style, 'setGeoJSONSourceData'); - const mockGeoJSONSourceSetData = jest.spyOn(geoJSONSource, 'setData'); + const mockStyleSetGeoJSONSourceDate = vi.spyOn(style, 'setGeoJSONSourceData'); + const mockGeoJSONSourceSetData = vi.spyOn(geoJSONSource, 'setData'); const didChange = style.setState(nextState); expect(mockStyleSetGeoJSONSourceDate).toHaveBeenCalledWith('source-id', geoJSONSourceData); @@ -1040,7 +1041,7 @@ describe('Style#removeSource', () => { await style.once('style.load'); const sourceCache = style.sourceCaches['source-id']; - jest.spyOn(sourceCache, 'clearTiles'); + vi.spyOn(sourceCache, 'clearTiles'); style.removeSource('source-id'); expect(sourceCache.clearTiles).toHaveBeenCalledTimes(1); }); @@ -1734,7 +1735,7 @@ describe('Style#setPaintProperty', () => { (source as any).on('data', (e) => setTimeout(() => { if (!begun) { begun = true; - jest.spyOn(sourceCache, 'reload').mockImplementation(() => { + vi.spyOn(sourceCache, 'reload').mockImplementation(() => { expect(styleUpdateCalled).toBeTruthy(); done(); }); @@ -1799,7 +1800,7 @@ describe('Style#setPaintProperty', () => { await style.once('style.load'); const backgroundLayer = style.getLayer('background'); - const validate = jest.spyOn(backgroundLayer, '_validate'); + const validate = vi.spyOn(backgroundLayer, '_validate'); style.setPaintProperty('background', 'background-color', 'notacolor', {validate: false}); expect(validate.mock.calls[0][4]).toEqual({validate: false}); @@ -1901,7 +1902,7 @@ describe('Style#setLayoutProperty', () => { await style.once('style.load'); const lineLayer = style.getLayer('line'); - const validate = jest.spyOn(lineLayer, '_validate'); + const validate = vi.spyOn(lineLayer, '_validate'); style.setLayoutProperty('line', 'line-cap', 'invalidcap', {validate: false}); expect(validate.mock.calls[0][4]).toEqual({validate: false}); @@ -2143,7 +2144,7 @@ describe('Style#setLayerZoomRange', () => { }); await style.once('style.load'); - jest.spyOn(style, '_reloadSource'); + vi.spyOn(style, '_reloadSource'); style.setLayerZoomRange('raster', 5, 12); style.update(0 as any as EvaluationParameters); @@ -2323,7 +2324,7 @@ describe('Style#queryRenderedFeatures', () => { test('checks type of `layers` option', () => { let errors = 0; - jest.spyOn(style, 'fire').mockImplementation((event) => { + vi.spyOn(style, 'fire').mockImplementation((event) => { if (event['error'] && event['error'].message.includes('parameters.layers must be an Array')) { errors++; } @@ -2358,14 +2359,14 @@ describe('Style#queryRenderedFeatures', () => { }); test('does not query sources not implicated by `layers` parameter', () => { - style.sourceCaches.mapLibre.map.queryRenderedFeatures = jest.fn(); + style.sourceCaches.mapLibre.map.queryRenderedFeatures = vi.fn(); style.queryRenderedFeatures([{x: 0, y: 0}], {layers: ['land--other']}, transform); expect(style.sourceCaches.mapLibre.map.queryRenderedFeatures).not.toHaveBeenCalled(); }); test('fires an error if layer included in params does not exist on the style', () => { let errors = 0; - jest.spyOn(style, 'fire').mockImplementation((event) => { + vi.spyOn(style, 'fire').mockImplementation((event) => { if (event['error'] && event['error'].message.includes('does not exist in the map\'s style and cannot be queried for features.')) errors++; return style; }); @@ -2389,9 +2390,9 @@ describe('Style defers ...', () => { style.update({} as EvaluationParameters); // spies to track deferred methods - const mockStyleFire = jest.spyOn(style, 'fire'); - jest.spyOn(style, '_reloadSource'); - jest.spyOn(style, '_updateWorkerLayers'); + const mockStyleFire = vi.spyOn(style, 'fire'); + vi.spyOn(style, '_reloadSource'); + vi.spyOn(style, '_updateWorkerLayers'); style.addLayer({id: 'first', type: 'symbol', source: 'streets'}); style.addLayer({id: 'second', type: 'symbol', source: 'streets'}); @@ -2443,7 +2444,7 @@ describe('Style#query*Features', () => { }] }); - onError = jest.fn(); + onError = vi.fn(); style.on('error', onError) .on('style.load', () => { @@ -2463,7 +2464,7 @@ describe('Style#query*Features', () => { test('querySourceFeatures not raise validation errors if validation was disabled', () => { let errors = 0; - jest.spyOn(style, 'fire').mockImplementation((event) => { + vi.spyOn(style, 'fire').mockImplementation((event) => { if (event['error']) { errors++; } @@ -2475,7 +2476,7 @@ describe('Style#query*Features', () => { test('querySourceFeatures not raise validation errors if validation was disabled', () => { let errors = 0; - jest.spyOn(style, 'fire').mockImplementation((event) => { + vi.spyOn(style, 'fire').mockImplementation((event) => { if (event['error']) errors++; return style; }); diff --git a/src/style/style_layer.test.ts b/src/style/style_layer.test.ts index 1ef27ef2b5..58f6fb8b2a 100644 --- a/src/style/style_layer.test.ts +++ b/src/style/style_layer.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {createStyleLayer} from './create_style_layer'; import {FillStyleLayer} from './style_layer/fill_style_layer'; import {extend} from '../util/util'; diff --git a/src/style/style_layer/fill_style_layer.test.ts b/src/style/style_layer/fill_style_layer.test.ts index 3500f50026..1096ad6506 100644 --- a/src/style/style_layer/fill_style_layer.test.ts +++ b/src/style/style_layer/fill_style_layer.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {getIntersectionDistance, Point3D} from './fill_extrusion_style_layer'; describe('getIntersectionDistance', () => { diff --git a/src/style/style_layer/line_style_layer.test.ts b/src/style/style_layer/line_style_layer.test.ts index 4ad575b994..7aebdfb452 100644 --- a/src/style/style_layer/line_style_layer.test.ts +++ b/src/style/style_layer/line_style_layer.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {createStyleLayer} from '../create_style_layer'; import {extend} from '../../util/util'; import {LineStyleLayer} from './line_style_layer'; diff --git a/src/style/style_layer/overlap_mode.test.ts b/src/style/style_layer/overlap_mode.test.ts index 6c984b3590..768074b8db 100644 --- a/src/style/style_layer/overlap_mode.test.ts +++ b/src/style/style_layer/overlap_mode.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {getOverlapMode} from './overlap_mode'; import {SymbolStyleLayer} from './symbol_style_layer'; import {ZoomHistory} from '../zoom_history'; diff --git a/src/style/style_layer/variable_text_anchor.test.ts b/src/style/style_layer/variable_text_anchor.test.ts index 0a4af2a4a0..4c7b7ed1db 100644 --- a/src/style/style_layer/variable_text_anchor.test.ts +++ b/src/style/style_layer/variable_text_anchor.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {EvaluationParameters} from '../evaluation_parameters'; import {ZoomHistory} from '../zoom_history'; import {SymbolStyleLayer} from './symbol_style_layer'; diff --git a/src/style/style_layer_index.test.ts b/src/style/style_layer_index.test.ts index 8d84e7a674..e710cb75f6 100644 --- a/src/style/style_layer_index.test.ts +++ b/src/style/style_layer_index.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {mapObject} from '../util/util'; import {StyleLayerIndex} from './style_layer_index'; diff --git a/src/symbol/anchor.test.ts b/src/symbol/anchor.test.ts index 1e08a98427..fffb9d627d 100644 --- a/src/symbol/anchor.test.ts +++ b/src/symbol/anchor.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {Anchor} from './anchor'; describe('Anchor', () => { diff --git a/src/symbol/check_max_angle.test.ts b/src/symbol/check_max_angle.test.ts index 59e3244041..e187e1051a 100644 --- a/src/symbol/check_max_angle.test.ts +++ b/src/symbol/check_max_angle.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {checkMaxAngle} from './check_max_angle'; import {Anchor} from './anchor'; diff --git a/src/symbol/clip_line.test.ts b/src/symbol/clip_line.test.ts index b9ba3b8aff..341288d66d 100644 --- a/src/symbol/clip_line.test.ts +++ b/src/symbol/clip_line.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {clipLine} from './clip_line'; diff --git a/src/symbol/collision_feature.test.ts b/src/symbol/collision_feature.test.ts index 362ca96c48..4bee15196f 100644 --- a/src/symbol/collision_feature.test.ts +++ b/src/symbol/collision_feature.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {CollisionFeature} from './collision_feature'; import {Anchor} from './anchor'; import Point from '@mapbox/point-geometry'; diff --git a/src/symbol/collision_index.test.ts b/src/symbol/collision_index.test.ts index e684da8f13..51ddf281fb 100644 --- a/src/symbol/collision_index.test.ts +++ b/src/symbol/collision_index.test.ts @@ -1,3 +1,4 @@ +import {vi, describe, test, expect} from 'vitest'; import {CollisionIndex} from './collision_index'; import {MercatorTransform} from '../geo/projection/mercator_transform'; import {CanonicalTileID, UnwrappedTileID} from '../source/tile_id'; @@ -9,7 +10,7 @@ describe('CollisionIndex', () => { const transform = new MercatorTransform(0, 22, 0, 60, true); transform.resize(200, 200); const tile = new UnwrappedTileID(0, new CanonicalTileID(0, 0, 0)); - jest.spyOn(transform, 'calculatePosMatrix').mockImplementation(() => mat4.create()); + vi.spyOn(transform, 'calculatePosMatrix').mockImplementation(() => mat4.create()); const ci = new CollisionIndex(transform); expect(ci.projectAndGetPerspectiveRatio(x, y, tile, null).x).toBeCloseTo(10000212.3456, 10); diff --git a/src/symbol/cross_tile_symbol_index.test.ts b/src/symbol/cross_tile_symbol_index.test.ts index ad07b7a94b..9b25b1b69c 100644 --- a/src/symbol/cross_tile_symbol_index.test.ts +++ b/src/symbol/cross_tile_symbol_index.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {CrossTileSymbolIndex, KDBUSH_THRESHHOLD} from './cross_tile_symbol_index'; import {OverscaledTileID} from '../source/tile_id'; import {StyleLayer} from '../style/style_layer'; @@ -237,7 +238,8 @@ describe('CrossTileSymbolIndex.addLayer', () => { }); }); -describe('CrossTileSymbolIndex.pruneUnusedLayers', () => { +test('CrossTileSymbolIndex.pruneUnusedLayers', () => { + const index = new CrossTileSymbolIndex(); const tileID = new OverscaledTileID(6, 0, 6, 8, 8); @@ -258,3 +260,4 @@ describe('CrossTileSymbolIndex.pruneUnusedLayers', () => { expect(index.layerIndexes[styleLayer.id]).toBeFalsy(); }); + diff --git a/src/symbol/get_anchors.test.ts b/src/symbol/get_anchors.test.ts index 6d3c1ec26b..68dfe8cd4f 100644 --- a/src/symbol/get_anchors.test.ts +++ b/src/symbol/get_anchors.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {getAnchors, getCenterAnchor} from './get_anchors'; import {PositionedIcon, Shaping} from './shaping'; diff --git a/src/symbol/grid_index.test.ts b/src/symbol/grid_index.test.ts index 442fcf29b5..9eb2e85f29 100644 --- a/src/symbol/grid_index.test.ts +++ b/src/symbol/grid_index.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {GridIndex} from './grid_index'; import type {GridKey} from './grid_index'; diff --git a/src/symbol/merge_lines.test.ts b/src/symbol/merge_lines.test.ts index d4a51abbde..b50e4b2e9e 100644 --- a/src/symbol/merge_lines.test.ts +++ b/src/symbol/merge_lines.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {mergeLines} from './merge_lines'; import Point from '@mapbox/point-geometry'; diff --git a/src/symbol/path_interpolator.test.ts b/src/symbol/path_interpolator.test.ts index 52251317a6..c58e968d8e 100644 --- a/src/symbol/path_interpolator.test.ts +++ b/src/symbol/path_interpolator.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {PathInterpolator} from './path_interpolator'; diff --git a/src/symbol/projection.test.ts b/src/symbol/projection.test.ts index 8f9fcb325b..982a4a0c02 100644 --- a/src/symbol/projection.test.ts +++ b/src/symbol/projection.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {SymbolProjectionContext, ProjectionSyntheticVertexArgs, findOffsetIntersectionPoint, projectWithMatrix, transformToOffsetNormal, projectLineVertexToLabelPlane, getPitchedLabelPlaneMatrix, getGlCoordMatrix, getTileSkewVectors} from './projection'; import Point from '@mapbox/point-geometry'; diff --git a/src/symbol/quads.test.ts b/src/symbol/quads.test.ts index f592bc9bb6..3e9f43b251 100644 --- a/src/symbol/quads.test.ts +++ b/src/symbol/quads.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {ImagePosition} from '../render/image_atlas'; import {getIconQuads} from './quads'; diff --git a/src/symbol/shaping.test.ts b/src/symbol/shaping.test.ts index c5b5ab1775..036c75259d 100644 --- a/src/symbol/shaping.test.ts +++ b/src/symbol/shaping.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {type PositionedIcon, type Box, type Shaping, applyTextFit, shapeIcon, fitIconToText} from './shaping'; import {ImagePosition} from '../render/image_atlas'; import {StyleImage, TextFit} from '../style/style_image'; diff --git a/src/symbol/symbol_style_layer.test.ts b/src/symbol/symbol_style_layer.test.ts index 979f732f33..5c8bf4775d 100644 --- a/src/symbol/symbol_style_layer.test.ts +++ b/src/symbol/symbol_style_layer.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {SymbolStyleLayer} from '../style/style_layer/symbol_style_layer'; import {FormatSectionOverride} from '../style/format_section_override'; import properties, {SymbolPaintPropsPossiblyEvaluated} from '../style/style_layer/symbol_style_layer_properties.g'; diff --git a/src/ui/camera.test.ts b/src/ui/camera.test.ts index 3ae21ad980..ccc31dd609 100644 --- a/src/ui/camera.test.ts +++ b/src/ui/camera.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {Camera, CameraOptions} from '../ui/camera'; import {TaskQueue, TaskID} from '../util/task_queue'; import {browser} from '../util/browser'; @@ -1053,7 +1054,7 @@ describe('#easeTo', () => { test('can be called from within a moveend event handler', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.easeTo({center: [100, 0], duration: 10}); @@ -1088,7 +1089,7 @@ describe('#easeTo', () => { test('pans eastward across the antimeridian', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -1131,7 +1132,7 @@ describe('#easeTo', () => { test('pans westward across the antimeridian', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -1175,7 +1176,7 @@ describe('#easeTo', () => { test('animation occurs when prefers-reduced-motion: reduce is set but overridden by essential: true', () => new Promise(done => { const camera = createCamera(); Object.defineProperty(browser, 'prefersReducedMotion', {value: true}); - const stubNow = jest.spyOn(browser, 'now'); + const stubNow = vi.spyOn(browser, 'now'); // camera transition expected to take in this range when prefersReducedMotion is set and essential: true, // when a duration of 200 is requested @@ -1336,7 +1337,7 @@ describe('#flyTo', () => { test('Zoom out from the same position to the same position with animation', () => new Promise(done => { const pos = {lng: 0, lat: 0}; const camera = createCamera({zoom: 20, center: pos}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.once('zoomend', () => { expect(fixedLngLat(camera.getCenter())).toEqual(fixedLngLat(pos)); @@ -1552,7 +1553,7 @@ describe('#flyTo', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], duration: 10}, eventData); @@ -1577,7 +1578,7 @@ describe('#flyTo', () => { test('can be called from within a moveend event handler', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], duration: 10}); @@ -1623,7 +1624,7 @@ describe('#flyTo', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], zoom: 18, duration: 10}); @@ -1641,7 +1642,7 @@ describe('#flyTo', () => { test('pans eastward across the prime meridian', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-10, 0]); let crossedPrimeMeridian; @@ -1673,7 +1674,7 @@ describe('#flyTo', () => { test('pans westward across the prime meridian', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([10, 0]); let crossedPrimeMeridian; @@ -1705,7 +1706,7 @@ describe('#flyTo', () => { test('pans eastward across the antimeridian', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -1737,7 +1738,7 @@ describe('#flyTo', () => { test('pans westward across the antimeridian', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -1769,7 +1770,7 @@ describe('#flyTo', () => { test('does not pan eastward across the antimeridian if no world copies', () => new Promise(done => { const camera = createCamera({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -1801,7 +1802,7 @@ describe('#flyTo', () => { test('does not pan westward across the antimeridian if no world copies', () => new Promise(done => { const camera = createCamera({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -1833,7 +1834,7 @@ describe('#flyTo', () => { test('jumps back to world 0 when crossing the antimeridian', () => new Promise(done => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); @@ -1864,7 +1865,7 @@ describe('#flyTo', () => { test('peaks at the specified zoom level', () => new Promise(done => { const camera = createCamera({zoom: 20}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); const minZoom = 1; let zoomed = false; @@ -1914,7 +1915,7 @@ describe('#flyTo', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [12, 34], zoom: 30, duration: 10}); @@ -1939,7 +1940,7 @@ describe('#flyTo', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [12, 34], zoom: 1, duration: 10}); @@ -1974,7 +1975,7 @@ describe('#flyTo', () => { test('check elevation events freezeElevation=false', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); const terrainCallbacks = {prepare: 0, update: 0, finalize: 0} as any; camera.terrain = {} as Terrain; @@ -1998,7 +1999,7 @@ describe('#flyTo', () => { test('check elevation events freezeElevation=true', async() => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); const terrainCallbacks = {prepare: 0, update: 0, finalize: 0} as any; camera.terrain = {} as Terrain; @@ -2067,7 +2068,7 @@ describe('#isEasing', () => { expect(!camera.isEasing()).toBeTruthy(); done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.panTo([100, 0], {duration: 1}); setTimeout(() => { @@ -2089,7 +2090,7 @@ describe('#isEasing', () => { expect(!camera.isEasing()).toBeTruthy(); done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.zoomTo(3.2, {duration: 1}); setTimeout(() => { @@ -2110,7 +2111,7 @@ describe('#isEasing', () => { expect(!camera.isEasing()).toBeTruthy(); done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.rotateTo(90, {duration: 1}); setTimeout(() => { @@ -2184,7 +2185,7 @@ describe('#stop', () => { done(); // Fails with ".end() called twice" if we get here a second time. }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.panTo([100, 0], {duration: 1}, eventData); @@ -2418,7 +2419,7 @@ describe('queryTerrainElevation', () => { const transform = new MercatorTransform(0, 22, 0, 60, true); transform.setElevation(50); const terrain = { - getElevationForLngLatZoom: jest.fn().mockReturnValue(200) + getElevationForLngLatZoom: vi.fn().mockReturnValue(200) } as any as Terrain; // Set up camera with mock transform and terrain @@ -2472,7 +2473,7 @@ describe('#transformCameraUpdate', () => { test('invoke transformCameraUpdate callback during easeTo', () => new Promise(done => { expect.assertions(2); const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); let callbackCount = 0; @@ -2508,7 +2509,7 @@ describe('#transformCameraUpdate', () => { test('invoke transformCameraUpdate callback during flyTo', () => new Promise(done => { expect.assertions(2); const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); let callbackCount = 0; @@ -2886,9 +2887,9 @@ describe('#easeTo globe projection', () => { test('emits zoom events if changing latitude but not zooming', async () => { const camera = createCameraGlobe(); - const zoomstart = jest.fn(); - const zoom = jest.fn(); - const zoomend = jest.fn(); + const zoomstart = vi.fn(); + const zoom = vi.fn(); + const zoomend = vi.fn(); expect.assertions(3); @@ -2910,7 +2911,7 @@ describe('#easeTo globe projection', () => { expect.assertions(1); - const spy = jest.fn(); + const spy = vi.fn(); camera .on('zoomstart', spy) .on('zoom', spy) @@ -2924,7 +2925,7 @@ describe('#easeTo globe projection', () => { test('pans eastward across the antimeridian', () => new Promise(done => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -2966,7 +2967,7 @@ describe('#easeTo globe projection', () => { test('pans westward across the antimeridian', () => new Promise(done => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -3066,7 +3067,7 @@ describe('#flyTo globe projection', () => { test('Zoom out from the same position to the same position with animation', () => new Promise(done => { const pos = {lng: 0, lat: 0}; const camera = createCameraGlobe({zoom: 20, center: pos}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.once('zoomend', () => { expect(fixedLngLat(camera.getCenter())).toEqual(fixedLngLat(pos)); @@ -3288,7 +3289,7 @@ describe('#flyTo globe projection', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], duration: 10}, eventData); @@ -3321,7 +3322,7 @@ describe('#flyTo globe projection', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], zoom: 18, duration: 10}); @@ -3339,7 +3340,7 @@ describe('#flyTo globe projection', () => { test('pans eastward across the prime meridian', () => new Promise(done => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-10, 0]); let crossedPrimeMeridian; @@ -3371,7 +3372,7 @@ describe('#flyTo globe projection', () => { test('pans westward across the prime meridian', () => new Promise(done => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([10, 0]); let crossedPrimeMeridian; @@ -3403,7 +3404,7 @@ describe('#flyTo globe projection', () => { test('pans eastward across the antimeridian', () => new Promise(done => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -3435,7 +3436,7 @@ describe('#flyTo globe projection', () => { test('pans westward across the antimeridian', () => new Promise(done => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -3467,7 +3468,7 @@ describe('#flyTo globe projection', () => { test('pans eastward across the antimeridian even if renderWorldCopies: false', () => new Promise(done => { const camera = createCameraGlobe({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -3499,7 +3500,7 @@ describe('#flyTo globe projection', () => { test('pans westward across the antimeridian even if renderWorldCopies: false', () => new Promise(done => { const camera = createCameraGlobe({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -3531,7 +3532,7 @@ describe('#flyTo globe projection', () => { test('jumps back to world 0 when crossing the antimeridian', () => new Promise(done => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); @@ -3562,7 +3563,7 @@ describe('#flyTo globe projection', () => { test('peaks at the specified zoom level', () => new Promise(done => { const camera = createCameraGlobe({zoom: 20}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); const minZoom = 1; let zoomed = false; @@ -3612,7 +3613,7 @@ describe('#flyTo globe projection', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [12, 34], zoom: 30, duration: 10}); @@ -3641,7 +3642,7 @@ describe('#flyTo globe projection', () => { done(); }); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: target, zoom: 1, duration: 10}); diff --git a/src/ui/control/attribution_control.test.ts b/src/ui/control/attribution_control.test.ts index 92553ca7ae..e29dcf553b 100644 --- a/src/ui/control/attribution_control.test.ts +++ b/src/ui/control/attribution_control.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {AttributionControl, defaultAttributionControlOptions} from './attribution_control'; import {createMap as globalCreateMap, beforeMapTest, sleep} from '../../util/test/util'; import simulate from '../../../test/unit/lib/simulate_interaction'; @@ -146,7 +147,7 @@ describe('AttributionControl', () => { const attribution = new AttributionControl(); map.addControl(attribution); - const spy = jest.fn(); + const spy = vi.fn(); map.on('data', spy); await map.once('load'); map.addSource('1', {type: 'geojson', data: {type: 'FeatureCollection', features: []}, attribution: 'World'}); @@ -178,7 +179,7 @@ describe('AttributionControl', () => { map.addSource('1', {type: 'geojson', data: {type: 'FeatureCollection', features: []}}); map.addLayer({id: '1', type: 'fill', source: '1'}); const container = map.getContainer(); - const spy = jest.fn(); + const spy = vi.fn(); map.on('data', spy); await sleep(100); @@ -194,7 +195,7 @@ describe('AttributionControl', () => { map.addSource('1', {type: 'geojson', data: {type: 'FeatureCollection', features: []}}); map.addLayer({id: '1', type: 'fill', source: '1'}); const container = map.getContainer(); - const spy = jest.fn(); + const spy = vi.fn(); map.on('data', spy); await sleep(100); @@ -251,7 +252,7 @@ describe('AttributionControl', () => { const attribution = new AttributionControl(); map.addControl(attribution); - const spy = jest.fn(); + const spy = vi.fn(); map.on('data', spy); await map.once('load'); map.addSource('1', {type: 'geojson', data: {type: 'FeatureCollection', features: []}, attribution: 'Used'}); @@ -289,7 +290,7 @@ describe('AttributionControl', () => { const attribution = new AttributionControl(); map.addControl(attribution); - const spy = jest.fn(); + const spy = vi.fn(); map.on('data', spy); await map.once('load'); map.addSource('1', {type: 'raster-dem', url: '/source.json'}); @@ -321,7 +322,7 @@ describe('AttributionControl', () => { const attribution = new AttributionControl(); map.addControl(attribution); - const spy = jest.fn(); + const spy = vi.fn(); map.on('data', spy); await map.once('load'); map.addSource('1', {type: 'raster-dem', url: '/source.json'}); diff --git a/src/ui/control/fullscreen_control.test.ts b/src/ui/control/fullscreen_control.test.ts index 6e05b0c6d2..cbc3c37b97 100644 --- a/src/ui/control/fullscreen_control.test.ts +++ b/src/ui/control/fullscreen_control.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {FullscreenControl} from './fullscreen_control'; @@ -57,8 +58,8 @@ describe('FullscreenControl', () => { const map = createMap(undefined, undefined); const fullscreen = new FullscreenControl({}); - const fullscreenstart = jest.fn(); - const fullscreenend = jest.fn(); + const fullscreenstart = vi.fn(); + const fullscreenend = vi.fn(); fullscreen.on('fullscreenstart', fullscreenstart); fullscreen.on('fullscreenend', fullscreenend); diff --git a/src/ui/control/geolocate_control.test.ts b/src/ui/control/geolocate_control.test.ts index e1c0b7dc56..6f9052ca82 100644 --- a/src/ui/control/geolocate_control.test.ts +++ b/src/ui/control/geolocate_control.test.ts @@ -1,10 +1,11 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import geolocation from 'mock-geolocation'; import {LngLatBounds} from '../../geo/lng_lat_bounds'; import {createMap, beforeMapTest, sleep} from '../../util/test/util'; import {GeolocateControl} from './geolocate_control'; -jest.mock('../../util/geolocation_support', () => ( +vi.mock('../../util/geolocation_support', () => ( { - checkGeolocationSupport: jest.fn() + checkGeolocationSupport: vi.fn() } )); import {checkGeolocationSupport} from '../../util/geolocation_support'; @@ -30,7 +31,7 @@ describe('GeolocateControl with no options', () => { beforeEach(() => { beforeMapTest(); map = createMap(undefined, undefined); - (checkGeolocationSupport as any as jest.SpyInstance).mockImplementationOnce(() => Promise.resolve(true)); + (checkGeolocationSupport as any as ReturnType).mockImplementationOnce(() => Promise.resolve(true)); }); afterEach(() => { @@ -38,9 +39,9 @@ describe('GeolocateControl with no options', () => { }); test('is disabled when there is no support', async () => { - (checkGeolocationSupport as any as jest.SpyInstance).mockReset().mockImplementationOnce(() => Promise.resolve(false)); + (checkGeolocationSupport as any as ReturnType).mockReset().mockImplementationOnce(() => Promise.resolve(false)); const geolocate = new GeolocateControl(undefined); - const spy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const spy = vi.spyOn(console, 'warn').mockImplementation(() => {}); map.addControl(geolocate); await sleep(0); expect(geolocate._geolocateButton.disabled).toBeTruthy(); @@ -83,7 +84,7 @@ describe('GeolocateControl with no options', () => { }); test('does not throw if removed quickly', () => { - (checkGeolocationSupport as any as jest.SpyInstance).mockReset() + (checkGeolocationSupport as any as ReturnType).mockReset() .mockImplementationOnce(() => { return sleep(10); }); @@ -170,7 +171,7 @@ describe('GeolocateControl with no options', () => { }); test('trigger before added to map', () => { - jest.spyOn(console, 'warn').mockImplementation(() => { }); + vi.spyOn(console, 'warn').mockImplementation(() => { }); const geolocate = new GeolocateControl(undefined); diff --git a/src/ui/control/logo_control.test.ts b/src/ui/control/logo_control.test.ts index 71b29a1022..6fcc8b105e 100644 --- a/src/ui/control/logo_control.test.ts +++ b/src/ui/control/logo_control.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect} from 'vitest'; import {createMap as globalCreateMap, beforeMapTest} from '../../util/test/util'; function createMap(logoPosition, maplibreLogo) { diff --git a/src/ui/control/navigation_control.test.ts b/src/ui/control/navigation_control.test.ts index 58038f711f..a9cf283d2b 100644 --- a/src/ui/control/navigation_control.test.ts +++ b/src/ui/control/navigation_control.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import simulate from '../../../test/unit/lib/simulate_interaction'; import {createMap as globalCreateMap, beforeMapTest} from '../../util/test/util'; import {NavigationControl} from './navigation_control'; @@ -59,7 +60,7 @@ describe('NavigationControl', () => { showZoom: true, showCompass: true })); - const spyReset = jest.spyOn(map, 'resetNorthPitch'); + const spyReset = vi.spyOn(map, 'resetNorthPitch'); const navButton = map.getContainer().querySelector('.maplibregl-ctrl-compass'); simulate.click(navButton); @@ -76,8 +77,8 @@ describe('NavigationControl', () => { }); map.addControl(navControl); - const spySetPitch = jest.spyOn(map, 'setPitch'); - const spySetBearing = jest.spyOn(map, 'setBearing'); + const spySetPitch = vi.spyOn(map, 'setPitch'); + const spySetBearing = vi.spyOn(map, 'setBearing'); const navButton = map.getContainer().querySelector('.maplibregl-ctrl-compass'); const navRect = navButton.getClientRects(); @@ -104,8 +105,8 @@ describe('NavigationControl', () => { }); map.addControl(navControl); - const spySetPitch = jest.spyOn(map, 'setPitch'); - const spySetBearing = jest.spyOn(map, 'setBearing'); + const spySetPitch = vi.spyOn(map, 'setPitch'); + const spySetBearing = vi.spyOn(map, 'setBearing'); const navButton = map.getContainer().querySelector('.maplibregl-ctrl-compass'); const navRect = navButton.getClientRects(); @@ -132,8 +133,8 @@ describe('NavigationControl', () => { }); map.addControl(navControl); - const spySetPitch = jest.spyOn(map, 'setPitch'); - const spySetBearing = jest.spyOn(map, 'setBearing'); + const spySetPitch = vi.spyOn(map, 'setPitch'); + const spySetBearing = vi.spyOn(map, 'setBearing'); const navButton = map.getContainer().querySelector('.maplibregl-ctrl-compass'); const navRect = navButton.getClientRects(); @@ -160,8 +161,8 @@ describe('NavigationControl', () => { }); map.addControl(navControl); - const spySetPitch = jest.spyOn(map, 'setPitch'); - const spySetBearing = jest.spyOn(map, 'setBearing'); + const spySetPitch = vi.spyOn(map, 'setPitch'); + const spySetBearing = vi.spyOn(map, 'setBearing'); const navButton = map.getContainer().querySelector('.maplibregl-ctrl-compass'); const navRect = navButton.getClientRects(); @@ -188,8 +189,8 @@ describe('NavigationControl', () => { }); map.addControl(navControl); - const spySetPitch = jest.spyOn(map, 'setPitch'); - const spySetBearing = jest.spyOn(map, 'setBearing'); + const spySetPitch = vi.spyOn(map, 'setPitch'); + const spySetBearing = vi.spyOn(map, 'setBearing'); const navButton = map.getContainer().querySelector('.maplibregl-ctrl-compass'); const navRect = navButton.getClientRects(); @@ -216,8 +217,8 @@ describe('NavigationControl', () => { }); map.addControl(navControl); - const spySetPitch = jest.spyOn(map, 'setPitch'); - const spySetBearing = jest.spyOn(map, 'setBearing'); + const spySetPitch = vi.spyOn(map, 'setPitch'); + const spySetBearing = vi.spyOn(map, 'setBearing'); const navButton = map.getContainer().querySelector('.maplibregl-ctrl-compass'); const navRect = navButton.getClientRects(); diff --git a/src/ui/control/scale_control.test.ts b/src/ui/control/scale_control.test.ts index fbe68e323d..318fcecd68 100644 --- a/src/ui/control/scale_control.test.ts +++ b/src/ui/control/scale_control.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {ScaleControl} from './scale_control'; diff --git a/src/ui/control/terrain_control.test.ts b/src/ui/control/terrain_control.test.ts index 8164a66a6d..f68139a064 100644 --- a/src/ui/control/terrain_control.test.ts +++ b/src/ui/control/terrain_control.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect} from 'vitest'; import {TerrainControl} from './terrain_control'; import {createMap as globalCreateMap, beforeMapTest} from '../../util/test/util'; diff --git a/src/ui/handler/box_zoom.test.ts b/src/ui/handler/box_zoom.test.ts index 6e6145cba7..b1b3af6139 100644 --- a/src/ui/handler/box_zoom.test.ts +++ b/src/ui/handler/box_zoom.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {Map} from '../map'; import {DOM} from '../../util/dom'; import simulate from '../../../test/unit/lib/simulate_interaction'; @@ -15,8 +16,8 @@ describe('BoxZoomHandler', () => { test('fires boxzoomstart and boxzoomend events at appropriate times', () => { const map = createMap(undefined); - const boxzoomstart = jest.fn(); - const boxzoomend = jest.fn(); + const boxzoomstart = vi.fn(); + const boxzoomend = vi.fn(); map.on('boxzoomstart', boxzoomstart); map.on('boxzoomend', boxzoomend); @@ -45,15 +46,15 @@ describe('BoxZoomHandler', () => { map.boxZoom.disable(); map.boxZoom.enable(); - const boxzoomstart = jest.fn(); - const boxzoomend = jest.fn(); + const boxzoomstart = vi.fn(); + const boxzoomend = vi.fn(); map.on('boxzoomstart', boxzoomstart); map.on('boxzoomend', boxzoomend); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -86,8 +87,8 @@ describe('BoxZoomHandler', () => { map.on('mousedown', e => e.preventDefault()); - const boxzoomstart = jest.fn(); - const boxzoomend = jest.fn(); + const boxzoomstart = vi.fn(); + const boxzoomend = vi.fn(); map.on('boxzoomstart', boxzoomstart); map.on('boxzoomend', boxzoomend); @@ -110,8 +111,8 @@ describe('BoxZoomHandler', () => { test('does not begin a box zoom on spurious mousemove events', () => { const map = createMap(undefined); - const boxzoomstart = jest.fn(); - const boxzoomend = jest.fn(); + const boxzoomstart = vi.fn(); + const boxzoomend = vi.fn(); map.on('boxzoomstart', boxzoomstart); map.on('boxzoomend', boxzoomend); @@ -137,8 +138,8 @@ describe('BoxZoomHandler', () => { test('does not begin a box zoom until mouse move is larger than click tolerance', () => { const map = createMap(4); - const boxzoomstart = jest.fn(); - const boxzoomend = jest.fn(); + const boxzoomstart = vi.fn(); + const boxzoomend = vi.fn(); map.on('boxzoomstart', boxzoomstart); map.on('boxzoomend', boxzoomend); diff --git a/src/ui/handler/cooperative_gestures.test.ts b/src/ui/handler/cooperative_gestures.test.ts index 5ce1585a94..a919321038 100644 --- a/src/ui/handler/cooperative_gestures.test.ts +++ b/src/ui/handler/cooperative_gestures.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {browser} from '../../util/browser'; import {Map} from '../map'; import {DOM} from '../../util/dom'; @@ -23,14 +24,14 @@ beforeEach(() => { describe('CoopGesturesHandler', () => { test('Does not zoom on wheel if no key is down', async () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); const map = createMap(true); map._renderTaskQueue.run(); - const cooperativegestureprevented = jest.fn(); + const cooperativegestureprevented = vi.fn(); map.on('cooperativegestureprevented', cooperativegestureprevented); const startZoom = map.getZoom(); @@ -62,7 +63,7 @@ describe('CoopGesturesHandler', () => { }); test('Zooms on wheel if no key is down after disabling cooperative gestures', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -87,7 +88,7 @@ describe('CoopGesturesHandler', () => { test('Zooms on wheel if control key is down', () => { // NOTE: This should pass regardless of whether cooperativeGestures is enabled or not - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -111,7 +112,7 @@ describe('CoopGesturesHandler', () => { test('Zooms on trackpad pinch when metaKey is the bypass key', () => { // NOTE: This should pass regardless of whether cooperativeGestures is enabled or not - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -144,13 +145,13 @@ describe('CoopGesturesHandler', () => { test('Does not show message if scrollZoom is disabled', () => { // NOTE: This should pass regardless of whether cooperativeGestures is enabled or not - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); const now = 1555555555555; browserNow.mockReturnValue(now); const map = createMap(true); - const cooperativegestureprevented = jest.fn(); + const cooperativegestureprevented = vi.fn(); map.on('cooperativegestureprevented', cooperativegestureprevented); map.scrollZoom.disable(); @@ -173,10 +174,10 @@ describe('CoopGesturesHandler', () => { const startCenter = map.getCenter(); map._renderTaskQueue.run(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); - const cooperativegestureprevented = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); + const cooperativegestureprevented = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -211,7 +212,7 @@ describe('CoopGesturesHandler', () => { test('Pans on touchmove with a single touch after disabling cooperative gestures', () => { const map = createMap(true); - const cooperativegestureprevented = jest.fn(); + const cooperativegestureprevented = vi.fn(); map.on('cooperativegestureprevented', cooperativegestureprevented); map.cooperativeGestures.disable(); @@ -241,7 +242,7 @@ describe('CoopGesturesHandler', () => { test('Does pan on touchmove with a double touch but does not change pitch', () => { const map = createMap(true); - const cooperativegestureprevented = jest.fn(); + const cooperativegestureprevented = vi.fn(); map.on('cooperativegestureprevented', cooperativegestureprevented); const target = map.getCanvas(); @@ -273,7 +274,7 @@ describe('CoopGesturesHandler', () => { // NOTE: This should pass regardless of whether cooperativeGestures is enabled or not const map = createMap(true); - const cooperativegestureprevented = jest.fn(); + const cooperativegestureprevented = vi.fn(); map.on('cooperativegestureprevented', cooperativegestureprevented); const target = map.getCanvas(); @@ -299,7 +300,7 @@ describe('CoopGesturesHandler', () => { }); test('Initially disabled cooperative gestures can be later enabled', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); diff --git a/src/ui/handler/dblclick_zoom.test.ts b/src/ui/handler/dblclick_zoom.test.ts index c7a706484c..31476d883f 100644 --- a/src/ui/handler/dblclick_zoom.test.ts +++ b/src/ui/handler/dblclick_zoom.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import simulate from '../../../test/unit/lib/simulate_interaction'; import {beforeMapTest, sleep} from '../../util/test/util'; import {Map, MapOptions} from '../map'; @@ -27,7 +28,7 @@ describe('dbclick_zoom', () => { test('DoubleClickZoomHandler zooms on dblclick event', () => { const map = createMap(); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoomstart', zoom); simulate.dblclick(map.getCanvas()); @@ -43,7 +44,7 @@ describe('dbclick_zoom', () => { map.on('dblclick', e => e.preventDefault()); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoomstart', zoom); simulate.dblclick(map.getCanvas()); @@ -57,7 +58,7 @@ describe('dbclick_zoom', () => { test('DoubleClickZoomHandler zooms on double tap if touchstart events are < 300ms apart', async () => { const map = createMap(); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoomstart', zoom); await simulateDoubleTap(map, 100); @@ -69,7 +70,7 @@ describe('dbclick_zoom', () => { test('DoubleClickZoomHandler does not zoom on double tap if touchstart events are > 500ms apart', async () => { const map = createMap(); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoom', zoom); await simulateDoubleTap(map, 500); @@ -81,7 +82,7 @@ describe('dbclick_zoom', () => { test('DoubleClickZoomHandler does not zoom on double tap if touchstart events are in different locations', async () => { const map = createMap(); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoom', zoom); const canvas = map.getCanvas(); @@ -101,7 +102,7 @@ describe('dbclick_zoom', () => { test('DoubleClickZoomHandler zooms on the second touchend event of a double tap', () => { const map = createMap(); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoomstart', zoom); const canvas = map.getCanvas(); @@ -135,7 +136,7 @@ describe('dbclick_zoom', () => { test('DoubleClickZoomHandler does not zoom on double tap if second touchend is >300ms after first touchstart', async () => { const map = createMap(); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoom', zoom); const canvas = map.getCanvas(); diff --git a/src/ui/handler/drag_pan.test.ts b/src/ui/handler/drag_pan.test.ts index dee3c37ef9..9d8b239f15 100644 --- a/src/ui/handler/drag_pan.test.ts +++ b/src/ui/handler/drag_pan.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {DOM} from '../../util/dom'; import simulate from '../../../test/unit/lib/simulate_interaction'; import {beforeMapTest} from '../../util/test/util'; @@ -24,9 +25,9 @@ describe('drag_pan', () => { test('DragPanHandler fires dragstart, drag, and dragend events at appropriate times in response to a mouse-triggered drag', () => { const map = createMap(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -56,9 +57,9 @@ describe('drag_pan', () => { test('DragPanHandler captures mousemove events during a mouse-triggered drag (receives them even if they occur outside the map)', () => { const map = createMap(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -89,9 +90,9 @@ describe('drag_pan', () => { const map = createMap(); const target = map.getCanvas(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -121,7 +122,7 @@ describe('drag_pan', () => { test('DragPanHandler prevents mousemove events from firing during a drag (#1555)', () => { const map = createMap(); - const mousemove = jest.fn(); + const mousemove = vi.fn(); map.on('mousemove', mousemove); simulate.mousedown(map.getCanvasContainer()); @@ -141,7 +142,7 @@ describe('drag_pan', () => { test('DragPanHandler ends a mouse-triggered drag if the window blurs', () => { const map = createMap(); - const dragend = jest.fn(); + const dragend = vi.fn(); map.on('dragend', dragend); simulate.mousedown(map.getCanvas()); @@ -160,7 +161,7 @@ describe('drag_pan', () => { const map = createMap(); const target = map.getCanvas(); - const dragend = jest.fn(); + const dragend = vi.fn(); map.on('dragend', dragend); simulate.touchstart(map.getCanvas(), {touches: [{target, clientX: 0, clientY: 0}]}); @@ -177,7 +178,7 @@ describe('drag_pan', () => { test('DragPanHandler requests a new render frame after each mousemove event', () => { const map = createMap(); - const requestFrame = jest.spyOn(map.handlers, '_requestFrame'); + const requestFrame = vi.spyOn(map.handlers, '_requestFrame'); simulate.mousedown(map.getCanvas()); simulate.mousemove(map.getCanvas(), {buttons, clientX: 10, clientY: 10}); @@ -197,9 +198,9 @@ describe('drag_pan', () => { // https://github.com/mapbox/mapbox-gl-js/issues/6106 const map = createMap(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -244,9 +245,9 @@ describe('drag_pan', () => { const map = createMap(); expect(map.dragRotate.isEnabled()).toBeTruthy(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -277,9 +278,9 @@ describe('drag_pan', () => { const map = createMap(); expect(map.dragRotate.isEnabled()).toBeTruthy(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -311,9 +312,9 @@ describe('drag_pan', () => { const map = createMap(); map.dragRotate.disable(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -344,9 +345,9 @@ describe('drag_pan', () => { const map = createMap(); map.dragRotate.disable(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -396,9 +397,9 @@ describe('drag_pan', () => { map.on('mousedown', e => e.preventDefault()); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -426,9 +427,9 @@ describe('drag_pan', () => { map.on('touchstart', e => e.preventDefault()); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); @@ -454,16 +455,16 @@ describe('drag_pan', () => { const map = createMap(); const target = map.getCanvas(); - jest.spyOn(map, 'getLayer').mockReturnValue(true as any); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue(true as any); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); map.on('touchstart', 'point', (e) => { e.preventDefault(); }); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); map.on('dragstart', dragstart); map.on('drag', drag); diff --git a/src/ui/handler/drag_rotate.test.ts b/src/ui/handler/drag_rotate.test.ts index a2203b41bf..8c3f48c81e 100644 --- a/src/ui/handler/drag_rotate.test.ts +++ b/src/ui/handler/drag_rotate.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {extend} from '../../util/util'; import {Map} from '../map'; import {DOM} from '../../util/dom'; @@ -20,7 +21,7 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); expect(map.dragRotate.isActive()).toBe(false); @@ -43,11 +44,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -78,11 +79,11 @@ describe('drag rotate', () => { const map = createMap({rollEnabled: true}); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rollstart = jest.fn(); - const roll = jest.fn(); - const rollend = jest.fn(); + const rollstart = vi.fn(); + const roll = vi.fn(); + const rollend = vi.fn(); map.on('rollstart', rollstart); map.on('roll', roll); @@ -113,9 +114,9 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const spy = jest.fn(); + const spy = vi.fn(); map.on('rotatestart', spy); map.on('rotate', spy); map.on('rotateend', spy); @@ -139,11 +140,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -174,11 +175,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const pitchstart = jest.fn(); - const pitch = jest.fn(); - const pitchend = jest.fn(); + const pitchstart = vi.fn(); + const pitch = vi.fn(); + const pitchend = vi.fn(); map.on('pitchstart', pitchstart); map.on('pitch', pitch); @@ -201,11 +202,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const pitchstart = jest.fn(); - const pitch = jest.fn(); - const pitchend = jest.fn(); + const pitchstart = vi.fn(); + const pitch = vi.fn(); + const pitchend = vi.fn(); map.on('pitchstart', pitchstart); map.on('pitch', pitch); @@ -227,11 +228,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const pitchstart = jest.fn(); - const pitch = jest.fn(); - const pitchend = jest.fn(); + const pitchstart = vi.fn(); + const pitch = vi.fn(); + const pitchend = vi.fn(); map.on('pitchstart', pitchstart); map.on('pitch', pitch); @@ -253,7 +254,7 @@ describe('drag rotate', () => { test('DragRotateHandler does not pitch if given pitchWithRotate: false', () => { const map = createMap({pitchWithRotate: false}); - const spy = jest.fn(); + const spy = vi.fn(); map.on('pitchstart', spy); map.on('pitch', spy); @@ -279,7 +280,7 @@ describe('drag rotate', () => { map.dragRotate.disable(); - const spy = jest.fn(); + const spy = vi.fn(); map.on('rotatestart', spy); map.on('rotate', spy); @@ -319,11 +320,11 @@ describe('drag rotate', () => { const map = createMap({bearingSnap: 0}); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const movestart = jest.fn(); - const move = jest.fn(); - const moveend = jest.fn(); + const movestart = vi.fn(); + const move = vi.fn(); + const moveend = vi.fn(); map.on('movestart', movestart); map.on('move', move); @@ -347,12 +348,12 @@ describe('drag rotate', () => { const map = createMap({bearingSnap: 0}); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const pitch = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const pitch = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -377,25 +378,25 @@ describe('drag rotate', () => { const map = createMap({bearingSnap: 0}); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); map.on('rotateend', rotateend); - const pitchstart = jest.fn(); - const pitch = jest.fn(); - const pitchend = jest.fn(); + const pitchstart = vi.fn(); + const pitch = vi.fn(); + const pitchend = vi.fn(); map.on('pitchstart', pitchstart); map.on('pitch', pitch); map.on('pitchend', pitchend); - const movestart = jest.fn(); - const move = jest.fn(); - const moveend = jest.fn(); + const movestart = vi.fn(); + const move = vi.fn(); + const moveend = vi.fn(); map.on('movestart', movestart); map.on('move', move); map.on('moveend', moveend); @@ -425,11 +426,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -452,9 +453,9 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const mousemove = jest.fn(); + const mousemove = vi.fn(); map.on('mousemove', mousemove); simulate.mousedown(map.getCanvasContainer(), {buttons: 2, button: 2}); @@ -471,11 +472,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -498,11 +499,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -522,10 +523,10 @@ describe('drag rotate', () => { test('DragRotateHandler requests a new render frame after each mousemove event', () => { const map = createMap(); - const requestRenderFrame = jest.spyOn(map.handlers, '_requestFrame'); + const requestRenderFrame = vi.spyOn(map.handlers, '_requestFrame'); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); simulate.mousedown(map.getCanvas(), {buttons: 2, button: 2}); simulate.mousemove(map.getCanvas(), {buttons: 2, clientX: 10, clientY: 10}); @@ -546,11 +547,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -595,9 +596,9 @@ describe('drag rotate', () => { const map = createMap(); map.dragPan.disable(); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -629,11 +630,11 @@ describe('drag rotate', () => { map.dragPan.disable(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -683,11 +684,11 @@ describe('drag rotate', () => { map.dragPan.disable(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -737,9 +738,9 @@ describe('drag rotate', () => { map.on('mousedown', e => e.preventDefault()); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -765,11 +766,11 @@ describe('drag rotate', () => { const map = createMap(); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -804,9 +805,9 @@ describe('drag rotate', () => { test('DragRotateHandler does not begin rotation on spurious mousemove events', () => { const map = createMap(); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -837,14 +838,14 @@ describe('drag rotate', () => { const map = createMap({clickTolerance: 4}); // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); - - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); - const pitchstart = jest.fn(); - const pitch = jest.fn(); - const pitchend = jest.fn(); + vi.spyOn(browser, 'now').mockReturnValue(0); + + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); + const pitchstart = vi.fn(); + const pitch = vi.fn(); + const pitchend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); diff --git a/src/ui/handler/keyboard.test.ts b/src/ui/handler/keyboard.test.ts index 98f271ff96..77db050d5a 100644 --- a/src/ui/handler/keyboard.test.ts +++ b/src/ui/handler/keyboard.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {Map} from '../../ui/map'; import {DOM} from '../../util/dom'; import simulate from '../../../test/unit/lib/simulate_interaction'; @@ -18,7 +19,7 @@ describe('keyboard', () => { test('KeyboardHandler responds to keydown events', () => { const map = createMap(); const h = map.keyboard; - const spy = jest.spyOn(h, 'keydown'); + const spy = vi.spyOn(h, 'keydown'); simulate.keydown(map.getCanvas(), {keyCode: 32, key: ' '}); expect(h.keydown).toHaveBeenCalled(); @@ -27,7 +28,7 @@ describe('keyboard', () => { test('KeyboardHandler pans map in response to arrow keys', () => { const map = createMap({zoom: 10, center: [0, 0]}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); simulate.keydown(map.getCanvas(), {keyCode: 32, key: ' '}); expect(map.easeTo).not.toHaveBeenCalled(); @@ -60,7 +61,7 @@ describe('keyboard', () => { test('KeyboardHandler pans map in response to arrow keys when disableRotation has been called', () => { const map = createMap({zoom: 10, center: [0, 0]}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); map.keyboard.disableRotation(); simulate.keydown(map.getCanvas(), {keyCode: 32, key: ' '}); @@ -94,7 +95,7 @@ describe('keyboard', () => { test('KeyboardHandler rotates map in response to Shift+left/right arrow keys', async () => { const map = createMap({zoom: 10, center: [0, 0], bearing: 0}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); simulate.keydown(map.getCanvas(), {keyCode: 32, key: ' '}); expect(map.easeTo).not.toHaveBeenCalled(); @@ -116,7 +117,7 @@ describe('keyboard', () => { test('KeyboardHandler does not rotate map in response to Shift+left/right arrow keys when disableRotation has been called', async () => { const map = createMap({zoom: 10, center: [0, 0], bearing: 0}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); map.keyboard.disableRotation(); simulate.keydown(map.getCanvas(), {keyCode: 32, key: ' '}); @@ -139,7 +140,7 @@ describe('keyboard', () => { test('KeyboardHandler pitches map in response to Shift+up/down arrow keys', async () => { const map = createMap({zoom: 10, center: [0, 0], pitch: 30}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); simulate.keydown(map.getCanvas(), {keyCode: 32, key: ' '}); expect(map.easeTo).not.toHaveBeenCalled(); @@ -161,7 +162,7 @@ describe('keyboard', () => { test('KeyboardHandler does not pitch map in response to Shift+up/down arrow keys when disableRotation has been called', async () => { const map = createMap({zoom: 10, center: [0, 0], pitch: 30}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); map.keyboard.disableRotation(); simulate.keydown(map.getCanvas(), {keyCode: 32, key: ' '}); @@ -184,7 +185,7 @@ describe('keyboard', () => { test('KeyboardHandler zooms map in response to -/+ keys', () => { const map = createMap({zoom: 10, center: [0, 0]}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); simulate.keydown(map.getCanvas(), {keyCode: 187, key: 'Equal'}); expect(spy).toHaveBeenCalledTimes(1); @@ -209,7 +210,7 @@ describe('keyboard', () => { test('KeyboardHandler zooms map in response to -/+ keys when disableRotation has been called', () => { const map = createMap({zoom: 10, center: [0, 0]}); - const spy = jest.spyOn(map, 'easeTo'); + const spy = vi.spyOn(map, 'easeTo'); map.keyboard.disableRotation(); simulate.keydown(map.getCanvas(), {keyCode: 187, key: 'Equal'}); diff --git a/src/ui/handler/map_event.test.ts b/src/ui/handler/map_event.test.ts index 9e16255ff4..ee36d84f4b 100644 --- a/src/ui/handler/map_event.test.ts +++ b/src/ui/handler/map_event.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {Map, MapOptions} from '../map'; import {DOM} from '../../util/dom'; import simulate from '../../../test/unit/lib/simulate_interaction'; @@ -16,9 +17,9 @@ describe('map events', () => { const map = createMap(); const target = map.getCanvas(); - const touchstart = jest.fn(); - const touchmove = jest.fn(); - const touchend = jest.fn(); + const touchstart = vi.fn(); + const touchmove = vi.fn(); + const touchend = vi.fn(); map.on('touchstart', touchstart); map.on('touchmove', touchmove); @@ -54,10 +55,10 @@ describe('map events', () => { const target = map.getCanvas(); map.dragPan.enable(); - const touchstart = jest.fn(); - const touchmove = jest.fn(); - const touchend = jest.fn(); - const drag = jest.fn(); + const touchstart = vi.fn(); + const touchmove = vi.fn(); + const touchend = vi.fn(); + const drag = vi.fn(); map.on('touchstart', touchstart); map.on('touchmove', touchmove); @@ -97,7 +98,7 @@ describe('map events', () => { const target = map.getCanvas(); map.dragPan.enable(); - const contextmenu = jest.fn(); + const contextmenu = vi.fn(); map.on('contextmenu', contextmenu); @@ -113,7 +114,7 @@ describe('map events', () => { const target = map.getCanvas(); map.dragPan.enable(); - const contextmenu = jest.fn(); + const contextmenu = vi.fn(); map.on('contextmenu', contextmenu); @@ -129,7 +130,7 @@ describe('map events', () => { const target = map.getCanvas(); map.dragPan.enable(); - const contextmenu = jest.fn(); + const contextmenu = vi.fn(); map.on('contextmenu', contextmenu); @@ -145,7 +146,7 @@ describe('map events', () => { const target = map.getCanvas(); map.dragPan.enable(); - const contextmenu = jest.fn(); + const contextmenu = vi.fn(); map.on('contextmenu', contextmenu); diff --git a/src/ui/handler/mouse_handler_interface.test.ts b/src/ui/handler/mouse_handler_interface.test.ts index b9dedf250c..f311d71d70 100644 --- a/src/ui/handler/mouse_handler_interface.test.ts +++ b/src/ui/handler/mouse_handler_interface.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {generateMousePanHandler, generateMousePitchHandler, generateMouseRollHandler, generateMouseRotationHandler} from './mouse'; diff --git a/src/ui/handler/mouse_rotate.test.ts b/src/ui/handler/mouse_rotate.test.ts index 2a840f3174..7df0b246ef 100644 --- a/src/ui/handler/mouse_rotate.test.ts +++ b/src/ui/handler/mouse_rotate.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {extend} from '../../util/util'; import {Map} from '../../ui/map'; import {DOM} from '../../util/dom'; @@ -19,7 +20,7 @@ describe('mouse rotate', () => { const mouseRotate = map.handlers._handlersById.mouseRotate; // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockReturnValue(0); + vi.spyOn(browser, 'now').mockReturnValue(0); expect(mouseRotate.isActive()).toBe(false); simulate.mousedown(map.getCanvas(), {buttons: 2, button: 2, clientX: 0, clientY: 0}); diff --git a/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts b/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts index 9eae8f2029..0517b3d260 100644 --- a/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +++ b/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {generateOneFingerTouchPitchHandler, generateOneFingerTouchRotationHandler} from './one_finger_touch_drag'; diff --git a/src/ui/handler/scroll_zoom.test.ts b/src/ui/handler/scroll_zoom.test.ts index 9155b6f095..62692861a5 100644 --- a/src/ui/handler/scroll_zoom.test.ts +++ b/src/ui/handler/scroll_zoom.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {browser} from '../../util/browser'; import {Map} from '../../ui/map'; import {DOM} from '../../util/dom'; @@ -22,7 +23,7 @@ beforeEach(() => { describe('ScrollZoomHandler', () => { test('Zooms for single mouse wheel tick', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -45,7 +46,7 @@ describe('ScrollZoomHandler', () => { }); test('Zooms for multiple fast mouse wheel ticks', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -71,7 +72,7 @@ describe('ScrollZoomHandler', () => { }); test('Zooms for single mouse wheel tick with non-magical deltaY', () => new Promise(done => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); const now = 1555555555555; browserNow.mockReturnValue(now); @@ -89,7 +90,7 @@ describe('ScrollZoomHandler', () => { })); test('Zooms for multiple mouse wheel ticks', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -132,7 +133,7 @@ describe('ScrollZoomHandler', () => { }); test('Gracefully ignores wheel events with deltaY: 0', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -157,7 +158,7 @@ describe('ScrollZoomHandler', () => { test('Gracefully handle wheel events that cancel each other out before the first scroll frame', () => { // See also https://github.com/mapbox/mapbox-gl-js/issues/6782 - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -179,7 +180,7 @@ describe('ScrollZoomHandler', () => { }); test('does not zoom if preventDefault is called on the wheel event', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -200,10 +201,10 @@ describe('ScrollZoomHandler', () => { }); test('emits one movestart event and one moveend event while zooming', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); - jest.useFakeTimers(); + vi.useFakeTimers(); setPerformance(); const map = createMap(); @@ -239,7 +240,7 @@ describe('ScrollZoomHandler', () => { } } - jest.advanceTimersByTime(200); + vi.advanceTimersByTime(200); map._renderTaskQueue.run(); @@ -249,11 +250,11 @@ describe('ScrollZoomHandler', () => { }); test('emits one zoomstart event and one zoomend event while zooming', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); - jest.useFakeTimers(); + vi.useFakeTimers(); setPerformance(); const map = createMap(); @@ -289,7 +290,7 @@ describe('ScrollZoomHandler', () => { } } - jest.advanceTimersByTime(200); + vi.advanceTimersByTime(200); map._renderTaskQueue.run(); expect(startCount).toBe(1); @@ -298,7 +299,7 @@ describe('ScrollZoomHandler', () => { }); test('Zooms for single mouse wheel tick while in the center of the map, should zoom to center', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -323,7 +324,7 @@ describe('ScrollZoomHandler', () => { }); test('Zooms for single mouse wheel tick while not in the center of the map, should zoom according to mouse position', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -350,7 +351,7 @@ describe('ScrollZoomHandler', () => { }); test('Zooms for single mouse wheel tick while not in the center of the map and terrain is on, should zoom according to mouse position', () => { - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); @@ -377,7 +378,7 @@ describe('ScrollZoomHandler', () => { test('Terrain 3D zoom is in the same direction when pointing above horizon or under horizon', () => { // See also https://github.com/maplibre/maplibre-gl-js/issues/3398 - const browserNow = jest.spyOn(browser, 'now'); + const browserNow = vi.spyOn(browser, 'now'); let now = 1555555555555; browserNow.mockReturnValue(now); diff --git a/src/ui/handler/tap_drag_zoom.test.ts b/src/ui/handler/tap_drag_zoom.test.ts index bc3813f6b4..d8bcc00adc 100644 --- a/src/ui/handler/tap_drag_zoom.test.ts +++ b/src/ui/handler/tap_drag_zoom.test.ts @@ -1,4 +1,6 @@ + import {beforeMapTest, sleep} from '../../util/test/util'; +import {describe, beforeEach, test, expect, vi} from 'vitest'; import simulate from '../../../test/unit/lib/simulate_interaction'; import {Map, MapOptions} from '../map'; @@ -7,13 +9,13 @@ function createMap() { } function setupEvents(map: Map) { - const zoomstart = jest.fn(); + const zoomstart = vi.fn(); map.on('zoomstart', zoomstart); - const zoom = jest.fn(); + const zoom = vi.fn(); map.on('zoom', zoom); - const zoomend = jest.fn(); + const zoomend = vi.fn(); map.on('zoomend', zoomend); return { diff --git a/src/ui/handler/two_fingers_touch.test.ts b/src/ui/handler/two_fingers_touch.test.ts index 8b0d5c74d0..780c7a5ced 100644 --- a/src/ui/handler/two_fingers_touch.test.ts +++ b/src/ui/handler/two_fingers_touch.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {Map, MapOptions} from '../map'; import {Marker} from '../marker'; import {DOM} from '../../util/dom'; @@ -18,9 +19,9 @@ describe('touch zoom rotate', () => { const map = createMap(); const target = map.getCanvas(); - const zoomstart = jest.fn(); - const zoom = jest.fn(); - const zoomend = jest.fn(); + const zoomstart = vi.fn(); + const zoom = vi.fn(); + const zoomend = vi.fn(); map.handlers._handlersById.tapZoom.disable(); map.touchPitch.disable(); @@ -62,9 +63,9 @@ describe('touch zoom rotate', () => { const map = createMap(); const target = map.getCanvas(); - const rotatestart = jest.fn(); - const rotate = jest.fn(); - const rotateend = jest.fn(); + const rotatestart = vi.fn(); + const rotate = vi.fn(); + const rotateend = vi.fn(); map.on('rotatestart', rotatestart); map.on('rotate', rotate); @@ -103,7 +104,7 @@ describe('touch zoom rotate', () => { map.on('touchstart', e => e.preventDefault()); - const move = jest.fn(); + const move = vi.fn(); map.on('move', move); simulate.touchstart(map.getCanvas(), {touches: [{target, clientX: 0, clientY: 0}, {target, clientX: 5, clientY: 0}]}); @@ -126,9 +127,9 @@ describe('touch zoom rotate', () => { map.touchZoomRotate.disableRotation(); map.handlers._handlersById.tapZoom.disable(); - const zoomstart = jest.fn(); - const zoom = jest.fn(); - const zoomend = jest.fn(); + const zoomstart = vi.fn(); + const zoom = vi.fn(); + const zoomend = vi.fn(); map.on('zoomstart', zoomstart); map.on('zoom', zoom); @@ -186,9 +187,9 @@ describe('touch zoom rotate', () => { const target1 = marker1.getElement(); const target2 = marker2.getElement(); - const zoomstart = jest.fn(); - const zoom = jest.fn(); - const zoomend = jest.fn(); + const zoomstart = vi.fn(); + const zoom = vi.fn(); + const zoomend = vi.fn(); map.handlers._handlersById.tapZoom.disable(); map.touchPitch.disable(); @@ -239,9 +240,9 @@ describe('touch zoom rotate', () => { const target1 = marker1.getElement(); // on map const target2 = marker2.getElement(); // not on map - const zoomstart = jest.fn(); - const zoom = jest.fn(); - const zoomend = jest.fn(); + const zoomstart = vi.fn(); + const zoom = vi.fn(); + const zoomend = vi.fn(); map.handlers._handlersById.tapZoom.disable(); map.touchPitch.disable(); diff --git a/src/ui/hash.test.ts b/src/ui/hash.test.ts index 7809a9f9f4..d7fc8911bd 100644 --- a/src/ui/hash.test.ts +++ b/src/ui/hash.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect} from 'vitest'; import {Hash} from './hash'; import {createMap as globalCreateMap, beforeMapTest} from '../util/test/util'; import type {Map} from './map'; @@ -252,6 +253,7 @@ describe('hash', () => { .addTo(map); expect(window.location.hash).toBeFalsy(); + window.location.hash = ''; map.setZoom(3); map.setCenter([1.0, 2.0]); diff --git a/src/ui/map_tests/map_animation.test.ts b/src/ui/map_tests/map_animation.test.ts index 1007b92bbc..2218eaac3a 100644 --- a/src/ui/map_tests/map_animation.test.ts +++ b/src/ui/map_tests/map_animation.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import simulate from '../../../test/unit/lib/simulate_interaction'; diff --git a/src/ui/map_tests/map_basic.test.ts b/src/ui/map_tests/map_basic.test.ts index 0364eacd83..20e1d41c5e 100644 --- a/src/ui/map_tests/map_basic.test.ts +++ b/src/ui/map_tests/map_basic.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {Map, MapOptions} from '../map'; import {createMap, beforeMapTest, createStyle, createStyleSource} from '../../util/test/util'; import {Tile} from '../../source/tile'; @@ -139,7 +140,7 @@ describe('Map', () => { test('#remove', () => { const map = createMap(); - const spyWorkerPoolRelease = jest.spyOn(map.style.dispatcher.workerPool, 'release'); + const spyWorkerPoolRelease = vi.spyOn(map.style.dispatcher.workerPool, 'release'); expect(map.getContainer().childNodes).toHaveLength(2); map.remove(); expect(spyWorkerPoolRelease).toHaveBeenCalledTimes(1); @@ -152,7 +153,7 @@ describe('Map', () => { test('#remove calls onRemove on added controls', () => { const map = createMap(); const control = { - onRemove: jest.fn(), + onRemove: vi.fn(), onAdd(_) { return window.document.createElement('div'); } @@ -188,7 +189,7 @@ describe('Map', () => { test('#remove broadcasts removeMap to worker', () => { const map = createMap(); - const _broadcastSpyOn = jest.spyOn(map.style.dispatcher, 'broadcast'); + const _broadcastSpyOn = vi.spyOn(map.style.dispatcher, 'broadcast'); map.remove(); expect(_broadcastSpyOn).toHaveBeenCalledWith(MessageType.removeMap, undefined); }); diff --git a/src/ui/map_tests/map_bounds.test.ts b/src/ui/map_tests/map_bounds.test.ts index 7c562d14a2..60caca137c 100644 --- a/src/ui/map_tests/map_bounds.test.ts +++ b/src/ui/map_tests/map_bounds.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {fixedLngLat, fixedNum} from '../../../test/unit/lib/fixed'; import {LngLatBoundsLike} from '../../geo/lng_lat_bounds'; diff --git a/src/ui/map_tests/map_calculate_camera_options.test.ts b/src/ui/map_tests/map_calculate_camera_options.test.ts index 06f8c5bcde..889d6eb145 100644 --- a/src/ui/map_tests/map_calculate_camera_options.test.ts +++ b/src/ui/map_tests/map_calculate_camera_options.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {LngLat} from '../../geo/lng_lat'; import {OverscaledTileID} from '../../source/tile_id'; @@ -15,7 +16,7 @@ describe('#calculateCameraOptionsFromTo', () => { test('pitch 90 with terrain', () => { const map = createMap(); - const mockedGetElevation = jest.fn((_lngLat: LngLat, _zoom: number) => 111200); + const mockedGetElevation = vi.fn((_lngLat: LngLat, _zoom: number) => 111200); const terrainStub = {} as Terrain; terrainStub.getElevationForLngLatZoom = mockedGetElevation; @@ -32,7 +33,7 @@ describe('#calculateCameraOptionsFromTo', () => { test('pitch 153.435 with terrain', () => { const map = createMap(); - const mockedGetElevation = jest.fn((_lngLat: LngLat, _zoom: number) => 111200 * 3); + const mockedGetElevation = vi.fn((_lngLat: LngLat, _zoom: number) => 111200 * 3); const terrainStub = {} as Terrain; terrainStub.getElevationForLngLatZoom = mockedGetElevation; @@ -49,7 +50,7 @@ describe('#calculateCameraOptionsFromTo', () => { test('pitch 63 with terrain', () => { const map = createMap(); - const mockedGetElevation = jest.fn((_lngLat: LngLat, _zoom: number) => 111200 / 2); + const mockedGetElevation = vi.fn((_lngLat: LngLat, _zoom: number) => 111200 / 2); const terrainStub = {} as Terrain; terrainStub.getElevationForLngLatZoom = mockedGetElevation; @@ -67,7 +68,7 @@ describe('#calculateCameraOptionsFromTo', () => { test('zoom distance 1000', () => { const map = createMap(); - const mockedGetElevation = jest.fn((_lngLat: LngLat, _zoom: number) => 1000); + const mockedGetElevation = vi.fn((_lngLat: LngLat, _zoom: number) => 1000); const terrainStub = {} as Terrain; terrainStub.getElevationForLngLatZoom = mockedGetElevation; @@ -84,7 +85,7 @@ describe('#calculateCameraOptionsFromTo', () => { test('don\'t call getElevation when altitude supplied', () => { const map = createMap(); - const mockedGetElevation = jest.fn((_tileID: OverscaledTileID, _x: number, _y: number, _extent?: number) => 0); + const mockedGetElevation = vi.fn((_tileID: OverscaledTileID, _x: number, _y: number, _extent?: number) => 0); const terrainStub = {} as Terrain; terrainStub.getElevation = mockedGetElevation; @@ -99,7 +100,7 @@ describe('#calculateCameraOptionsFromTo', () => { test('don\'t call getElevation when altitude 0 supplied', () => { const map = createMap(); - const mockedGetElevation = jest.fn((_tileID: OverscaledTileID, _x: number, _y: number, _extent?: number) => 0); + const mockedGetElevation = vi.fn((_tileID: OverscaledTileID, _x: number, _y: number, _extent?: number) => 0); const terrainStub = {} as Terrain; terrainStub.getElevation = mockedGetElevation; diff --git a/src/ui/map_tests/map_canvas.test.ts b/src/ui/map_tests/map_canvas.test.ts index 8f2c1b6b0e..09ea53e8eb 100644 --- a/src/ui/map_tests/map_canvas.test.ts +++ b/src/ui/map_tests/map_canvas.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { @@ -10,8 +11,8 @@ describe('Max Canvas Size option', () => { const container = window.document.createElement('div'); Object.defineProperty(container, 'clientWidth', {value: 2048}); Object.defineProperty(container, 'clientHeight', {value: 2048}); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(8192); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(8192); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(8192); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(8192); const map = createMap({container, maxCanvasSize: [8192, 8192], pixelRatio: 5}); map.resize(); expect(map.getCanvas().width).toBe(8192); @@ -22,8 +23,8 @@ describe('Max Canvas Size option', () => { const container = window.document.createElement('div'); Object.defineProperty(container, 'clientWidth', {value: 1024}); Object.defineProperty(container, 'clientHeight', {value: 2048}); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(8192); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(4096); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(8192); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(4096); const map = createMap({container, maxCanvasSize: [8192, 4096], pixelRatio: 3}); map.resize(); expect(map.getCanvas().width).toBe(2048); @@ -34,8 +35,8 @@ describe('Max Canvas Size option', () => { const container = window.document.createElement('div'); Object.defineProperty(container, 'clientWidth', {value: 12834}); Object.defineProperty(container, 'clientHeight', {value: 9000}); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(4096); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(8192); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(4096); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(8192); const map = createMap({container, maxCanvasSize: [4096, 8192], pixelRatio: 1}); map.resize(); expect(map.getCanvas().width).toBe(4096); @@ -46,8 +47,8 @@ describe('Max Canvas Size option', () => { const container = window.document.createElement('div'); Object.defineProperty(container, 'clientWidth', {value: 2048}); Object.defineProperty(container, 'clientHeight', {value: 2048}); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(3072); - jest.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(3072); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferWidth', 'get').mockReturnValue(3072); + vi.spyOn(WebGLRenderingContext.prototype, 'drawingBufferHeight', 'get').mockReturnValue(3072); const map = createMap({container, maxCanvasSize: [3072, 3072], pixelRatio: 1.25}); map.resize(); expect(map.getCanvas().width).toBe(2560); diff --git a/src/ui/map_tests/map_control.test.ts b/src/ui/map_tests/map_control.test.ts index 9a0ca3c4f3..894839d748 100644 --- a/src/ui/map_tests/map_control.test.ts +++ b/src/ui/map_tests/map_control.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {IControl} from '../control/control'; @@ -21,7 +22,7 @@ test('#addControl', () => { test('#removeControl errors on invalid arguments', () => { const map = createMap(); const control = {} as any as IControl; - const stub = jest.spyOn(console, 'error').mockImplementation(() => {}); + const stub = vi.spyOn(console, 'error').mockImplementation(() => {}); map.addControl(control); map.removeControl(control); diff --git a/src/ui/map_tests/map_disable_handlers.test.ts b/src/ui/map_tests/map_disable_handlers.test.ts index 1b082101e2..4defa366ee 100644 --- a/src/ui/map_tests/map_disable_handlers.test.ts +++ b/src/ui/map_tests/map_disable_handlers.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { diff --git a/src/ui/map_tests/map_events.test.ts b/src/ui/map_tests/map_events.test.ts index d4d90035d1..747042a895 100644 --- a/src/ui/map_tests/map_events.test.ts +++ b/src/ui/map_tests/map_events.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import simulate from '../../../test/unit/lib/simulate_interaction'; import {StyleLayer} from '../../style/style_layer'; import {createMap, beforeMapTest, createStyle, sleep} from '../../util/test/util'; @@ -19,7 +20,7 @@ describe('map events', () => { test('Map#on adds a non-delegated event listener', () => { const map = createMap(); - const spy = jest.fn(function (e) { + const spy = vi.fn(function (e) { expect(this).toBe(map); expect(e.type).toBe('click'); }); @@ -32,7 +33,7 @@ describe('map events', () => { test('Map#off removes a non-delegated event listener', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.on('click', spy); map.off('click', spy); @@ -46,13 +47,13 @@ describe('map events', () => { const map = createMap(); const features = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { expect(options).toEqual({layers: ['layer']}); return features; }); - const spy = jest.fn(function (e) { + const spy = vi.fn(function (e) { expect(this).toBe(map); expect(e.type).toBe('click'); expect(e.features).toBe(features); @@ -68,14 +69,14 @@ describe('map events', () => { const map = createMap(); const features = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures') + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures') .mockImplementationOnce((_point, options) => { expect(options).toEqual({layers: ['layer1', 'layer2']}); return features; }); - const spy = jest.fn(function (e) { + const spy = vi.fn(function (e) { expect(this).toBe(map); expect(e.type).toBe('click'); expect(e.features).toBe(features); @@ -91,19 +92,19 @@ describe('map events', () => { const map = createMap(); const features = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockImplementation((id: string) => { + vi.spyOn(map, 'getLayer').mockImplementation((id: string) => { if (id === 'nonExistingLayer') { return undefined; } return {} as StyleLayer; }); - jest.spyOn(map, 'queryRenderedFeatures') + vi.spyOn(map, 'queryRenderedFeatures') .mockImplementationOnce((_point, options) => { expect(options).toEqual({layers: ['layer1', 'layer2']}); return features; }); - const spy = jest.fn(function (e) { + const spy = vi.fn(function (e) { expect(this).toBe(map); expect(e.type).toBe('click'); expect(e.features).toBe(features); @@ -119,13 +120,13 @@ describe('map events', () => { const map = createMap(); const features = []; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((point, options) => { expect(options).toEqual({layers: ['layer']}); return features; }); - const spy = jest.fn(); + const spy = vi.fn(); map.on('click', 'layer', spy); simulate.click(map.getCanvas()); @@ -137,9 +138,9 @@ describe('map events', () => { test('Map#on adds a listener not triggered when the specified layer does not exist', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue(null as unknown as StyleLayer); + vi.spyOn(map, 'getLayer').mockReturnValue(null as unknown as StyleLayer); - const spy = jest.fn(); + const spy = vi.fn(); map.on('click', 'layer', spy); simulate.click(map.getCanvas()); @@ -151,14 +152,14 @@ describe('map events', () => { test('Map#on distinguishes distinct event types', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spyDown = jest.fn((e) => { + const spyDown = vi.fn((e) => { expect(e.type).toBe('mousedown'); }); - const spyUp = jest.fn((e) => { + const spyUp = vi.fn((e) => { expect(e.type).toBe('mouseup'); }); @@ -175,16 +176,16 @@ describe('map events', () => { const featuresA = [{} as MapGeoJSONFeature]; const featuresB = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { return (options as any).layers[0] === 'A' ? featuresA : featuresB; }); - const spyA = jest.fn((e) => { + const spyA = vi.fn((e) => { expect(e.features).toBe(featuresA); }); - const spyB = jest.fn((e) => { + const spyB = vi.fn((e) => { expect(e.features).toBe(featuresB); }); @@ -199,11 +200,11 @@ describe('map events', () => { test('Map#on distinguishes distinct listeners', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spyA = jest.fn(); - const spyB = jest.fn(); + const spyA = vi.fn(); + const spyB = vi.fn(); map.on('click', 'layer', spyA); map.on('click', 'layer', spyB); @@ -220,7 +221,7 @@ describe('map events', () => { onMove: function onMove(_event: MapLibreEvent) {} }; - jest.spyOn(handler, 'onMove'); + vi.spyOn(handler, 'onMove'); map.on('move', (event) => handler.onMove(event)); map.jumpTo({center: {lng: 10, lat: 10}}); @@ -231,7 +232,7 @@ describe('map events', () => { test('Map#on allows a listener to infer the event type ', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.on('mousemove', (event) => { assertNotAny(event); const {lng, lat} = event.lngLat; @@ -245,10 +246,10 @@ describe('map events', () => { test('Map#off removes a delegated event listener', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on('click', 'layer', spy); map.off('click', 'layer', spy); @@ -260,10 +261,10 @@ describe('map events', () => { test('Map#off removes a delegated event listener for multiple layers', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on('click', ['layer1', 'layer2'], spy); map.off('click', ['layer1', 'layer2'], spy); @@ -275,10 +276,10 @@ describe('map events', () => { test('Map#off distinguishes distinct event types', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn((e) => { + const spy = vi.fn((e) => { expect(e.type).toBe('mousedown'); }); @@ -294,13 +295,13 @@ describe('map events', () => { const map = createMap(); const featuresA = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((point, options) => { expect(options).toEqual({layers: ['A']}); return featuresA; }); - const spy = jest.fn((e) => { + const spy = vi.fn((e) => { expect(e.features).toBe(featuresA); }); @@ -316,13 +317,13 @@ describe('map events', () => { const map = createMap(); const featuresAB = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((point, options) => { expect(options).toEqual({layers: ['A', 'B']}); return featuresAB; }); - const spy = jest.fn((e) => { + const spy = vi.fn((e) => { expect(e.features).toBe(featuresAB); }); @@ -337,15 +338,15 @@ describe('map events', () => { test('Map#off compares full layer array list, including layers missing in style', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockImplementation((id: string) => { + vi.spyOn(map, 'getLayer').mockImplementation((id: string) => { if (id === 'nonExistingLayer') { return undefined; } return {} as StyleLayer; }); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on('click', ['A', 'C', 'nonExistingLayer'], spy); map.off('click', ['A', 'C'], spy); @@ -362,11 +363,11 @@ describe('map events', () => { test('Map#off distinguishes distinct listeners', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spyA = jest.fn(); - const spyB = jest.fn(); + const spyA = vi.fn(); + const spyB = vi.fn(); map.on('click', 'layer', spyA); map.on('click', 'layer', spyB); @@ -384,7 +385,7 @@ describe('map events', () => { onMove: function onMove(_event: MapLibreEvent) {} }; - jest.spyOn(handler, 'onMove'); + vi.spyOn(handler, 'onMove'); map.off('move', (event) => handler.onMove(event)); map.jumpTo({center: {lng: 10, lat: 10}}); @@ -395,7 +396,7 @@ describe('map events', () => { test('Map#off allows a listener to infer the event type ', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.off('mousemove', (event) => { assertNotAny(event); const {lng, lat} = event.lngLat; @@ -413,7 +414,7 @@ describe('map events', () => { onMoveOnce: function onMoveOnce(_event: MapLibreEvent) {} }; - jest.spyOn(handler, 'onMoveOnce'); + vi.spyOn(handler, 'onMoveOnce'); map.once('move', (event) => handler.onMoveOnce(event)); map.jumpTo({center: {lng: 10, lat: 10}}); @@ -424,7 +425,7 @@ describe('map events', () => { test('Map#once allows a listener to infer the event type ', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.once('mousemove', (event) => { assertNotAny(event); const {lng, lat} = event.lngLat; @@ -438,10 +439,10 @@ describe('map events', () => { test('Map#off removes listener registered with Map#once', () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.once('click', 'layer', spy); map.off('click', 'layer', spy); @@ -454,9 +455,9 @@ describe('map events', () => { test(`Map#on ${event} does not fire if the specified layer does not exist`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue(null as unknown as StyleLayer); + vi.spyOn(map, 'getLayer').mockReturnValue(null as unknown as StyleLayer); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); simulate.mousemove(map.getCanvas()); @@ -470,13 +471,13 @@ describe('map events', () => { const map = createMap(); const features = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { expect(options).toEqual({layers: ['layer']}); return features; }); - const spy = jest.fn(function (e) { + const spy = vi.fn(function (e) { expect(this).toBe(map); expect(e.type).toBe(event); expect(e.target).toBe(map); @@ -492,10 +493,10 @@ describe('map events', () => { test(`Map#on ${event} does not fire on mousemove within the specified layer`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); simulate.mousemove(map.getCanvas()); @@ -507,13 +508,13 @@ describe('map events', () => { test(`Map#on ${event} fires when reentering the specified layer`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures') + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures') .mockReturnValueOnce([{} as MapGeoJSONFeature]) .mockReturnValueOnce([]) .mockReturnValueOnce([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); simulate.mousemove(map.getCanvas()); @@ -526,10 +527,10 @@ describe('map events', () => { test(`Map#on ${event} fires when reentering the specified layer after leaving the canvas`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); simulate.mousemove(map.getCanvas()); @@ -544,16 +545,16 @@ describe('map events', () => { const featuresA = [{} as MapGeoJSONFeature]; const featuresB = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { return (options as any).layers[0] === 'A' ? featuresA : featuresB; }); - const spyA = jest.fn((e) => { + const spyA = vi.fn((e) => { expect(e.features).toBe(featuresA); }); - const spyB = jest.fn((e) => { + const spyB = vi.fn((e) => { expect(e.features).toBe(featuresB); }); @@ -573,8 +574,8 @@ describe('map events', () => { const nonEmptyFeatures = [{} as MapGeoJSONFeature]; const emptyFeatures = []; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { const layers = (options as any).layers as string[]; if (layers.includes('A')) { return nonEmptyFeatures; @@ -582,9 +583,9 @@ describe('map events', () => { return emptyFeatures; }); - const spyA = jest.fn(); - const spyAB = jest.fn(); - const spyC = jest.fn(); + const spyA = vi.fn(); + const spyAB = vi.fn(); + const spyC = vi.fn(); map.on(event, 'A', spyA); map.on(event, ['A', 'B'], spyAB); @@ -601,13 +602,13 @@ describe('map events', () => { test(`Map#on ${event} filters non-existing layers`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockImplementation((id: string) => id === 'B' ? undefined : {} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockImplementation((id: string) => id === 'B' ? undefined : {} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { expect((options as any).layers).toStrictEqual(['A', 'C']); return [{} as MapGeoJSONFeature]; }); - const spyAC = jest.fn(); + const spyAC = vi.fn(); map.on(event, ['A', 'B', 'C'], spyAC); @@ -620,11 +621,11 @@ describe('map events', () => { test(`Map#on ${event} distinguishes distinct listeners`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spyA = jest.fn(); - const spyB = jest.fn(); + const spyA = vi.fn(); + const spyB = vi.fn(); map.on(event, 'layer', spyA); map.on(event, 'layer', spyB); @@ -637,10 +638,10 @@ describe('map events', () => { test(`Map#off ${event} removes a delegated event listener`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); map.off(event, 'layer', spy); @@ -654,13 +655,13 @@ describe('map events', () => { const map = createMap(); const featuresA = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { expect(options).toEqual({layers: ['A']}); return featuresA; }); - const spy = jest.fn((e) => { + const spy = vi.fn((e) => { expect(e.features).toBe(featuresA); }); @@ -676,13 +677,13 @@ describe('map events', () => { const map = createMap(); const featuresAB = [{} as MapGeoJSONFeature]; - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockImplementation((_point, options) => { expect(options).toEqual({layers: ['A', 'B']}); return featuresAB; }); - const spy = jest.fn((e) => { + const spy = vi.fn((e) => { expect(e.features).toBe(featuresAB); }); @@ -698,11 +699,11 @@ describe('map events', () => { test(`Map#off ${event} distinguishes distinct listeners`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spyA = jest.fn(); - const spyB = jest.fn(); + const spyA = vi.fn(); + const spyB = vi.fn(); map.on(event, 'layer', spyA); map.on(event, 'layer', spyB); @@ -718,10 +719,10 @@ describe('map events', () => { test(`Map#on ${event} does not fire if the specified layer does not exist`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue(undefined); - jest.spyOn(map, 'queryRenderedFeatures'); + vi.spyOn(map, 'getLayer').mockReturnValue(undefined); + vi.spyOn(map, 'queryRenderedFeatures'); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); simulate.mousemove(map.getCanvas()); @@ -734,12 +735,12 @@ describe('map events', () => { test(`Map#on ${event} fires if one of specified layers exists`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockImplementation((id: string) => id === 'A' ? {} as StyleLayer : undefined); - jest.spyOn(map, 'queryRenderedFeatures') + vi.spyOn(map, 'getLayer').mockImplementation((id: string) => id === 'A' ? {} as StyleLayer : undefined); + vi.spyOn(map, 'queryRenderedFeatures') .mockReturnValueOnce([{} as MapGeoJSONFeature]) .mockReturnValueOnce([]); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, ['A', 'B'], spy); simulate.mousemove(map.getCanvas()); @@ -751,10 +752,10 @@ describe('map events', () => { test(`Map#on ${event} does not fire on mousemove when entering or within the specified layer`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); simulate.mousemove(map.getCanvas()); @@ -767,12 +768,12 @@ describe('map events', () => { test(`Map#on ${event} fires when exiting the specified layer`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures') + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures') .mockReturnValueOnce([{} as MapGeoJSONFeature]) .mockReturnValueOnce([]); - const spy = jest.fn(function (e) { + const spy = vi.fn(function (e) { expect(this).toBe(map); expect(e.type).toBe(event); expect(e.features).toBeUndefined(); @@ -788,10 +789,10 @@ describe('map events', () => { test(`Map#on ${event} fires when exiting the canvas`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures').mockReturnValue([{} as MapGeoJSONFeature]); - const spy = jest.fn(function (e) { + const spy = vi.fn(function (e) { expect(this).toBe(map); expect(e.type).toBe(event); expect(e.features).toBeUndefined(); @@ -807,12 +808,12 @@ describe('map events', () => { test(`Map#off ${event} removes a delegated event listener`, () => { const map = createMap(); - jest.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); - jest.spyOn(map, 'queryRenderedFeatures') + vi.spyOn(map, 'getLayer').mockReturnValue({} as StyleLayer); + vi.spyOn(map, 'queryRenderedFeatures') .mockReturnValueOnce([{} as MapGeoJSONFeature]) .mockReturnValueOnce([]); - const spy = jest.fn(); + const spy = vi.fn(); map.on(event, 'layer', spy); map.off(event, 'layer', spy); @@ -830,7 +831,7 @@ describe('map events', () => { map.on('mousedown', e => e.preventDefault()); - const click = jest.fn(); + const click = vi.fn(); map.on('click', click); simulate.click(map.getCanvas()); @@ -844,7 +845,7 @@ describe('map events', () => { map.on('mousedown', e => e.preventDefault()); - const click = jest.fn(); + const click = vi.fn(); map.on('click', click); const canvas = map.getCanvas(); @@ -859,7 +860,7 @@ describe('map events', () => { map.on('mousedown', e => e.preventDefault()); - const click = jest.fn(); + const click = vi.fn(); map.on('click', click); const canvas = map.getCanvas(); @@ -874,7 +875,7 @@ describe('map events', () => { map.on('mousedown', e => e.preventDefault()); - const click = jest.fn(); + const click = vi.fn(); map.on('click', click); const canvas = map.getCanvas(); @@ -887,7 +888,7 @@ describe('map events', () => { test('Map#on click fires subsequent click event if there is no corresponding mousedown/mouseup event', () => { const map = createMap({clickTolerance: 4}); - const click = jest.fn(); + const click = vi.fn(); map.on('click', click); const canvas = map.getCanvas(); @@ -1002,10 +1003,10 @@ describe('map events', () => { describe('error event', () => { test('logs errors to console when it has NO listeners', () => { // to avoid seeing error in the console in Jest - let stub = jest.spyOn(console, 'error').mockImplementation(() => {}); + let stub = vi.spyOn(console, 'error').mockImplementation(() => {}); const map = createMap(); stub.mockReset(); - stub = jest.spyOn(console, 'error').mockImplementation(() => {}); + stub = vi.spyOn(console, 'error').mockImplementation(() => {}); const error = new Error('test'); map.fire(new ErrorEvent(error)); expect(stub).toHaveBeenCalledTimes(1); @@ -1030,7 +1031,7 @@ describe('map events', () => { await map.once('load'); - const spy = jest.fn(); + const spy = vi.fn(); map.on('projectiontransition', (e) => spy(e.newProjection)); map.setProjection({ type: 'globe', @@ -1044,10 +1045,10 @@ describe('map events', () => { }); test('projectiontransition is fired when globe transitions to mercator', async () => { const map = createMap(); - jest.spyOn(GlobeProjection.prototype, 'updateGPUdependent').mockImplementation(() => {}); + vi.spyOn(GlobeProjection.prototype, 'updateGPUdependent').mockImplementation(() => {}); await map.once('load'); - const spy = jest.fn(); + const spy = vi.fn(); map.on('projectiontransition', (e) => spy(e.newProjection)); map.setProjection({ diff --git a/src/ui/map_tests/map_feature_state.test.ts b/src/ui/map_tests/map_feature_state.test.ts index b3160b8169..1275de4c64 100644 --- a/src/ui/map_tests/map_feature_state.test.ts +++ b/src/ui/map_tests/map_feature_state.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest, createStyleSource} from '../../util/test/util'; beforeEach(() => { diff --git a/src/ui/map_tests/map_images.test.ts b/src/ui/map_tests/map_images.test.ts index c2261e39d7..2d13cc5c11 100644 --- a/src/ui/map_tests/map_images.test.ts +++ b/src/ui/map_tests/map_images.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {StyleImageInterface} from '../../style/style_image'; diff --git a/src/ui/map_tests/map_is_moving.test.ts b/src/ui/map_tests/map_is_moving.test.ts index 814578985a..d7ab43a43e 100644 --- a/src/ui/map_tests/map_is_moving.test.ts +++ b/src/ui/map_tests/map_is_moving.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {browser} from '../../util/browser'; import {Map} from '../map'; import {DOM} from '../../util/dom'; @@ -68,7 +69,7 @@ describe('Map#isMoving', () => { test('returns true when drag rotating', () => new Promise(done => { // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockImplementation(() => { return 0; }); + vi.spyOn(browser, 'now').mockImplementation(() => { return 0; }); map.on('movestart', () => { expect(map.isMoving()).toBe(true); @@ -108,7 +109,7 @@ describe('Map#isMoving', () => { }); let now = 0; - jest.spyOn(browser, 'now').mockImplementation(() => { return now; }); + vi.spyOn(browser, 'now').mockImplementation(() => { return now; }); simulate.wheel(map.getCanvas(), {type: 'wheel', deltaY: -simulate.magicWheelZoomDelta}); map._renderTaskQueue.run(); @@ -151,7 +152,7 @@ describe('Map#isMoving', () => { map._renderTaskQueue.run(); let now = 0; - jest.spyOn(browser, 'now').mockImplementation(() => { return now; }); + vi.spyOn(browser, 'now').mockImplementation(() => { return now; }); simulate.wheel(map.getCanvas(), {type: 'wheel', deltaY: -simulate.magicWheelZoomDelta}); map._renderTaskQueue.run(); diff --git a/src/ui/map_tests/map_is_rotating.test.ts b/src/ui/map_tests/map_is_rotating.test.ts index 7dc3bd4a00..7c4973c099 100644 --- a/src/ui/map_tests/map_is_rotating.test.ts +++ b/src/ui/map_tests/map_is_rotating.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {Map} from '../map'; import {DOM} from '../../util/dom'; import simulate from '../../../test/unit/lib/simulate_interaction'; @@ -39,7 +40,7 @@ describe('Map#isRotating', () => { test('returns true when drag rotating', () => new Promise(done => { // Prevent inertial rotation. - jest.spyOn(browser, 'now').mockImplementation(() => { return 0; }); + vi.spyOn(browser, 'now').mockImplementation(() => { return 0; }); map.on('rotatestart', () => { expect(map.isRotating()).toBe(true); diff --git a/src/ui/map_tests/map_is_zooming.test.ts b/src/ui/map_tests/map_is_zooming.test.ts index 44e507e7d9..6dc38511c4 100644 --- a/src/ui/map_tests/map_is_zooming.test.ts +++ b/src/ui/map_tests/map_is_zooming.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {browser} from '../../util/browser'; import {Map} from '../map'; import {DOM} from '../../util/dom'; @@ -50,7 +51,7 @@ describe('Map#isZooming', () => { }); let now = 0; - jest.spyOn(browser, 'now').mockImplementation(() => { return now; }); + vi.spyOn(browser, 'now').mockImplementation(() => { return now; }); simulate.wheel(map.getCanvas(), {type: 'wheel', deltaY: -simulate.magicWheelZoomDelta}); map._renderTaskQueue.run(); @@ -75,7 +76,7 @@ describe('Map#isZooming', () => { }); let now = 0; - jest.spyOn(browser, 'now').mockImplementation(() => { return now; }); + vi.spyOn(browser, 'now').mockImplementation(() => { return now; }); simulate.dblclick(map.getCanvas()); map._renderTaskQueue.run(); diff --git a/src/ui/map_tests/map_layer.test.ts b/src/ui/map_tests/map_layer.test.ts index efdfeef7c5..1437f5d37c 100644 --- a/src/ui/map_tests/map_layer.test.ts +++ b/src/ui/map_tests/map_layer.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect} from 'vitest'; import {createMap, beforeMapTest, createStyle} from '../../util/test/util'; import {extend} from '../../util/util'; import {EvaluationParameters} from '../../style/evaluation_parameters'; diff --git a/src/ui/map_tests/map_options.test.ts b/src/ui/map_tests/map_options.test.ts index 5d905df292..d33a3b4fef 100644 --- a/src/ui/map_tests/map_options.test.ts +++ b/src/ui/map_tests/map_options.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest, createStyle} from '../../util/test/util'; import {EvaluationParameters} from '../../style/evaluation_parameters'; import {Style} from '../../style/style'; @@ -27,7 +28,7 @@ describe('#mapOptions', () => { test('Style validation is enabled by default', () => { let validationOption = false; - jest.spyOn(Style.prototype, 'loadJSON').mockImplementationOnce((styleJson, options) => { + vi.spyOn(Style.prototype, 'loadJSON').mockImplementationOnce((styleJson, options) => { validationOption = options.validate; }); createMap(); @@ -36,7 +37,7 @@ describe('#mapOptions', () => { test('Style validation disabled using mapOptions', () => { let validationOption = true; - jest.spyOn(Style.prototype, 'loadJSON').mockImplementationOnce((styleJson, options) => { + vi.spyOn(Style.prototype, 'loadJSON').mockImplementationOnce((styleJson, options) => { validationOption = options.validate; }); createMap({validateStyle: false}); @@ -47,7 +48,7 @@ describe('#mapOptions', () => { test('fadeDuration is set after first idle event', async () => { let idleTriggered = false; const fadeDuration = 100; - const spy = jest.spyOn(Style.prototype, 'update').mockImplementation((parameters: EvaluationParameters) => { + const spy = vi.spyOn(Style.prototype, 'update').mockImplementation((parameters: EvaluationParameters) => { if (!idleTriggered) { expect(parameters.fadeDuration).toBe(0); } else { diff --git a/src/ui/map_tests/map_pitch.test.ts b/src/ui/map_tests/map_pitch.test.ts index 35e4750bd3..a37d20ea74 100644 --- a/src/ui/map_tests/map_pitch.test.ts +++ b/src/ui/map_tests/map_pitch.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { diff --git a/src/ui/map_tests/map_pixel_ratio.test.ts b/src/ui/map_tests/map_pixel_ratio.test.ts index bbdf6bd98b..cbb1febd82 100644 --- a/src/ui/map_tests/map_pixel_ratio.test.ts +++ b/src/ui/map_tests/map_pixel_ratio.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { diff --git a/src/ui/map_tests/map_query_rendered_features.test.ts b/src/ui/map_tests/map_query_rendered_features.test.ts index ae21156dd2..6d03aa3aa2 100644 --- a/src/ui/map_tests/map_query_rendered_features.test.ts +++ b/src/ui/map_tests/map_query_rendered_features.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {LngLat} from '../../geo/lng_lat'; @@ -11,7 +12,7 @@ describe('#queryRenderedFeatures', () => { test('if no arguments provided', () => new Promise(done => { createMap({}, (err, map) => { expect(err).toBeFalsy(); - const spy = jest.spyOn(map.style, 'queryRenderedFeatures'); + const spy = vi.spyOn(map.style, 'queryRenderedFeatures'); const output = map.queryRenderedFeatures(); @@ -27,7 +28,7 @@ describe('#queryRenderedFeatures', () => { test('if only "geometry" provided', () => new Promise(done => { createMap({}, (err, map) => { expect(err).toBeFalsy(); - const spy = jest.spyOn(map.style, 'queryRenderedFeatures'); + const spy = vi.spyOn(map.style, 'queryRenderedFeatures'); const output = map.queryRenderedFeatures(map.project(new LngLat(0, 0))); @@ -44,7 +45,7 @@ describe('#queryRenderedFeatures', () => { test('if only "params" provided', () => new Promise(done => { createMap({}, (err, map) => { expect(err).toBeFalsy(); - const spy = jest.spyOn(map.style, 'queryRenderedFeatures'); + const spy = vi.spyOn(map.style, 'queryRenderedFeatures'); const output = map.queryRenderedFeatures({filter: ['all']}); @@ -60,7 +61,7 @@ describe('#queryRenderedFeatures', () => { test('if both "geometry" and "params" provided', () => new Promise(done => { createMap({}, (err, map) => { expect(err).toBeFalsy(); - const spy = jest.spyOn(map.style, 'queryRenderedFeatures'); + const spy = vi.spyOn(map.style, 'queryRenderedFeatures'); const output = map.queryRenderedFeatures({filter: ['all']}); @@ -76,7 +77,7 @@ describe('#queryRenderedFeatures', () => { test('if "geometry" with unwrapped coords provided', () => new Promise(done => { createMap({}, (err, map) => { expect(err).toBeFalsy(); - const spy = jest.spyOn(map.style, 'queryRenderedFeatures'); + const spy = vi.spyOn(map.style, 'queryRenderedFeatures'); map.queryRenderedFeatures(map.project(new LngLat(360, 0))); diff --git a/src/ui/map_tests/map_render.test.ts b/src/ui/map_tests/map_render.test.ts index fe88f809f1..dbbd858b75 100644 --- a/src/ui/map_tests/map_render.test.ts +++ b/src/ui/map_tests/map_render.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, afterEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest, createStyle} from '../../util/test/util'; import {fakeServer, FakeServer} from 'nise'; @@ -60,7 +61,7 @@ test('no render before style loaded', () => new Promise((done) => { server.respondWith('/styleUrl', JSON.stringify(createStyle())); const map = createMap({style: '/styleUrl'}); - jest.spyOn(map, 'triggerRepaint').mockImplementationOnce(() => { + vi.spyOn(map, 'triggerRepaint').mockImplementationOnce(() => { if (!map.style._loaded) { throw new Error('test failed'); } diff --git a/src/ui/map_tests/map_request_render_frame.test.ts b/src/ui/map_tests/map_request_render_frame.test.ts index c4f57937bb..dedfc36fcf 100644 --- a/src/ui/map_tests/map_request_render_frame.test.ts +++ b/src/ui/map_tests/map_request_render_frame.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { @@ -8,7 +9,7 @@ describe('requestRenderFrame', () => { test('Map#_requestRenderFrame schedules a new render frame if necessary', () => new Promise(done => { const map = createMap(); - const spy = jest.spyOn(map, 'triggerRepaint'); + const spy = vi.spyOn(map, 'triggerRepaint'); map._requestRenderFrame(() => {}); expect(spy).toHaveBeenCalledTimes(0); @@ -24,7 +25,7 @@ describe('requestRenderFrame', () => { test('Map#_requestRenderFrame should not schedule a render frame before style load', () => { const map = createMap(); - const spy = jest.spyOn(map, 'triggerRepaint'); + const spy = vi.spyOn(map, 'triggerRepaint'); map._requestRenderFrame(() => {}); expect(spy).toHaveBeenCalledTimes(0); map.remove(); @@ -32,7 +33,7 @@ describe('requestRenderFrame', () => { test('Map#_requestRenderFrame queues a task for the next render frame', async () => { const map = createMap(); - const cb = jest.fn(); + const cb = vi.fn(); map._requestRenderFrame(cb); await map.once('render'); expect(cb).toHaveBeenCalledTimes(1); @@ -41,7 +42,7 @@ describe('requestRenderFrame', () => { test('Map#_cancelRenderFrame cancels a queued task', async () => { const map = createMap(); - const cb = jest.fn(); + const cb = vi.fn(); const id = map._requestRenderFrame(cb); map._cancelRenderFrame(id); await map.once('render'); diff --git a/src/ui/map_tests/map_resize.test.ts b/src/ui/map_tests/map_resize.test.ts index 4dcaec2bce..0604ef2877 100644 --- a/src/ui/map_tests/map_resize.test.ts +++ b/src/ui/map_tests/map_resize.test.ts @@ -1,4 +1,5 @@ import {MercatorProjection} from '../../geo/projection/mercator'; +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest, sleep} from '../../util/test/util'; beforeEach(() => { @@ -36,8 +37,8 @@ describe('#resize', () => { }); test('listen to window resize event', () => { - const spy = jest.fn(); - global.ResizeObserver = jest.fn().mockImplementation(() => ({ + const spy = vi.fn(); + global.ResizeObserver = vi.fn().mockImplementation(() => ({ observe: spy })); @@ -48,15 +49,15 @@ describe('#resize', () => { test('do not resize if trackResize is false', () => { let observerCallback: Function = null; - global.ResizeObserver = jest.fn().mockImplementation((c) => ({ + global.ResizeObserver = vi.fn().mockImplementation((c) => ({ observe: () => { observerCallback = c; } })); const map = createMap({trackResize: false}); - const spyA = jest.spyOn(map, 'stop'); - const spyB = jest.spyOn(map, '_update'); - const spyC = jest.spyOn(map, 'resize'); + const spyA = vi.spyOn(map, 'stop'); + const spyB = vi.spyOn(map, '_update'); + const spyC = vi.spyOn(map, 'resize'); observerCallback(); @@ -67,15 +68,16 @@ describe('#resize', () => { test('do resize if trackResize is true (default)', async () => { let observerCallback: Function = null; - global.ResizeObserver = jest.fn().mockImplementation((c) => ({ + global.ResizeObserver = vi.fn().mockImplementation((c) => ({ observe: () => { observerCallback = c; } })); const map = createMap(); + map.style.projection = new MercatorProjection(); - const resizeSpy = jest.spyOn(map, 'resize'); - const redrawSpy = jest.spyOn(map, 'redraw'); - const renderSpy = jest.spyOn(map, '_render'); + const resizeSpy = vi.spyOn(map, 'resize'); + const redrawSpy = vi.spyOn(map, 'redraw'); + const renderSpy = vi.spyOn(map, '_render'); // The initial "observe" event fired by ResizeObserver should be captured/muted // in the map constructor diff --git a/src/ui/map_tests/map_sky.test.ts b/src/ui/map_tests/map_sky.test.ts index 9d468873e3..e7f0151e79 100644 --- a/src/ui/map_tests/map_sky.test.ts +++ b/src/ui/map_tests/map_sky.test.ts @@ -1,3 +1,5 @@ + +import {beforeEach, describe, expect, test, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { @@ -8,7 +10,7 @@ beforeEach(() => { describe('#setSky', () => { test('calls style setSky when set', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.style.setSky = spy; map.setSky({'atmosphere-blend': 0.5}); @@ -24,7 +26,7 @@ describe('#getSky', () => { test('calls style getSky when invoked', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.style.getSky = spy; map.getSky(); diff --git a/src/ui/map_tests/map_style.test.ts b/src/ui/map_tests/map_style.test.ts index b60c686b51..465cab425c 100644 --- a/src/ui/map_tests/map_style.test.ts +++ b/src/ui/map_tests/map_style.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {Map, MapOptions} from '../map'; import {createMap, beforeMapTest, createStyle, createStyleSource} from '../../util/test/util'; import {Event as EventedEvent} from '../../util/evented'; @@ -103,7 +104,7 @@ describe('#setStyle', () => { {id: 'background', type: 'background' as const, paint: {'background-color': 'blue'}}, ]}; const map = createMap({style: redStyle}); - const spy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const spy = vi.spyOn(console, 'warn').mockImplementation(() => {}); map.setStyle(blueStyle); await map.once('style.load'); map.setStyle(redStyle); @@ -161,15 +162,15 @@ describe('#setStyle', () => { const map = createMap(); const style = map.style; expect(style).toBeTruthy(); - jest.spyOn(style, '_remove'); + vi.spyOn(style, '_remove'); map.setStyle(null); expect(style._remove).toHaveBeenCalledTimes(1); }); test('passing null releases the worker', () => { const map = createMap(); - const spyWorkerPoolAcquire = jest.spyOn(map.style.dispatcher.workerPool, 'acquire'); - const spyWorkerPoolRelease = jest.spyOn(map.style.dispatcher.workerPool, 'release'); + const spyWorkerPoolAcquire = vi.spyOn(map.style.dispatcher.workerPool, 'acquire'); + const spyWorkerPoolRelease = vi.spyOn(map.style.dispatcher.workerPool, 'release'); map.setStyle({version: 8, sources: {}, layers: []}, {diff: false}); expect(spyWorkerPoolAcquire).toHaveBeenCalledTimes(1); @@ -331,7 +332,7 @@ describe('#setStyle', () => { test('Override default style validation', () => { let validationOption = true; - jest.spyOn(Style.prototype, 'loadJSON').mockImplementationOnce((styleJson, options) => { + vi.spyOn(Style.prototype, 'loadJSON').mockImplementationOnce((styleJson, options) => { validationOption = options.validate; }); const map = createMap({style: null}); @@ -477,10 +478,10 @@ describe('#getStyle', () => { test('creates a new Style if diff fails', () => { const style = createStyle(); const map = createMap({style}); - jest.spyOn(map.style, 'setState').mockImplementation(() => { + vi.spyOn(map.style, 'setState').mockImplementation(() => { throw new Error('Dummy error'); }); - jest.spyOn(console, 'warn').mockImplementation(() => {}); + vi.spyOn(console, 'warn').mockImplementation(() => {}); const previousStyle = map.style; map.setStyle(style); @@ -490,7 +491,7 @@ describe('#getStyle', () => { test('creates a new Style if diff option is false', () => { const style = createStyle(); const map = createMap({style}); - const spy = jest.spyOn(map.style, 'setState'); + const spy = vi.spyOn(map.style, 'setState'); const previousStyle = map.style; map.setStyle(style, {diff: false}); @@ -501,7 +502,7 @@ describe('#getStyle', () => { describe('#setSky', () => { test('calls style setSky when set', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.style.setSky = spy; map.setSky({'horizon-fog-blend': 0.5}); @@ -519,7 +520,7 @@ describe('#getStyle', () => { describe('#setLight', () => { test('calls style setLight when set', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.style.setLight = spy; map.setLight({anchor: 'viewport'}); @@ -530,7 +531,7 @@ describe('#getStyle', () => { describe('#getLight', () => { test('calls style getLight when invoked', () => { const map = createMap(); - const spy = jest.fn(); + const spy = vi.fn(); map.style.getLight = spy; map.getLight(); diff --git a/src/ui/map_tests/map_terrian.test.ts b/src/ui/map_tests/map_terrian.test.ts index 9e6bedceba..2b5570e827 100644 --- a/src/ui/map_tests/map_terrian.test.ts +++ b/src/ui/map_tests/map_terrian.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import {LngLat} from '../../geo/lng_lat'; import {fakeServer, FakeServer} from 'nise'; @@ -32,7 +33,7 @@ describe('#setTerrain', () => { map.addSource('terrainrgb', {type: 'raster-dem', url: '/source.json'}); server.respond(); map.addLayer({id: 'hillshade', type: 'hillshade', source: 'terrainrgb'}); - const stub = jest.spyOn(console, 'warn').mockImplementation(() => { }); + const stub = vi.spyOn(console, 'warn').mockImplementation(() => { }); stub.mockReset(); map.setTerrain({ source: 'terrainrgb' @@ -76,7 +77,7 @@ describe('Keep camera outside terrain', () => { let terrainElevation = 10; const terrainStub = {} as Terrain; - terrainStub.getElevationForLngLatZoom = jest.fn( + terrainStub.getElevationForLngLatZoom = vi.fn( (_lngLat: LngLat, _zoom: number) => terrainElevation ); map.terrain = terrainStub; diff --git a/src/ui/map_tests/map_webgl.test.ts b/src/ui/map_tests/map_webgl.test.ts index 889e44fbad..7078bcf093 100644 --- a/src/ui/map_tests/map_webgl.test.ts +++ b/src/ui/map_tests/map_webgl.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, test, expect, vi} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { @@ -62,8 +63,8 @@ test('Hit WebGL max drawing buffer limit', () => { Object.defineProperty(container, 'clientWidth', {value: 8000}); Object.defineProperty(container, 'clientHeight', {value: 4500}); const map = createMap({container, maxCanvasSize: [16834, 16834], pixelRatio: 1}); - jest.spyOn(map.painter.context.gl, 'drawingBufferWidth', 'get').mockReturnValue(7536); - jest.spyOn(map.painter.context.gl, 'drawingBufferHeight', 'get').mockReturnValue(4239); + vi.spyOn(map.painter.context.gl, 'drawingBufferWidth', 'get').mockReturnValue(7536); + vi.spyOn(map.painter.context.gl, 'drawingBufferHeight', 'get').mockReturnValue(4239); map.resize(); expect(map.getCanvas().width).toBe(7536); expect(map.getCanvas().height).toBe(4239); diff --git a/src/ui/map_tests/map_world_copies.test.ts b/src/ui/map_tests/map_world_copies.test.ts index 6ec34b2f6f..81f15f72a1 100644 --- a/src/ui/map_tests/map_world_copies.test.ts +++ b/src/ui/map_tests/map_world_copies.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; beforeEach(() => { diff --git a/src/ui/map_tests/map_zoom.test.ts b/src/ui/map_tests/map_zoom.test.ts index f30cf051aa..aac3760b4c 100644 --- a/src/ui/map_tests/map_zoom.test.ts +++ b/src/ui/map_tests/map_zoom.test.ts @@ -1,3 +1,4 @@ +import {beforeEach, test, expect} from 'vitest'; import {createMap, beforeMapTest} from '../../util/test/util'; import simulate from '../../../test/unit/lib/simulate_interaction'; diff --git a/src/ui/marker.test.ts b/src/ui/marker.test.ts index dec4482a1b..60e1a0cef3 100644 --- a/src/ui/marker.test.ts +++ b/src/ui/marker.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap as globalCreateMap, beforeMapTest, sleep} from '../util/test/util'; import {Marker} from './marker'; import {Popup} from './popup'; @@ -461,9 +462,9 @@ describe('marker', () => { .addTo(map); const el = marker.getElement(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); marker.on('dragstart', dragstart); marker.on('drag', drag); @@ -510,9 +511,9 @@ describe('marker', () => { .addTo(map); const el = marker.getElement(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); marker.on('dragstart', dragstart); marker.on('drag', drag); @@ -559,9 +560,9 @@ describe('marker', () => { .addTo(map); const el = marker.getElement(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); marker.on('dragstart', dragstart); marker.on('drag', drag); @@ -592,9 +593,9 @@ describe('marker', () => { .addTo(map); const el = marker.getElement(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); marker.on('dragstart', dragstart); marker.on('drag', drag); @@ -641,9 +642,9 @@ describe('marker', () => { .addTo(map); const el = marker.getElement(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); marker.on('dragstart', dragstart); marker.on('drag', drag); @@ -690,9 +691,9 @@ describe('marker', () => { .addTo(map); const el = marker.getElement(); - const dragstart = jest.fn(); - const drag = jest.fn(); - const dragend = jest.fn(); + const dragstart = vi.fn(); + const drag = vi.fn(); + const dragend = vi.fn(); marker.on('dragstart', dragstart); marker.on('drag', drag); @@ -855,8 +856,8 @@ describe('marker', () => { }); test('Marker removed after update when terrain is on should clear timeout', async () => { - jest.spyOn(global, 'setTimeout'); - jest.spyOn(global, 'clearTimeout'); + vi.spyOn(global, 'setTimeout'); + vi.spyOn(global, 'clearTimeout'); const map = createMap(); const marker = new Marker() .setLngLat([0, 0]) @@ -944,7 +945,7 @@ describe('marker', () => { test('Marker changes opacity behind terrain and when terrain is removed', async () => { const map = createMap(); - jest.spyOn(MercatorTransform.prototype, 'lngLatToCameraDepth').mockImplementation((_lngLat, _ele) => 0.95); // Mocking distance to marker + vi.spyOn(MercatorTransform.prototype, 'lngLatToCameraDepth').mockImplementation((_lngLat, _ele) => 0.95); // Mocking distance to marker const marker = new Marker() .setLngLat([0, 0]) .addTo(map); @@ -979,7 +980,7 @@ describe('marker', () => { test('Applies options.opacity when 3d terrain is enabled and marker is in clear view', async () => { const map = createMap(); - jest.spyOn(MercatorTransform.prototype, 'lngLatToCameraDepth').mockImplementation((_lngLat, _ele) => 0.95); // Mocking distance to marker + vi.spyOn(MercatorTransform.prototype, 'lngLatToCameraDepth').mockImplementation((_lngLat, _ele) => 0.95); // Mocking distance to marker const marker = new Marker({opacity: '0.7'}) .setLngLat([0, 0]) .addTo(map); @@ -997,7 +998,7 @@ describe('marker', () => { test('Applies options.opacity when marker\'s base is hidden by 3d terrain but its center is visible', async () => { const map = createMap(); - jest.spyOn(MercatorTransform.prototype, 'lngLatToCameraDepth').mockImplementation((_lngLat, _ele) => 0.95); // Mocking distance to marker + vi.spyOn(MercatorTransform.prototype, 'lngLatToCameraDepth').mockImplementation((_lngLat, _ele) => 0.95); // Mocking distance to marker const marker = new Marker({opacity: '0.7'}) .setLngLat([0, 0]) .addTo(map); diff --git a/src/ui/popup.test.ts b/src/ui/popup.test.ts index f6c26a1cf4..9c984aea7e 100644 --- a/src/ui/popup.test.ts +++ b/src/ui/popup.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {createMap as globalCreateMap, beforeMapTest} from '../util/test/util'; import {Popup, Offset} from './popup'; import {LngLat} from '../geo/lng_lat'; @@ -120,7 +121,7 @@ describe('popup', () => { test('Popup fires close event when removed', () => { const map = createMap(); - const onClose = jest.fn(); + const onClose = vi.fn(); new Popup() .setText('Test') @@ -133,7 +134,7 @@ describe('popup', () => { }); test('Popup does not fire close event when removed if it is not on the map', () => { - const onClose = jest.fn(); + const onClose = vi.fn(); new Popup() .setText('Test') @@ -146,7 +147,7 @@ describe('popup', () => { test('Popup fires open event when added', () => { const map = createMap(); - const onOpen = jest.fn(); + const onOpen = vi.fn(); new Popup() .setText('Test') @@ -393,7 +394,7 @@ describe('popup', () => { Object.defineProperty(popup.getElement(), 'offsetWidth', {value: 100}); Object.defineProperty(popup.getElement(), 'offsetHeight', {value: 100}); - jest.spyOn(map, 'project').mockReturnValue(point); + vi.spyOn(map, 'project').mockReturnValue(point); popup.setLngLat([0, 0]); expect(popup.getElement().classList.contains(`maplibregl-popup-anchor-${anchor}`)).toBeTruthy(); @@ -401,7 +402,7 @@ describe('popup', () => { test(`Popup translation reflects offset and ${anchor} anchor`, () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({anchor, offset: 10}) .setLngLat([0, 0]) @@ -427,7 +428,7 @@ describe('popup', () => { Object.defineProperty(popup.getElement(), 'offsetWidth', {value: containerWidth / 2}); Object.defineProperty(popup.getElement(), 'offsetHeight', {value: containerHeight / 2}); - jest.spyOn(map, 'project').mockReturnValue(point); + vi.spyOn(map, 'project').mockReturnValue(point); popup.setLngLat([0, 0]); expect(popup.getElement().classList.contains('maplibregl-popup-anchor-top')).toBeTruthy(); @@ -435,7 +436,7 @@ describe('popup', () => { test('Popup is offset via a PointLike offset option', () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({anchor: 'top-left', offset: [5, 10]}) .setLngLat([0, 0]) @@ -447,7 +448,7 @@ describe('popup', () => { test('Popup is offset via an object offset option', () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({anchor: 'top-left', offset: {'top-left': [5, 10]} as Offset}) .setLngLat([0, 0]) @@ -459,7 +460,7 @@ describe('popup', () => { test('Popup is offset via an incomplete object offset option', () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({anchor: 'top-right', offset: {'top-left': [5, 10]} as Offset}) .setLngLat([0, 0]) @@ -774,7 +775,7 @@ describe('popup', () => { test('Popup is positioned on rounded whole-number pixel coordinates by default when offset is a decimal', () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({offset: [-0.1, 0.9]}) .setLngLat([0, 0]) @@ -786,7 +787,7 @@ describe('popup', () => { test('Popup position is not rounded when subpixel positioning is enabled', () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({offset: [-0.1, 0.9], subpixelPositioning: true}) .setLngLat([0, 0]) @@ -798,7 +799,7 @@ describe('popup', () => { test('Popup subpixel positioning can be enabled with Popup#setSubpixelPositioning', () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({offset: [0, 0]}) .setLngLat([0, 0]) @@ -812,7 +813,7 @@ describe('popup', () => { }); test('Popup subpixel positioning can be disabled with Popup#setSubpixelPositioning', () => { const map = createMap(); - jest.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); + vi.spyOn(map, 'project').mockReturnValue(new Point(0, 0)); const popup = new Popup({offset: [0, 0], subpixelPositioning: true}) .setLngLat([0, 0]) diff --git a/src/util/actor.test.ts b/src/util/actor.test.ts index fc0d9a2659..7b11a95faa 100644 --- a/src/util/actor.test.ts +++ b/src/util/actor.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeAll, afterAll, test, expect, vi} from 'vitest'; import {Actor, ActorTarget} from './actor'; import {WorkerGlobalScopeInterface, workerFactory} from './web_worker'; import {setGlobalWorker} from '../../test/unit/lib/web_worker_mock'; @@ -94,11 +95,11 @@ describe('Actor', () => { expect(gotAbortSignal).toBeTruthy(); }); - test('cancel a request that must be queued will not call the method at all', async () => { + test('cancel a request that must be queued will not call the method at all', {retry: 3}, async () => { const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget; const actor = new Actor(worker, '1'); - const spy = jest.fn().mockReturnValue(Promise.resolve({})); + const spy = vi.fn().mockReturnValue(Promise.resolve({})); worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy); let received = false; @@ -164,7 +165,7 @@ describe('Actor', () => { worker.worker.actor.mapId = '2'; - const spy = jest.fn().mockReturnValue(Promise.resolve({})); + const spy = vi.fn().mockReturnValue(Promise.resolve({})); worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy); actor.sendAsync({type: MessageType.getClusterExpansionZoom, data: {} as any, targetMapId: '1'}); @@ -178,7 +179,7 @@ describe('Actor', () => { const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget; const actor = new Actor(worker, '1'); - const spy = jest.fn().mockReturnValue(Promise.resolve({})); + const spy = vi.fn().mockReturnValue(Promise.resolve({})); worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy); actor.target.postMessage({type: 'getClusterExpansionZoom', data: {} as any, origin: 'https://example.com'}); @@ -192,7 +193,7 @@ describe('Actor', () => { const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget; const actor = new Actor(worker, '1'); - const spy = jest.fn().mockReturnValue(Promise.resolve({})); + const spy = vi.fn().mockReturnValue(Promise.resolve({})); worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy); actor.target.postMessage({type: MessageType.getClusterExpansionZoom, data: {} as any, origin: 'file://'}); @@ -206,7 +207,7 @@ describe('Actor', () => { const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget; const actor = new Actor(worker, '1'); - const spy = jest.fn().mockReturnValue(Promise.resolve({})); + const spy = vi.fn().mockReturnValue(Promise.resolve({})); worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy); actor.target.postMessage({type: MessageType.getClusterExpansionZoom, data: {} as any, origin: 'resource://android'}); diff --git a/src/util/ajax.test.ts b/src/util/ajax.test.ts index 33407cc9d8..566668ce2b 100644 --- a/src/util/ajax.test.ts +++ b/src/util/ajax.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import { getArrayBuffer, getJSON, @@ -89,7 +90,7 @@ describe('ajax', () => { }); test('sameOrigin method', () => { - jest.spyOn(window, 'location', 'get').mockReturnValue({ + vi.spyOn(window, 'location', 'get').mockReturnValue({ protocol: 'https:', host: 'somewhere.com' } as any); @@ -122,7 +123,7 @@ describe('ajax', () => { expect(sameOrigin('file:///c:/temp/foo.html')).toBe(false); // file url - jest.spyOn(window, 'location', 'get').mockReturnValue({ + vi.spyOn(window, 'location', 'get').mockReturnValue({ protocol: 'file:', host: '' } as any); diff --git a/src/util/browser.test.ts b/src/util/browser.test.ts index ac047252f7..dcef4c6472 100644 --- a/src/util/browser.test.ts +++ b/src/util/browser.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {browser} from './browser'; describe('browser', () => { diff --git a/src/util/color_ramp.test.ts b/src/util/color_ramp.test.ts index 17083b96c3..00ae94a2cc 100644 --- a/src/util/color_ramp.test.ts +++ b/src/util/color_ramp.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {renderColorRamp} from './color_ramp'; import {createPropertyExpression, StylePropertyExpression, StylePropertySpecification} from '@maplibre/maplibre-gl-style-spec'; diff --git a/src/util/dispatcher.test.ts b/src/util/dispatcher.test.ts index 7c3fe66c6b..6707efddad 100644 --- a/src/util/dispatcher.test.ts +++ b/src/util/dispatcher.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {Actor} from './actor'; import {Dispatcher} from './dispatcher'; import {workerFactory} from './web_worker'; @@ -62,7 +63,7 @@ describe('Dispatcher', () => { test('#remove destroys actors', () => { const actorsRemoved = []; const mapId = 1; - const spy = jest.fn().mockImplementation(() => { actorsRemoved.push(this); }); + const spy = vi.fn().mockImplementation(() => { actorsRemoved.push(this); }); Actor.prototype.remove = spy; WorkerPool.workerCount = 4; diff --git a/src/util/evented.test.ts b/src/util/evented.test.ts index 3fb0fd3b75..3b930b08e3 100644 --- a/src/util/evented.test.ts +++ b/src/util/evented.test.ts @@ -1,10 +1,11 @@ +import {describe, test, expect, vi} from 'vitest'; import {Event, Evented} from './evented'; describe('Evented', () => { test('calls listeners added with "on"', () => { const evented = new Evented(); - const listener = jest.fn(); + const listener = vi.fn(); evented.on('a', listener); evented.fire(new Event('a')); evented.fire(new Event('a')); @@ -13,7 +14,7 @@ describe('Evented', () => { test('calls listeners added with "once" once', () => { const evented = new Evented(); - const listener = jest.fn(); + const listener = vi.fn(); evented.once('a', listener); evented.fire(new Event('a')); evented.fire(new Event('a')); @@ -61,7 +62,7 @@ describe('Evented', () => { test('removes listeners with "off"', () => { const evented = new Evented(); - const listener = jest.fn(); + const listener = vi.fn(); evented.on('a', listener); evented.off('a', listener); evented.fire(new Event('a')); @@ -70,7 +71,7 @@ describe('Evented', () => { test('removes one-time listeners with "off"', () => { const evented = new Evented(); - const listener = jest.fn(); + const listener = vi.fn(); evented.once('a', listener); evented.off('a', listener); evented.fire(new Event('a')); @@ -79,7 +80,7 @@ describe('Evented', () => { test('once listener is removed prior to call', () => { const evented = new Evented(); - const listener = jest.fn(); + const listener = vi.fn(); evented.once('a', () => { listener(); evented.fire(new Event('a')); @@ -115,7 +116,7 @@ describe('Evented', () => { test('has backward compatibility for fire(string, object) API', () => { const evented = new Evented(); - const listener = jest.fn(x => x); + const listener = vi.fn(x => x); evented.on('a', listener); evented.fire('a' as any as Event, {foo: 'bar'}); expect(listener).toHaveBeenCalledTimes(1); @@ -126,8 +127,8 @@ describe('Evented', () => { test('on is idempotent', () => { const evented = new Evented(); const order = []; - const listenerA = jest.fn(() => order.push('A')); - const listenerB = jest.fn(() => order.push('B')); + const listenerA = vi.fn(() => order.push('A')); + const listenerB = vi.fn(() => order.push('B')); evented.on('a', listenerA); evented.on('a', listenerB); evented.on('a', listenerA); @@ -141,7 +142,7 @@ describe('Evented', () => { describe('evented parents', () => { test('adds parents with "setEventedParent"', () => { - const listener = jest.fn(); + const listener = vi.fn(); const eventedSource = new Evented(); const eventedSink = new Evented(); eventedSource.setEventedParent(eventedSink); @@ -197,7 +198,7 @@ describe('evented parents', () => { }); test('removes parents with "setEventedParent(null)"', () => { - const listener = jest.fn(); + const listener = vi.fn(); const eventedSource = new Evented(); const eventedSink = new Evented(); eventedSink.on('a', listener); diff --git a/src/util/find_pole_of_inaccessibility.test.ts b/src/util/find_pole_of_inaccessibility.test.ts index dfea4f0e76..cecd130591 100644 --- a/src/util/find_pole_of_inaccessibility.test.ts +++ b/src/util/find_pole_of_inaccessibility.test.ts @@ -1,3 +1,4 @@ +import {test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {findPoleOfInaccessibility} from './find_pole_of_inaccessibility'; diff --git a/src/util/geolocation_support.test.ts b/src/util/geolocation_support.test.ts index ad90232ddb..d7a3f7cdbe 100644 --- a/src/util/geolocation_support.test.ts +++ b/src/util/geolocation_support.test.ts @@ -1,8 +1,9 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import {checkGeolocationSupport} from './geolocation_support'; describe('checkGeolocationSupport', () => { beforeEach(() => { - jest.resetModules(); + vi.resetModules(); }); test('it should return false if geolocation is not defined', async () => { diff --git a/src/util/image_request.test.ts b/src/util/image_request.test.ts index ed9e67d9da..92aa4cc92c 100644 --- a/src/util/image_request.test.ts +++ b/src/util/image_request.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; import {config} from './config'; import {webpSupported} from './webp_supported'; import {sleep, stubAjaxGetImage} from './test/util'; @@ -144,7 +145,7 @@ describe('ImageRequest', () => { }); test('getImage uses HTMLImageElement when createImageBitmap is not supported', async () => { - const makeRequestSky = jest.spyOn(ajax, 'makeRequest'); + const makeRequestSky = vi.spyOn(ajax, 'makeRequest'); server.respondWith(request => request.respond(200, {'Content-Type': 'image/png', 'Cache-Control': 'cache', 'Expires': 'expires'}, '')); @@ -161,7 +162,7 @@ describe('ImageRequest', () => { }); test('getImage using HTMLImageElement with same-origin credentials', async () => { - const makeRequestSky = jest.spyOn(ajax, 'makeRequest'); + const makeRequestSky = vi.spyOn(ajax, 'makeRequest'); const promise = ImageRequest.getImage({url: '', credentials: 'same-origin'}, new AbortController(), false); expect(makeRequestSky).toHaveBeenCalledTimes(0); @@ -174,7 +175,7 @@ describe('ImageRequest', () => { }); test('getImage using HTMLImageElement with include credentials', async () => { - const makeRequestSky = jest.spyOn(ajax, 'makeRequest'); + const makeRequestSky = vi.spyOn(ajax, 'makeRequest'); const promise = ImageRequest.getImage({url: '', credentials: 'include'}, new AbortController(), false); expect(makeRequestSky).toHaveBeenCalledTimes(0); @@ -187,7 +188,7 @@ describe('ImageRequest', () => { }); test('getImage using HTMLImageElement with accept header', async () => { - const makeRequestSky = jest.spyOn(ajax, 'makeRequest'); + const makeRequestSky = vi.spyOn(ajax, 'makeRequest'); const promise = ImageRequest.getImage({url: '', credentials: 'include', headers: {accept: 'accept'}}, new AbortController(), false); expect(makeRequestSky).toHaveBeenCalledTimes(0); @@ -199,7 +200,7 @@ describe('ImageRequest', () => { }); test('getImage uses makeRequest when custom Headers are added', () => { - const makeRequestSky = jest.spyOn(ajax, 'makeRequest'); + const makeRequestSky = vi.spyOn(ajax, 'makeRequest'); ImageRequest.getImage({url: '', credentials: 'include', headers: {custom: 'test', accept: 'image'}}, new AbortController(), false); diff --git a/src/util/is_char_in_unicode_block.test.ts b/src/util/is_char_in_unicode_block.test.ts index a742947017..88410c2022 100644 --- a/src/util/is_char_in_unicode_block.test.ts +++ b/src/util/is_char_in_unicode_block.test.ts @@ -1,14 +1,17 @@ +import {describe, test, expect} from 'vitest'; import {unicodeBlockLookup} from './is_char_in_unicode_block'; describe('unicodeBlockLookup', () => { test('each code block lookup function follows the same pattern', () => { for (const codeBlock in unicodeBlockLookup) { const lookup = unicodeBlockLookup[codeBlock]; - const match = lookup.toString().match(/^\(char\) => char >= 0x([0-9A-F]{4,6}) && char <= 0x([0-9A-F]{4,6})$/); + const lookupString = lookup.toString(); + console.log(`Checking code block: ${codeBlock}, function: ${lookupString}`); + const match = lookupString.match(/^\(char\) => char >= (\d+) && char <= (\d+)$/); expect(match).not.toBeNull(); expect(match).toHaveLength(3); - const lower = parseInt(match[1], 16); - const upper = parseInt(match[2], 16); + const lower = parseInt(match[1], 10); + const upper = parseInt(match[2], 10); expect(upper).toBeGreaterThan(lower); } }); diff --git a/src/util/offscreen_canvas_distorted.test.ts b/src/util/offscreen_canvas_distorted.test.ts index bf5c4bf483..0a1534d890 100644 --- a/src/util/offscreen_canvas_distorted.test.ts +++ b/src/util/offscreen_canvas_distorted.test.ts @@ -1,9 +1,10 @@ +import {test, expect, vi} from 'vitest'; import {isOffscreenCanvasDistorted} from './offscreen_canvas_distorted'; import {Canvas} from 'canvas'; import {offscreenCanvasSupported} from './offscreen_canvas_supported'; test('normal operation does not mangle canvas', () => { - const OffscreenCanvas = (window as any).OffscreenCanvas = jest.fn((width:number, height: number) => { + const OffscreenCanvas = (window as any).OffscreenCanvas = vi.fn((width:number, height: number) => { return new Canvas(width, height); }); expect(offscreenCanvasSupported()).toBeTruthy(); diff --git a/src/util/primitives.test.ts b/src/util/primitives.test.ts index e1ce2b2fbb..1ed9d41fcf 100644 --- a/src/util/primitives.test.ts +++ b/src/util/primitives.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {Aabb, Frustum, IntersectionResult} from './primitives'; import {mat4, vec3, vec4} from 'gl-matrix'; diff --git a/src/util/resolve_tokens.test.ts b/src/util/resolve_tokens.test.ts index ed9fbe88b9..5c58381085 100644 --- a/src/util/resolve_tokens.test.ts +++ b/src/util/resolve_tokens.test.ts @@ -1,3 +1,4 @@ +import {test, expect} from 'vitest'; import {resolveTokens} from './resolve_tokens'; test('resolveToken', () => { diff --git a/src/util/script_detection.test.ts b/src/util/script_detection.test.ts index 7e3f5a350d..276368d644 100644 --- a/src/util/script_detection.test.ts +++ b/src/util/script_detection.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {charAllowsIdeographicBreaking, charAllowsLetterSpacing, charHasUprightVerticalOrientation, charInComplexShapingScript, charInRTLScript} from './script_detection'; describe('charAllowsIdeographicBreaking', () => { diff --git a/src/util/smart_wrap.test.ts b/src/util/smart_wrap.test.ts index e93fe9d7d7..02bd78f1d8 100644 --- a/src/util/smart_wrap.test.ts +++ b/src/util/smart_wrap.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import Point from '@mapbox/point-geometry'; import {LngLat} from '../geo/lng_lat'; import {smartWrap} from './smart_wrap'; diff --git a/src/util/struct_array.test.ts b/src/util/struct_array.test.ts index 77e2d1616b..5dcd39c661 100644 --- a/src/util/struct_array.test.ts +++ b/src/util/struct_array.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {StructArrayLayout3i6, FeatureIndexArray} from '../data/array_types.g'; describe('StructArray', () => { diff --git a/src/util/style.test.ts b/src/util/style.test.ts index 305c8cf481..b108f287a4 100644 --- a/src/util/style.test.ts +++ b/src/util/style.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {coerceSpriteToArray} from './style'; describe('style utils', () => { diff --git a/src/util/task_queue.test.ts b/src/util/task_queue.test.ts index d3084024ee..1b4d0b1d4a 100644 --- a/src/util/task_queue.test.ts +++ b/src/util/task_queue.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi} from 'vitest'; import {TaskQueue} from './task_queue'; describe('TaskQueue', () => { @@ -20,7 +21,7 @@ describe('TaskQueue', () => { test('Allows a given callback to be queued multiple times', () => { const q = new TaskQueue(); - const fn = jest.fn(); + const fn = vi.fn(); q.add(fn); q.add(fn); q.run(); @@ -29,8 +30,8 @@ describe('TaskQueue', () => { test('Does not call a callback that was cancelled before the queue was run', () => { const q = new TaskQueue(); - const yes = jest.fn(); - const no = jest.fn(); + const yes = vi.fn(); + const no = vi.fn(); q.add(yes); const id = q.add(no); q.remove(id); @@ -41,8 +42,8 @@ describe('TaskQueue', () => { test('Does not call a callback that was cancelled while the queue was running', () => { const q = new TaskQueue(); - const yes = jest.fn(); - const no = jest.fn(); + const yes = vi.fn(); + const no = vi.fn(); q.add(yes); let id; // eslint-disable-line prefer-const q.add(() => q.remove(id)); @@ -54,7 +55,7 @@ describe('TaskQueue', () => { test('Allows each instance of a multiply-queued callback to be cancelled independently', () => { const q = new TaskQueue(); - const cb = jest.fn(); + const cb = vi.fn(); q.add(cb); const id = q.add(cb); q.remove(id); @@ -64,7 +65,7 @@ describe('TaskQueue', () => { test('Does not throw if a remove() is called after running the queue', () => { const q = new TaskQueue(); - const cb = jest.fn(); + const cb = vi.fn(); const id = q.add(cb); q.run(); q.remove(id); @@ -73,7 +74,7 @@ describe('TaskQueue', () => { test('Does not add tasks to the currently-running queue', () => { const q = new TaskQueue(); - const cb = jest.fn(); + const cb = vi.fn(); q.add(() => q.add(cb)); q.run(); expect(cb).not.toHaveBeenCalled(); @@ -89,8 +90,8 @@ describe('TaskQueue', () => { test('TaskQueue#clear() prevents queued task from being executed', () => { const q = new TaskQueue(); - const before = jest.fn(); - const after = jest.fn(); + const before = vi.fn(); + const after = vi.fn(); q.add(before); q.clear(); q.add(after); @@ -101,8 +102,8 @@ describe('TaskQueue', () => { test('TaskQueue#clear() interrupts currently-running queue', () => { const q = new TaskQueue(); - const before = jest.fn(); - const after = jest.fn(); + const before = vi.fn(); + const after = vi.fn(); q.add(() => q.add(after)); q.add(() => q.clear()); q.add(before); diff --git a/src/util/test/util.ts b/src/util/test/util.ts index 5be8154b4b..b1ef4a2916 100644 --- a/src/util/test/util.ts +++ b/src/util/test/util.ts @@ -1,3 +1,4 @@ +import {vi, expect} from 'vitest'; import {Map} from '../../ui/map'; import {extend} from '../../util/util'; import {Dispatcher} from '../../util/dispatcher'; @@ -76,33 +77,33 @@ export function equalWithPrecision(test, expected, actual, multiplier, message, } export function setPerformance() { - window.performance.mark = jest.fn(); - window.performance.clearMeasures = jest.fn(); - window.performance.clearMarks = jest.fn(); + window.performance.mark = vi.fn(); + window.performance.clearMeasures = vi.fn(); + window.performance.clearMarks = vi.fn(); } export function setMatchMedia() { // https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom Object.defineProperty(window, 'matchMedia', { writable: true, - value: jest.fn().mockImplementation(query => ({ + value: vi.fn().mockImplementation(query => ({ matches: false, media: query, onchange: null, - addListener: jest.fn(), // deprecated - removeListener: jest.fn(), // deprecated - addEventListener: jest.fn(), - removeEventListener: jest.fn(), - dispatchEvent: jest.fn(), + addListener: vi.fn(), // deprecated + removeListener: vi.fn(), // deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), })), }); } function setResizeObserver() { - global.ResizeObserver = jest.fn().mockImplementation(() => ({ - observe: jest.fn(), - unobserve: jest.fn(), - disconnect: jest.fn(), + global.ResizeObserver = vi.fn().mockImplementation(() => ({ + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), })); } @@ -115,11 +116,11 @@ export function beforeMapTest() { (WebGLRenderingContext.prototype as any).createVertexArray = WebGLRenderingContext.prototype.getExtension('OES_vertex_array_object').createVertexArrayOES; if (!WebGLRenderingContext.prototype.drawingBufferHeight && !WebGLRenderingContext.prototype.drawingBufferWidth) { Object.defineProperty(WebGLRenderingContext.prototype, 'drawingBufferWidth', { - get: jest.fn(), + get: vi.fn(), configurable: true, }); Object.defineProperty(WebGLRenderingContext.prototype, 'drawingBufferHeight', { - get: jest.fn(), + get: vi.fn(), configurable: true, }); } diff --git a/src/util/throttle.test.ts b/src/util/throttle.test.ts index 88eea13f45..c0a4276b54 100644 --- a/src/util/throttle.test.ts +++ b/src/util/throttle.test.ts @@ -1,4 +1,5 @@ import {sleep} from './test/util'; +import {describe, test, expect} from 'vitest'; import {throttle} from './throttle'; describe('throttle', () => { diff --git a/src/util/transferable_grid_index.test.ts b/src/util/transferable_grid_index.test.ts index b2f71bf255..741815facb 100644 --- a/src/util/transferable_grid_index.test.ts +++ b/src/util/transferable_grid_index.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {TransferableGridIndex} from './transferable_grid_index'; describe('TransferableGridIndex', () => { diff --git a/src/util/util.test.ts b/src/util/util.test.ts index a57c29fcf1..dedbdf910c 100644 --- a/src/util/util.test.ts +++ b/src/util/util.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, test, expect, vi} from 'vitest'; import Point from '@mapbox/point-geometry'; import {arraysIntersect, bezier, clamp, clone, deepEqual, easeCubicInOut, extend, filterObject, findLineIntersection, isCounterClockwise, isPowerOfTwo, keysDifference, mapObject, nextPowerOfTwo, parseCacheControl, pick, readImageDataUsingOffscreenCanvas, readImageUsingVideoFrame, uniqueId, wrap, mod, distanceOfAnglesRadians, distanceOfAnglesDegrees, differenceOfAnglesRadians, differenceOfAnglesDegrees, solveQuadratic, remapSaturate, radiansToDegrees, degreesToRadians, rollPitchBearingToQuat, getRollPitchBearing} from './util'; import {Canvas} from 'canvas'; @@ -311,13 +312,13 @@ describe('util readImageUsingVideoFrame', () => { get format() { return format; }, - copyTo: jest.fn(buf => { + copyTo: vi.fn(buf => { buf.set(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).subarray(0, buf.length)); return Promise.resolve(); }), - close: jest.fn(), + close: vi.fn(), }; - (window as any).VideoFrame = jest.fn(() => frame); + (window as any).VideoFrame = vi.fn(() => frame); const canvas = document.createElement('canvas'); canvas.width = canvas.height = 2; @@ -360,7 +361,7 @@ describe('util readImageUsingVideoFrame', () => { describe('layout/rect', () => { beforeEach(() => { - (window as any).VideoFrame = jest.fn(() => frame); + (window as any).VideoFrame = vi.fn(() => frame); canvas.width = canvas.height = 3; }); diff --git a/src/util/web_worker_transfer.test.ts b/src/util/web_worker_transfer.test.ts index 4969e0dc97..f7512c38cc 100644 --- a/src/util/web_worker_transfer.test.ts +++ b/src/util/web_worker_transfer.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {SerializedObject} from '../../dist/maplibre-gl'; import {AJAXError} from './ajax'; import {register, serialize, deserialize} from './web_worker_transfer'; diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index d3d2df0788..65ebfd3666 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -56,7 +56,7 @@ export function register( }, options: RegisterOptions = {} ) { - if (registry[name]) throw new Error(`${name} is already registered.`); + if (registry[name]) console.warn(`${name} is already registered.`); ((Object.defineProperty as any))(klass, '_classRegistryKey', { value: name, writeable: false diff --git a/src/util/worker_pool.test.ts b/src/util/worker_pool.test.ts index 5f73a43d88..afaba35b59 100644 --- a/src/util/worker_pool.test.ts +++ b/src/util/worker_pool.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {WorkerPool} from './worker_pool'; describe('WorkerPool', () => { diff --git a/src/util/world_bounds.test.ts b/src/util/world_bounds.test.ts index 6714716d2b..49c3267b69 100644 --- a/src/util/world_bounds.test.ts +++ b/src/util/world_bounds.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {isInBoundsForTileZoomXY, isInBoundsForZoomLngLat} from './world_bounds'; import {MAX_TILE_ZOOM, MIN_TILE_ZOOM} from './util'; import {LngLat} from '../geo/lng_lat'; diff --git a/test/build/dev.test.ts b/test/build/dev.test.ts index acb5b8a5b0..d6d7a94a91 100644 --- a/test/build/dev.test.ts +++ b/test/build/dev.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import fs from 'fs'; describe('dev build', () => { diff --git a/test/build/import.test.ts b/test/build/import.test.ts index f0d04a2ea1..8e923500d3 100644 --- a/test/build/import.test.ts +++ b/test/build/import.test.ts @@ -1,3 +1,4 @@ +import {describe, expect, it} from 'vitest'; import {LngLat} from '../../dist/maplibre-gl'; describe('Importing a class', () => { diff --git a/test/build/min.test.ts b/test/build/min.test.ts index ee5bbc5544..3971aa600f 100644 --- a/test/build/min.test.ts +++ b/test/build/min.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import fs from 'fs'; import packageJson from '../../package.json' assert {type: 'json'}; diff --git a/test/build/sourcemaps.test.ts b/test/build/sourcemaps.test.ts index 039a05fe46..6ded823609 100644 --- a/test/build/sourcemaps.test.ts +++ b/test/build/sourcemaps.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import packageJson from '../../package.json' with {type: 'json'}; import {globSync, glob} from 'glob'; import path, {dirname} from 'path'; diff --git a/test/integration/browser/browser.test.ts b/test/integration/browser/browser.test.ts index 5efa3b2508..f9db40e256 100644 --- a/test/integration/browser/browser.test.ts +++ b/test/integration/browser/browser.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, beforeAll, afterEach, afterAll, test, expect} from 'vitest'; import puppeteer, {Page, Browser} from 'puppeteer'; import st from 'st'; import http, {type Server} from 'http'; @@ -15,8 +16,6 @@ let page: Page; let map: Map; let maplibregl: typeof MapLibreGL; -jest.retryTimes(3); - describe('Browser tests', () => { // start server @@ -66,7 +65,7 @@ describe('Browser tests', () => { } }, 40000); - test('Load should fire before resize and moveend', async () => { + test('Load should fire before resize and moveend', {retry: 3, timeout: 20000}, async () => { const firstFiredEvent = await page.evaluate(() => { const map2 = new maplibregl.Map({ container: 'map', @@ -81,9 +80,9 @@ describe('Browser tests', () => { }); }); expect(firstFiredEvent).toBe('load'); - }, 20000); + }); - test('Should continue zooming from last mouse position after scroll and flyto, see #2709', async () => { + test('Should continue zooming from last mouse position after scroll and flyto, see #2709', {retry: 3, timeout: 20000}, async () => { const finalZoom = await page.evaluate(() => { return new Promise((resolve, _reject) => { map.once('zoom', () => { @@ -101,9 +100,9 @@ describe('Browser tests', () => { }); }); expect(finalZoom).toBeGreaterThan(2); - }, 20000); + }); - test('Drag to the left', async () => { + test('Drag to the left', {retry: 3, timeout: 20000}, async () => { const canvas = await page.$('.maplibregl-canvas'); const canvasBB = await canvas?.boundingBox(); @@ -134,9 +133,9 @@ describe('Browser tests', () => { const centerWithInertia = await dragToLeft(); expect(centerWithInertia.lng).toBeLessThan(-60); expect(centerWithInertia.lat).toBeCloseTo(0, 7); - }, 20000); + }); - test('Resize viewport (page)', async () => { + test('Resize viewport (page)', {retry: 3, timeout: 20000}, async () => { await page.setViewport({width: 400, height: 400, deviceScaleFactor: 2}); @@ -146,9 +145,9 @@ describe('Browser tests', () => { const canvasBB = await canvas?.boundingBox(); expect(canvasBB?.width).toBeCloseTo(400); expect(canvasBB?.height).toBeCloseTo(400); - }, 20000); + }); - test('Resize div', async () => { + test('Resize div', {retry: 3, timeout: 20000}, async () => { await page.evaluate(() => { document.getElementById('map')!.style.width = '200px'; @@ -160,9 +159,9 @@ describe('Browser tests', () => { const canvasBB = await canvas?.boundingBox(); expect(canvasBB!.width).toBeCloseTo(200); expect(canvasBB!.height).toBeCloseTo(200); - }, 20000); + }); - test('Zoom: Double click at the center', async () => { + test('Zoom: Double click at the center', {retry: 3, timeout: 20000}, async () => { const canvas = await page.$('.maplibregl-canvas'); const canvasBB = await canvas?.boundingBox()!; @@ -176,9 +175,9 @@ describe('Browser tests', () => { }); expect(zoom).toBe(2); - }, 20000); + }); - test('Marker scaled: correct drag', async () => { + test('Marker scaled: correct drag', {retry: 3}, async () => { await page.evaluate(() => { document.getElementById('map')!.style.transform = 'scale(0.5)'; const markerMapPosition = map.getCenter(); @@ -208,7 +207,7 @@ describe('Browser tests', () => { expect(newPosition.y).toBeCloseTo(0); }); - test('Marker: correct position', async () => { + test('Marker: correct position', {retry: 3, timeout: 20000}, async () => { const markerScreenPosition = await page.evaluate(() => { const markerMapPosition = [11.40, 47.30] as [number, number]; const marker = new maplibregl.Marker() @@ -282,9 +281,9 @@ describe('Browser tests', () => { expect(markerScreenPosition.x).toBeCloseTo(386.5); expect(markerScreenPosition.y).toBeCloseTo(378.1); - }, 20000); + }); - test('Fullscreen control should work in shadowdom as well', async () => { + test('Fullscreen control should work in shadowdom as well', {retry: 3, timeout: 20000}, async () => { const fullscreenButtonTitle = await page.evaluate(async () => { function sleepInBrowser(milliseconds: number) { return new Promise(resolve => setTimeout(resolve, milliseconds)); @@ -341,9 +340,9 @@ describe('Browser tests', () => { }); expect(fullscreenButtonTitle).toBe('Exit fullscreen'); - }, 20000); + }); - test('Marker: correct opacity after resize with 3d terrain', async () => { + test('Marker: correct opacity after resize with 3d terrain', {retry: 3, timeout: 20000}, async () => { const markerOpacity = await page.evaluate(() => { const marker = new maplibregl.Marker() .setLngLat(map.getCenter()) @@ -390,7 +389,7 @@ describe('Browser tests', () => { }); expect(markerOpacity).toBe('1'); - }, 20000); + }); test('Load map with RTL plugin should throw exception for invalid URL', async () => { @@ -407,7 +406,7 @@ describe('Browser tests', () => { }, 2000); - test('Movement with transformCameraUpdate and terrain', async () => { + test('Movement with transformCameraUpdate and terrain', {retry: 3, timeout: 20000}, async () => { await page.evaluate(async () => { map.setPitch(52) .setZoom(15) @@ -446,5 +445,5 @@ describe('Browser tests', () => { }); expect(center.lng).toBeCloseTo(11.39770); expect(center.lat).toBeCloseTo(47.29960); - }, 20000); + }); }); diff --git a/test/integration/query/query.test.ts b/test/integration/query/query.test.ts index 57570cf73a..4681735e72 100644 --- a/test/integration/query/query.test.ts +++ b/test/integration/query/query.test.ts @@ -1,3 +1,4 @@ +import {describe, beforeEach, beforeAll, afterEach, afterAll, test, expect} from 'vitest'; import puppeteer, {Page, Browser} from 'puppeteer'; @@ -16,8 +17,6 @@ import {globSync} from 'glob'; import * as maplibreglModule from '../../../dist/maplibre-gl'; let maplibregl: typeof maplibreglModule; -jest.retryTimes(3); - function performQueryOnFixture(fixture) { return new Promise((resolve, _reject) => { @@ -160,7 +159,7 @@ describe('query tests', () => { for (const styleJson of testStyles) { const testCaseRoot = path.dirname(styleJson.replace(/\\/g, '/')); // glob is returning paths that dirname can't handle... const caseName = path.relative(allTestsRoot, testCaseRoot); - test(caseName, async () => { + test(caseName, {retry: 3, timeout: 20000}, async () => { const port = (server.address() as AddressInfo).port; const fixture = await dirToJson(testCaseRoot, port); @@ -194,7 +193,7 @@ describe('query tests', () => { } expect(isEqual).toBeTruthy(); - }, 20000); + }); } }); diff --git a/test/integration/symbol-shaping/shaping.test.ts b/test/integration/symbol-shaping/shaping.test.ts index fca54cd0fd..4dbf84e47b 100644 --- a/test/integration/symbol-shaping/shaping.test.ts +++ b/test/integration/symbol-shaping/shaping.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import fs from 'fs'; import path from 'path'; import {WritingMode, shapeText, Shaping} from '../../../src/symbol/shaping'; diff --git a/tsconfig.json b/tsconfig.json index ccbb173995..471e3483be 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,8 +22,7 @@ ], "types": [ "geojson", - "offscreencanvas", - "jest" + "offscreencanvas" ] }, "ts-node": { diff --git a/vitest.config.build.ts b/vitest.config.build.ts new file mode 100644 index 0000000000..b01c0e0030 --- /dev/null +++ b/vitest.config.build.ts @@ -0,0 +1,20 @@ +import {defineConfig} from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + name: 'build', + environment: 'node', + include: [ + 'test/build/**/*.test.{ts,js}', + ], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + exclude: ['node_modules/', 'dist/'], + all: true, + include: ['src'], + reportsDirectory: './coverage/vitest/build', + }, + } +}); diff --git a/vitest.config.integration.ts b/vitest.config.integration.ts new file mode 100644 index 0000000000..a9458997bc --- /dev/null +++ b/vitest.config.integration.ts @@ -0,0 +1,20 @@ +import {defineConfig} from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + name: 'integration', + environment: 'node', + include: [ + 'test/integration/**/*.test.{ts,js}', + ], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + exclude: ['node_modules/', 'dist/'], + all: true, + include: ['src'], + reportsDirectory: './coverage/vitest/integration', + }, + }, +}); diff --git a/vitest.config.unit.ts b/vitest.config.unit.ts new file mode 100644 index 0000000000..97f2dbbee1 --- /dev/null +++ b/vitest.config.unit.ts @@ -0,0 +1,28 @@ +import {defineConfig} from 'vitest/config'; + +export default defineConfig({ + test: { + name: 'unit', + environment: 'jsdom', + environmentOptions: { + jsdom: { + url: 'http://localhost/', + } + }, + setupFiles: [ + 'vitest-webgl-canvas-mock', + './test/unit/lib/web_worker_mock.ts' + ], + include: [ + 'src/**/*.test.{ts,js}' + ], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + exclude: ['node_modules/', 'dist/'], + all: true, + include: ['src'], + reportsDirectory: './coverage/vitest/unit', + }, + }, +});