From 5fba9fef7d4a4965fcfc9d850345de541698c120 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Tue, 10 Sep 2024 00:40:58 +0200 Subject: [PATCH 01/32] Vitest --- .vscode/settings.json | 5 +- eslint.config.js | 23 +- jest.config.ts | 67 - package-lock.json | 7592 +++++++---------- 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 | 13 +- 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 | 95 +- 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/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, 4280 insertions(+), 5416 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 1bc2838a97..23544abcee 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: { @@ -101,23 +101,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' }, }, { @@ -155,5 +139,4 @@ export default [ }, }, }, - ]; 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 ffe14be1c6..fd40d4a437 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,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", @@ -70,6 +69,7 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.15.0", "@typescript-eslint/parser": "^8.15.0", + "@vitest/coverage-v8": "^2.0.5", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -84,18 +84,13 @@ "eslint": "^9.15.0", "eslint-plugin-html": "^8.1.2", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jest": "^28.9.0", "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.12.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", @@ -123,13 +118,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.1", "typedoc": "^0.26.11", "typedoc-plugin-markdown": "^4.2.10", "typedoc-plugin-missing-exports": "^3.0.2", - "typescript": "^5.6.3" + "typescript": "^5.6.3", + "vitest": "^2.0.0", + "vitest-webgl-canvas-mock": "^1.1.0" }, "engines": { "node": ">=16.14.0", @@ -149,24 +145,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" @@ -220,221 +206,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" } @@ -489,10 +276,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" }, @@ -500,350 +291,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.16.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.16.0.tgz", + "integrity": "sha512-R0Eqq5kTZnmZ0elih5uY3TWjMqqAeMl7ciU7maUs+m1FNjCEdJXtJ9wrQxNgjmXi0tX8cvahZRO3O558tEz/KA==", "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": "^6.0.1", + "@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.5", + "@cspell/dict-npm": "^5.1.11", + "@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.13", + "@cspell/dict-sql": "^2.1.8", + "@cspell/dict-svelte": "^1.0.5", + "@cspell/dict-swift": "^2.0.4", + "@cspell/dict-terraform": "^1.0.6", + "@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.16.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.16.0.tgz", + "integrity": "sha512-KLjPK94gA3JNuWy70LeenJ6EL3SFk2ejERKYJ6SVV/cVOKIvVd2qe42yX3/A/DkF2xzuZ2LD4z0sfoqQL1BaqA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@cspell/cspell-types": "8.16.0" }, - "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.16.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.16.0.tgz", + "integrity": "sha512-WoCgrv/mrtwCY4lhc6vEcqN3AQ7lT6K0NW5ShoSo116U2tRaW0unApIYH4Va8u7T9g3wyspFEceQRR1xD9qb9w==", "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.16.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.16.0.tgz", + "integrity": "sha512-b+99bph43ptkXlQHgPXSkN/jK6LQHy2zL1Fm9up7+x6Yr64bxAzWzoeqJAPtnrPvFuOrFN0jZasZzKBw8CvrrQ==", "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.16.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.16.0.tgz", + "integrity": "sha512-+fn763JKA4EYCOv+1VShFq015UMEBAFRDr+rlCnesgLE0fv9TSFVLsjOfh9/g6GuGQLCRLUqKztwwuueeErstQ==", "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.16.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.16.0.tgz", + "integrity": "sha512-bGrIK7p4NVsK+QX/CYWmjax+FkzfSIZaIaoiBESGV5gmwgXDVRMJ3IP6tQVAmTtckOYHCmtT5CZgI8zXWr8dHQ==", "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.16.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.16.0.tgz", - "integrity": "sha512-R0Eqq5kTZnmZ0elih5uY3TWjMqqAeMl7ciU7maUs+m1FNjCEdJXtJ9wrQxNgjmXi0tX8cvahZRO3O558tEz/KA==", - "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": "^6.0.1", - "@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.5", - "@cspell/dict-npm": "^5.1.11", - "@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.13", - "@cspell/dict-sql": "^2.1.8", - "@cspell/dict-svelte": "^1.0.5", - "@cspell/dict-swift": "^2.0.4", - "@cspell/dict-terraform": "^1.0.6", - "@cspell/dict-typescript": "^3.1.11", - "@cspell/dict-vue": "^3.0.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-json-reporter": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.16.0.tgz", - "integrity": "sha512-KLjPK94gA3JNuWy70LeenJ6EL3SFk2ejERKYJ6SVV/cVOKIvVd2qe42yX3/A/DkF2xzuZ2LD4z0sfoqQL1BaqA==", - "dev": true, - "dependencies": { - "@cspell/cspell-types": "8.16.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-pipe": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.16.0.tgz", - "integrity": "sha512-WoCgrv/mrtwCY4lhc6vEcqN3AQ7lT6K0NW5ShoSo116U2tRaW0unApIYH4Va8u7T9g3wyspFEceQRR1xD9qb9w==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-resolver": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.16.0.tgz", - "integrity": "sha512-b+99bph43ptkXlQHgPXSkN/jK6LQHy2zL1Fm9up7+x6Yr64bxAzWzoeqJAPtnrPvFuOrFN0jZasZzKBw8CvrrQ==", - "dev": true, - "dependencies": { - "global-directory": "^4.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-service-bus": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.16.0.tgz", - "integrity": "sha512-+fn763JKA4EYCOv+1VShFq015UMEBAFRDr+rlCnesgLE0fv9TSFVLsjOfh9/g6GuGQLCRLUqKztwwuueeErstQ==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-types": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.16.0.tgz", - "integrity": "sha512-bGrIK7p4NVsK+QX/CYWmjax+FkzfSIZaIaoiBESGV5gmwgXDVRMJ3IP6tQVAmTtckOYHCmtT5CZgI8zXWr8dHQ==", - "dev": true, - "engines": { - "node": ">=18" + "engines": { + "node": ">=18" } }, "node_modules/@cspell/dict-ada": { @@ -1346,616 +928,714 @@ "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.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "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.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "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.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "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.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "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/@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/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": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">=12" } }, - "node_modules/@eslint/js": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", - "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "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.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/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, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "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, - "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.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "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" + "node": ">=12" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "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": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": ">=12" } }, - "node_modules/@humanfs/node/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-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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=12" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "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, - "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.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "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": "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-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, - "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-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, + "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/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-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/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, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "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/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": { - "ansi-regex": "^6.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "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/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-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "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-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, - "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-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": "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/@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, - "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" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "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/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/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" + "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": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "eslint": "^6.0.0 || ^7.0.0 || >=8.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-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.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/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^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-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/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "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": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "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" + "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_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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/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": { - "@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" + "node": ">=18" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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": { - "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": "*" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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/js": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", "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" - }, "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/@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, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" + "levn": "^0.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.18.0" } }, - "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/@humanfs/node/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/@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.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "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": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "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-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/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/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.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/@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": { + "ansi-regex": "^6.0.1" + }, + "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==", + "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", @@ -1975,13 +1655,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" @@ -1997,7 +1679,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": { @@ -2015,18 +1699,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": { @@ -2242,6 +1929,7 @@ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz", "integrity": "sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng==", "dev": true, + "license": "Apache-2.0", "dependencies": { "debug": "^4.3.7", "extract-zip": "^2.0.1", @@ -2462,6 +2150,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2475,6 +2164,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2488,6 +2178,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2501,6 +2192,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2514,6 +2206,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2527,6 +2220,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2540,6 +2234,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2553,6 +2248,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2566,6 +2262,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2579,6 +2276,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2592,6 +2290,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2605,6 +2304,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2618,6 +2318,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2631,6 +2332,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2644,6 +2346,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2657,6 +2360,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2670,6 +2374,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2683,6 +2388,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2763,24 +2469,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", @@ -2816,19 +2504,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", @@ -2859,62 +2540,21 @@ "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==", + "node_modules/@types/benchmark": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", + "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==", + "dev": true + }, + "node_modules/@types/caseless": { + "version": "0.12.2", "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } + "license": "MIT" }, - "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", - "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==", - "dev": true - }, - "node_modules/@types/caseless": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", "dev": true, "dependencies": { "@types/d3-array": "*", @@ -3138,7 +2778,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", @@ -3191,15 +2832,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", @@ -3230,16 +2862,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", @@ -3316,6 +2938,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.19.8" } @@ -3447,6 +3070,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": "*" @@ -3457,6 +3081,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.15.0", @@ -3490,6 +3115,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "8.15.0", "@typescript-eslint/types": "8.15.0", @@ -3518,6 +3144,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.15.0", "@typescript-eslint/visitor-keys": "8.15.0" @@ -3535,6 +3162,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.15.0", "@typescript-eslint/utils": "8.15.0", @@ -3562,6 +3190,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "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.15.0.tgz", "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "8.15.0", "@typescript-eslint/visitor-keys": "8.15.0", @@ -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.15.0.tgz", "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.15.0", @@ -3654,6 +3287,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.15.0", "eslint-visitor-keys": "^4.2.0" @@ -3684,10 +3318,288 @@ "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" + "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", @@ -3706,15 +3618,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", @@ -3784,47 +3687,20 @@ "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==", + "node_modules/ansi-regex": { + "version": "3.0.1", "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "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==", + "node_modules/ansi-styles": { + "version": "3.2.1", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" }, "engines": { "node": ">=4" @@ -3876,14 +3752,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", @@ -4048,11 +3916,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" }, @@ -4157,96 +4036,8 @@ "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" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "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" - } - }, - "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==", - "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" - } + "license": "Apache-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -4258,6 +4049,7 @@ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", "dev": true, + "license": "Apache-2.0", "optional": true }, "node_modules/bare-fs": { @@ -4265,6 +4057,7 @@ "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", @@ -4277,6 +4070,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": { @@ -4284,6 +4078,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" @@ -4294,6 +4089,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" @@ -4323,6 +4119,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" } @@ -4402,26 +4199,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, @@ -4452,6 +4229,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4462,6 +4240,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": "*" } @@ -4483,6 +4262,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", @@ -4510,14 +4299,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", @@ -4575,6 +4356,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, @@ -4647,15 +4445,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", @@ -4676,6 +4465,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, @@ -4715,6 +4514,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", @@ -4729,12 +4529,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", @@ -4800,22 +4594,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, @@ -4984,27 +4762,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, @@ -5462,27 +5219,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, @@ -5869,21 +5605,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": { @@ -5971,18 +5695,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": { @@ -6037,6 +5757,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", @@ -6095,15 +5816,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", @@ -6177,17 +5889,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", @@ -6260,1655 +5961,1190 @@ "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.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", - "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.15.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.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" - }, - "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.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.9.0.tgz", - "integrity": "sha512-rLu1s1Wf96TgUUxSw6loVIkNtUjq1Re7A9QdCCHSohnvXEBAjuL420h0T/fMmkQlNsQP2GhQzEUpYHPfxBkvYQ==", - "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==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "dependencies": { + "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==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "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/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/emoji-regex": { + "version": "8.0.0", "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.15.0", - "@microsoft/tsdoc-config": "0.17.0" - } + "license": "MIT" }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "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": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "once": "^1.4.0" } }, - "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/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": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", + "node_modules/error-ex": { + "version": "1.3.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.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", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "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": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", + "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": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, "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-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-limit": "^3.0.2" + "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/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/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": ">=8" + "node": ">= 0.4" } }, - "node_modules/eslint/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/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": { - "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", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "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, - "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.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", "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.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.5", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.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" + }, + "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_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": { - "to-regex-range": "^5.0.1" + "node": "^18.18.0 || >=20.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/find-up": { - "version": "4.1.0", + "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": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@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_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==", + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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": { + "@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.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "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.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "dev": true, "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.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, "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", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "ISC" + "engines": { + "node": ">=8" + } }, - "node_modules/fsevents": { - "version": "2.3.2", + "node_modules/eslint/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, - "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", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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", + }, + "node_modules/esprima": { + "version": "4.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" + "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.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", - "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "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" @@ -7917,575 +7153,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" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/has-bigints": { - "version": "1.0.2", + "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", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/has-flag": { - "version": "4.0.0", + "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, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/has-own-prop": { + "node_modules/foreground-child/node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, "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-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, - "dependencies": { - "es-define-property": "^1.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/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, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/form-data": { + "version": "2.5.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.12" } }, - "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/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, - "dependencies": { - "has-symbols": "^1.0.3" - }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, - "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" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.7", + "node_modules/globals": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", "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" @@ -8494,116 +7695,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" @@ -8612,16 +7806,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" }, @@ -8629,21 +7817,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" @@ -8652,514 +7832,415 @@ "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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", + "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, - "license": "ISC" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "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==", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", + "node_modules/inflight": { + "version": "1.0.6", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "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" - }, - "engines": { - "node": ">=8" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", + "node_modules/inherits": { + "version": "2.0.4", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "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==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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/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, "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "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/internmap": { + "version": "2.0.3", "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "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/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": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": ">=10" + "node": ">= 12" } }, - "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/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, - "engines": { - "node": ">=0.10.0" - } + "license": "BSD-3-Clause" }, - "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-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": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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-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": { - "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" + "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-bigint": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" + "has-bigints": "^1.0.1" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jake": { - "version": "10.8.5", + "node_modules/is-binary-path": { + "version": "2.1.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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-boolean-object": { + "version": "1.1.2", "dev": true, + "license": "MIT", "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" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.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" + "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-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": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" + "builtin-modules": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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-callable": { + "version": "1.2.7", "dev": true, - "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" - }, + "license": "MIT", "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-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/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" - }, - "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-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-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": { - "@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" + "is-typed-array": "^1.1.13" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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-date-object": { + "version": "1.0.5", "dev": true, + "license": "MIT", "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" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "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-docker": { + "version": "2.2.1", "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" + "license": "MIT", + "bin": { + "is-docker": "cli.js" }, "engines": { "node": ">=8" @@ -9168,604 +8249,469 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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-extglob": { + "version": "2.1.1", "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, + "license": "MIT", "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-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": { - "detect-newline": "^3.0.0" + "call-bind": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "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-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": { - "@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" + "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-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-glob": { + "version": "4.0.3", "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" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" + "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==", + "dev": true, + "engines": { + "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-module": { + "version": "1.0.0", "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } + "license": "MIT" }, - "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-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, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "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 - } + "node": ">=0.12.0" } }, - "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-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/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "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-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": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "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-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", "dev": true, + "license": "MIT", "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" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "@types/estree": "*" } }, - "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-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": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" + "call-bind": "^1.0.2", + "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-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, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.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-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-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": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "call-bind": "^1.0.7" }, "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-string": { + "version": "1.0.7", "dev": true, + "license": "MIT", "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" + "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-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-symbol": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^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-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-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": { - "monocart-coverage-reports": "^2.8.7" + "which-typed-array": "^1.1.14" }, - "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 - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "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-weakref": { + "version": "1.0.2", "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" + "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-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/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": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/is-wsl": { + "version": "2.2.0", "dev": true, + "license": "MIT", "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" + "is-docker": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "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/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, - "engines": { - "node": ">=0.10.0" - } + "license": "ISC" }, - "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-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": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.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/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/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" + "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-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/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": { - "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" + "semver": "^7.5.3" }, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "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/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": { - "@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" + "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-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "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": { - "@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" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.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/jake": { + "version": "10.8.5", "dev": true, - "engines": { - "node": ">=8.6" + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/jest-validate": { + "node_modules/jest-diff": { "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-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", "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==", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher": { + "node_modules/jest-matcher-utils": { "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-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "jest-diff": "^29.7.0", + "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-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==", + "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==", "dev": true, "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" + "@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_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": { @@ -9779,23 +8725,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", @@ -10004,17 +8939,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", @@ -10047,17 +8971,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, @@ -10130,30 +9043,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", @@ -10215,17 +9110,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, @@ -10289,11 +9173,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" } @@ -10311,22 +9203,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", @@ -10355,15 +9251,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", @@ -10449,12 +9336,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, @@ -10607,15 +9488,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, @@ -10673,7 +9545,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", @@ -10727,20 +9600,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/monocart-locator/-/monocart-locator-1.0.2.tgz", "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" + "dev": true }, "node_modules/ms": { "version": "2.1.3", @@ -10793,6 +9653,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" } @@ -10872,12 +9733,6 @@ "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 - }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -10995,27 +9850,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, @@ -11158,21 +9992,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", @@ -11232,46 +10051,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", @@ -11291,6 +10076,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" }, @@ -11303,6 +10089,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" @@ -11316,6 +10103,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" @@ -11329,6 +10117,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" @@ -11359,6 +10148,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, @@ -11463,6 +10268,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", @@ -11521,7 +10343,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.1", @@ -11552,14 +10375,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", @@ -11572,18 +10387,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, @@ -12305,23 +11108,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, @@ -12356,6 +11147,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", @@ -12375,6 +11167,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" }, @@ -12387,6 +11180,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" @@ -12400,6 +11194,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" @@ -12412,23 +11207,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" @@ -12458,6 +11250,7 @@ "integrity": "sha512-WfB8jGwFV+qrD9dcJJVvWPFJBU6kxeu2wxJz9WooDGfM3vIiKLgzImEDBxUQnCBK/2cXB3d4dV6gs/LLpgfLDg==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.4.1", "chromium-bidi": "0.8.0", @@ -12478,6 +11271,7 @@ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.9.0.tgz", "integrity": "sha512-hLVrav2HYMVdK0YILtfJwtnkBAwNOztUdR4aJ5YKDvgsbtagNr6urUJk9HyjRA9e+PaLI3jzJ0wM7A4jSZ7Qxw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.4.1", "chromium-bidi": "0.8.0", @@ -12502,27 +11296,6 @@ "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", "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, @@ -12546,7 +11319,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", @@ -12748,11 +11522,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", @@ -12770,18 +11539,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, @@ -12797,15 +11554,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, @@ -12858,6 +11606,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz", "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -13136,6 +11885,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, @@ -13170,12 +11926,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, @@ -13248,6 +11998,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" @@ -13264,6 +12015,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" @@ -13278,6 +12030,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", @@ -13292,6 +12045,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" }, @@ -13500,11 +12254,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", @@ -13576,11 +12325,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.2", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", "dev": true, + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -13617,19 +12381,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, @@ -13841,15 +12592,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", @@ -14279,6 +13021,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" @@ -14293,6 +13036,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", @@ -14323,49 +13067,33 @@ "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/through": { "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", @@ -14380,10 +13108,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", @@ -14403,20 +13161,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", @@ -14429,33 +13173,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", @@ -14478,62 +13195,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", @@ -14712,7 +13373,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.11", @@ -14819,6 +13481,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" @@ -14828,7 +13491,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", @@ -14910,14 +13574,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", @@ -14956,60 +13612,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, @@ -15047,6 +13666,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", @@ -15068,27 +13846,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", @@ -15098,38 +13855,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, @@ -15222,6 +13947,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, @@ -15376,18 +14118,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", @@ -15421,21 +14151,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", @@ -15535,6 +14250,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 3ffa7d1a5f..3b140fa694 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,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", @@ -78,6 +77,7 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.15.0", "@typescript-eslint/parser": "^8.15.0", + "@vitest/coverage-v8": "^2.0.5", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -92,18 +92,13 @@ "eslint": "^9.15.0", "eslint-plugin-html": "^8.1.2", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jest": "^28.9.0", "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.12.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", @@ -131,13 +126,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.1", "typedoc": "^0.26.11", "typedoc-plugin-markdown": "^4.2.10", "typedoc-plugin-missing-exports": "^3.0.2", - "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", @@ -164,16 +160,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 55330a41b1..c46a6c8b8a 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 f54c927f9b..e8c252b094 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 117e5d8e5f..354994f612 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 41c3c7f896..3c977d4cea 100644 --- a/src/geo/projection/globe_covering_tiles.test.ts +++ b/src/geo/projection/globe_covering_tiles.test.ts @@ -1,4 +1,5 @@ import {Aabb} from '../../util/primitives/aabb'; +import {describe, expect, test} from 'vitest'; import {expectToBeCloseToArray} from '../../util/test/util'; import {GlobeCoveringTilesDetailsProvider} from './globe_covering_tiles_details_provider'; diff --git a/src/geo/projection/globe_transform.test.ts b/src/geo/projection/globe_transform.test.ts index e687685515..b66e347f64 100644 --- a/src/geo/projection/globe_transform.test.ts +++ b/src/geo/projection/globe_transform.test.ts @@ -9,6 +9,7 @@ import {expectToBeCloseToArray, getGlobeProjectionMock, sleep} from '../../util/ import {MercatorCoordinate} from '../mercator_coordinate'; import {tileCoordinatesToLocation} from './mercator_utils'; import {coveringTiles} from './covering_tiles'; +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 995e71fc83..9e37478b61 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 08f1c54c23..5106abe52d 100644 --- a/src/gl/state.test.ts +++ b/src/gl/state.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {type 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 9deb16ea62..6d4dc4554c 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 59d7d20c11..40690c2e6e 100644 --- a/src/render/draw_custom.test.ts +++ b/src/render/draw_custom.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi, type 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 a8fde5b4e7..54c2a0c781 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 {type SourceCache} from '../source/source_cache'; import {type RasterSourceSpecification, type SourceSpecification, type 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 24e40632c4..cddfff80dd 100644 --- a/src/render/draw_fill.test.ts +++ b/src/render/draw_fill.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi, type 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 {type ProgramConfiguration, type 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; const renderOptions: RenderOptions = {isRenderingToTexture: false, isRenderingGlobe: false}; @@ -131,8 +132,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; } @@ -144,7 +145,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 9b986b7ce2..491946575e 100644 --- a/src/render/draw_symbol.test.ts +++ b/src/render/draw_symbol.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect, vi, type 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 {type 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 { @@ -86,7 +87,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: { @@ -149,7 +150,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: { @@ -169,16 +170,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'); const renderOptions: RenderOptions = {isRenderingToTexture: false, isRenderingGlobe: false}; drawSymbols(painterMock, sourceCacheMock, layer, [tileId], null, renderOptions); @@ -216,7 +217,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: { @@ -236,9 +237,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; const renderOptions: RenderOptions = {isRenderingToTexture: false, isRenderingGlobe: false}; diff --git a/src/render/fill_large_mesh_arrays.test.ts b/src/render/fill_large_mesh_arrays.test.ts index b359b4fa4a..4d9c930a32 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 {type 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 59f5ac8093..ab3692def7 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 0af42e9941..8776857022 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 e4ad0da4f2..1238831feb 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 = {_source: {tileSize: 512}} 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 = {_source: {tileSize: 512}} 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 78e11b08a5..fb34ab1ab4 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 {type mat4} from 'gl-matrix'; import {type 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 047a8b07c0..29b4313e7e 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 {type 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 e391d256f2..fed290fcf3 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, type GeoJSONSourceOptions} from './geojson_source'; @@ -65,7 +66,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; @@ -306,7 +307,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); @@ -341,7 +342,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 a085e02ae5..075ac0e158 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, type 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 2fab4d68ab..7a93382100 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 {type 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 0e4746ffe3..417b31e1d2 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 66354cc733..d2ce7d97ed 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, type 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 24a212d084..3839cba760 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 {type WorkerDEMTileParameters} from './worker_source'; diff --git a/src/source/raster_tile_source.test.ts b/src/source/raster_tile_source.test.ts index e6d1f85cdd..ee31e2894a 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 9e78e839f8..aa5eaec606 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 {type 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 90512bfb33..617c9f0ee6 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 {type 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 3d2bc210f0..2b03f7b407 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 {type 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 d9981a36e7..9e2db5bbf0 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 {type Map} from '../ui/map'; import {type Source, addSourceType} from './source'; @@ -99,7 +100,7 @@ function createSourceCache(options?, used?) { } afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); describe('SourceCache#addTile', () => { @@ -136,7 +137,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); @@ -180,7 +181,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); @@ -293,7 +294,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); @@ -363,14 +364,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', () => { @@ -521,7 +522,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); @@ -547,7 +548,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); @@ -815,7 +816,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) => { @@ -925,7 +926,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); @@ -977,8 +978,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'; @@ -1013,8 +1014,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([ @@ -1044,8 +1045,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); @@ -1088,7 +1089,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(); @@ -1107,7 +1108,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 @@ -1151,7 +1152,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); @@ -1172,7 +1173,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([ @@ -1197,7 +1198,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 @@ -1986,7 +1987,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); @@ -1994,7 +1995,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 528b99f4bf..df518d77f0 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 44c0c4114b..6b10b63a03 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, type 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 5fc9a6ffcd..0694b9e2dc 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 b0ce15257c..e8632f1ee3 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 {type 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 2c0d8d90c0..620f9d202e 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 {type 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 f9141f8d14..29f38cbf5d 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 7a816dbb6d..f9584c93f7 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 986fb1d4a3..a2aa08614f 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 {type 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 b00d7d1964..fba3972dc0 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, type 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 4881634565..621224edf7 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, type FormattedSection, createExpression, type 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 4caf340a04..91e57e98ed 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, type 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 a7bdb9eda5..0a425c49b1 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'; @@ -44,7 +45,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; @@ -57,7 +58,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}; }); @@ -89,7 +90,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}; }); @@ -132,7 +133,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}; }); @@ -147,7 +148,7 @@ describe('loadSprite', () => { }); test('request canceling', async () => { - const transform = jest.fn().mockImplementation((url, type) => { + const transform = vi.fn().mockImplementation((url, type) => { return {url, type}; }); @@ -170,7 +171,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 c9195937d1..607bc83604 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, type SkySpecification} from '@maplibre/maplibre-gl-style-spec'; import {type EvaluationParameters} from './evaluation_parameters'; import {type 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 ee2531f286..0608a59a96 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(), { @@ -405,7 +406,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} @@ -470,7 +471,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); @@ -485,7 +486,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(); @@ -502,7 +503,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; @@ -532,7 +533,7 @@ describe('Style#_load', () => { type: 'custom' }] }); - const stub = jest.spyOn(console, 'error'); + const stub = vi.spyOn(console, 'error'); style._load(styleSpec, {validate: true}); @@ -584,9 +585,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(); @@ -598,7 +599,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(); @@ -655,17 +656,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(); @@ -703,21 +704,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',}; @@ -767,20 +768,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}; @@ -805,8 +806,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(); @@ -863,8 +864,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); @@ -1042,7 +1043,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); }); @@ -1736,7 +1737,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(); }); @@ -1801,7 +1802,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}); @@ -1903,7 +1904,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}); @@ -2145,7 +2146,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); @@ -2325,7 +2326,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++; } @@ -2360,14 +2361,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; }); @@ -2391,9 +2392,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'}); @@ -2445,7 +2446,7 @@ describe('Style#query*Features', () => { }] }); - onError = jest.fn(); + onError = vi.fn(); style.on('error', onError); style.on('style.load', () => { @@ -2465,7 +2466,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++; } @@ -2477,7 +2478,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 ac0e6f6bd6..03193ba86e 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 5ea22e391f..facc37b8af 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 {type 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 46f0654bbd..0079c08314 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 {type 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 7e37504847..3b2b53570e 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 {type EvaluationParameters} from '../evaluation_parameters'; import {type 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 e34df9cd26..26df5014d2 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 ad1a2d11e6..59d733a2ac 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 {type 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 08feafe442..b1a4e3c806 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 {type PositionedIcon, type 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 bb67df1e58..5aa6f06c60 100644 --- a/src/symbol/projection.test.ts +++ b/src/symbol/projection.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {type SymbolProjectionContext, type 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 31e619138b..3e466973be 100644 --- a/src/symbol/quads.test.ts +++ b/src/symbol/quads.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {type ImagePosition} from '../render/image_atlas'; import {getIconQuads} from './quads'; diff --git a/src/symbol/shaping.test.ts b/src/symbol/shaping.test.ts index eb3383cec8..2a2d294438 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 {type 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 5cb7902aab..76db381c1f 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, {type 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 adf6aa63b0..145d878ff7 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, type CameraOptions, type PointLike} from '../ui/camera'; import {TaskQueue, type TaskID} from '../util/task_queue'; import {browser} from '../util/browser'; @@ -1020,7 +1021,7 @@ describe('#easeTo', () => { test('can be called from within a moveend event handler', async () => { 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}); @@ -1057,7 +1058,7 @@ describe('#easeTo', () => { test('pans eastward across the antimeridian', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -1100,7 +1101,7 @@ describe('#easeTo', () => { test('pans westward across the antimeridian', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -1144,7 +1145,7 @@ describe('#easeTo', () => { test('animation occurs when prefers-reduced-motion: reduce is set but overridden by essential: true', async () => { 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 @@ -1180,7 +1181,7 @@ describe('#easeTo', () => { let startTime; camera.on('movestart', () => { startTime = new Date(); }); const promise = camera.once('moveend'); - + camera.easeTo({center: [100, 0], zoom: 3.2, bearing: 90, duration: 1000}); await promise; @@ -1301,7 +1302,7 @@ describe('#flyTo', () => { test('Zoom out from the same position to the same position with animation', async () => { 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'); const promise = camera.once('moveend'); @@ -1495,7 +1496,7 @@ describe('#flyTo', () => { camera.on('pitchend', (d) => { pitchended = d.data; }) const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], duration: 10}, eventData); @@ -1537,7 +1538,7 @@ describe('#flyTo', () => { test('can be called from within a moveend event handler', async () => { 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}); @@ -1578,7 +1579,7 @@ describe('#flyTo', () => { const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], zoom: 18, duration: 10}); @@ -1598,7 +1599,7 @@ describe('#flyTo', () => { test('pans eastward across the prime meridian', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-10, 0]); let crossedPrimeMeridian; @@ -1630,7 +1631,7 @@ describe('#flyTo', () => { test('pans westward across the prime meridian', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([10, 0]); let crossedPrimeMeridian; @@ -1662,7 +1663,7 @@ describe('#flyTo', () => { test('pans eastward across the antimeridian', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -1693,7 +1694,7 @@ describe('#flyTo', () => { test('pans westward across the antimeridian', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -1724,7 +1725,7 @@ describe('#flyTo', () => { test('does not pan eastward across the antimeridian if no world copies', async () => { const camera = createCamera({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -1756,7 +1757,7 @@ describe('#flyTo', () => { test('does not pan westward across the antimeridian if no world copies', async () => { const camera = createCamera({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -1788,7 +1789,7 @@ describe('#flyTo', () => { test('jumps back to world 0 when crossing the antimeridian', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); @@ -1819,7 +1820,7 @@ describe('#flyTo', () => { test('peaks at the specified zoom level', async () => { const camera = createCamera({zoom: 20}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); const minZoom = 1; let zoomed = false; @@ -1863,7 +1864,7 @@ describe('#flyTo', () => { const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [12, 34], zoom: 30, duration: 10}); @@ -1888,7 +1889,7 @@ describe('#flyTo', () => { const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [12, 34], zoom: 1, duration: 10}); @@ -1936,7 +1937,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; @@ -1960,7 +1961,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; @@ -2026,7 +2027,7 @@ describe('#isEasing', () => { test('returns false when done panning', async () => { const camera = createCamera(); const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.panTo([100, 0], {duration: 1}); setTimeout(() => { @@ -2048,7 +2049,7 @@ describe('#isEasing', () => { test('returns false when done zooming', async () => { const camera = createCamera(); const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.zoomTo(3.2, {duration: 1}); setTimeout(() => { @@ -2069,7 +2070,7 @@ describe('#isEasing', () => { test('returns false when done rotating', async () => { const camera = createCamera(); const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.rotateTo(90, {duration: 1}); setTimeout(() => { @@ -2144,7 +2145,7 @@ describe('#stop', () => { const spy = jest.fn(); camera.on('moveend', spy); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.panTo([100, 0], {duration: 1}, eventData); @@ -2380,7 +2381,7 @@ describe('queryTerrainElevation', () => { }); test('Calls getElevationForLngLatZoom with correct arguments', () => { - const getElevationForLngLatZoom = jest.fn(); + const getElevationForLngLatZoom = vi.fn(); camera.terrain = {getElevationForLngLatZoom} as any as Terrain; camera.transform = new MercatorTransform(0, 22, 0, 60, true); @@ -2419,7 +2420,7 @@ describe('#transformCameraUpdate', () => { test('invoke transformCameraUpdate callback during easeTo', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); let callbackCount = 0; @@ -2453,7 +2454,7 @@ describe('#transformCameraUpdate', () => { test('invoke transformCameraUpdate callback during flyTo', async () => { const camera = createCamera(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); let callbackCount = 0; @@ -2826,9 +2827,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(); camera.on('zoomstart', zoomstart); camera.on('zoom', zoom); @@ -2846,7 +2847,7 @@ describe('#easeTo globe projection', () => { test('does not emit zoom events if not changing latitude and not zooming', async () => { const camera = createCameraGlobe(); - const spy = jest.fn(); + const spy = vi.fn(); camera.on('zoomstart', spy); camera.on('zoom', spy); camera.on('zoomend', spy); @@ -2860,7 +2861,7 @@ describe('#easeTo globe projection', () => { test('pans eastward across the antimeridian', async () => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -2902,7 +2903,7 @@ describe('#easeTo globe projection', () => { test('pans westward across the antimeridian', async () => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -3002,7 +3003,7 @@ describe('#flyTo globe projection', () => { test('Zoom out from the same position to the same position with animation', async () => { 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'); const promise = camera.once('zoomend'); @@ -3204,7 +3205,7 @@ describe('#flyTo globe projection', () => { camera.on('pitchend', (d) => { pitchended = d.data; }) const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], duration: 10}, eventData); @@ -3251,7 +3252,7 @@ describe('#flyTo globe projection', () => { const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [100, 0], zoom: 18, duration: 10}); @@ -3272,7 +3273,7 @@ describe('#flyTo globe projection', () => { test('pans eastward across the prime meridian', async () => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-10, 0]); let crossedPrimeMeridian; @@ -3304,7 +3305,7 @@ describe('#flyTo globe projection', () => { test('pans westward across the prime meridian', async () => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([10, 0]); let crossedPrimeMeridian; @@ -3336,7 +3337,7 @@ describe('#flyTo globe projection', () => { test('pans eastward across the antimeridian', async () => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -3368,7 +3369,7 @@ describe('#flyTo globe projection', () => { test('pans westward across the antimeridian', async () => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -3400,7 +3401,7 @@ describe('#flyTo globe projection', () => { test('pans eastward across the antimeridian even if renderWorldCopies: false', async () => { const camera = createCameraGlobe({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([170, 0]); let crossedAntimeridian; @@ -3432,7 +3433,7 @@ describe('#flyTo globe projection', () => { test('pans westward across the antimeridian even if renderWorldCopies: false', async () => { const camera = createCameraGlobe({renderWorldCopies: false}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); let crossedAntimeridian; @@ -3464,7 +3465,7 @@ describe('#flyTo globe projection', () => { test('jumps back to world 0 when crossing the antimeridian', async () => { const camera = createCameraGlobe(); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); camera.setCenter([-170, 0]); @@ -3495,7 +3496,7 @@ describe('#flyTo globe projection', () => { test('peaks at the specified zoom level', async () => { const camera = createCameraGlobe({zoom: 20}); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); const minZoom = 1; let zoomed = false; @@ -3539,7 +3540,7 @@ describe('#flyTo globe projection', () => { const promise = camera.once('moveend'); - const stub = jest.spyOn(browser, 'now'); + const stub = vi.spyOn(browser, 'now'); stub.mockImplementation(() => 0); camera.flyTo({center: [12, 34], zoom: 30, duration: 10}); @@ -3568,7 +3569,7 @@ describe('#flyTo globe projection', () => { const promise = camera.once('moveend'); - 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 5114401d58..18bfc4204a 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 69e919f01d..6ba16d878f 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, type 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 4cca7adcb5..1f233af63f 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 20dc95fd1a..ccd5baa248 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 87011d28cb..c91ab01479 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, type 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 75efb2fd74..7c2d026d22 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 c9ddae30b9..e521f34605 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 37dfbbf15e..fba4af0409 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, type 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 1b1c65303e..2a771cb36e 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, type 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 5b25c2541e..3d42493411 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, type 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 bea073696d..a99788a3b2 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 {type 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 c4a0de7dba..d720215274 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 {type 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 d105686691..5b14676a73 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 {type 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 e26a435c92..441d232dea 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 {type 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((e) => { + const spy = vi.fn((e) => { expect(e.type).toBe('click'); expect(e.features).toBe(features); }); @@ -109,19 +110,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); @@ -137,13 +138,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()); @@ -155,9 +156,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()); @@ -169,14 +170,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'); }); @@ -193,16 +194,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); }); @@ -217,11 +218,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); @@ -238,7 +239,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}}); @@ -249,7 +250,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; @@ -263,10 +264,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); @@ -278,10 +279,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); @@ -293,10 +294,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'); }); @@ -312,13 +313,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); }); @@ -334,13 +335,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); }); @@ -355,15 +356,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); @@ -380,11 +381,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); @@ -402,7 +403,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}}); @@ -413,7 +414,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; @@ -431,7 +432,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}}); @@ -442,7 +443,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; @@ -456,10 +457,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); @@ -472,9 +473,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()); @@ -488,13 +489,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); @@ -510,10 +511,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()); @@ -525,13 +526,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()); @@ -544,10 +545,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()); @@ -562,16 +563,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); }); @@ -591,8 +592,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; @@ -600,9 +601,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); @@ -619,13 +620,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); @@ -638,11 +639,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); @@ -655,10 +656,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); @@ -672,13 +673,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); }); @@ -694,13 +695,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); }); @@ -716,11 +717,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); @@ -736,10 +737,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()); @@ -752,12 +753,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()); @@ -769,10 +770,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()); @@ -785,12 +786,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(); @@ -806,10 +807,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(); @@ -825,12 +826,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); @@ -848,7 +849,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()); @@ -862,7 +863,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(); @@ -877,7 +878,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(); @@ -892,7 +893,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(); @@ -905,7 +906,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(); @@ -1020,10 +1021,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); @@ -1056,7 +1057,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', @@ -1070,10 +1071,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 2d5cd14fc6..e444a5d632 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 {type 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 05d5e4a96d..32aecd2d65 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 {type 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 4b72a3c5d2..b93439b00c 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 {type 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 e804636fcd..01bd86cb56 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, type 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 5dba0fa363..9df2763e5b 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, type 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 37d8c86c6a..43177568f6 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, type 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 5612b898d8..c845d32665 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, type 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(); const popup = 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(); const popup = 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(); const popup = 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 1d80194915..4ae1ce6a50 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, type ActorTarget} from './actor'; import {type 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 15c628c402..2231749929 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 3f52b15138..356116cd21 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, type StylePropertyExpression, type 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 df1cbba77a..5e26c4da7a 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')); @@ -70,7 +71,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')); @@ -79,7 +80,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')); @@ -88,7 +89,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')); @@ -124,7 +125,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); @@ -135,8 +136,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); @@ -150,7 +151,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); @@ -206,7 +207,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/primitives.test.ts b/src/util/primitives/primitives.test.ts index 9d393b1ac9..4bd92283f8 100644 --- a/src/util/primitives/primitives.test.ts +++ b/src/util/primitives/primitives.test.ts @@ -1,3 +1,4 @@ +import {describe, test, expect} from 'vitest'; import {mat4, vec3, type vec4} from 'gl-matrix'; import {Aabb, IntersectionResult} from './aabb'; import {Frustum} from './frustum'; 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 fa17d9c4e9..cdd092bcb8 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 {type 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 9141c5d282..1ce1663ed2 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, getAngleDelta} 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 09e3df6ce4..98e451f33e 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 {type 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 b9da7aa9b9..882df6731f 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 52cbd597ac..be857b3b1a 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, {type Page, type 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 d6aff7fe88..6467fe4b1a 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, {type Page, type Browser} from 'puppeteer'; @@ -16,8 +17,6 @@ import {globSync} from 'glob'; import type * 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 7aa7330af4..ad337ced9f 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, type 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', + }, + }, +}); From 50a20cf16c5f515b6c43f54d577e5a0ae336084d Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Thu, 21 Nov 2024 23:16:26 +0100 Subject: [PATCH 02/32] jest -> vi --- src/ui/camera.test.ts | 12 ++++++------ src/ui/map_tests/map_events.test.ts | 10 +++++----- src/util/evented.test.ts | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/ui/camera.test.ts b/src/ui/camera.test.ts index 145d878ff7..eb49d28775 100644 --- a/src/ui/camera.test.ts +++ b/src/ui/camera.test.ts @@ -1000,7 +1000,7 @@ describe('#easeTo', () => { test('does not emit zoom events if not zooming', async () => { const camera = createCamera(); - const spy = jest.fn(); + const spy = vi.fn(); camera.on('zoomstart', spy); camera.on('zoom', spy); camera.on('zoomend', spy); @@ -1193,7 +1193,7 @@ describe('#easeTo', () => { test('jumpTo on("move") during easeTo with zoom, pitch, etc', () => { const camera = createCamera(); - const spy = jest.fn(); + const spy = vi.fn(); camera.on('moveend', spy); camera.easeTo({zoom: 20, bearing: 90, pitch: 60, duration: 500}, {done: true}); @@ -1210,7 +1210,7 @@ describe('#easeTo', () => { test('jumpTo on("zoom") during easeTo', () => { const camera = createCamera(); - const spy = jest.fn(); + const spy = vi.fn(); camera.on('moveend', spy); camera.easeTo({zoom: 20, duration: 500}, {done: true}); @@ -1227,7 +1227,7 @@ describe('#easeTo', () => { test('jumpTo on("pitch") during easeTo', () => { const camera = createCamera(); - const spy = jest.fn(); + const spy = vi.fn(); camera.on('moveend', spy); camera.easeTo({pitch: 60, duration: 500}, {done: true}); @@ -1244,7 +1244,7 @@ describe('#easeTo', () => { test('jumpTo on("rotate") during easeTo', () => { const camera = createCamera(); - const spy = jest.fn(); + const spy = vi.fn(); camera.on('moveend', spy); camera.easeTo({bearing: 90, duration: 500}, {done: true}); @@ -2142,7 +2142,7 @@ describe('#stop', () => { const eventData = {data: 'ok'}; const promise = camera.once('moveend'); - const spy = jest.fn(); + const spy = vi.fn(); camera.on('moveend', spy); const stub = vi.spyOn(browser, 'now'); diff --git a/src/ui/map_tests/map_events.test.ts b/src/ui/map_tests/map_events.test.ts index 441d232dea..e59a35d3bb 100644 --- a/src/ui/map_tests/map_events.test.ts +++ b/src/ui/map_tests/map_events.test.ts @@ -90,14 +90,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(); + const spy = vi.fn(); const subscription = map.on('click', ['layer1', 'layer2'], spy); subscription.unsubscribe(); @@ -947,7 +947,7 @@ describe('map events', () => { test('emits load event after a style is set', async () => { const map = new Map({container: window.document.createElement('div')} as any as MapOptions); - const failSpy = jest.fn(); + const failSpy = vi.fn(); map.on('load', failSpy); await sleep(1); @@ -1043,7 +1043,7 @@ describe('map events', () => { test('does not call listeners after unsubscribe', async () => { const map = createMap(); const error = new Error('test'); - const spy = jest.fn(); + const spy = vi.fn(); const subscription = map.on('error', spy); subscription.unsubscribe(); map.fire(new ErrorEvent(error)); diff --git a/src/util/evented.test.ts b/src/util/evented.test.ts index 5e26c4da7a..ba53792a31 100644 --- a/src/util/evented.test.ts +++ b/src/util/evented.test.ts @@ -24,7 +24,7 @@ describe('Evented', () => { test('calls listeners added with "on" and allows to unsubscribe', () => { const evented = new Evented(); - const listener = jest.fn(); + const listener = vi.fn(); const subscription = evented.on('a', listener); evented.fire(new Event('a')); subscription.unsubscribe(); From 05ea269a6867046064972f24283de2fd38d54b9a Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Thu, 21 Nov 2024 23:18:18 +0100 Subject: [PATCH 03/32] import vitest describe, expect, test --- src/data/feature_index.test.ts | 3 ++- src/render/program/terrain_program.test.ts | 3 ++- src/ui/control/globe_control.test.ts | 1 + src/util/dom.test.ts | 1 + src/util/primitives/aabb_cache.test.ts | 1 + 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/data/feature_index.test.ts b/src/data/feature_index.test.ts index a47a4ef7d0..3dba197c0a 100644 --- a/src/data/feature_index.test.ts +++ b/src/data/feature_index.test.ts @@ -1,6 +1,7 @@ import {FeatureIndex} from './feature_index'; import {OverscaledTileID} from '../source/tile_id'; import type {VectorTileFeature} from '@mapbox/vector-tile'; +import { describe, expect, test } from 'vitest'; describe('FeatureIndex', () => { describe('getId', () => { @@ -24,7 +25,7 @@ describe('FeatureIndex', () => { loadGeometry: () => [], toGeoJSON: () => ({}) } as unknown as VectorTileFeature; - + expect(featureIndex.getId(feature, 'sourceLayer')).toBe(123); // cluster_id converted to number }); }); diff --git a/src/render/program/terrain_program.test.ts b/src/render/program/terrain_program.test.ts index 993f7a32ad..9d61ce7eca 100644 --- a/src/render/program/terrain_program.test.ts +++ b/src/render/program/terrain_program.test.ts @@ -1,6 +1,7 @@ import {terrainUniformValues} from './terrain_program'; import {Sky} from '../../style/sky'; import {mat4} from 'gl-matrix'; +import { describe, expect, test } from 'vitest'; describe('terrainUniformValues', () => { test('disables fog when in globe projection mode', () => { @@ -27,4 +28,4 @@ describe('terrainUniformValues', () => { const uniformValues = terrainUniformValues(eleDelta, fogMatrix, sky, pitch, isGlobeMode); expect(uniformValues['u_fog_ground_blend_opacity']).toBe(sky.calculateFogBlendOpacity(pitch)); }); -}); \ No newline at end of file +}); diff --git a/src/ui/control/globe_control.test.ts b/src/ui/control/globe_control.test.ts index 63367c699a..32f5198584 100644 --- a/src/ui/control/globe_control.test.ts +++ b/src/ui/control/globe_control.test.ts @@ -1,5 +1,6 @@ import {GlobeControl} from './globe_control'; import {createMap as globalCreateMap, beforeMapTest} from '../../util/test/util'; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; function createMap() { return globalCreateMap({ diff --git a/src/util/dom.test.ts b/src/util/dom.test.ts index 089c00deba..0f69f414ab 100644 --- a/src/util/dom.test.ts +++ b/src/util/dom.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, test } from 'vitest'; import {DOM} from './dom'; describe('DOM', () => { diff --git a/src/util/primitives/aabb_cache.test.ts b/src/util/primitives/aabb_cache.test.ts index f401a85549..2395c91692 100644 --- a/src/util/primitives/aabb_cache.test.ts +++ b/src/util/primitives/aabb_cache.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, test } from 'vitest'; import {GlobeCoveringTilesDetailsProvider} from '../../geo/projection/globe_covering_tiles_details_provider'; describe('aabb cache', () => { From be761a8168dff16fff0a13b5e3a7e68a06c52459 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Thu, 21 Nov 2024 23:18:39 +0100 Subject: [PATCH 04/32] lint --- src/data/feature_index.test.ts | 2 +- src/render/program/terrain_program.test.ts | 2 +- src/ui/control/globe_control.test.ts | 2 +- src/util/dom.test.ts | 2 +- src/util/primitives/aabb_cache.test.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/feature_index.test.ts b/src/data/feature_index.test.ts index 3dba197c0a..9bc01e50bb 100644 --- a/src/data/feature_index.test.ts +++ b/src/data/feature_index.test.ts @@ -1,7 +1,7 @@ import {FeatureIndex} from './feature_index'; import {OverscaledTileID} from '../source/tile_id'; import type {VectorTileFeature} from '@mapbox/vector-tile'; -import { describe, expect, test } from 'vitest'; +import {describe, expect, test} from 'vitest'; describe('FeatureIndex', () => { describe('getId', () => { diff --git a/src/render/program/terrain_program.test.ts b/src/render/program/terrain_program.test.ts index 9d61ce7eca..3610cc4eac 100644 --- a/src/render/program/terrain_program.test.ts +++ b/src/render/program/terrain_program.test.ts @@ -1,7 +1,7 @@ import {terrainUniformValues} from './terrain_program'; import {Sky} from '../../style/sky'; import {mat4} from 'gl-matrix'; -import { describe, expect, test } from 'vitest'; +import {describe, expect, test} from 'vitest'; describe('terrainUniformValues', () => { test('disables fog when in globe projection mode', () => { diff --git a/src/ui/control/globe_control.test.ts b/src/ui/control/globe_control.test.ts index 32f5198584..2f532b1b6b 100644 --- a/src/ui/control/globe_control.test.ts +++ b/src/ui/control/globe_control.test.ts @@ -1,6 +1,6 @@ import {GlobeControl} from './globe_control'; import {createMap as globalCreateMap, beforeMapTest} from '../../util/test/util'; -import { afterEach, beforeEach, describe, expect, test } from 'vitest'; +import {afterEach, beforeEach, describe, expect, test} from 'vitest'; function createMap() { return globalCreateMap({ diff --git a/src/util/dom.test.ts b/src/util/dom.test.ts index 0f69f414ab..69e9c433b9 100644 --- a/src/util/dom.test.ts +++ b/src/util/dom.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from 'vitest'; +import {describe, expect, test} from 'vitest'; import {DOM} from './dom'; describe('DOM', () => { diff --git a/src/util/primitives/aabb_cache.test.ts b/src/util/primitives/aabb_cache.test.ts index 2395c91692..25b73a4e30 100644 --- a/src/util/primitives/aabb_cache.test.ts +++ b/src/util/primitives/aabb_cache.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from 'vitest'; +import {describe, expect, test} from 'vitest'; import {GlobeCoveringTilesDetailsProvider} from '../../geo/projection/globe_covering_tiles_details_provider'; describe('aabb cache', () => { From 82096af7d72df5a0a0f86bc58fb547994674f039 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 11:23:15 +0100 Subject: [PATCH 05/32] use 2.2.0-beta.2, due to fix for coverageMap --- package-lock.json | 192 +++++++++++++++++++++++++++++++--------------- package.json | 6 +- 2 files changed, 133 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index fd40d4a437..d0a8d021f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,7 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.15.0", "@typescript-eslint/parser": "^8.15.0", - "@vitest/coverage-v8": "^2.0.5", + "@vitest/coverage-v8": "^2.2.0-beta.2", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -124,7 +124,7 @@ "typedoc-plugin-markdown": "^4.2.10", "typedoc-plugin-missing-exports": "^3.0.2", "typescript": "^5.6.3", - "vitest": "^2.0.0", + "vitest": "^2.2.0-beta.2", "vitest-webgl-canvas-mock": "^1.1.0" }, "engines": { @@ -3319,9 +3319,9 @@ "dev": true }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.2.0-beta.2.tgz", + "integrity": "sha512-tLIN+RNRlt6KmhhzjbOqhay2L3tFx+D8dHJrhEQS6P6SrDn045jccUk6NCLXazFqcxWApuONzDV56j4Lp7kSIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3334,7 +3334,7 @@ "istanbul-reports": "^3.1.7", "magic-string": "^0.30.12", "magicast": "^0.3.5", - "std-env": "^3.7.0", + "std-env": "^3.8.0", "test-exclude": "^7.0.1", "tinyrainbow": "^1.2.0" }, @@ -3342,8 +3342,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "2.1.4", - "vitest": "2.1.4" + "@vitest/browser": "2.2.0-beta.2", + "vitest": "2.2.0-beta.2" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -3479,14 +3479,14 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.2.0-beta.2.tgz", + "integrity": "sha512-E8p3ua0VwVo49KHUO5YUYAcSdC1nFDW4/RxVnhho29hGEMyGUv/JwJDC+idcn2rQ8NlgMsKEWDVIhRP77vf/3A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", + "@vitest/spy": "2.2.0-beta.2", + "@vitest/utils": "2.2.0-beta.2", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, @@ -3495,13 +3495,13 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.2.0-beta.2.tgz", + "integrity": "sha512-l5m/69cV+fSNUr6CfejirnPME/LSHVd4VHOPdJZWNEOtRQV/33lahEtMfbkViOvifUFDIdrjQC5j4914UlKSaw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.4", + "@vitest/spy": "2.2.0-beta.2", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, @@ -3532,9 +3532,9 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.2.0-beta.2.tgz", + "integrity": "sha512-EWpdeQ1ooBK61VnWddSlFqr8YsOOEQQL6/fufRowY5xAYbnL5VlzKkUrGiotHg/WYPIOdw8EwmMeftgvvshUGg==", "dev": true, "license": "MIT", "dependencies": { @@ -3545,13 +3545,13 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.2.0-beta.2.tgz", + "integrity": "sha512-XV7E7S7VwPfLkB+cvpM+ahwNEikSJSDT9SRKNxZMHd2lo7R2Wx4Lm5wyiU7HO60y0W3WtzAK5EDnlYe9OgIBeg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.4", + "@vitest/utils": "2.2.0-beta.2", "pathe": "^1.1.2" }, "funding": { @@ -3559,13 +3559,13 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.2.0-beta.2.tgz", + "integrity": "sha512-fOXZlA1enCyeGvTiV/ZFFDaI9vPadKu3E/Q5LKVcXBqCPHDnRDpa6UNP6N7l74CchXj8y0LaIewkFxsq3FpBSg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.2.0-beta.2", "magic-string": "^0.30.12", "pathe": "^1.1.2" }, @@ -3574,9 +3574,9 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.2.0-beta.2.tgz", + "integrity": "sha512-AeQPFsEgaxnAzcK37CxA58WFyEMdbDOqXg+vZMJ8oPcL9CHzr3JhyxVaSWOpxnCv9+LXlMLyNSp7EbrUonEDJw==", "dev": true, "license": "MIT", "dependencies": { @@ -3587,13 +3587,13 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", - "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.2.0-beta.2.tgz", + "integrity": "sha512-GImag6HksQwfmXQbHj41yAMpViDvvzDZgVwiLIGNQim6PcDp6bqonTTh8jNbesVo/1TAzdmbPVXVmoNiyK49TQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.2.0-beta.2", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, @@ -6127,6 +6127,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -9488,6 +9495,19 @@ "node": ">= 0.6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mimic-response": { "version": "2.1.0", "dev": true, @@ -9992,6 +10012,22 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "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", @@ -11554,6 +11590,36 @@ "protocol-buffers-schema": "^3.3.1" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -12333,9 +12399,9 @@ "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "dev": true, "license": "MIT" }, @@ -13109,9 +13175,9 @@ } }, "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, "license": "MIT", "engines": { @@ -13667,9 +13733,9 @@ } }, "node_modules/vite": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", - "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13727,14 +13793,15 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.2.0-beta.2.tgz", + "integrity": "sha512-yvlCHJ2k5UMW9e2Vikhi/2rfTuLGAtEY9lYibjapxRyD5gCH/w30swn7lbTPjh/+pSbnZYa9o8UIm7fMC1rMKw==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, @@ -13749,31 +13816,32 @@ } }, "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==", + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.2.0-beta.2.tgz", + "integrity": "sha512-RJClaY1NBLXjk9CbDRioFsLHXdSxN3BZPqHeZfPSdRfJyqCPBEh+ITadn/2RamzdZqrP+ba81t9L8R5K2WzCKQ==", "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", + "@vitest/expect": "2.2.0-beta.2", + "@vitest/mocker": "2.2.0-beta.2", + "@vitest/pretty-format": "^2.2.0-beta.2", + "@vitest/runner": "2.2.0-beta.2", + "@vitest/snapshot": "2.2.0-beta.2", + "@vitest/spy": "2.2.0-beta.2", + "@vitest/utils": "2.2.0-beta.2", "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", + "restore-cursor": "^5.1.0", + "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", + "tinypool": "^1.0.2", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.4", + "vite-node": "2.2.0-beta.2", "why-is-node-running": "^2.3.0" }, "bin": { @@ -13788,8 +13856,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.4", - "@vitest/ui": "2.1.4", + "@vitest/browser": "2.2.0-beta.2", + "@vitest/ui": "2.2.0-beta.2", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index 3b140fa694..341060e96c 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.15.0", "@typescript-eslint/parser": "^8.15.0", - "@vitest/coverage-v8": "^2.0.5", + "@vitest/coverage-v8": "^2.2.0-beta.2", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -132,7 +132,7 @@ "typedoc-plugin-markdown": "^4.2.10", "typedoc-plugin-missing-exports": "^3.0.2", "typescript": "^5.6.3", - "vitest": "^2.0.0", + "vitest": "^2.2.0-beta.2", "vitest-webgl-canvas-mock": "^1.1.0" }, "scripts": { @@ -162,7 +162,7 @@ "lint-css": "stylelint **/*.css --fix -f verbose", "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-unit-ci": "vitest run --config vitest.config.unit.ts --coverage --outputFile=report.json --reporter=json", "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", From 45b2f5917ad034b76ff5527378762a9ab9823b3d Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 11:30:35 +0100 Subject: [PATCH 06/32] pass vitest cov file to ci --- .github/workflows/test-all.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index d8ff763547..64ccb08412 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -61,7 +61,7 @@ jobs: - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v5 with: - files: ${{ github.workspace }}/coverage/jest/codecov.json + files: ${{ github.workspace }}/coverage/vitest/unit/coverage-final.json verbose: true token: ${{ secrets.CODECOV_TOKEN }} disable_search: true diff --git a/package.json b/package.json index 341060e96c..62232815c2 100644 --- a/package.json +++ b/package.json @@ -162,7 +162,7 @@ "lint-css": "stylelint **/*.css --fix -f verbose", "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 --outputFile=report.json --reporter=json", + "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", From 45cd6313dd3d10f6d03aa35725f1c197f54c9aa9 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 11:42:04 +0100 Subject: [PATCH 07/32] pass integration test file too --- .github/workflows/test-all.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index 64ccb08412..fc4fee4d59 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -61,7 +61,7 @@ jobs: - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v5 with: - files: ${{ github.workspace }}/coverage/vitest/unit/coverage-final.json + files: ${{ github.workspace }}/coverage/vitest/unit/coverage-final.json,${{ github.workspace }}/coverage/vitest/integration/coverage-final.json verbose: true token: ${{ secrets.CODECOV_TOKEN }} disable_search: true From 5ef4940b5d7904561cdf8f22f3c4bebe5782c933 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 12:01:15 +0100 Subject: [PATCH 08/32] fix integration test --- .github/workflows/test-all.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index fc4fee4d59..63efbbb081 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -61,7 +61,7 @@ jobs: - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v5 with: - files: ${{ github.workspace }}/coverage/vitest/unit/coverage-final.json,${{ github.workspace }}/coverage/vitest/integration/coverage-final.json + files: ${{ github.workspace }}/coverage/vitest/unit/coverage-final.json verbose: true token: ${{ secrets.CODECOV_TOKEN }} disable_search: true @@ -92,7 +92,7 @@ jobs: if: '!cancelled()' uses: codecov/codecov-action@v5 with: - files: ${{ github.workspace }}/coverage/jest/codecov.json + files: ${{ github.workspace }}/coverage/vitest/integration/coverage-final.json verbose: true token: ${{ secrets.CODECOV_TOKEN }} disable_search: true From 11df5776a011a028f99c09a38a906650c82a3208 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 12:25:13 +0100 Subject: [PATCH 09/32] exclude .test.ts --- vitest.config.integration.ts | 2 +- vitest.config.unit.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vitest.config.integration.ts b/vitest.config.integration.ts index a9458997bc..ee24a7f27b 100644 --- a/vitest.config.integration.ts +++ b/vitest.config.integration.ts @@ -11,7 +11,7 @@ export default defineConfig({ coverage: { provider: 'v8', reporter: ['text', 'json', 'html'], - exclude: ['node_modules/', 'dist/'], + exclude: ['node_modules/', 'dist/', '**/*.test.ts'], all: true, include: ['src'], reportsDirectory: './coverage/vitest/integration', diff --git a/vitest.config.unit.ts b/vitest.config.unit.ts index 97f2dbbee1..4d11553c86 100644 --- a/vitest.config.unit.ts +++ b/vitest.config.unit.ts @@ -19,7 +19,7 @@ export default defineConfig({ coverage: { provider: 'v8', reporter: ['text', 'json', 'html'], - exclude: ['node_modules/', 'dist/'], + exclude: ['node_modules/', 'dist/', '**/*.test.ts'], all: true, include: ['src'], reportsDirectory: './coverage/vitest/unit', From c05f5680778fac159227e1899b59c9dbcf7ce2f7 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 12:25:36 +0100 Subject: [PATCH 10/32] exclude test.ts --- vitest.config.build.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vitest.config.build.ts b/vitest.config.build.ts index b01c0e0030..b907a47465 100644 --- a/vitest.config.build.ts +++ b/vitest.config.build.ts @@ -11,7 +11,7 @@ export default defineConfig({ coverage: { provider: 'v8', reporter: ['text', 'json', 'html'], - exclude: ['node_modules/', 'dist/'], + exclude: ['node_modules/', 'dist/', '**/*.test.ts'], all: true, include: ['src'], reportsDirectory: './coverage/vitest/build', From 9f147b36a835a6e540b9537637a85fb5d136d9bc Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 12:49:21 +0100 Subject: [PATCH 11/32] remove no-op text reporter --- vitest.config.build.ts | 2 +- vitest.config.integration.ts | 2 +- vitest.config.unit.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vitest.config.build.ts b/vitest.config.build.ts index b907a47465..78d1b8b60a 100644 --- a/vitest.config.build.ts +++ b/vitest.config.build.ts @@ -10,7 +10,7 @@ export default defineConfig({ ], coverage: { provider: 'v8', - reporter: ['text', 'json', 'html'], + reporter: ['json', 'html'], exclude: ['node_modules/', 'dist/', '**/*.test.ts'], all: true, include: ['src'], diff --git a/vitest.config.integration.ts b/vitest.config.integration.ts index ee24a7f27b..ae47597067 100644 --- a/vitest.config.integration.ts +++ b/vitest.config.integration.ts @@ -10,7 +10,7 @@ export default defineConfig({ ], coverage: { provider: 'v8', - reporter: ['text', 'json', 'html'], + reporter: ['json', 'html'], exclude: ['node_modules/', 'dist/', '**/*.test.ts'], all: true, include: ['src'], diff --git a/vitest.config.unit.ts b/vitest.config.unit.ts index 4d11553c86..497914a878 100644 --- a/vitest.config.unit.ts +++ b/vitest.config.unit.ts @@ -18,7 +18,7 @@ export default defineConfig({ ], coverage: { provider: 'v8', - reporter: ['text', 'json', 'html'], + reporter: ['json', 'html'], exclude: ['node_modules/', 'dist/', '**/*.test.ts'], all: true, include: ['src'], From cdde7c895b992c7b098849f969b8956696f90d77 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 13:43:51 +0100 Subject: [PATCH 12/32] add ui --- package-lock.json | 76 +++++++++++++++++++++++++++++++++++++++++++++-- package.json | 9 +++--- 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d0a8d021f1..52ce265fd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,8 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.15.0", "@typescript-eslint/parser": "^8.15.0", - "@vitest/coverage-v8": "^2.2.0-beta.2", + "@vitest/coverage-v8": "2.2.0-beta.2", + "@vitest/ui": "2.2.0-beta.2", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -124,7 +125,7 @@ "typedoc-plugin-markdown": "^4.2.10", "typedoc-plugin-missing-exports": "^3.0.2", "typescript": "^5.6.3", - "vitest": "^2.2.0-beta.2", + "vitest": "2.2.0-beta.2", "vitest-webgl-canvas-mock": "^1.1.0" }, "engines": { @@ -1924,6 +1925,13 @@ "node": ">=14" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true, + "license": "MIT" + }, "node_modules/@puppeteer/browsers": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz", @@ -3586,6 +3594,28 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/ui": { + "version": "2.2.0-beta.2", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.2.0-beta.2.tgz", + "integrity": "sha512-lFDKNLjGkVurGgHp+PUAmDXuLcEonaL+TkIdpQuimWWb9HDKllmSpLAsKzCMFVkKNqeTJqMx6HwasTI2HvSWPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.2.0-beta.2", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^3.0.0", + "tinyglobby": "^0.2.10", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.2.0-beta.2" + } + }, "node_modules/@vitest/utils": { "version": "2.2.0-beta.2", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.2.0-beta.2.tgz", @@ -7097,6 +7127,13 @@ } } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, + "license": "MIT" + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -9622,6 +9659,16 @@ "integrity": "sha512-v8W5hJLcWMIxLCcSi/MHh+VeefI+ycFmGz23Froer9QzWjrbg4J3gFJBuI/T1VLNoYxF47bVPPxq8ZlNX4gVCw==", "dev": true }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -11992,6 +12039,21 @@ "simple-concat": "^1.0.0" } }, + "node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/slash": { "version": "3.0.0", "dev": true, @@ -13239,6 +13301,16 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", diff --git a/package.json b/package.json index 62232815c2..f7134a24f0 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,8 @@ "@types/window-or-global": "^1.0.6", "@typescript-eslint/eslint-plugin": "^8.15.0", "@typescript-eslint/parser": "^8.15.0", - "@vitest/coverage-v8": "^2.2.0-beta.2", + "@vitest/coverage-v8": "2.2.0-beta.2", + "@vitest/ui": "2.2.0-beta.2", "address": "^2.0.3", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", @@ -132,7 +133,7 @@ "typedoc-plugin-markdown": "^4.2.10", "typedoc-plugin-missing-exports": "^3.0.2", "typescript": "^5.6.3", - "vitest": "^2.2.0-beta.2", + "vitest": "2.2.0-beta.2", "vitest-webgl-canvas-mock": "^1.1.0" }, "scripts": { @@ -163,9 +164,9 @@ "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": "vitest --ui --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": "vitest --ui --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", From 330622acaca3e0254db8a1d9b1a45ce547f8c743 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 13:44:15 +0100 Subject: [PATCH 13/32] vitest run --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f7134a24f0..c6912f20d6 100644 --- a/package.json +++ b/package.json @@ -164,9 +164,9 @@ "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 --ui --config vitest.config.integration.ts", + "test-integration": "vitest run --config vitest.config.integration.ts", "test-integration-ci": "vitest run --config vitest.config.integration.ts --coverage", - "test-build": "vitest --ui --config vitest.config.build.ts", + "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", From 7bc1f22c1fad587b9ffa261b76e52ad8600eb3c4 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 13:54:38 +0100 Subject: [PATCH 14/32] use mockinstance --- src/source/rtl_text_plugin_main_thread.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/source/rtl_text_plugin_main_thread.test.ts b/src/source/rtl_text_plugin_main_thread.test.ts index aa5eaec606..89a34e6563 100644 --- a/src/source/rtl_text_plugin_main_thread.test.ts +++ b/src/source/rtl_text_plugin_main_thread.test.ts @@ -1,4 +1,4 @@ -import {describe, beforeEach, it, afterEach, expect, vi} from 'vitest'; +import {describe, beforeEach, it, afterEach, expect, vi, type MockInstance} from 'vitest'; import {type FakeServer, fakeServer} from 'nise'; import {rtlMainThreadPluginFactory} from './rtl_text_plugin_main_thread'; import {sleep} from '../util/test/util'; @@ -10,7 +10,7 @@ const rtlMainThreadPlugin = rtlMainThreadPluginFactory(); describe('RTLMainThreadPlugin', () => { let server: FakeServer; - let broadcastSpy: ReturnType; + let broadcastSpy: MockInstance; const url = 'http://example.com/plugin'; const failedToLoadMessage = `RTL Text Plugin failed to import scripts from ${url}`; const SyncRTLPluginStateMessageName = MessageType.syncRTLPluginState; From 0dab41bd4e8ea553602c247fefa636e6ccbcfd46 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 13:56:17 +0100 Subject: [PATCH 15/32] use MockInstance --- src/style/style.test.ts | 4 ++-- src/ui/control/geolocate_control.test.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/style/style.test.ts b/src/style/style.test.ts index 0608a59a96..ab7ffc5849 100644 --- a/src/style/style.test.ts +++ b/src/style/style.test.ts @@ -1,4 +1,4 @@ -import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; +import {describe, beforeEach, afterEach, test, expect, vi, MockInstance} from 'vitest'; import {Style} from './style'; import {SourceCache} from '../source/source_cache'; import {StyleLayer} from './style_layer'; @@ -56,7 +56,7 @@ function createStyle(map = getStubMap()) { } let server: FakeServer; -let mockConsoleError: ReturnType; +let mockConsoleError: MockInstance; beforeEach(() => { global.fetch = null; diff --git a/src/ui/control/geolocate_control.test.ts b/src/ui/control/geolocate_control.test.ts index 6f9052ca82..634892ce39 100644 --- a/src/ui/control/geolocate_control.test.ts +++ b/src/ui/control/geolocate_control.test.ts @@ -1,4 +1,4 @@ -import {describe, beforeEach, afterEach, test, expect, vi} from 'vitest'; +import {describe, beforeEach, afterEach, test, expect, vi, MockInstance} from 'vitest'; import geolocation from 'mock-geolocation'; import {LngLatBounds} from '../../geo/lng_lat_bounds'; import {createMap, beforeMapTest, sleep} from '../../util/test/util'; @@ -31,7 +31,7 @@ describe('GeolocateControl with no options', () => { beforeEach(() => { beforeMapTest(); map = createMap(undefined, undefined); - (checkGeolocationSupport as any as ReturnType).mockImplementationOnce(() => Promise.resolve(true)); + (checkGeolocationSupport as unknown as MockInstance).mockImplementationOnce(() => Promise.resolve(true)); }); afterEach(() => { @@ -39,7 +39,7 @@ describe('GeolocateControl with no options', () => { }); test('is disabled when there is no support', async () => { - (checkGeolocationSupport as any as ReturnType).mockReset().mockImplementationOnce(() => Promise.resolve(false)); + (checkGeolocationSupport as unknown as MockInstance).mockReset().mockImplementationOnce(() => Promise.resolve(false)); const geolocate = new GeolocateControl(undefined); const spy = vi.spyOn(console, 'warn').mockImplementation(() => {}); map.addControl(geolocate); @@ -84,7 +84,7 @@ describe('GeolocateControl with no options', () => { }); test('does not throw if removed quickly', () => { - (checkGeolocationSupport as any as ReturnType).mockReset() + (checkGeolocationSupport as unknown as MockInstance).mockReset() .mockImplementationOnce(() => { return sleep(10); }); From 1702365b16f68b3955fafebd83b4a09c5efb8c79 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:04:51 +0100 Subject: [PATCH 16/32] cleanup --- src/util/actor.test.ts | 2 +- src/util/is_char_in_unicode_block.test.ts | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/util/actor.test.ts b/src/util/actor.test.ts index 4ae1ce6a50..c91111be1c 100644 --- a/src/util/actor.test.ts +++ b/src/util/actor.test.ts @@ -95,7 +95,7 @@ describe('Actor', () => { expect(gotAbortSignal).toBeTruthy(); }); - test('cancel a request that must be queued will not call the method at all', {retry: 3}, async () => { + test('cancel a request that must be queued will not call the method at all', async () => { const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget; const actor = new Actor(worker, '1'); diff --git a/src/util/is_char_in_unicode_block.test.ts b/src/util/is_char_in_unicode_block.test.ts index 88410c2022..c6777c1504 100644 --- a/src/util/is_char_in_unicode_block.test.ts +++ b/src/util/is_char_in_unicode_block.test.ts @@ -5,13 +5,11 @@ describe('unicodeBlockLookup', () => { test('each code block lookup function follows the same pattern', () => { for (const codeBlock in unicodeBlockLookup) { const lookup = unicodeBlockLookup[codeBlock]; - const lookupString = lookup.toString(); - console.log(`Checking code block: ${codeBlock}, function: ${lookupString}`); - const match = lookupString.match(/^\(char\) => char >= (\d+) && char <= (\d+)$/); + const match = lookup.toString().match(/^\(char\) => char >= (\d+) && char <= (\d+)$/); expect(match).not.toBeNull(); expect(match).toHaveLength(3); - const lower = parseInt(match[1], 10); - const upper = parseInt(match[2], 10); + const lower = Number.parseInt(match[1], 16); + const upper = Number.parseInt(match[2], 16); expect(upper).toBeGreaterThan(lower); } }); From 51b5a6192201e64e5aba232be58cfddd2e94bce7 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:06:25 +0100 Subject: [PATCH 17/32] revert web_worker --- src/util/web_worker_transfer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index 65ebfd3666..d3d2df0788 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]) console.warn(`${name} is already registered.`); + if (registry[name]) throw new Error(`${name} is already registered.`); ((Object.defineProperty as any))(klass, '_classRegistryKey', { value: name, writeable: false From 96d7c6779a61a2f7dd09b318bd35c31af5563ebb Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:21:58 +0100 Subject: [PATCH 18/32] import vitest first line --- src/data/bucket/fill_bucket.test.ts | 1 - src/data/feature_index.test.ts | 2 +- src/geo/projection/globe_covering_tiles.test.ts | 2 +- src/geo/projection/globe_transform.test.ts | 4 ++-- src/geo/projection/mercator_utils.test.ts | 2 +- src/render/fill_large_mesh_arrays.test.ts | 4 ++-- src/source/rtl_text_plugin_main_thread.test.ts | 2 +- src/style/style.test.ts | 2 +- src/ui/control/geolocate_control.test.ts | 2 +- src/ui/control/globe_control.test.ts | 2 +- src/ui/handler/tap_drag_zoom.test.ts | 2 +- src/ui/map_tests/map_resize.test.ts | 2 +- src/util/throttle.test.ts | 2 +- test/integration/query/query.test.ts | 3 +-- 14 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/data/bucket/fill_bucket.test.ts b/src/data/bucket/fill_bucket.test.ts index c46a6c8b8a..4d12b0447e 100644 --- a/src/data/bucket/fill_bucket.test.ts +++ b/src/data/bucket/fill_bucket.test.ts @@ -1,5 +1,4 @@ import {test, expect} from 'vitest'; - import fs from 'fs'; import path from 'path'; import Protobuf from 'pbf'; diff --git a/src/data/feature_index.test.ts b/src/data/feature_index.test.ts index 9bc01e50bb..c566dd53a3 100644 --- a/src/data/feature_index.test.ts +++ b/src/data/feature_index.test.ts @@ -1,7 +1,7 @@ +import {describe, expect, test} from 'vitest'; import {FeatureIndex} from './feature_index'; import {OverscaledTileID} from '../source/tile_id'; import type {VectorTileFeature} from '@mapbox/vector-tile'; -import {describe, expect, test} from 'vitest'; describe('FeatureIndex', () => { describe('getId', () => { diff --git a/src/geo/projection/globe_covering_tiles.test.ts b/src/geo/projection/globe_covering_tiles.test.ts index 3c977d4cea..62155ff748 100644 --- a/src/geo/projection/globe_covering_tiles.test.ts +++ b/src/geo/projection/globe_covering_tiles.test.ts @@ -1,5 +1,5 @@ -import {Aabb} from '../../util/primitives/aabb'; import {describe, expect, test} from 'vitest'; +import {Aabb} from '../../util/primitives/aabb'; import {expectToBeCloseToArray} from '../../util/test/util'; import {GlobeCoveringTilesDetailsProvider} from './globe_covering_tiles_details_provider'; diff --git a/src/geo/projection/globe_transform.test.ts b/src/geo/projection/globe_transform.test.ts index b66e347f64..76edeeb8af 100644 --- a/src/geo/projection/globe_transform.test.ts +++ b/src/geo/projection/globe_transform.test.ts @@ -1,4 +1,5 @@ -import {globeConstants, type GlobeProjection} from './globe'; +import {describe, expect, test} from 'vitest'; +import {globeConstants, GlobeProjection} from './globe'; import {EXTENT} from '../../data/extent'; import Point from '@mapbox/point-geometry'; import {LngLat} from '../lng_lat'; @@ -9,7 +10,6 @@ import {expectToBeCloseToArray, getGlobeProjectionMock, sleep} from '../../util/ import {MercatorCoordinate} from '../mercator_coordinate'; import {tileCoordinatesToLocation} from './mercator_utils'; import {coveringTiles} from './covering_tiles'; -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/mercator_utils.test.ts b/src/geo/projection/mercator_utils.test.ts index 3aeb1db689..61dfe9e8b6 100644 --- a/src/geo/projection/mercator_utils.test.ts +++ b/src/geo/projection/mercator_utils.test.ts @@ -1,3 +1,4 @@ +import {describe, expect, test} from 'vitest'; import Point from '@mapbox/point-geometry'; import {LngLat} from '../lng_lat'; import {getBasicProjectionData, getMercatorHorizon, locationToMercatorCoordinate, projectToWorldCoordinates, tileCoordinatesToLocation, tileCoordinatesToMercatorCoordinates} from './mercator_utils'; @@ -8,7 +9,6 @@ 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/render/fill_large_mesh_arrays.test.ts b/src/render/fill_large_mesh_arrays.test.ts index 4d9c930a32..af131461bf 100644 --- a/src/render/fill_large_mesh_arrays.test.ts +++ b/src/render/fill_large_mesh_arrays.test.ts @@ -1,8 +1,8 @@ +import {describe, expect, test} from 'vitest'; import {FillLayoutArray, LineIndexArray, TriangleIndexArray} from '../data/array_types.g'; import {SegmentVector} from '../data/segment'; import {fillLargeMeshArrays} from './fill_large_mesh_arrays'; -import {type SimpleMesh, getGridMesh, getGridMeshRandom} from '../../test/unit/lib/mesh_utils'; -import {describe, expect, test} from 'vitest'; +import {SimpleMesh, getGridMesh, getGridMeshRandom} from '../../test/unit/lib/mesh_utils'; describe('fillArrays', () => { test('Mesh comparison works', () => { diff --git a/src/source/rtl_text_plugin_main_thread.test.ts b/src/source/rtl_text_plugin_main_thread.test.ts index 89a34e6563..7f1d337ff5 100644 --- a/src/source/rtl_text_plugin_main_thread.test.ts +++ b/src/source/rtl_text_plugin_main_thread.test.ts @@ -1,5 +1,5 @@ import {describe, beforeEach, it, afterEach, expect, vi, type MockInstance} from 'vitest'; -import {type FakeServer, fakeServer} from 'nise'; +import {FakeServer, fakeServer} from 'nise'; import {rtlMainThreadPluginFactory} from './rtl_text_plugin_main_thread'; import {sleep} from '../util/test/util'; import {browser} from '../util/browser'; diff --git a/src/style/style.test.ts b/src/style/style.test.ts index ab7ffc5849..9a2329f602 100644 --- a/src/style/style.test.ts +++ b/src/style/style.test.ts @@ -1,4 +1,4 @@ -import {describe, beforeEach, afterEach, test, expect, vi, MockInstance} from 'vitest'; +import {describe, beforeEach, afterEach, test, expect, vi, type MockInstance} from 'vitest'; import {Style} from './style'; import {SourceCache} from '../source/source_cache'; import {StyleLayer} from './style_layer'; diff --git a/src/ui/control/geolocate_control.test.ts b/src/ui/control/geolocate_control.test.ts index 634892ce39..176adb21f2 100644 --- a/src/ui/control/geolocate_control.test.ts +++ b/src/ui/control/geolocate_control.test.ts @@ -1,4 +1,4 @@ -import {describe, beforeEach, afterEach, test, expect, vi, MockInstance} from 'vitest'; +import {describe, beforeEach, afterEach, test, expect, vi, type MockInstance} from 'vitest'; import geolocation from 'mock-geolocation'; import {LngLatBounds} from '../../geo/lng_lat_bounds'; import {createMap, beforeMapTest, sleep} from '../../util/test/util'; diff --git a/src/ui/control/globe_control.test.ts b/src/ui/control/globe_control.test.ts index 2f532b1b6b..9d974a70c7 100644 --- a/src/ui/control/globe_control.test.ts +++ b/src/ui/control/globe_control.test.ts @@ -1,6 +1,6 @@ +import {afterEach, beforeEach, describe, expect, test} from 'vitest'; import {GlobeControl} from './globe_control'; import {createMap as globalCreateMap, beforeMapTest} from '../../util/test/util'; -import {afterEach, beforeEach, describe, expect, test} from 'vitest'; function createMap() { return globalCreateMap({ diff --git a/src/ui/handler/tap_drag_zoom.test.ts b/src/ui/handler/tap_drag_zoom.test.ts index fba4af0409..58938b37fe 100644 --- a/src/ui/handler/tap_drag_zoom.test.ts +++ b/src/ui/handler/tap_drag_zoom.test.ts @@ -1,6 +1,6 @@ -import {beforeMapTest, sleep} from '../../util/test/util'; import {describe, beforeEach, test, expect, vi} from 'vitest'; +import {beforeMapTest, sleep} from '../../util/test/util'; import simulate from '../../../test/unit/lib/simulate_interaction'; import {Map, type MapOptions} from '../map'; diff --git a/src/ui/map_tests/map_resize.test.ts b/src/ui/map_tests/map_resize.test.ts index 0604ef2877..29f89bf09b 100644 --- a/src/ui/map_tests/map_resize.test.ts +++ b/src/ui/map_tests/map_resize.test.ts @@ -1,5 +1,5 @@ -import {MercatorProjection} from '../../geo/projection/mercator'; import {describe, beforeEach, test, expect, vi} from 'vitest'; +import {MercatorProjection} from '../../geo/projection/mercator'; import {createMap, beforeMapTest, sleep} from '../../util/test/util'; beforeEach(() => { diff --git a/src/util/throttle.test.ts b/src/util/throttle.test.ts index c0a4276b54..1be186fac0 100644 --- a/src/util/throttle.test.ts +++ b/src/util/throttle.test.ts @@ -1,5 +1,5 @@ -import {sleep} from './test/util'; import {describe, test, expect} from 'vitest'; +import {sleep} from './test/util'; import {throttle} from './throttle'; describe('throttle', () => { diff --git a/test/integration/query/query.test.ts b/test/integration/query/query.test.ts index 6467fe4b1a..df8bf76858 100644 --- a/test/integration/query/query.test.ts +++ b/test/integration/query/query.test.ts @@ -1,6 +1,5 @@ import {describe, beforeEach, beforeAll, afterEach, afterAll, test, expect} from 'vitest'; - -import puppeteer, {type Page, type Browser} from 'puppeteer'; +import puppeteer, {Page, Browser} from 'puppeteer'; import {deepEqual} from '../lib/json-diff'; import st from 'st'; From 674ee44701e5b68fecd9802d24ab922a2146e21e Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:26:11 +0100 Subject: [PATCH 19/32] only register SymbolBuffers if it isn't already --- src/data/bucket/symbol_bucket.ts | 6 ++++-- src/util/web_worker_transfer.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/data/bucket/symbol_bucket.ts b/src/data/bucket/symbol_bucket.ts index b9eb8b319b..488a580b9e 100644 --- a/src/data/bucket/symbol_bucket.ts +++ b/src/data/bucket/symbol_bucket.ts @@ -33,7 +33,7 @@ import {verticalizedCharacterMap} from '../../util/verticalize_punctuation'; import {type Anchor} from '../../symbol/anchor'; import {getSizeData, MAX_PACKED_SIZE} from '../../symbol/symbol_size'; -import {register} from '../../util/web_worker_transfer'; +import {isRegistered, register} from '../../util/web_worker_transfer'; import {EvaluationParameters} from '../../style/evaluation_parameters'; import {Formatted, ResolvedImage} from '@maplibre/maplibre-gl-style-spec'; import {rtlWorkerPlugin} from '../../source/rtl_text_plugin_worker'; @@ -229,7 +229,9 @@ export class SymbolBuffers { } } -register('SymbolBuffers', SymbolBuffers); +if (!isRegistered(SymbolBuffers)){ + register('SymbolBuffers', SymbolBuffers); +} class CollisionBuffers { layoutVertexArray: StructArray; diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index d3d2df0788..26edfaa65f 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -97,7 +97,7 @@ function getClassRegistryKey(input: Object|SerializedObject): string { return (input as SerializedObject).$name || klass._classRegistryKey; } -function isRegistered(input: unknown): boolean { +export function isRegistered(input: unknown): boolean { if (input === null || typeof input !== 'object') { return false; } From 440652ac7bc61d01ca44d5ad4558f1a116e4df3f Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:29:20 +0100 Subject: [PATCH 20/32] cleanup vitest import --- src/render/program/terrain_program.test.ts | 2 +- src/render/subdivision.test.ts | 2 +- src/style/sky.test.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/render/program/terrain_program.test.ts b/src/render/program/terrain_program.test.ts index 3610cc4eac..dc6ff7fff8 100644 --- a/src/render/program/terrain_program.test.ts +++ b/src/render/program/terrain_program.test.ts @@ -1,7 +1,7 @@ +import {describe, expect, test} from 'vitest'; import {terrainUniformValues} from './terrain_program'; import {Sky} from '../../style/sky'; import {mat4} from 'gl-matrix'; -import {describe, expect, test} from 'vitest'; describe('terrainUniformValues', () => { test('disables fog when in globe projection mode', () => { diff --git a/src/render/subdivision.test.ts b/src/render/subdivision.test.ts index a23057d9f5..81d27c4461 100644 --- a/src/render/subdivision.test.ts +++ b/src/render/subdivision.test.ts @@ -1,8 +1,8 @@ +import {describe, expect, test} from 'vitest'; 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/style/sky.test.ts b/src/style/sky.test.ts index 607bc83604..6bf3fbde42 100644 --- a/src/style/sky.test.ts +++ b/src/style/sky.test.ts @@ -1,8 +1,8 @@ -import {Sky} from './sky'; -import {latest as styleSpec, type SkySpecification} from '@maplibre/maplibre-gl-style-spec'; -import {type EvaluationParameters} from './evaluation_parameters'; -import {type TransitionParameters} from './properties'; import {describe, expect, test, vi} from 'vitest'; +import {Sky} from './sky'; +import {latest as styleSpec, SkySpecification} from '@maplibre/maplibre-gl-style-spec'; +import {EvaluationParameters} from './evaluation_parameters'; +import {TransitionParameters} from './properties'; const spec = styleSpec.sky; From ee7eef92f1ff356b1b5fa0211e0b3d68c206768a Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:36:02 +0100 Subject: [PATCH 21/32] brush up readme --- test/README.md | 21 +++++---------------- test/integration/README.md | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/test/README.md b/test/README.md index 5180aa16f0..cac682f09f 100644 --- a/test/README.md +++ b/test/README.md @@ -19,29 +19,18 @@ The render tests rely on the dev-build of the project, and they will not pass un To run specific tests: - - Unit test by file name : `npx jest path/to/file.test.ts --reporters=default` (e.g. `npx jest src/style/style_layer.test.ts`) - - Unit test that matches a test name: `npx jest path/to/file.test.ts --reporters=default -t "test name"` - - Browser test that matches a test name: `npx jest test/integration/browser/browser.test.ts --reporters=default -t "test name"`, in some cases here you might want to change the headless mode in the test file to be `false` to see what's happening in the browser. + - Unit test by file name : `npm run test-unit -- draw_symbol.test.ts` + - Integration test by file name : `npm run test-integration -- browser` + want to change the headless mode in the test file to be `false` to see what's happening in the browser. - Render tests that matches a folder or file names: `npm run test-render -- render-test-name` (e.g. `npm run test-render -- text-rotation-alignment`) To run folders in watch mode, meaning they will run continuously as you make changes to relevant code, (i.e. for test driven development): use `npm run test-watch-roots *folder1* [*folder2*...]` (e.g. `npm run test-watch-roots ./src/ui/control`) ## Debugging Tests in VSCode -Steps to use Visual Studio Code: +You may run tests and view output with the plugin Vitest for VSCode, see: +https://marketplace.visualstudio.com/items?itemName=vitest.explorer - - Install VS Code. - - Open MapLibre root folder with VS Code UI. - - Start debugging: - - ![Start debugging](assets/docs/debug_test_in_vscode.png) - Before debugging, you might want to set break points in sources. - -You may also run tests and view output with the plugin [orta.vscode-jest](https://marketplace.visualstudio.com/items?itemName=Orta.vscode-jest): - -![VScode screenshots](assets/docs/vscode-jest.png) - -If you do so, note that the initial test run may take a while (3 minutes or so), during which time the test results are not yet available. ## Integration Tests diff --git a/test/integration/README.md b/test/integration/README.md index ee0231aaa4..69498f40e9 100644 --- a/test/integration/README.md +++ b/test/integration/README.md @@ -48,13 +48,19 @@ To run the build tests npm run test-build ``` -For running a subset of tests, you may use jest filters e.g. +For running a subset of tests, you may use vitest filters e.g. ``` -npm run test-integration -- --testPathIgnorePatterns "/test/integration/(query|build)/" +npm run test-integration -- browser +``` + +Additionally, it may be helpful to use a visual frontend ([Vitest UI](https://vitest.dev/guide/ui.html)). Note that since render tests do not use Vitest, these will still have to be run from the command line. The UI can be started by replaceing `run` with `--ui` in package.json: + +```diff +- "test-unit": "vitest run --config vitest.config.unit.ts", ++ "test-unit": "vitest --ui --config vitest.config.unit.ts", ``` -Additionally, it may be helpful to use a visual jest frontend (e.g. `npx majestic`). Note that since render tests do not use Jest, these will still have to be run from the command line. ### Running specific tests @@ -133,11 +139,7 @@ $env:UPDATE=$true; npm run test-render #### Notes on the query integration tests -In test/integration/lib/query-browser-jest.test.ts a web server is automatically started to expose static assets from the integration folder. In order to start a similar server manually, run: - -``` -npx st -l --port 7357 -d test/integration -co -``` +In test/integration/browser/browser.test.ts a web server is automatically started to expose static assets from the integration folder. In order to start a similar server manually with `npm run start`. We currently run each test in a new tab. Alternatively we might gain some speed by clearing the webgl context instead, and running everything in one tab. From 281f8d3b7b1f4d567d19b564f1db334ebb300caa Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:38:25 +0100 Subject: [PATCH 22/32] remove vscode extension section --- test/README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/README.md b/test/README.md index cac682f09f..06814064e4 100644 --- a/test/README.md +++ b/test/README.md @@ -26,12 +26,6 @@ To run specific tests: To run folders in watch mode, meaning they will run continuously as you make changes to relevant code, (i.e. for test driven development): use `npm run test-watch-roots *folder1* [*folder2*...]` (e.g. `npm run test-watch-roots ./src/ui/control`) -## Debugging Tests in VSCode - -You may run tests and view output with the plugin Vitest for VSCode, see: -https://marketplace.visualstudio.com/items?itemName=vitest.explorer - - ## Integration Tests See [`test/integration/README.md`](./integration/README.md). From a6730704eeaef3dbf933939bdedd362823d52ad0 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:48:53 +0100 Subject: [PATCH 23/32] return if registerede --- src/data/bucket/symbol_bucket.ts | 6 ++---- src/util/web_worker_transfer.ts | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/data/bucket/symbol_bucket.ts b/src/data/bucket/symbol_bucket.ts index 488a580b9e..ece3ed83ed 100644 --- a/src/data/bucket/symbol_bucket.ts +++ b/src/data/bucket/symbol_bucket.ts @@ -33,7 +33,7 @@ import {verticalizedCharacterMap} from '../../util/verticalize_punctuation'; import {type Anchor} from '../../symbol/anchor'; import {getSizeData, MAX_PACKED_SIZE} from '../../symbol/symbol_size'; -import {isRegistered, register} from '../../util/web_worker_transfer'; +import {register, registry} from '../../util/web_worker_transfer'; import {EvaluationParameters} from '../../style/evaluation_parameters'; import {Formatted, ResolvedImage} from '@maplibre/maplibre-gl-style-spec'; import {rtlWorkerPlugin} from '../../source/rtl_text_plugin_worker'; @@ -229,9 +229,7 @@ export class SymbolBuffers { } } -if (!isRegistered(SymbolBuffers)){ - register('SymbolBuffers', SymbolBuffers); -} +register('SymbolBuffers', SymbolBuffers); class CollisionBuffers { layoutVertexArray: StructArray; diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index 26edfaa65f..cdd3b9d3c0 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -42,7 +42,7 @@ type RegisterOptions = { shallow?: ReadonlyArray; }; -const registry: Registry = {}; +export const registry: Registry = {}; /** * Register the given class as serializable. @@ -56,7 +56,7 @@ export function register( }, options: RegisterOptions = {} ) { - if (registry[name]) throw new Error(`${name} is already registered.`); + if (registry[name]) return; ((Object.defineProperty as any))(klass, '_classRegistryKey', { value: name, writeable: false @@ -97,7 +97,7 @@ function getClassRegistryKey(input: Object|SerializedObject): string { return (input as SerializedObject).$name || klass._classRegistryKey; } -export function isRegistered(input: unknown): boolean { +function isRegistered(input: unknown): boolean { if (input === null || typeof input !== 'object') { return false; } From f9056d73743bde03f79c9de00ab495d3bceaa8b1 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:49:49 +0100 Subject: [PATCH 24/32] warn about re-registration and return --- src/util/web_worker_transfer.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index cdd3b9d3c0..dc0564445d 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -56,7 +56,10 @@ export function register( }, options: RegisterOptions = {} ) { - if (registry[name]) return; + if (registry[name]) { + console.warn(`Class ${name} is already registered.`); + return; + } ((Object.defineProperty as any))(klass, '_classRegistryKey', { value: name, writeable: false From 176240ff070087cb5239ebcf9cb4c21d9a0b24d8 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:50:05 +0100 Subject: [PATCH 25/32] warn about re-registration --- src/util/web_worker_transfer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index dc0564445d..50c275ebfa 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -57,7 +57,7 @@ export function register( options: RegisterOptions = {} ) { if (registry[name]) { - console.warn(`Class ${name} is already registered.`); + console.warn(`${name} is already registered.`); return; } ((Object.defineProperty as any))(klass, '_classRegistryKey', { From 173f0c783c6a93167f30b7687aceb88e4f9562f4 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:50:38 +0100 Subject: [PATCH 26/32] don't export registry --- src/util/web_worker_transfer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index 50c275ebfa..7d800b1afb 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -42,7 +42,7 @@ type RegisterOptions = { shallow?: ReadonlyArray; }; -export const registry: Registry = {}; +const registry: Registry = {}; /** * Register the given class as serializable. From aec2f7e20d71bd7a8366b8cd5c6a3904b5f5087a Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 14:57:08 +0100 Subject: [PATCH 27/32] don't import registry --- src/data/bucket/symbol_bucket.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/bucket/symbol_bucket.ts b/src/data/bucket/symbol_bucket.ts index ece3ed83ed..b9eb8b319b 100644 --- a/src/data/bucket/symbol_bucket.ts +++ b/src/data/bucket/symbol_bucket.ts @@ -33,7 +33,7 @@ import {verticalizedCharacterMap} from '../../util/verticalize_punctuation'; import {type Anchor} from '../../symbol/anchor'; import {getSizeData, MAX_PACKED_SIZE} from '../../symbol/symbol_size'; -import {register, registry} from '../../util/web_worker_transfer'; +import {register} from '../../util/web_worker_transfer'; import {EvaluationParameters} from '../../style/evaluation_parameters'; import {Formatted, ResolvedImage} from '@maplibre/maplibre-gl-style-spec'; import {rtlWorkerPlugin} from '../../source/rtl_text_plugin_worker'; From c5cbcd8eb85b46df5995d7b443683ec100527704 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 19:19:55 +0100 Subject: [PATCH 28/32] mock symbol bucket --- src/render/draw_symbol.test.ts | 8 +++++++- src/util/web_worker_transfer.ts | 3 +-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/render/draw_symbol.test.ts b/src/render/draw_symbol.test.ts index 491946575e..e748431b1a 100644 --- a/src/render/draw_symbol.test.ts +++ b/src/render/draw_symbol.test.ts @@ -22,7 +22,13 @@ vi.mock('./painter'); vi.mock('./program'); vi.mock('../source/source_cache'); vi.mock('../source/tile'); -vi.mock('../data/bucket/symbol_bucket'); +vi.mock('../data/bucket/symbol_bucket', () => { + return { + SymbolBucket: vi.fn(), + SymbolBuffers: vi.fn() + }; +}); + vi.mock('../symbol/projection'); (symbolProjection.getPitchedLabelPlaneMatrix as Mock).mockReturnValue(mat4.create()); diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index 7d800b1afb..1ee9a5dae1 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -57,8 +57,7 @@ export function register( options: RegisterOptions = {} ) { if (registry[name]) { - console.warn(`${name} is already registered.`); - return; + throw new Error(`${name} is already registered.`); } ((Object.defineProperty as any))(klass, '_classRegistryKey', { value: name, From fec4f693b91960e58358fb924aee411f4f7e0f12 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 19:21:50 +0100 Subject: [PATCH 29/32] one line error --- src/util/web_worker_transfer.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index 1ee9a5dae1..d3d2df0788 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -56,9 +56,7 @@ export function register( }, options: RegisterOptions = {} ) { - if (registry[name]) { - throw new Error(`${name} is already registered.`); - } + if (registry[name]) throw new Error(`${name} is already registered.`); ((Object.defineProperty as any))(klass, '_classRegistryKey', { value: name, writeable: false From 391813de3fd5d780ff2a0a75cb0d450b75a652b9 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 19:24:52 +0100 Subject: [PATCH 30/32] SymbolBucket mock --- src/render/draw_symbol.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/render/draw_symbol.test.ts b/src/render/draw_symbol.test.ts index e748431b1a..01ece88030 100644 --- a/src/render/draw_symbol.test.ts +++ b/src/render/draw_symbol.test.ts @@ -24,8 +24,7 @@ vi.mock('../source/source_cache'); vi.mock('../source/tile'); vi.mock('../data/bucket/symbol_bucket', () => { return { - SymbolBucket: vi.fn(), - SymbolBuffers: vi.fn() + SymbolBucket: vi.fn() }; }); From e86a411b578396b43db314f8ba6b09fa747244c9 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 20:15:00 +0100 Subject: [PATCH 31/32] mock symbol bucket other places --- src/render/draw_custom.test.ts | 6 +++++- src/render/draw_fill.test.ts | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/render/draw_custom.test.ts b/src/render/draw_custom.test.ts index 40690c2e6e..79fffa0574 100644 --- a/src/render/draw_custom.test.ts +++ b/src/render/draw_custom.test.ts @@ -13,7 +13,11 @@ vi.mock('./painter'); vi.mock('./program'); vi.mock('../source/source_cache'); vi.mock('../source/tile'); -vi.mock('../data/bucket/symbol_bucket'); +vi.mock('../data/bucket/symbol_bucket', () => { + return { + SymbolBucket: vi.fn() + }; +}); vi.mock('../symbol/projection'); describe('drawCustom', () => { diff --git a/src/render/draw_fill.test.ts b/src/render/draw_fill.test.ts index cddfff80dd..e7fbe5fd33 100644 --- a/src/render/draw_fill.test.ts +++ b/src/render/draw_fill.test.ts @@ -21,7 +21,12 @@ vi.mock('./painter'); vi.mock('./program'); vi.mock('../source/source_cache'); vi.mock('../source/tile'); -vi.mock('../data/bucket/symbol_bucket'); + +vi.mock('../data/bucket/symbol_bucket', () => { + return { + SymbolBucket: vi.fn() + }; +}); vi.mock('../symbol/projection'); describe('drawFill', () => { From e4b0e4850eb39a9588e9ab792df0c64223f6e512 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 22 Nov 2024 22:40:37 +0100 Subject: [PATCH 32/32] lint --- src/geo/projection/globe_transform.test.ts | 2 +- src/render/fill_large_mesh_arrays.test.ts | 2 +- src/source/rtl_text_plugin_main_thread.test.ts | 2 +- src/style/sky.test.ts | 6 +++--- test/integration/query/query.test.ts | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/geo/projection/globe_transform.test.ts b/src/geo/projection/globe_transform.test.ts index 76edeeb8af..0062396ca1 100644 --- a/src/geo/projection/globe_transform.test.ts +++ b/src/geo/projection/globe_transform.test.ts @@ -1,5 +1,5 @@ import {describe, expect, test} from 'vitest'; -import {globeConstants, GlobeProjection} from './globe'; +import {globeConstants, type GlobeProjection} from './globe'; import {EXTENT} from '../../data/extent'; import Point from '@mapbox/point-geometry'; import {LngLat} from '../lng_lat'; diff --git a/src/render/fill_large_mesh_arrays.test.ts b/src/render/fill_large_mesh_arrays.test.ts index af131461bf..adb5df1d29 100644 --- a/src/render/fill_large_mesh_arrays.test.ts +++ b/src/render/fill_large_mesh_arrays.test.ts @@ -2,7 +2,7 @@ import {describe, expect, test} from 'vitest'; import {FillLayoutArray, LineIndexArray, TriangleIndexArray} from '../data/array_types.g'; import {SegmentVector} from '../data/segment'; import {fillLargeMeshArrays} from './fill_large_mesh_arrays'; -import {SimpleMesh, getGridMesh, getGridMeshRandom} from '../../test/unit/lib/mesh_utils'; +import {type SimpleMesh, getGridMesh, getGridMeshRandom} from '../../test/unit/lib/mesh_utils'; describe('fillArrays', () => { test('Mesh comparison works', () => { diff --git a/src/source/rtl_text_plugin_main_thread.test.ts b/src/source/rtl_text_plugin_main_thread.test.ts index 7f1d337ff5..89a34e6563 100644 --- a/src/source/rtl_text_plugin_main_thread.test.ts +++ b/src/source/rtl_text_plugin_main_thread.test.ts @@ -1,5 +1,5 @@ import {describe, beforeEach, it, afterEach, expect, vi, type MockInstance} from 'vitest'; -import {FakeServer, fakeServer} from 'nise'; +import {type FakeServer, fakeServer} from 'nise'; import {rtlMainThreadPluginFactory} from './rtl_text_plugin_main_thread'; import {sleep} from '../util/test/util'; import {browser} from '../util/browser'; diff --git a/src/style/sky.test.ts b/src/style/sky.test.ts index 6bf3fbde42..f6f4c23680 100644 --- a/src/style/sky.test.ts +++ b/src/style/sky.test.ts @@ -1,8 +1,8 @@ import {describe, expect, test, vi} from 'vitest'; 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 {latest as styleSpec, type SkySpecification} from '@maplibre/maplibre-gl-style-spec'; +import {type EvaluationParameters} from './evaluation_parameters'; +import {type TransitionParameters} from './properties'; const spec = styleSpec.sky; diff --git a/test/integration/query/query.test.ts b/test/integration/query/query.test.ts index df8bf76858..5e8e0de43d 100644 --- a/test/integration/query/query.test.ts +++ b/test/integration/query/query.test.ts @@ -1,5 +1,5 @@ import {describe, beforeEach, beforeAll, afterEach, afterAll, test, expect} from 'vitest'; -import puppeteer, {Page, Browser} from 'puppeteer'; +import puppeteer, {type Page, type Browser} from 'puppeteer'; import {deepEqual} from '../lib/json-diff'; import st from 'st';