From e15cd8b540fa9fe83b0e9b9e38aea73dc4fe76e1 Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Tue, 3 Mar 2026 20:13:19 -0800 Subject: [PATCH 01/10] feat(test-utils): Add vitest entry point with tape backward compat - Add @deck.gl/test-utils/vitest entry point with vi.spyOn as default spy factory - Add @deck.gl/test-utils/tape entry point with probe.gl makeSpy default (with deprecation warning) - Extract SpyFactory abstraction in lifecycle-test.ts for spy provider flexibility - Add tape-compat and vitest-entry smoke tests to verify both paths work - Update package.json exports to support both entry points - Add vitest 4.0.18 as optional peer dependency Co-Authored-By: Claude Opus 4.5 --- .ocularrc.js | 3 +- modules/test-utils/package.json | 13 +- modules/test-utils/src/globals.d.ts | 42 + modules/test-utils/src/lifecycle-test.ts | 214 ++-- modules/test-utils/src/tape.ts | 56 ++ modules/test-utils/src/vitest.ts | 38 + package.json | 5 +- test/smoke/tape-compat.ts | 35 + test/smoke/vitest-entry.spec.ts | 51 + vitest.config.ts | 22 + yarn.lock | 1127 +++++++++++++++------- 11 files changed, 1115 insertions(+), 491 deletions(-) create mode 100644 modules/test-utils/src/globals.d.ts create mode 100644 modules/test-utils/src/tape.ts create mode 100644 modules/test-utils/src/vitest.ts create mode 100644 test/smoke/tape-compat.ts create mode 100644 test/smoke/vitest-entry.spec.ts create mode 100644 vitest.config.ts diff --git a/.ocularrc.js b/.ocularrc.js index b21f7550479..f0a6829d5ce 100644 --- a/.ocularrc.js +++ b/.ocularrc.js @@ -53,7 +53,8 @@ const config = { 'test-browser': 'index.html', bench: 'test/bench/index.js', 'bench-browser': 'test/bench/browser.html', - size: 'test/size/import-nothing.js' + size: 'test/size/import-nothing.js', + 'tape-compat': 'test/smoke/tape-compat.ts' } }; diff --git a/modules/test-utils/package.json b/modules/test-utils/package.json index db2554d05e0..8f1e7d9f25f 100644 --- a/modules/test-utils/package.json +++ b/modules/test-utils/package.json @@ -25,6 +25,11 @@ "types": "./dist/index.d.ts", "import": "./dist/index.js", "require": "./dist/index.cjs" + }, + "./vitest": { + "types": "./dist/vitest.d.ts", + "import": "./dist/vitest.js", + "require": "./dist/vitest.cjs" } }, "files": [ @@ -39,7 +44,13 @@ "@deck.gl/core": "~9.2.0", "@luma.gl/core": "~9.3.0-alpha.2", "@luma.gl/engine": "~9.3.0-alpha.2", - "@probe.gl/test-utils": "^4.1.1" + "@probe.gl/test-utils": "^4.1.1", + "vitest": "^4.0.18" + }, + "peerDependenciesMeta": { + "vitest": { + "optional": true + } }, "gitHead": "13ace64fc2cee08c133afc882fc307253489a4e4" } diff --git a/modules/test-utils/src/globals.d.ts b/modules/test-utils/src/globals.d.ts new file mode 100644 index 00000000000..111dfc79480 --- /dev/null +++ b/modules/test-utils/src/globals.d.ts @@ -0,0 +1,42 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +// Type declarations for browser test driver functions injected by @probe.gl/test-utils + +interface BrowserTestDriverDiffOptions { + goldenImage: string; + region?: {x: number; y: number; width: number; height: number}; + saveOnFail?: boolean; + saveAs?: string; + threshold?: number; + createDiffImage?: boolean; + tolerance?: number; + includeAA?: boolean; + includeEmpty?: boolean; + platform?: string; +} + +interface BrowserTestDriverDiffResult { + headless: boolean; + match: string | number; + matchPercentage: string; + success: boolean; + error: Error | string | null; +} + +interface BrowserTestDriverInputEvent { + type: string; + [key: string]: any; +} + +declare global { + interface Window { + browserTestDriver_emulateInput(event: BrowserTestDriverInputEvent): Promise; + browserTestDriver_captureAndDiffScreen( + options: BrowserTestDriverDiffOptions + ): Promise; + } +} + +export {}; diff --git a/modules/test-utils/src/lifecycle-test.ts b/modules/test-utils/src/lifecycle-test.ts index cfc73bc6c83..3d79ba914d8 100644 --- a/modules/test-utils/src/lifecycle-test.ts +++ b/modules/test-utils/src/lifecycle-test.ts @@ -3,14 +3,30 @@ // Copyright (c) vis.gl contributors import {LayerManager, MapView, DeckRenderer} from '@deck.gl/core'; - -import {makeSpy} from '@probe.gl/test-utils'; import {device} from './utils/setup-gl'; import type {Layer, CompositeLayer, Viewport} from '@deck.gl/core'; import type {Timeline} from '@luma.gl/engine'; import type {StatsManager} from '@luma.gl/core'; +// Spy abstraction - supports both vitest and probe.gl spy implementations +type Spy = { + mockRestore?: () => void; // vitest + restore?: () => void; // probe.gl + mock?: {calls: any[][]}; // vitest + calls?: any[][]; // probe.gl +}; + +export type SpyFactory = (obj: object, method: string) => Spy; + +function restoreSpy(spy: Spy): void { + if (spy.mockRestore) { + spy.mockRestore(); + } else if (spy.restore) { + spy.restore(); + } +} + const testViewport = new MapView({}).makeViewport({ width: 100, height: 100, @@ -24,13 +40,8 @@ function defaultOnError(error: unknown, title: string): void { } type InitializeLayerTestOptions = { - /** The layer instance to test */ layer: Layer; - /** The initial viewport - * @default WebMercatorViewport - */ viewport?: Viewport; - /** Callback if any error is thrown */ onError?: (error: unknown, title: string) => void; }; @@ -43,94 +54,46 @@ function initializeLayerManager({ layerManager.setProps({ onError: error => onError(error, `initializing ${layer.id}`) }); - layerManager.setLayers([layer]); return layerManager; } -/** Test that initializing a layer does not throw. - * Use `testInitializeLayerAsync` if the layer's initialization flow contains async operations. - */ -export function testInitializeLayer( - opts: InitializeLayerTestOptions & { - /** Automatically finalize the layer and release all resources after the test */ - finalize?: true; - } -): null; -export function testInitializeLayer( - opts: InitializeLayerTestOptions & { - /** Automatically finalize the layer and release all resources after the test */ - finalize: false; - } -): { - /** Finalize the layer and release all resources */ +export function testInitializeLayer(opts: InitializeLayerTestOptions & {finalize?: true}): null; +export function testInitializeLayer(opts: InitializeLayerTestOptions & {finalize: false}): { finalize: () => void; }; - export function testInitializeLayer( - opts: InitializeLayerTestOptions & { - /** Automatically finalize the layer and release all resources after the test */ - finalize?: boolean; - } -): { - /** Finalize the layer and release all resources */ - finalize: () => void; -} | null { + opts: InitializeLayerTestOptions & {finalize?: boolean} +): {finalize: () => void} | null { const layerManager = initializeLayerManager(opts); if (opts.finalize === false) { - return { - finalize: () => layerManager.finalize() - }; + return {finalize: () => layerManager.finalize()}; } layerManager.finalize(); return null; } -/** Test that initializing a layer does not throw. - * Resolves when the layer's isLoaded flag becomes true. - */ export function testInitializeLayerAsync( - opts: InitializeLayerTestOptions & { - /** Automatically finalize the layer and release all resources after the test */ - finalize?: true; - } + opts: InitializeLayerTestOptions & {finalize?: true} ): Promise; export function testInitializeLayerAsync( - opts: InitializeLayerTestOptions & { - /** Automatically finalize the layer and release all resources after the test */ - finalize: false; - } -): Promise<{ - /** Finalize the layer and release all resources */ - finalize: () => void; -}>; - + opts: InitializeLayerTestOptions & {finalize: false} +): Promise<{finalize: () => void}>; export async function testInitializeLayerAsync( - opts: InitializeLayerTestOptions & { - /** Automatically finalize the layer and release all resources after the test */ - finalize?: boolean; - } -): Promise<{ - /** Finalize the layer and release all resources */ - finalize: () => void; -} | null> { + opts: InitializeLayerTestOptions & {finalize?: boolean} +): Promise<{finalize: () => void} | null> { const layerManager = initializeLayerManager(opts); const deckRenderer = new DeckRenderer(device); while (!opts.layer.isLoaded) { await update({layerManager, deckRenderer, oldResourceCounts: {}}); } if (opts.finalize === false) { - return { - finalize: () => layerManager.finalize() - }; + return {finalize: () => layerManager.finalize()}; } layerManager.finalize(); return null; } -// TODO - export from probe.gl -type Spy = ReturnType; - export type LayerClass = { new (...args): LayerT; layerName: string; @@ -140,17 +103,10 @@ export type LayerClass = { export type LayerTestCase = { title: string; viewport?: Viewport; - /** Reset the props of the test layer instance */ props?: Partial; - /** Update the given props of the test layer instance */ updateProps?: Partial; - /** List of layer method names to watch */ spies?: string[]; - - /** Called before layer updates */ onBeforeUpdate?: (params: {layer: Layer; testCase: LayerTestCase}) => void; - - /** Called after layer is updated */ onAfterUpdate?: (params: { testCase: LayerTestCase; layer: LayerT; @@ -167,45 +123,37 @@ type TestResources = { oldResourceCounts: Record; }; -/** - * Initialize and updates a layer over a sequence of scenarios (test cases). - * Use `testLayerAsync` if the layer's update flow contains async operations. - */ -export function testLayer(opts: { - /** The layer class to test against */ +export type TestLayerOptions = { Layer: LayerClass; - /** The initial viewport - * @default WebMercatorViewport - */ viewport?: Viewport; - /** - * If provided, used to controls time progression. Useful for testing transitions and animations. - */ timeline?: Timeline; testCases?: LayerTestCase[]; - /** - * List of layer method names to watch - */ spies?: string[]; - /** Callback if any error is thrown */ + createSpy: SpyFactory; onError?: (error: Error, title: string) => void; -}): void { - const {Layer, testCases = [], spies = [], onError = defaultOnError} = opts; +}; + +/** + * Initialize and updates a layer over a sequence of scenarios (test cases). + * Use `testLayerAsync` if the layer's update flow contains async operations. + */ +export function testLayer(opts: TestLayerOptions): void { + const {Layer, testCases = [], spies = [], onError = defaultOnError, createSpy} = opts; const resources = setupLayerTests(`testing ${Layer.layerName}`, opts); let layer = new Layer(); - // Run successive update tests for (const testCase of testCases) { - // Save old state before update const oldState = {...layer.state}; - - const {layer: newLayer, spyMap} = runLayerTestUpdate(testCase, resources, layer, spies); - + const {layer: newLayer, spyMap} = runLayerTestUpdate( + testCase, + resources, + layer, + spies, + createSpy + ); runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); - - // Remove spies - Object.keys(spyMap).forEach(k => spyMap[k].reset()); + Object.keys(spyMap).forEach(k => restoreSpy(spyMap[k])); layer = newLayer; } @@ -219,37 +167,23 @@ export function testLayer(opts: { * Initialize and updates a layer over a sequence of scenarios (test cases). * Each test case is awaited until the layer's isLoaded flag is true. */ -export async function testLayerAsync(opts: { - /** The layer class to test against */ - Layer: LayerClass; - /** The initial viewport - * @default WebMercatorViewport - */ - viewport?: Viewport; - /** - * If provided, used to controls time progression. Useful for testing transitions and animations. - */ - timeline?: Timeline; - testCases?: LayerTestCase[]; - /** - * List of layer method names to watch - */ - spies?: string[]; - /** Callback if any error is thrown */ - onError?: (error: Error, title: string) => void; -}): Promise { - const {Layer, testCases = [], spies = [], onError = defaultOnError} = opts; +export async function testLayerAsync( + opts: TestLayerOptions +): Promise { + const {Layer, testCases = [], spies = [], onError = defaultOnError, createSpy} = opts; const resources = setupLayerTests(`testing ${Layer.layerName}`, opts); let layer = new Layer(); - // Run successive update tests for (const testCase of testCases) { - // Save old state before update const oldState = {...layer.state}; - - const {layer: newLayer, spyMap} = runLayerTestUpdate(testCase, resources, layer, spies); - + const {layer: newLayer, spyMap} = runLayerTestUpdate( + testCase, + resources, + layer, + spies, + createSpy + ); runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); while (!newLayer.isLoaded) { @@ -257,8 +191,7 @@ export async function testLayerAsync(opts: { runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); } - // Remove spies - Object.keys(spyMap).forEach(k => spyMap[k].reset()); + Object.keys(spyMap).forEach(k => restoreSpy(spyMap[k])); layer = newLayer; } @@ -281,7 +214,6 @@ function setupLayerTests( } ): TestResources { const oldResourceCounts = getResourceCounts(); - const layerManager = new LayerManager(device, {viewport, timeline}); const deckRenderer = new DeckRenderer(device); @@ -306,7 +238,6 @@ function cleanupAfterLayerTests({ deckRenderer.finalize(); const resourceCounts = getResourceCounts(); - for (const resourceName in resourceCounts) { if (resourceCounts[resourceName] !== oldResourceCounts[resourceName]) { return new Error( @@ -318,7 +249,6 @@ function cleanupAfterLayerTests({ } function getResourceCounts(): Record { - /* global luma */ const resourceStats = (luma.stats as StatsManager).get('Resource Counts'); return { Texture2D: resourceStats.get('Texture2Ds Active').count, @@ -326,11 +256,11 @@ function getResourceCounts(): Record { }; } -function injectSpies(layer: Layer, spies: string[]): Record { +function injectSpies(layer: Layer, spies: string[], spyFactory: SpyFactory): Record { const spyMap: Record = {}; if (spies) { for (const functionName of spies) { - spyMap[functionName] = makeSpy(Object.getPrototypeOf(layer), functionName); + spyMap[functionName] = spyFactory(Object.getPrototypeOf(layer), functionName); } } return spyMap; @@ -342,15 +272,11 @@ function runLayerTestPostUpdateCheck( oldState: any, spyMap: Record ) { - // assert on updated layer if (testCase.onAfterUpdate) { - // layer manager should handle match subLayer and tranfer state and props - // here we assume subLayer matches copy over the new props from a new subLayer const subLayers = newLayer.isComposite ? (newLayer as Layer as CompositeLayer).getSubLayers() : []; const subLayer = subLayers.length ? subLayers[0] : null; - testCase.onAfterUpdate({ testCase, layer: newLayer, @@ -366,11 +292,9 @@ function runLayerTestUpdate( testCase: LayerTestCase, {layerManager, deckRenderer}: TestResources, layer: LayerT, - spies: string[] -): { - layer: LayerT; - spyMap: Record; -} { + spies: string[], + spyFactory: SpyFactory +): {layer: LayerT; spyMap: Record} { const {props, updateProps, onBeforeUpdate, viewport = layerManager.context.viewport} = testCase; if (onBeforeUpdate) { @@ -378,16 +302,13 @@ function runLayerTestUpdate( } if (props) { - // Test case can reset the props on every iteration layer = new (layer.constructor as LayerClass)(props); } else if (updateProps) { - // Test case can override with new props on every iteration layer = layer.clone(updateProps); } - // Create a map of spies that the test case can inspect spies = testCase.spies || spies; - const spyMap = injectSpies(layer, spies); + const spyMap = injectSpies(layer, spies, spyFactory); const drawLayers = () => { deckRenderer.renderLayers({ pass: 'test', @@ -402,7 +323,6 @@ function runLayerTestUpdate( layerManager.setLayers([layer]); drawLayers(); - // clear update flags set by viewport change, if any if (layerManager.needsUpdate()) { layerManager.updateLayers(); drawLayers(); @@ -411,13 +331,11 @@ function runLayerTestUpdate( return {layer, spyMap}; } -/* global setTimeout */ function update({layerManager, deckRenderer}: TestResources): Promise { return new Promise(resolve => { const onAnimationFrame = () => { if (layerManager.needsUpdate()) { layerManager.updateLayers(); - deckRenderer.renderLayers({ pass: 'test', views: {}, @@ -429,10 +347,8 @@ function update({layerManager, deckRenderer}: TestResources): Promise { resolve(); return; } - setTimeout(onAnimationFrame, 50); }; - onAnimationFrame(); }); } diff --git a/modules/test-utils/src/tape.ts b/modules/test-utils/src/tape.ts new file mode 100644 index 00000000000..f10400532d3 --- /dev/null +++ b/modules/test-utils/src/tape.ts @@ -0,0 +1,56 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +// Tape entry point - wraps lifecycle-test and adds @probe.gl/test-utils as the default spy factory +// For vitest users, use @deck.gl/test-utils/vitest which doesn't import probe.gl + +import {makeSpy} from '@probe.gl/test-utils'; +import { + testLayer as testLayerCore, + testLayerAsync as testLayerAsyncCore, + testInitializeLayer, + testInitializeLayerAsync +} from './lifecycle-test'; +import type {Layer} from '@deck.gl/core'; +import type {LayerClass, LayerTestCase, SpyFactory, TestLayerOptions} from './lifecycle-test'; + +export {testInitializeLayer, testInitializeLayerAsync}; +export type {LayerClass, LayerTestCase, SpyFactory}; + +let _hasWarnedDeprecation = false; + +function getDefaultSpyFactory(): SpyFactory { + if (!_hasWarnedDeprecation) { + _hasWarnedDeprecation = true; + // eslint-disable-next-line no-console + console.warn( + '[@deck.gl/test-utils] Implicit @probe.gl/test-utils usage is deprecated. ' + + 'Pass createSpy option: createSpy: (obj, method) => vi.spyOn(obj, method) for vitest, ' + + 'or createSpy: makeSpy for probe.gl.' + ); + } + return makeSpy; +} + +/** + * Initialize and updates a layer over a sequence of scenarios (test cases). + * Use `testLayerAsync` if the layer's update flow contains async operations. + */ +export function testLayer( + opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} +): void { + const createSpy = opts.createSpy || getDefaultSpyFactory(); + testLayerCore({...opts, createSpy}); +} + +/** + * Initialize and updates a layer over a sequence of scenarios (test cases). + * Each test case is awaited until the layer's isLoaded flag is true. + */ +export async function testLayerAsync( + opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} +): Promise { + const createSpy = opts.createSpy || getDefaultSpyFactory(); + await testLayerAsyncCore({...opts, createSpy}); +} diff --git a/modules/test-utils/src/vitest.ts b/modules/test-utils/src/vitest.ts new file mode 100644 index 00000000000..0a48b0bbeb4 --- /dev/null +++ b/modules/test-utils/src/vitest.ts @@ -0,0 +1,38 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +// Vitest-specific entry point with vi.spyOn default +// Use: import { testLayer } from '@deck.gl/test-utils/vitest' + +import {vi} from 'vitest'; +import {testLayer as testLayerCore, testLayerAsync as testLayerAsyncCore} from './lifecycle-test'; +import type {Layer} from '@deck.gl/core'; +import type {SpyFactory, TestLayerOptions} from './lifecycle-test'; + +// Default spy factory using vi.spyOn +const defaultSpyFactory: SpyFactory = (obj, method) => vi.spyOn(obj, method as never); + +export function testLayer( + opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} +) { + const createSpy = opts.createSpy || defaultSpyFactory; + return testLayerCore({...opts, createSpy}); +} + +export function testLayerAsync( + opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} +) { + const createSpy = opts.createSpy || defaultSpyFactory; + return testLayerAsyncCore({...opts, createSpy}); +} + +// Re-export non-spy utilities +export {testInitializeLayer, testInitializeLayerAsync} from './lifecycle-test'; +export {getLayerUniforms} from './utils/layer'; +export {toLowPrecision} from './utils/precision'; +export {gl, device} from './utils/setup-gl'; +export {generateLayerTests} from './generate-layer-tests'; + +// Types +export type {LayerTestCase, SpyFactory, TestLayerOptions} from './lifecycle-test'; diff --git a/package.json b/package.json index 7aca8b983df..2e815d6dbf8 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,8 @@ "start": "open https://deck.gl/docs/get-started/getting-started", "test": "ocular-test", "test-fast": "ocular-lint && ocular-test node", + "test-tape-compat": "ocular-test tape-compat", + "test-vitest-smoke": "vitest run test/smoke/vitest-entry.spec.ts", "test-website": "cd website && yarn && yarn test-build && cd ..", "metrics": "ocular-metrics", "link-luma": "yarn && (cd node_modules && mv luma.gl luma.orig && ln -s ../../luma.gl/modules/core)", @@ -53,7 +55,8 @@ "puppeteer": "^24.26.1", "s2-geometry": "^1.2.10", "tap-spec": "^5.0.0", - "tape-catch": "^1.0.6" + "tape-catch": "^1.0.6", + "vitest": "^4.0.18" }, "resolutions": { "wgsl_reflect": "^1.2.0", diff --git a/test/smoke/tape-compat.ts b/test/smoke/tape-compat.ts new file mode 100644 index 00000000000..627e25b7100 --- /dev/null +++ b/test/smoke/tape-compat.ts @@ -0,0 +1,35 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +import test from 'tape-catch'; +import {makeSpy} from '@probe.gl/test-utils'; +import {ScatterplotLayer} from '@deck.gl/layers'; +import {testLayer, testInitializeLayer} from '@deck.gl/test-utils'; + +test('tape-compat: testInitializeLayer works', t => { + const layer = new ScatterplotLayer({ + id: 'smoke-test-layer', + data: [{position: [0, 0]}], + getPosition: d => d.position + }); + testInitializeLayer({layer}); + t.pass('testInitializeLayer completed'); + t.end(); +}); + +test('tape-compat: testLayer works with explicit createSpy', t => { + testLayer({ + Layer: ScatterplotLayer, + testCases: [ + { + title: 'Initialize', + props: {id: 'test', data: [{position: [0, 0]}], getPosition: d => d.position} + } + ], + createSpy: makeSpy, + onError: e => t.fail(e.message) + }); + t.pass('testLayer completed'); + t.end(); +}); diff --git a/test/smoke/vitest-entry.spec.ts b/test/smoke/vitest-entry.spec.ts new file mode 100644 index 00000000000..5f467b4e5eb --- /dev/null +++ b/test/smoke/vitest-entry.spec.ts @@ -0,0 +1,51 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +import {test, expect, vi} from 'vitest'; +import {ScatterplotLayer} from '@deck.gl/layers'; +import {testLayer, testInitializeLayer} from '@deck.gl/test-utils/vitest'; + +test('vitest-entry: testInitializeLayer works', () => { + const layer = new ScatterplotLayer({ + id: 'smoke-test-layer', + data: [{position: [0, 0]}], + getPosition: d => d.position + }); + testInitializeLayer({layer}); + // If we get here without throwing, test passes +}); + +test('vitest-entry: testLayer works with default vi.spyOn', () => { + testLayer({ + Layer: ScatterplotLayer, + testCases: [ + { + title: 'Initialize', + props: {id: 'test', data: [{position: [0, 0]}], getPosition: d => d.position} + } + ], + onError: e => { + throw e; + } + }); + // If we get here without throwing, test passes +}); + +test('vitest-entry: testLayer works with explicit createSpy', () => { + const customSpy = (obj: object, method: string) => vi.spyOn(obj, method as never); + + testLayer({ + Layer: ScatterplotLayer, + testCases: [ + { + title: 'Initialize', + props: {id: 'test', data: [{position: [0, 0]}], getPosition: d => d.position} + } + ], + createSpy: customSpy, + onError: e => { + throw e; + } + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000000..4d03109485f --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,22 @@ +// deck.gl +// SPDX-License-Identifier: MIT +// Copyright (c) vis.gl contributors + +import {defineConfig} from 'vitest/config'; +import {resolve} from 'path'; + +const rootDir = import.meta.dirname; + +export default defineConfig({ + resolve: { + alias: { + '@deck.gl/test-utils/vitest': resolve(rootDir, 'modules/test-utils/src/vitest.ts'), + '@deck.gl/test-utils': resolve(rootDir, 'modules/test-utils/src/index.ts'), + '@deck.gl/core': resolve(rootDir, 'modules/core/src/index.ts'), + '@deck.gl/layers': resolve(rootDir, 'modules/layers/src/index.ts') + } + }, + test: { + include: ['test/smoke/vitest-entry.spec.ts'] + } +}); diff --git a/yarn.lock b/yarn.lock index 1cd4821cb34..e6882fae506 100644 --- a/yarn.lock +++ b/yarn.lock @@ -99,6 +99,11 @@ escape-string-regexp "^4.0.0" rollup-plugin-node-polyfills "^0.2.1" +"@esbuild/aix-ppc64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" + integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== + "@esbuild/android-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" @@ -109,6 +114,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== +"@esbuild/android-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8" + integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== + "@esbuild/android-arm@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" @@ -119,6 +129,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== +"@esbuild/android-arm@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b" + integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== + "@esbuild/android-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" @@ -129,6 +144,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== +"@esbuild/android-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac" + integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== + "@esbuild/darwin-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" @@ -139,6 +159,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== +"@esbuild/darwin-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd" + integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== + "@esbuild/darwin-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" @@ -149,6 +174,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== +"@esbuild/darwin-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a" + integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== + "@esbuild/freebsd-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" @@ -159,6 +189,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== +"@esbuild/freebsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b" + integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== + "@esbuild/freebsd-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" @@ -169,6 +204,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== +"@esbuild/freebsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead" + integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== + "@esbuild/linux-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" @@ -179,6 +219,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== +"@esbuild/linux-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6" + integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== + "@esbuild/linux-arm@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" @@ -189,6 +234,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== +"@esbuild/linux-arm@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11" + integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== + "@esbuild/linux-ia32@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" @@ -199,6 +249,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== +"@esbuild/linux-ia32@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29" + integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== + "@esbuild/linux-loong64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" @@ -209,6 +264,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== +"@esbuild/linux-loong64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed" + integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== + "@esbuild/linux-mips64el@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" @@ -219,6 +279,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== +"@esbuild/linux-mips64el@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1" + integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== + "@esbuild/linux-ppc64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" @@ -229,6 +294,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== +"@esbuild/linux-ppc64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78" + integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== + "@esbuild/linux-riscv64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" @@ -239,6 +309,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== +"@esbuild/linux-riscv64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d" + integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== + "@esbuild/linux-s390x@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" @@ -249,6 +324,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== +"@esbuild/linux-s390x@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d" + integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== + "@esbuild/linux-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" @@ -259,6 +339,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== +"@esbuild/linux-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz#12383dcbf71b7cf6513e58b4b08d95a710bf52a5" + integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== + +"@esbuild/netbsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7" + integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== + "@esbuild/netbsd-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" @@ -269,6 +359,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== +"@esbuild/netbsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b" + integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== + +"@esbuild/openbsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5" + integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== + "@esbuild/openbsd-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" @@ -279,6 +379,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== +"@esbuild/openbsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b" + integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== + +"@esbuild/openharmony-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e" + integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== + "@esbuild/sunos-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" @@ -289,6 +399,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== +"@esbuild/sunos-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537" + integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== + "@esbuild/win32-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" @@ -299,6 +414,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== +"@esbuild/win32-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e" + integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== + "@esbuild/win32-ia32@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" @@ -309,6 +429,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== +"@esbuild/win32-ia32@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c" + integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== + "@esbuild/win32-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" @@ -319,6 +444,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/win32-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17" + integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -486,6 +616,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -694,70 +829,80 @@ dependencies: call-bind "^1.0.7" -"@loaders.gl/3d-tiles@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/3d-tiles/-/3d-tiles-4.4.0-alpha.16.tgz#343a92fea9057f05e39b0307a5125afdf01c307e" - integrity sha512-Z579Cm6/zd+UltEg9mnThUvkcM/GFyxgWOYZqXOascWX/eIZmgM5eeS3Q/tW/GuPSynKV70fDC9LyWJMxc3cig== - dependencies: - "@loaders.gl/compression" "4.4.0-alpha.16" - "@loaders.gl/crypto" "4.4.0-alpha.16" - "@loaders.gl/draco" "4.4.0-alpha.16" - "@loaders.gl/gltf" "4.4.0-alpha.16" - "@loaders.gl/images" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/math" "4.4.0-alpha.16" - "@loaders.gl/tiles" "4.4.0-alpha.16" - "@loaders.gl/zip" "4.4.0-alpha.16" +"@loaders.gl/3d-tiles@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/3d-tiles/-/3d-tiles-4.3.4.tgz#fa421a6eb0032a233cf1cfdd2d3ce25ea9ccee10" + integrity sha512-JQ3y3p/KlZP7lfobwON5t7H9WinXEYTvuo3SRQM8TBKhM+koEYZhvI2GwzoXx54MbBbY+s3fm1dq5UAAmaTsZw== + dependencies: + "@loaders.gl/compression" "4.3.4" + "@loaders.gl/crypto" "4.3.4" + "@loaders.gl/draco" "4.3.4" + "@loaders.gl/gltf" "4.3.4" + "@loaders.gl/images" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/math" "4.3.4" + "@loaders.gl/tiles" "4.3.4" + "@loaders.gl/zip" "4.3.4" "@math.gl/core" "^4.1.0" "@math.gl/culling" "^4.1.0" "@math.gl/geospatial" "^4.1.0" - "@probe.gl/log" "^4.1.1" + "@probe.gl/log" "^4.0.4" long "^5.2.1" -"@loaders.gl/compression@4.4.0-alpha.16", "@loaders.gl/compression@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/compression/-/compression-4.4.0-alpha.16.tgz#268080bf81af16d5178b2d2c1328f62e38fef34c" - integrity sha512-KKomj2Dn8vN6R9OE71jAYB4tJRH/1zcfLvpv3ZzPQ2VDyR2KWt9M7ExD5Mf+aUgqymaJZe8RNseU82b2k8BmCA== +"@loaders.gl/compression@4.3.4", "@loaders.gl/compression@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/compression/-/compression-4.3.4.tgz#f9d8508dcaf7e1185ac57fe656b525db4e40fba3" + integrity sha512-+o+5JqL9Sx8UCwdc2MTtjQiUHYQGJALHbYY/3CT+b9g/Emzwzez2Ggk9U9waRfdHiBCzEgRBivpWZEOAtkimXQ== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/worker-utils" "4.4.0-alpha.16" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/worker-utils" "4.3.4" + "@types/brotli" "^1.3.0" "@types/pako" "^1.0.1" fflate "0.7.4" + lzo-wasm "^0.0.4" pako "1.0.11" snappyjs "^0.6.1" optionalDependencies: - "@types/brotli" "^1.3.0" brotli "^1.3.2" lz4js "^0.2.0" zstd-codec "^0.1" -"@loaders.gl/core@4.4.0-alpha.16", "@loaders.gl/core@^4.2.0", "@loaders.gl/core@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.4.0-alpha.16.tgz#f0b15b12ec3c32259a14a4dfe210d2fb203b9548" - integrity sha512-CJ8aLdtIwMnnXvFq3jpvZV9TZGF/UhSsWYmVKt88BuLDsGEho4GT3dDFGBsl6PmMmJle9PGpxn3R0OtzdymS8Q== +"@loaders.gl/core@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.2.2.tgz#36b30b364fe95bcfdbe4a493f6497425aa644b74" + integrity sha512-d3YElSsqL29MaiOwzGB97v994SPotbTvJnooCqoQsYGoYYrECdIetv1/zlfDsh5UB2Wl/NaUMJrzyOqlLmDz5Q== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" - "@loaders.gl/schema-utils" "4.4.0-alpha.16" - "@loaders.gl/worker-utils" "4.4.0-alpha.16" - "@probe.gl/log" "^4.1.1" + "@loaders.gl/loader-utils" "4.2.2" + "@loaders.gl/schema" "4.2.2" + "@loaders.gl/worker-utils" "4.2.2" + "@probe.gl/log" "^4.0.2" + +"@loaders.gl/core@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.3.4.tgz#f6495a375dec5f33ed631c7d116e7e9292bccb0b" + integrity sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw== + dependencies: + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" + "@loaders.gl/worker-utils" "4.3.4" + "@probe.gl/log" "^4.0.2" -"@loaders.gl/crypto@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/crypto/-/crypto-4.4.0-alpha.16.tgz#e3f8e8c331c053af847153906b5c20cc68bc3837" - integrity sha512-xeWbp6pPg0NImHjpAzqTaThi2arIvBzcr450B3TVSOJhG3RBDoTlK5PlCQJzFSPb3S+FF69WuNzfS4FDl2UZnA== +"@loaders.gl/crypto@4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/crypto/-/crypto-4.3.4.tgz#dfe29fea474b26f257fbd72d3d66219614e4edb9" + integrity sha512-3VS5FgB44nLOlAB9Q82VOQnT1IltwfRa1miE0mpHCe1prYu1M/dMnEyynusbrsp+eDs3EKbxpguIS9HUsFu5dQ== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/worker-utils" "4.4.0-alpha.16" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/worker-utils" "4.3.4" "@types/crypto-js" "^4.0.2" -"@loaders.gl/csv@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/csv/-/csv-4.4.0-alpha.16.tgz#aa36ee6c6c5b45af030e10d6e0b3e0f76c1db542" - integrity sha512-T6aeuyUuV2H5mSOQypu0IafmmoghLtO0D9w0C7ndgbtMIEpM8JxHV4LiVA4iIGnGWEa7jCguaZmis9yGLS5sSw== +"@loaders.gl/csv@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/csv/-/csv-4.3.4.tgz#5a302839523815f4dbe522b96bd6c610fad8275a" + integrity sha512-F3RiZ24bekkZozBnvaJK3uUBENfYXTmEQPRY6KzxLqVs+oWIfIJyDeemau07Z9qRnsdw1IJ8O+HNotcjoZn9Xw== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" d3-dsv "^1.2.0" "@loaders.gl/draco@4.2.2": @@ -770,48 +915,37 @@ "@loaders.gl/worker-utils" "4.2.2" draco3d "1.5.7" -"@loaders.gl/draco@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-4.4.0-alpha.16.tgz#442d86751385ce26691ad339afa41ef6ead90305" - integrity sha512-ofQ1d7hdm7xuiDT3CxNBcvKwUHUnd8xAOtwj2rJRuN7HgTQtsHzfBvBid6s91opB02vc8kZjcatBVoWCHH1Idw== +"@loaders.gl/draco@4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-4.3.4.tgz#5a95b715fb061a24b17a35587ba6ed37ca37323b" + integrity sha512-4Lx0rKmYENGspvcgV5XDpFD9o+NamXoazSSl9Oa3pjVVjo+HJuzCgrxTQYD/3JvRrolW/QRehZeWD/L/cEC6mw== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" - "@loaders.gl/schema-utils" "4.4.0-alpha.16" - "@loaders.gl/worker-utils" "4.4.0-alpha.16" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" + "@loaders.gl/worker-utils" "4.3.4" draco3d "1.5.7" -"@loaders.gl/geoarrow@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/geoarrow/-/geoarrow-4.4.0-alpha.16.tgz#2811bb8fcb0267b17dfa764d7c7a1893a3506832" - integrity sha512-/jmkVrdkWd8MrsB0uEb9KVXBYOia0wEc85MrRTlRqJAN90yG9a1kNba0joNaoCrKzUvYN7adFEQSro4EO5KpqQ== +"@loaders.gl/gis@4.3.4", "@loaders.gl/gis@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-4.3.4.tgz#07fa1101cf294c6783755fddbda50336dc6c26ea" + integrity sha512-8xub38lSWW7+ZXWuUcggk7agRHJUy6RdipLNKZ90eE0ZzLNGDstGD1qiBwkvqH0AkG+uz4B7Kkiptyl7w2Oa6g== dependencies: - "@math.gl/polygon" "^4.1.0" - apache-arrow ">= 17.0.0" - -"@loaders.gl/gis@4.4.0-alpha.16", "@loaders.gl/gis@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-4.4.0-alpha.16.tgz#a7d035061ec80b5754e30c7d71a1052855061ec5" - integrity sha512-qOU26baZolW6B8atapKQPl/PKHLhIbkAh8hCXlW0YpKdUKddf0iK/kebiDZ4RkX0rDyoKlCrtw8vjLx/IX56Uw== - dependencies: - "@loaders.gl/geoarrow" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" - "@loaders.gl/schema-utils" "4.4.0-alpha.16" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" "@mapbox/vector-tile" "^1.3.1" "@math.gl/polygon" "^4.1.0" pbf "^3.2.1" -"@loaders.gl/gltf@4.4.0-alpha.16", "@loaders.gl/gltf@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-4.4.0-alpha.16.tgz#5dfbf4e7093d4452dfcc96e0e3e29ecd5ef819a8" - integrity sha512-+tB4Bm9qcDN6bx1xBbNvIcTtD2yMWTMk1hv5PKIh+OzUYKCisaG4lsRqIM1QK4eZ/hbe3TU11Fy0spLhiv1IIg== +"@loaders.gl/gltf@4.3.4", "@loaders.gl/gltf@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-4.3.4.tgz#1981e1013ece61fe93033f11362ad3818ab68238" + integrity sha512-EiUTiLGMfukLd9W98wMpKmw+hVRhQ0dJ37wdlXK98XPeGGB+zTQxCcQY+/BaMhsSpYt/OOJleHhTfwNr8RgzRg== dependencies: - "@loaders.gl/draco" "4.4.0-alpha.16" - "@loaders.gl/images" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" - "@loaders.gl/textures" "4.4.0-alpha.16" + "@loaders.gl/draco" "4.3.4" + "@loaders.gl/images" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" + "@loaders.gl/textures" "4.3.4" "@math.gl/core" "^4.1.0" "@loaders.gl/gltf@^4.2.0": @@ -833,12 +967,12 @@ dependencies: "@loaders.gl/loader-utils" "4.2.2" -"@loaders.gl/images@4.4.0-alpha.16", "@loaders.gl/images@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-4.4.0-alpha.16.tgz#942feb2937f6dacfb34c676000f50e8ee8c8d4a9" - integrity sha512-MJSQoDLkFJXWuCvFGQQVrAK2mvP9Hz/QTipfDUUlO/o9NoJuuqYb8czBR65x7C2thdvEXoBC0paAxjX8+ZPxzQ== +"@loaders.gl/images@4.3.4", "@loaders.gl/images@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-4.3.4.tgz#386ab26083893af3ffe5b9dd4ae8912fcfb920c0" + integrity sha512-qgc33BaNsqN9cWa/xvcGvQ50wGDONgQQdzHCKDDKhV2w/uptZoR5iofJfuG8UUV2vUMMd82Uk9zbopRx2rS4Ag== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" + "@loaders.gl/loader-utils" "4.3.4" "@loaders.gl/loader-utils@4.2.2": version "4.2.2" @@ -849,43 +983,45 @@ "@loaders.gl/worker-utils" "4.2.2" "@probe.gl/stats" "^4.0.2" -"@loaders.gl/loader-utils@4.4.0-alpha.16", "@loaders.gl/loader-utils@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-4.4.0-alpha.16.tgz#1b4245a5b1eaa43e0b187f320dee37a6714a5646" - integrity sha512-SRixSHeq6/hyyjtgpLZ6h/g+hN1rf4/9YNkIaUwp4YUIdm7zf1xt0w79T69XgOMPR4xfLmEWkaWaMfjNqsjxUg== +"@loaders.gl/loader-utils@4.3.4", "@loaders.gl/loader-utils@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-4.3.4.tgz#c45385f29e3a806e709453a59a2e8c3f6f92fca4" + integrity sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q== dependencies: - "@loaders.gl/schema" "4.4.0-alpha.16" - "@loaders.gl/worker-utils" "4.4.0-alpha.16" - "@probe.gl/log" "^4.1.1" - "@probe.gl/stats" "^4.1.1" + "@loaders.gl/schema" "4.3.4" + "@loaders.gl/worker-utils" "4.3.4" + "@probe.gl/log" "^4.0.2" + "@probe.gl/stats" "^4.0.2" -"@loaders.gl/math@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/math/-/math-4.4.0-alpha.16.tgz#b3995d3e9f1c8cd796ae8535fbca6356ad687d5b" - integrity sha512-nfYDMg4dQMIRmBCJkSCiU0OrHWX4XIFcFikjwpyj9B18AWg8gxpgahb9FD2nPAkXEeMAs3lZU94b4F+gdHimdw== +"@loaders.gl/math@4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/math/-/math-4.3.4.tgz#6da6af9da2e23e97857846c38a7d9593bf6894ec" + integrity sha512-UJrlHys1fp9EUO4UMnqTCqvKvUjJVCbYZ2qAKD7tdGzHJYT8w/nsP7f/ZOYFc//JlfC3nq+5ogvmdpq2pyu3TA== dependencies: + "@loaders.gl/images" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" "@math.gl/core" "^4.1.0" -"@loaders.gl/mvt@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/mvt/-/mvt-4.4.0-alpha.16.tgz#911337fae57297977af4fd0b13c3b81c78acf542" - integrity sha512-Y2NUdE1p12BboWMbfUHWJhlLZq+74wbP98UtnBx8OXQoturJXzCM+r5xkogPB/wdnHyXNCA+HLSf833Dc/YqTg== +"@loaders.gl/mvt@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/mvt/-/mvt-4.3.4.tgz#e7ddd27f8a70f75179b9941f3636ec9edd32bde0" + integrity sha512-9DrJX8RQf14htNtxsPIYvTso5dUce9WaJCWCIY/79KYE80Be6dhcEYMknxBS4w3+PAuImaAe66S5xo9B7Erm5A== dependencies: - "@loaders.gl/gis" "4.4.0-alpha.16" - "@loaders.gl/images" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" + "@loaders.gl/gis" "4.3.4" + "@loaders.gl/images" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" "@math.gl/polygon" "^4.1.0" - "@probe.gl/stats" "^4.1.1" + "@probe.gl/stats" "^4.0.0" pbf "^3.2.1" -"@loaders.gl/polyfills@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/polyfills/-/polyfills-4.4.0-alpha.16.tgz#20797f592ec160fe98ca32f60b66e25cc2c17163" - integrity sha512-3uSnAkjvOUVsbwUnkp5DV3URDOlJkjGaEK7XecpgqDuSC0AZ23GxdhoLbXqpwK6Krexugwc8ulpGbel6EkWViw== +"@loaders.gl/polyfills@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/polyfills/-/polyfills-4.3.4.tgz#95f6a2e99178a4d1075288d1b576469390380ea8" + integrity sha512-rL7mtzyY1YLFRbDw7NAjXJD/zQuT6BMhIGQI/UnOcj/w9I/dDKq+lk9/LsyRSNdUq68gAPtH/PTVplPJAaW85A== dependencies: - "@loaders.gl/crypto" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" + "@loaders.gl/crypto" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" buffer "^6.0.3" get-pixels "^3.3.3" ndarray "^1.0.19" @@ -894,15 +1030,6 @@ through "^2.3.8" web-streams-polyfill "^4.0.0" -"@loaders.gl/schema-utils@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/schema-utils/-/schema-utils-4.4.0-alpha.16.tgz#ebeac67aa972a113a1bd7ee1177c8a6650bc200c" - integrity sha512-VfspF8L5kbDAWxiWD0Q9+J/sw4pEP7JgN7hLFKAgsdsSv2B0XGvqO1u0TrA2Izr5PBhDHAV6xeWb63v6GVsnRQ== - dependencies: - "@loaders.gl/schema" "4.4.0-alpha.16" - "@types/geojson" "^7946.0.7" - apache-arrow ">= 17.0.0" - "@loaders.gl/schema@4.2.2": version "4.2.2" resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.2.2.tgz#c5399343ce6103aebb21ba51bda956478247c133" @@ -910,13 +1037,12 @@ dependencies: "@types/geojson" "^7946.0.7" -"@loaders.gl/schema@4.4.0-alpha.16", "@loaders.gl/schema@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.4.0-alpha.16.tgz#d6641b96b7ffece1ae213472e7e853103b8aed8d" - integrity sha512-A7vQtCK8x5q2Qmw6Ah2H6Fy+soyT5CB9YYtAYTS8KnIOrs2yX80JHPq5iwLOVSmcKnMxgK2AAMAEhyfpD9NQiA== +"@loaders.gl/schema@4.3.4", "@loaders.gl/schema@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.3.4.tgz#03a09dd8cccc30b6e979471daa8343c1efd7d254" + integrity sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw== dependencies: "@types/geojson" "^7946.0.7" - apache-arrow ">= 17.0.0" "@loaders.gl/schema@^4.3.3": version "4.3.3" @@ -925,14 +1051,14 @@ dependencies: "@types/geojson" "^7946.0.7" -"@loaders.gl/terrain@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/terrain/-/terrain-4.4.0-alpha.16.tgz#d75196cc86f488ddb08bcc1030acf43003323791" - integrity sha512-Be2pHXoOsYPfrMs7HYnRttBfgSpW9R00dxwjdsMiOZwp2f6mqUIPhuNm0C2s4a6pa2m4+NefZI5k4MiwvqgFsA== +"@loaders.gl/terrain@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/terrain/-/terrain-4.3.4.tgz#c0824608a6d63a6fabf4d3a20b9274ed7db737d2" + integrity sha512-JszbRJGnxL5Fh82uA2U8HgjlsIpzYoCNNjy3cFsgCaxi4/dvjz3BkLlBilR7JlbX8Ka+zlb4GAbDDChiXLMJ/g== dependencies: - "@loaders.gl/images" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" + "@loaders.gl/images" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" "@mapbox/martini" "^0.2.0" "@loaders.gl/textures@4.2.2", "@loaders.gl/textures@^4.2.0": @@ -948,41 +1074,41 @@ ktx-parse "^0.0.4" texture-compressor "^1.0.2" -"@loaders.gl/textures@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-4.4.0-alpha.16.tgz#9d0fd2360f407dfa443868946c7f35e2c18e6808" - integrity sha512-L9ZDBTT+9sF9SaHQcnBszPGZ0juJjchvCktW8AOv9w/Wfupyi8CIwEKwLSbbDJaejL+PV+O3QZm0Y8UxgSK2xA== +"@loaders.gl/textures@4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-4.3.4.tgz#20762907fd811a09e19483b31fc8d3dcc3b3b634" + integrity sha512-arWIDjlE7JaDS6v9by7juLfxPGGnjT9JjleaXx3wq/PTp+psLOpGUywHXm38BNECos3MFEQK3/GFShWI+/dWPw== dependencies: - "@loaders.gl/images" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" - "@loaders.gl/worker-utils" "4.4.0-alpha.16" + "@loaders.gl/images" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" + "@loaders.gl/worker-utils" "4.3.4" "@math.gl/types" "^4.1.0" ktx-parse "^0.7.0" texture-compressor "^1.0.2" -"@loaders.gl/tiles@4.4.0-alpha.16", "@loaders.gl/tiles@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/tiles/-/tiles-4.4.0-alpha.16.tgz#3ef362013aa2fbe30b3cbb9d96b1f1df57c953d5" - integrity sha512-c7QHMsdenjzbzK+Q+MtW5B9aXR2GKw9nEKjchjjpf91taGwAEl8ho0SWEy5iVB1nnO3Ii7Fe9qIFP2F93xMMyg== +"@loaders.gl/tiles@4.3.4", "@loaders.gl/tiles@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/tiles/-/tiles-4.3.4.tgz#371982dfe518e1866329e5efca712ae1ddf84d62" + integrity sha512-oC0zJfyvGox6Ag9ABF8fxOkx9yEFVyzTa9ryHXl2BqLiQoR1v3p+0tIJcEbh5cnzHfoTZzUis1TEAZluPRsHBQ== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/math" "4.4.0-alpha.16" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/math" "4.3.4" "@math.gl/core" "^4.1.0" "@math.gl/culling" "^4.1.0" "@math.gl/geospatial" "^4.1.0" "@math.gl/web-mercator" "^4.1.0" - "@probe.gl/stats" "^4.1.1" + "@probe.gl/stats" "^4.0.2" -"@loaders.gl/wms@^4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/wms/-/wms-4.4.0-alpha.16.tgz#fc2a2ac938024f012ffd3d7d595b5c2d84476900" - integrity sha512-fvrtnofD2NaHH0mn5q9C76VhsAgrqXCMWbM/u0ULj0pXR5YsccDe3D4IdSTP1KdHgN/WpXl0pTviboADAcrvFQ== +"@loaders.gl/wms@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/wms/-/wms-4.3.4.tgz#e37463bae5cb53993e254ae50e8f9d0a2f5212a0" + integrity sha512-yXF0wuYzJUdzAJQrhLIua6DnjOiBJusaY1j8gpvuH1VYs3mzvWlIRuZKeUd9mduQZKK88H2IzHZbj2RGOauq4w== dependencies: - "@loaders.gl/images" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" - "@loaders.gl/xml" "4.4.0-alpha.16" + "@loaders.gl/images" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" + "@loaders.gl/xml" "4.3.4" "@turf/rewind" "^5.1.5" deep-strict-equal "^0.2.0" @@ -991,45 +1117,45 @@ resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.2.2.tgz#1c6c639f059b03ca3c443dc029bbbeede1aa571b" integrity sha512-7Ad83VS/PmS0T3LXo+LB6cq5oHhAUW3GvYWizm4OfeuBDQRtYK7iRehgC13/BomkNtWIn0y7iAphlQMVrNdvhQ== -"@loaders.gl/worker-utils@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.4.0-alpha.16.tgz#fbb865a20b50a4935251afbd2817f6baea17e711" - integrity sha512-BS7OQycVJYjsqowIyMLBkqEuq/g+/87LWnktQRPaeD6dRWF7TQhtW8GljVpmfIxsUlBudoajEjSZ9LLxP5gtRQ== +"@loaders.gl/worker-utils@4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.3.4.tgz#f1e3115d8aff4f229aedd2cfc89fa07f9aae7d07" + integrity sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA== -"@loaders.gl/xml@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/xml/-/xml-4.4.0-alpha.16.tgz#b066eb5c91a7a6feaf1e4a264236f251c66274cc" - integrity sha512-dzc3Y0PBUGa6VByQ8p+j3iHNy/6CplteGvXqGGippxhT1iSpKBUYNuBLMw8Gju+OCTOkL49NhH36WwK3C8FGTg== +"@loaders.gl/xml@4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/xml/-/xml-4.3.4.tgz#3fabc216cc0711b67a5ccb9e4abdf7f07e829d7d" + integrity sha512-p+y/KskajsvyM3a01BwUgjons/j/dUhniqd5y1p6keLOuwoHlY/TfTKd+XluqfyP14vFrdAHCZTnFCWLblN10w== dependencies: - "@loaders.gl/loader-utils" "4.4.0-alpha.16" - "@loaders.gl/schema" "4.4.0-alpha.16" - fast-xml-parser "^5.3.6" + "@loaders.gl/loader-utils" "4.3.4" + "@loaders.gl/schema" "4.3.4" + fast-xml-parser "^4.2.5" -"@loaders.gl/zip@4.4.0-alpha.16": - version "4.4.0-alpha.16" - resolved "https://registry.yarnpkg.com/@loaders.gl/zip/-/zip-4.4.0-alpha.16.tgz#468b6bac5603beffd560a93b7fd5e995d9806593" - integrity sha512-9OQhPehgFrS+bjRrk6AbD0eyLs7852rU+86y+EjWN85/A1GOoV3tiheqHJ2REmrcRZRo+SSRJMNd/SIKwSYoNw== +"@loaders.gl/zip@4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@loaders.gl/zip/-/zip-4.3.4.tgz#a8278fb098987c99f94633b0953ee36692a7d094" + integrity sha512-bHY4XdKYJm3vl9087GMoxnUqSURwTxPPh6DlAGOmz6X9Mp3JyWuA2gk3tQ1UIuInfjXKph3WAUfGe6XRIs1sfw== dependencies: - "@loaders.gl/compression" "4.4.0-alpha.16" - "@loaders.gl/crypto" "4.4.0-alpha.16" - "@loaders.gl/loader-utils" "4.4.0-alpha.16" + "@loaders.gl/compression" "4.3.4" + "@loaders.gl/crypto" "4.3.4" + "@loaders.gl/loader-utils" "4.3.4" jszip "^3.1.5" md5 "^2.3.0" -"@luma.gl/constants@9.3.0-alpha.2", "@luma.gl/constants@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/constants/-/constants-9.3.0-alpha.2.tgz#781c973d2ceebd5a7bad3782a88d3c155716859e" - integrity sha512-ZpI9s54I8SMCZolw4l58OxCXcx+5P+0efvDFUnIQTuLUtIqcfKxweQwQ/QcYsniDB5e5nhJWZL861UvUem54Yw== +"@luma.gl/constants@9.2.6", "@luma.gl/constants@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/constants/-/constants-9.2.6.tgz#19baa45cd3b1a24eec7371a0127899b37d2644e8" + integrity sha512-rvFFrJuSm5JIWbDHFuR4Q2s4eudO3Ggsv0TsGKn9eqvO7bBiPm/ANugHredvh3KviEyYuMZZxtfJvBdr3kzldg== "@luma.gl/constants@^9.0.0": version "9.0.27" resolved "https://registry.yarnpkg.com/@luma.gl/constants/-/constants-9.0.27.tgz#65d65fa1ea407fd5f74bfa92dfba43261be33763" integrity sha512-NBkMim3u0xt4UDe4e69L6E/pq5XNxfX60GrggJDzfilVRfIbx5XwKhBXTyNjjtNEk4oc6uYLHWd/05jGRHcfLg== -"@luma.gl/core@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/core/-/core-9.3.0-alpha.2.tgz#ce64118f0343823ea80036d6255d8adaf80215d7" - integrity sha512-wrfzZ6CE0OOU8lx+nhYRjFs8u8DXbcnh+S9wNr24OOvTvp7MQYs5NSJopcYwf3fpbujJr7Rqp48EoQVx0RJruA== +"@luma.gl/core@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/core/-/core-9.2.6.tgz#28c9d7965d3ebf003e0c1db7f90b5d24bc6c87d8" + integrity sha512-d8KcH8ZZcjDAodSN/G2nueA9YE2X8kMz7Q0OxDGpCww6to1MZXM3Ydate/Jqsb5DDKVgUF6yD6RL8P5jOki9Yw== dependencies: "@math.gl/types" "^4.1.0" "@probe.gl/env" "^4.0.8" @@ -1037,67 +1163,68 @@ "@probe.gl/stats" "^4.0.8" "@types/offscreencanvas" "^2019.6.4" -"@luma.gl/effects@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/effects/-/effects-9.3.0-alpha.2.tgz#d89580e8c3dc16810d007e53fe97f6626304ba60" - integrity sha512-INe6u+Wl8e4DbkZDpgoBSxrtPUD4tDiMIeJHav4elaYcc035I1NNRCUFx4Ao5N4wOa9XABlbgUVwqvrhirdrqg== +"@luma.gl/effects@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/effects/-/effects-9.2.6.tgz#983945d909d64bf9abab305278187893b0d9623f" + integrity sha512-pxAUqgJe1Hvo5q5AcNtm/K1vX0D07ZpOR+Ee0Jq5wxVQQbaKnOiMZGEgZg4xJaQKuD+GmfUY/MPqdRxWJQayyA== dependencies: "@math.gl/core" "^4.1.0" "@math.gl/types" "^4.1.0" + wgsl_reflect "^1.0.1" -"@luma.gl/engine@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/engine/-/engine-9.3.0-alpha.2.tgz#ee238fd5b5180be281e280b507a78b3a4d018700" - integrity sha512-jooY4INdBymS33Vipwo/lV3PxSgz/OAY17tOMhx6/mM4ke0UyIWFRwTtHjQwOafGndN5XLykHIYQ7z/8sipAWw== +"@luma.gl/engine@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/engine/-/engine-9.2.6.tgz#e61791b45a19fbff5a36c0dc8f85ec9492bd1c61" + integrity sha512-1AEDs2AUqOWh7Wl4onOhXmQF+Rz1zNdPXF+Kxm4aWl92RQ42Sh2CmTvRt2BJku83VQ91KFIEm/v3qd3Urzf+Uw== dependencies: "@math.gl/core" "^4.1.0" "@math.gl/types" "^4.1.0" "@probe.gl/log" "^4.0.8" "@probe.gl/stats" "^4.0.8" -"@luma.gl/gltf@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/gltf/-/gltf-9.3.0-alpha.2.tgz#5c284c6f93c0aeb2fa5f592c8cc0fe3711c0a732" - integrity sha512-l38hz+knNYx0QAp6Elb6Hi4vJEd0HdAFKW5aPVBmMgCOBCgB5VXbQzwpfbvehj1XZco7N/YqClx0z2elEmQA+Q== +"@luma.gl/gltf@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/gltf/-/gltf-9.2.6.tgz#2e1bfa2cdd7f71ee0e5801525e483436891497b4" + integrity sha512-is3YkiGsWqWTmwldMz6PRaIUleufQfUKYjJTKpsF5RS1OnN+xdAO0mJq5qJTtOQpppWAU0VrmDFEVZ6R3qvm0A== dependencies: "@loaders.gl/core" "^4.2.0" "@loaders.gl/gltf" "^4.2.0" "@loaders.gl/textures" "^4.2.0" "@math.gl/core" "^4.1.0" -"@luma.gl/shadertools@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/shadertools/-/shadertools-9.3.0-alpha.2.tgz#a212e509b11a266e9e1780581ce0aa8a8df5728b" - integrity sha512-33ZEuH9u4E8sJxZ8SDDbmNuNVdvaNJtIbfNoPgYlXzNMsLqdwAumWJcsdht2383zjaf74oA7urdAaokczoPGAA== +"@luma.gl/shadertools@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/shadertools/-/shadertools-9.2.6.tgz#850a69d3df37125c546d229651aa6936b8164ec7" + integrity sha512-4+uUbynqPUra9d/z1nQChyHmhLgmKfSMjS7kOwLB6exSnhKnpHL3+Hu9fv55qyaX50nGH3oHawhGtJ6RRvu65w== dependencies: "@math.gl/core" "^4.1.0" "@math.gl/types" "^4.1.0" + wgsl_reflect "^1.2.0" -"@luma.gl/test-utils@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/test-utils/-/test-utils-9.3.0-alpha.2.tgz#52e59d16de80b686ba31690d5d46a7ed0a9ad5eb" - integrity sha512-rF+7BhjSNbdop/PsscvZNyPBNpTxJhNeBn9fHmQSinfwcq5iRnAfFoQS1iQAQnvAnABqx6Oe74J1kC/E2ChdQw== +"@luma.gl/test-utils@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/test-utils/-/test-utils-9.2.6.tgz#e74bd0f5d202dfbbc438f2c7258df1808efd8d12" + integrity sha512-sCHrQiTgBpUwqnHm1nOkJ56KlZHqDCGt7m1x5PsxWEKlGlPJPGPX+QmrgyopZoaAp+/onAAvNKjFwImfUNa05Q== dependencies: "@probe.gl/env" "^4.0.8" "@probe.gl/stats" "^4.0.8" -"@luma.gl/webgl@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/webgl/-/webgl-9.3.0-alpha.2.tgz#f3acb599da7d1777171948bddf35829061d62764" - integrity sha512-Us5a7VFWgYuHSIJ5Sm7+i+ECcN+Tw421pgirsSyqbEmHZr/eu776/N7eoFKj4SjLXeaSKQioIpjGZMm2efJxeg== +"@luma.gl/webgl@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/webgl/-/webgl-9.2.6.tgz#41f6aa6b34690cbeefbb613024802f28d9924f1d" + integrity sha512-NGBTdxJMk7j8Ygr1zuTyAvr1Tw+EpupMIQo7RelFjEsZXg6pujFqiDMM+rgxex8voCeuhWBJc7Rs+MoSqd46UQ== dependencies: - "@luma.gl/constants" "9.3.0-alpha.2" + "@luma.gl/constants" "9.2.6" "@math.gl/types" "^4.1.0" "@probe.gl/env" "^4.0.8" -"@luma.gl/webgpu@^9.3.0-alpha.2": - version "9.3.0-alpha.2" - resolved "https://registry.yarnpkg.com/@luma.gl/webgpu/-/webgpu-9.3.0-alpha.2.tgz#6935e861dc3b3bc37e39776f6fcd322251c6cc73" - integrity sha512-Egcs6IqPSOsuFc961oJtQAuyDxBy42pfvbvwAMP7MyVXXkfB9GBCHfifzUgD/93jQg1cJnE7kE3y7lW01GjlRA== +"@luma.gl/webgpu@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@luma.gl/webgpu/-/webgpu-9.2.6.tgz#7542900f33bd0ea1027e0dc22258b7762ef82c64" + integrity sha512-ktWCpWP2HsV/b+S9un75XS+HdTTzQ6ZLxBgpyD0g8eSRPyzpXcVQGwd3ZRa7cXXIEuurhoVwlqDGo1Rtcu4flQ== dependencies: "@probe.gl/env" "^4.0.8" "@webgpu/types" "^0.1.34" - wgsl_reflect "^1.2.1" "@lumino/algorithm@^1.9.0", "@lumino/algorithm@^1.9.2": version "1.9.2" @@ -1825,14 +1952,14 @@ dependencies: "@probe.gl/env" "4.1.0" -"@probe.gl/log@4.1.1", "@probe.gl/log@^4.0.8", "@probe.gl/log@^4.1.1": +"@probe.gl/log@4.1.1", "@probe.gl/log@^4.0.2", "@probe.gl/log@^4.0.4", "@probe.gl/log@^4.0.8", "@probe.gl/log@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@probe.gl/log/-/log-4.1.1.tgz#9b916545fed02971a3ac05fdb620ad5bd4dadb4d" integrity sha512-kcZs9BT44pL7hS1OkRGKYRXI/SN9KejUlPD+BY40DguRLzdC5tLG/28WGMyfKdn/51GT4a0p+0P8xvDn1Ez+Kg== dependencies: "@probe.gl/env" "4.1.1" -"@probe.gl/stats@^4.0.2", "@probe.gl/stats@^4.0.8": +"@probe.gl/stats@^4.0.0", "@probe.gl/stats@^4.0.2", "@probe.gl/stats@^4.0.8": version "4.1.0" resolved "https://registry.yarnpkg.com/@probe.gl/stats/-/stats-4.1.0.tgz#181b774b31f7f3c91f9750e41ccd72f6c8c4ad93" integrity sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ== @@ -1864,6 +1991,131 @@ tar-fs "^3.1.1" yargs "^17.7.2" +"@rollup/rollup-android-arm-eabi@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz#a6742c74c7d9d6d604ef8a48f99326b4ecda3d82" + integrity sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg== + +"@rollup/rollup-android-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz#97247be098de4df0c11971089fd2edf80a5da8cf" + integrity sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q== + +"@rollup/rollup-darwin-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz#674852cf14cf11b8056e0b1a2f4e872b523576cf" + integrity sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg== + +"@rollup/rollup-darwin-x64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz#36dfd7ed0aaf4d9d89d9ef983af72632455b0246" + integrity sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w== + +"@rollup/rollup-freebsd-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz#2f87c2074b4220260fdb52a9996246edfc633c22" + integrity sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA== + +"@rollup/rollup-freebsd-x64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz#9b5a26522a38a95dc06616d1939d4d9a76937803" + integrity sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg== + +"@rollup/rollup-linux-arm-gnueabihf@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz#86aa4859385a8734235b5e40a48e52d770758c3a" + integrity sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw== + +"@rollup/rollup-linux-arm-musleabihf@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz#cbe70e56e6ece8dac83eb773b624fc9e5a460976" + integrity sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA== + +"@rollup/rollup-linux-arm64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz#d14992a2e653bc3263d284bc6579b7a2890e1c45" + integrity sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA== + +"@rollup/rollup-linux-arm64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz#2fdd1ddc434ea90aeaa0851d2044789b4d07f6da" + integrity sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA== + +"@rollup/rollup-linux-loong64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz#8a181e6f89f969f21666a743cd411416c80099e7" + integrity sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg== + +"@rollup/rollup-linux-loong64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz#904125af2babc395f8061daa27b5af1f4e3f2f78" + integrity sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q== + +"@rollup/rollup-linux-ppc64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz#a57970ac6864c9a3447411a658224bdcf948be22" + integrity sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA== + +"@rollup/rollup-linux-ppc64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz#bb84de5b26870567a4267666e08891e80bb56a63" + integrity sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA== + +"@rollup/rollup-linux-riscv64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz#72d00d2c7fb375ce3564e759db33f17a35bffab9" + integrity sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg== + +"@rollup/rollup-linux-riscv64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz#4c166ef58e718f9245bd31873384ba15a5c1a883" + integrity sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg== + +"@rollup/rollup-linux-s390x-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz#bb5025cde9a61db478c2ca7215808ad3bce73a09" + integrity sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w== + +"@rollup/rollup-linux-x64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz#9b66b1f9cd95c6624c788f021c756269ffed1552" + integrity sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg== + +"@rollup/rollup-linux-x64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz#b007ca255dc7166017d57d7d2451963f0bd23fd9" + integrity sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg== + +"@rollup/rollup-openbsd-x64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz#e8b357b2d1aa2c8d76a98f5f0d889eabe93f4ef9" + integrity sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ== + +"@rollup/rollup-openharmony-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz#96c2e3f4aacd3d921981329831ff8dde492204dc" + integrity sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA== + +"@rollup/rollup-win32-arm64-msvc@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz#2d865149d706d938df8b4b8f117e69a77646d581" + integrity sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A== + +"@rollup/rollup-win32-ia32-msvc@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz#abe1593be0fa92325e9971c8da429c5e05b92c36" + integrity sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA== + +"@rollup/rollup-win32-x64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz#c4af3e9518c9a5cd4b1c163dc81d0ad4d82e7eab" + integrity sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA== + +"@rollup/rollup-win32-x64-msvc@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz#4584a8a87b29188a4c1fe987a9fcf701e256d86c" + integrity sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA== + "@sigstore/bundle@^2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" @@ -1915,18 +2167,16 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@standard-schema/spec@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== + "@stencil/core@4.20.0": version "4.20.0" resolved "https://registry.yarnpkg.com/@stencil/core/-/core-4.20.0.tgz#221f2b36ab999891560449b02d6915862c435f49" integrity sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg== -"@swc/helpers@^0.5.11": - version "0.5.18" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.18.tgz#feeeabea0d10106ee25aaf900165df911ab6d3b1" - integrity sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ== - dependencies: - tslib "^2.8.0" - "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -2037,6 +2287,14 @@ dependencies: "@types/node" "*" +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== + dependencies: + "@types/deep-eql" "*" + assertion-error "^2.0.1" + "@types/color-convert@*": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-2.0.3.tgz#e93f5c991eda87a945058b47044f5f0008b0dce9" @@ -2056,16 +2314,6 @@ dependencies: "@types/color-convert" "*" -"@types/command-line-args@^5.2.3": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@types/command-line-args/-/command-line-args-5.2.3.tgz#553ce2fd5acf160b448d307649b38ffc60d39639" - integrity sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw== - -"@types/command-line-usage@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/command-line-usage/-/command-line-usage-5.0.4.tgz#374e4c62d78fbc5a670a0f36da10235af879a0d5" - integrity sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg== - "@types/crypto-js@^4.0.2": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.2.2.tgz#771c4a768d94eb5922cc202a3009558204df0cea" @@ -2093,6 +2341,16 @@ resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.4.tgz#43587aa57d565ab60a1d2201edeebc497d5c1252" integrity sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw== +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/estree@1.0.8", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + "@types/geojson-vt@3.2.5": version "3.2.5" resolved "https://registry.yarnpkg.com/@types/geojson-vt/-/geojson-vt-3.2.5.tgz#b6c356874991d9ab4207533476dfbcdb21e38408" @@ -2156,13 +2414,6 @@ dependencies: undici-types "~6.19.2" -"@types/node@^24.0.3": - version "24.10.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.9.tgz#1aeb5142e4a92957489cac12b07f9c7fe26057d0" - integrity sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw== - dependencies: - undici-types "~7.16.0" - "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -2530,6 +2781,64 @@ ts-patch "^3.1.2" typescript "^5.2.2" +"@vitest/expect@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.0.18.tgz#361510d99fbf20eb814222e4afcb8539d79dc94d" + integrity sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ== + dependencies: + "@standard-schema/spec" "^1.0.0" + "@types/chai" "^5.2.2" + "@vitest/spy" "4.0.18" + "@vitest/utils" "4.0.18" + chai "^6.2.1" + tinyrainbow "^3.0.3" + +"@vitest/mocker@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.0.18.tgz#b9735da114ef65ea95652c5bdf13159c6fab4865" + integrity sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ== + dependencies: + "@vitest/spy" "4.0.18" + estree-walker "^3.0.3" + magic-string "^0.30.21" + +"@vitest/pretty-format@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.0.18.tgz#fbccd4d910774072ec15463553edb8ca5ce53218" + integrity sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw== + dependencies: + tinyrainbow "^3.0.3" + +"@vitest/runner@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.0.18.tgz#c2c0a3ed226ec85e9312f9cc8c43c5b3a893a8b1" + integrity sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw== + dependencies: + "@vitest/utils" "4.0.18" + pathe "^2.0.3" + +"@vitest/snapshot@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.0.18.tgz#bcb40fd6d742679c2ac927ba295b66af1c6c34c5" + integrity sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA== + dependencies: + "@vitest/pretty-format" "4.0.18" + magic-string "^0.30.21" + pathe "^2.0.3" + +"@vitest/spy@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.0.18.tgz#ba0f20503fb6d08baf3309d690b3efabdfa88762" + integrity sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw== + +"@vitest/utils@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.0.18.tgz#9636b16d86a4152ec68a8d6859cff702896433d4" + integrity sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA== + dependencies: + "@vitest/pretty-format" "4.0.18" + tinyrainbow "^3.0.3" + "@webcomponents/shadycss@^1.9.1": version "1.11.2" resolved "https://registry.yarnpkg.com/@webcomponents/shadycss/-/shadycss-1.11.2.tgz#7539b0ad29598aa2eafee8b341059e20ac9e1006" @@ -2713,21 +3022,6 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -"apache-arrow@>= 17.0.0": - version "21.1.0" - resolved "https://registry.yarnpkg.com/apache-arrow/-/apache-arrow-21.1.0.tgz#0b8d0a844d7a86cc29902f3561bf8be7844b7b36" - integrity sha512-kQrYLxhC+NTVVZ4CCzGF6L/uPVOzJmD1T3XgbiUnP7oTeVFOFgEUu6IKNwCDkpFoBVqDKQivlX4RUFqqnWFlEA== - dependencies: - "@swc/helpers" "^0.5.11" - "@types/command-line-args" "^5.2.3" - "@types/command-line-usage" "^5.0.4" - "@types/node" "^24.0.3" - command-line-args "^6.0.1" - command-line-usage "^7.0.1" - flatbuffers "^25.1.24" - json-bignum "^0.0.3" - tslib "^2.6.2" - aproba@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" @@ -2757,11 +3051,6 @@ aria-query@~5.1.3: dependencies: deep-equal "^2.0.5" -array-back@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157" - integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw== - array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -2888,6 +3177,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + ast-types-flow@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" @@ -3201,12 +3495,10 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk-template@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" - integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== - dependencies: - chalk "^4.1.2" +chai@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.2.tgz#ae41b52c9aca87734505362717f3255facda360e" + integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== chalk@4.1.0: version "4.1.0" @@ -3421,26 +3713,6 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -command-line-args@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-6.0.1.tgz#cbd1efb4f72b285dbd54bde9a8585c2d9694b070" - integrity sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg== - dependencies: - array-back "^6.2.2" - find-replace "^5.0.2" - lodash.camelcase "^4.3.0" - typical "^7.2.0" - -command-line-usage@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.3.tgz#6bce992354f6af10ecea2b631bfdf0c8b3bfaea3" - integrity sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q== - dependencies: - array-back "^6.2.2" - chalk-template "^0.4.0" - table-layout "^4.1.0" - typical "^7.1.1" - commander@2, commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -4263,6 +4535,11 @@ es-iterator-helpers@^1.0.19: iterator.prototype "^1.1.2" safe-array-concat "^1.1.2" +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" @@ -4356,6 +4633,38 @@ esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +esbuild@^0.27.0: + version "0.27.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8" + integrity sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.27.3" + "@esbuild/android-arm" "0.27.3" + "@esbuild/android-arm64" "0.27.3" + "@esbuild/android-x64" "0.27.3" + "@esbuild/darwin-arm64" "0.27.3" + "@esbuild/darwin-x64" "0.27.3" + "@esbuild/freebsd-arm64" "0.27.3" + "@esbuild/freebsd-x64" "0.27.3" + "@esbuild/linux-arm" "0.27.3" + "@esbuild/linux-arm64" "0.27.3" + "@esbuild/linux-ia32" "0.27.3" + "@esbuild/linux-loong64" "0.27.3" + "@esbuild/linux-mips64el" "0.27.3" + "@esbuild/linux-ppc64" "0.27.3" + "@esbuild/linux-riscv64" "0.27.3" + "@esbuild/linux-s390x" "0.27.3" + "@esbuild/linux-x64" "0.27.3" + "@esbuild/netbsd-arm64" "0.27.3" + "@esbuild/netbsd-x64" "0.27.3" + "@esbuild/openbsd-arm64" "0.27.3" + "@esbuild/openbsd-x64" "0.27.3" + "@esbuild/openharmony-arm64" "0.27.3" + "@esbuild/sunos-x64" "0.27.3" + "@esbuild/win32-arm64" "0.27.3" + "@esbuild/win32-ia32" "0.27.3" + "@esbuild/win32-x64" "0.27.3" + escalade@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -4584,6 +4893,13 @@ estree-walker@^0.6.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -4616,6 +4932,11 @@ execa@5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +expect-type@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.3.0.tgz#0d58ed361877a31bbc4dd6cf71bbfef7faf6bd68" + integrity sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== + exponential-backoff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" @@ -4687,12 +5008,12 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-xml-parser@^5.3.6: - version "5.3.7" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.3.7.tgz#81694e71ff0e568cbb6befade342f2a7e58aa1d9" - integrity sha512-JzVLro9NQv92pOM/jTCR6mHlJh2FGwtomH8ZQjhFj/R29P2Fnj38OgPJVtcvYw6SuKClhgYuwUZf5b3rd8u2mA== +fast-xml-parser@^4.2.5: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== dependencies: - strnum "^2.1.2" + strnum "^1.0.5" fastq@^1.6.0: version "1.17.1" @@ -4708,6 +5029,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + fflate@0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" @@ -4749,11 +5075,6 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -find-replace@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-5.0.2.tgz#fe27ff0be05975aef6fc679c1139bbabea564e26" - integrity sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q== - find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -4791,11 +5112,6 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatbuffers@^25.1.24: - version "25.9.23" - resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-25.9.23.tgz#346811557fe9312ab5647535e793c761e9c81eb1" - integrity sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ== - flatted@^3.2.9: version "3.3.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" @@ -4899,7 +5215,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -6060,11 +6376,6 @@ jsep@^1.4.0: resolved "https://registry.yarnpkg.com/jsep/-/jsep-1.4.0.tgz#19feccbfa51d8a79f72480b4b8e40ce2e17152f0" integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== -json-bignum@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/json-bignum/-/json-bignum-0.0.3.tgz#41163b50436c773d82424dbc20ed70db7604b8d7" - integrity sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -6441,11 +6752,6 @@ lodash-es@4.17.21: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -6526,6 +6832,11 @@ lz4js@^0.2.0: resolved "https://registry.yarnpkg.com/lz4js/-/lz4js-0.2.0.tgz#09f1a397cb2158f675146c3351dde85058cb322f" integrity sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg== +lzo-wasm@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/lzo-wasm/-/lzo-wasm-0.0.4.tgz#49152521a0b67a1da3a3e113dd38f150f303230a" + integrity sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw== + magic-string@^0.25.3: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -6533,6 +6844,13 @@ magic-string@^0.25.3: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.30.21: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + make-dir@4.0.0, make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -6955,6 +7273,11 @@ mute-stream@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + nanoid@^3.3.7: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" @@ -7293,6 +7616,11 @@ object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: define-properties "^1.2.1" es-object-atoms "^1.0.0" +obug@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" + integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== + omggif@^1.0.5: version "1.0.10" resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" @@ -7664,6 +7992,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + pbf@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.3.0.tgz#1790f3d99118333cc7f498de816028a346ef367f" @@ -7694,11 +8027,21 @@ picocolors@^1.0.0, picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + pify@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" @@ -7770,6 +8113,15 @@ postcss@^8.4.27: picocolors "^1.0.1" source-map-js "^1.2.0" +postcss@^8.5.6: + version "8.5.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" + integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + potpack@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" @@ -8343,6 +8695,40 @@ rollup@^3.27.1: optionalDependencies: fsevents "~2.3.2" +rollup@^4.43.0: + version "4.59.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.59.0.tgz#cf74edac17c1486f562d728a4d923a694abdf06f" + integrity sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.59.0" + "@rollup/rollup-android-arm64" "4.59.0" + "@rollup/rollup-darwin-arm64" "4.59.0" + "@rollup/rollup-darwin-x64" "4.59.0" + "@rollup/rollup-freebsd-arm64" "4.59.0" + "@rollup/rollup-freebsd-x64" "4.59.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.59.0" + "@rollup/rollup-linux-arm-musleabihf" "4.59.0" + "@rollup/rollup-linux-arm64-gnu" "4.59.0" + "@rollup/rollup-linux-arm64-musl" "4.59.0" + "@rollup/rollup-linux-loong64-gnu" "4.59.0" + "@rollup/rollup-linux-loong64-musl" "4.59.0" + "@rollup/rollup-linux-ppc64-gnu" "4.59.0" + "@rollup/rollup-linux-ppc64-musl" "4.59.0" + "@rollup/rollup-linux-riscv64-gnu" "4.59.0" + "@rollup/rollup-linux-riscv64-musl" "4.59.0" + "@rollup/rollup-linux-s390x-gnu" "4.59.0" + "@rollup/rollup-linux-x64-gnu" "4.59.0" + "@rollup/rollup-linux-x64-musl" "4.59.0" + "@rollup/rollup-openbsd-x64" "4.59.0" + "@rollup/rollup-openharmony-arm64" "4.59.0" + "@rollup/rollup-win32-arm64-msvc" "4.59.0" + "@rollup/rollup-win32-ia32-msvc" "4.59.0" + "@rollup/rollup-win32-x64-gnu" "4.59.0" + "@rollup/rollup-win32-x64-msvc" "4.59.0" + fsevents "~2.3.2" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -8528,6 +8914,11 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@3.0.7, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -8620,6 +9011,11 @@ source-map-js@^1.2.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -8717,6 +9113,16 @@ ssri@^10.0.0, ssri@^10.0.6: dependencies: minipass "^7.0.3" +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -8903,10 +9309,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strnum@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a" - integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: version "2.1.0" @@ -8965,14 +9371,6 @@ tabbable@^6.2.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -table-layout@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-4.1.1.tgz#0f72965de1a5c0c1419c9ba21cae4e73a2f73a42" - integrity sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA== - dependencies: - array-back "^6.2.2" - wordwrapjs "^5.1.0" - tap-out@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tap-out/-/tap-out-2.1.0.tgz#c093079a915036de8b835bfa3297f14458b15358" @@ -9139,6 +9537,24 @@ timezone-groups@0.10.2: resolved "https://registry.yarnpkg.com/timezone-groups/-/timezone-groups-0.10.2.tgz#34afa8dd7049726b286521a47461417162689731" integrity sha512-01G9JdlIybA9Njp0wJcGenXKWAw+woWbv6W/oMexWyPs7Nr/S2p2n1NRrMHbHaFzdf+PNNStQp1WILdnAGjYXQ== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251" + integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== + +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + tinyqueue@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" @@ -9149,6 +9565,11 @@ tinyqueue@^3.0.0: resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-3.0.0.tgz#101ea761ccc81f979e29200929e78f1556e3661e" integrity sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g== +tinyrainbow@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.0.3.tgz#984a5b1c1b25854a9b6bccbe77964d0593d1ea42" + integrity sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -9273,11 +9694,6 @@ tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -tslib@^2.6.2, tslib@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - tuf-js@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56" @@ -9409,11 +9825,6 @@ typescript-eslint@^7.7.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== -typical@^7.1.1, typical@^7.2.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-7.3.0.tgz#930376be344228709f134613911fa22aa09617a4" - integrity sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw== - uglify-js@^3.1.4: version "3.19.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.2.tgz#319ae26a5fbd18d03c7dc02496cfa1d6f1cd4307" @@ -9439,11 +9850,6 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== - uniq@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" @@ -9567,6 +9973,46 @@ vite@^4.5.0: optionalDependencies: fsevents "~2.3.2" +"vite@^6.0.0 || ^7.0.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.1.tgz#7f6cfe8fb9074138605e822a75d9d30b814d6507" + integrity sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA== + dependencies: + esbuild "^0.27.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^4.0.18: + version "4.0.18" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.0.18.tgz#56f966353eca0b50f4df7540cd4350ca6d454a05" + integrity sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ== + dependencies: + "@vitest/expect" "4.0.18" + "@vitest/mocker" "4.0.18" + "@vitest/pretty-format" "4.0.18" + "@vitest/runner" "4.0.18" + "@vitest/snapshot" "4.0.18" + "@vitest/spy" "4.0.18" + "@vitest/utils" "4.0.18" + es-module-lexer "^1.7.0" + expect-type "^1.2.2" + magic-string "^0.30.21" + obug "^2.1.1" + pathe "^2.0.3" + picomatch "^4.0.3" + std-env "^3.10.0" + tinybench "^2.9.0" + tinyexec "^1.0.2" + tinyglobby "^0.2.15" + tinyrainbow "^3.0.3" + vite "^6.0.0 || ^7.0.0" + why-is-node-running "^2.3.0" + vt-pbf@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" @@ -9615,7 +10061,7 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -wgsl_reflect@^1.2.0, wgsl_reflect@^1.2.1: +wgsl_reflect@^1.0.1, wgsl_reflect@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/wgsl_reflect/-/wgsl_reflect-1.2.0.tgz#37be44b292f93cbd64f6f994ab9a38214577ba32" integrity sha512-bDYcmWfbg4WsrBmPv6lsyjqXx02r8dkNAzR77OCNqIcR8snO4aNSBTjir9zqgR7rLnw6PaisiZxtCitSCIUlnQ== @@ -9726,6 +10172,14 @@ which@^4.0.0: dependencies: isexe "^3.1.1" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + wide-align@1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -9748,11 +10202,6 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -wordwrapjs@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.1.tgz#bfd1eb426f0f7eec73b7df32cf7df1f618bfb3a9" - integrity sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg== - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" From 8f6757b6cbc5b7d96315433d506a14561c740a0a Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Tue, 3 Mar 2026 20:14:13 -0800 Subject: [PATCH 02/10] ci: Add tape-compat and vitest-smoke tests to CI workflow Co-Authored-By: Claude Opus 4.5 --- .github/workflows/test.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d1f1a507af9..2dba7832db5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,6 +40,11 @@ jobs: yarn lint yarn test ci + - name: Run compat tests + run: | + yarn test-tape-compat + yarn test-vitest-smoke + - name: Coveralls uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6 with: From c8d58fc7e862121d25ff3b4022630b91586cb91d Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Tue, 3 Mar 2026 20:27:44 -0800 Subject: [PATCH 03/10] fix(examples): Disable import/namespace rule for vite config The eslint-plugin-import namespace rule fails parsing vite module internals. Co-Authored-By: Claude Opus 4.5 --- examples/vite.config.local.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/vite.config.local.mjs b/examples/vite.config.local.mjs index 38910afb79e..e0eaf388111 100644 --- a/examples/vite.config.local.mjs +++ b/examples/vite.config.local.mjs @@ -1,3 +1,4 @@ +/* eslint-disable import/namespace */ import {defineConfig} from 'vite'; import {getOcularConfig} from '@vis.gl/dev-tools'; import {join} from 'path'; From fd8efe998454c2cc43aecd225352c5b7fe63d176 Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Tue, 3 Mar 2026 20:36:43 -0800 Subject: [PATCH 04/10] fix(test-utils): Re-export from tape.ts for backward compat The index.ts was exporting directly from lifecycle-test.ts which requires createSpy, breaking existing tests. Now exports from tape.ts which provides a default spy factory. Co-Authored-By: Claude Opus 4.5 --- modules/test-utils/src/index.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/test-utils/src/index.ts b/modules/test-utils/src/index.ts index 35ad96edfc1..a4ba7fd1ebf 100644 --- a/modules/test-utils/src/index.ts +++ b/modules/test-utils/src/index.ts @@ -7,12 +7,8 @@ export {toLowPrecision} from './utils/precision'; export {gl, device} from './utils/setup-gl'; // Utilities for update tests (lifecycle tests) -export { - testLayer, - testLayerAsync, - testInitializeLayer, - testInitializeLayerAsync -} from './lifecycle-test'; +// Re-export from tape.ts which provides default spy factory for backward compat +export {testLayer, testLayerAsync, testInitializeLayer, testInitializeLayerAsync} from './tape'; export {generateLayerTests} from './generate-layer-tests'; // Basic utility for rendering multiple scenes (could go into "deck.gl/core") @@ -23,6 +19,6 @@ export {SnapshotTestRunner} from './snapshot-test-runner'; // A utility that emulates input events export {InteractionTestRunner} from './interaction-test-runner'; -export type {LayerTestCase} from './lifecycle-test'; +export type {LayerTestCase, SpyFactory} from './tape'; export type {SnapshotTestCase} from './snapshot-test-runner'; export type {InteractionTestCase} from './interaction-test-runner'; From 35e45db56eb6bb8f3ed75bf8e6418a6acf2917ce Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Wed, 4 Mar 2026 10:09:35 -0800 Subject: [PATCH 05/10] fix(test-utils): Restore JSDoc comments and add called to Spy type - Restore JSDoc comments that were stripped from lifecycle-test.ts - Add 'called' property to Spy type for TypeScript compatibility with probe.gl spies Co-Authored-By: Claude Opus 4.5 --- modules/test-utils/src/lifecycle-test.ts | 100 ++++++++++++++++++++--- 1 file changed, 90 insertions(+), 10 deletions(-) diff --git a/modules/test-utils/src/lifecycle-test.ts b/modules/test-utils/src/lifecycle-test.ts index 3d79ba914d8..a8e7c948a4b 100644 --- a/modules/test-utils/src/lifecycle-test.ts +++ b/modules/test-utils/src/lifecycle-test.ts @@ -9,12 +9,19 @@ import type {Layer, CompositeLayer, Viewport} from '@deck.gl/core'; import type {Timeline} from '@luma.gl/engine'; import type {StatsManager} from '@luma.gl/core'; -// Spy abstraction - supports both vitest and probe.gl spy implementations +/** + * Spy abstraction - supports both vitest and probe.gl spy implementations. + * This type captures the common interface needed for test assertions. + */ type Spy = { + // Cleanup methods mockRestore?: () => void; // vitest restore?: () => void; // probe.gl + + // Call tracking mock?: {calls: any[][]}; // vitest calls?: any[][]; // probe.gl + called?: boolean; // probe.gl - whether the spy was called }; export type SpyFactory = (obj: object, method: string) => Spy; @@ -40,8 +47,13 @@ function defaultOnError(error: unknown, title: string): void { } type InitializeLayerTestOptions = { + /** The layer instance to test */ layer: Layer; + /** The initial viewport + * @default WebMercatorViewport + */ viewport?: Viewport; + /** Callback if any error is thrown */ onError?: (error: unknown, title: string) => void; }; @@ -58,13 +70,34 @@ function initializeLayerManager({ return layerManager; } -export function testInitializeLayer(opts: InitializeLayerTestOptions & {finalize?: true}): null; -export function testInitializeLayer(opts: InitializeLayerTestOptions & {finalize: false}): { +/** + * Test that initializing a layer does not throw. + * Use `testInitializeLayerAsync` if the layer's initialization flow contains async operations. + */ +export function testInitializeLayer( + opts: InitializeLayerTestOptions & { + /** Automatically finalize the layer and release all resources after the test */ + finalize?: true; + } +): null; +export function testInitializeLayer( + opts: InitializeLayerTestOptions & { + /** Automatically finalize the layer and release all resources after the test */ + finalize: false; + } +): { + /** Finalize the layer and release all resources */ finalize: () => void; }; export function testInitializeLayer( - opts: InitializeLayerTestOptions & {finalize?: boolean} -): {finalize: () => void} | null { + opts: InitializeLayerTestOptions & { + /** Automatically finalize the layer and release all resources after the test */ + finalize?: boolean; + } +): { + /** Finalize the layer and release all resources */ + finalize: () => void; +} | null { const layerManager = initializeLayerManager(opts); if (opts.finalize === false) { return {finalize: () => layerManager.finalize()}; @@ -73,15 +106,34 @@ export function testInitializeLayer( return null; } +/** + * Test that initializing a layer does not throw. + * Resolves when the layer's isLoaded flag becomes true. + */ export function testInitializeLayerAsync( - opts: InitializeLayerTestOptions & {finalize?: true} + opts: InitializeLayerTestOptions & { + /** Automatically finalize the layer and release all resources after the test */ + finalize?: true; + } ): Promise; export function testInitializeLayerAsync( - opts: InitializeLayerTestOptions & {finalize: false} -): Promise<{finalize: () => void}>; + opts: InitializeLayerTestOptions & { + /** Automatically finalize the layer and release all resources after the test */ + finalize: false; + } +): Promise<{ + /** Finalize the layer and release all resources */ + finalize: () => void; +}>; export async function testInitializeLayerAsync( - opts: InitializeLayerTestOptions & {finalize?: boolean} -): Promise<{finalize: () => void} | null> { + opts: InitializeLayerTestOptions & { + /** Automatically finalize the layer and release all resources after the test */ + finalize?: boolean; + } +): Promise<{ + /** Finalize the layer and release all resources */ + finalize: () => void; +} | null> { const layerManager = initializeLayerManager(opts); const deckRenderer = new DeckRenderer(device); while (!opts.layer.isLoaded) { @@ -103,10 +155,15 @@ export type LayerClass = { export type LayerTestCase = { title: string; viewport?: Viewport; + /** Reset the props of the test layer instance */ props?: Partial; + /** Update the given props of the test layer instance */ updateProps?: Partial; + /** List of layer method names to watch */ spies?: string[]; + /** Called before layer updates */ onBeforeUpdate?: (params: {layer: Layer; testCase: LayerTestCase}) => void; + /** Called after layer is updated */ onAfterUpdate?: (params: { testCase: LayerTestCase; layer: LayerT; @@ -124,12 +181,20 @@ type TestResources = { }; export type TestLayerOptions = { + /** The layer class to test against */ Layer: LayerClass; + /** The initial viewport + * @default WebMercatorViewport + */ viewport?: Viewport; + /** If provided, used to controls time progression. Useful for testing transitions and animations. */ timeline?: Timeline; testCases?: LayerTestCase[]; + /** List of layer method names to watch */ spies?: string[]; + /** Factory function to create spies for layer methods */ createSpy: SpyFactory; + /** Callback if any error is thrown */ onError?: (error: Error, title: string) => void; }; @@ -143,7 +208,9 @@ export function testLayer(opts: TestLayerOptions): const resources = setupLayerTests(`testing ${Layer.layerName}`, opts); let layer = new Layer(); + // Run successive update tests for (const testCase of testCases) { + // Save old state before update const oldState = {...layer.state}; const {layer: newLayer, spyMap} = runLayerTestUpdate( testCase, @@ -153,6 +220,7 @@ export function testLayer(opts: TestLayerOptions): createSpy ); runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); + // Remove spies Object.keys(spyMap).forEach(k => restoreSpy(spyMap[k])); layer = newLayer; } @@ -175,7 +243,9 @@ export async function testLayerAsync( const resources = setupLayerTests(`testing ${Layer.layerName}`, opts); let layer = new Layer(); + // Run successive update tests for (const testCase of testCases) { + // Save old state before update const oldState = {...layer.state}; const {layer: newLayer, spyMap} = runLayerTestUpdate( testCase, @@ -191,6 +261,7 @@ export async function testLayerAsync( runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); } + // Remove spies Object.keys(spyMap).forEach(k => restoreSpy(spyMap[k])); layer = newLayer; } @@ -249,6 +320,7 @@ function cleanupAfterLayerTests({ } function getResourceCounts(): Record { + /* global luma */ const resourceStats = (luma.stats as StatsManager).get('Resource Counts'); return { Texture2D: resourceStats.get('Texture2Ds Active').count, @@ -272,7 +344,10 @@ function runLayerTestPostUpdateCheck( oldState: any, spyMap: Record ) { + // assert on updated layer if (testCase.onAfterUpdate) { + // layer manager should handle match subLayer and tranfer state and props + // here we assume subLayer matches copy over the new props from a new subLayer const subLayers = newLayer.isComposite ? (newLayer as Layer as CompositeLayer).getSubLayers() : []; @@ -302,11 +377,14 @@ function runLayerTestUpdate( } if (props) { + // Test case can reset the props on every iteration layer = new (layer.constructor as LayerClass)(props); } else if (updateProps) { + // Test case can override with new props on every iteration layer = layer.clone(updateProps); } + // Create a map of spies that the test case can inspect spies = testCase.spies || spies; const spyMap = injectSpies(layer, spies, spyFactory); const drawLayers = () => { @@ -323,6 +401,7 @@ function runLayerTestUpdate( layerManager.setLayers([layer]); drawLayers(); + // clear update flags set by viewport change, if any if (layerManager.needsUpdate()) { layerManager.updateLayers(); drawLayers(); @@ -331,6 +410,7 @@ function runLayerTestUpdate( return {layer, spyMap}; } +/* global setTimeout */ function update({layerManager, deckRenderer}: TestResources): Promise { return new Promise(resolve => { const onAnimationFrame = () => { From 1ee36d4ba2c2c2bf297ce4d2cac97a21398f4d2c Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Wed, 4 Mar 2026 13:19:40 -0800 Subject: [PATCH 06/10] fix(test-utils): Preserve original file formatting Restore original lifecycle-test.ts and reapply minimal SpyFactory abstraction changes to avoid unintended formatting modifications. Co-Authored-By: Claude Opus 4.6 --- modules/test-utils/src/lifecycle-test.ts | 99 +++++++++++++++--------- 1 file changed, 63 insertions(+), 36 deletions(-) diff --git a/modules/test-utils/src/lifecycle-test.ts b/modules/test-utils/src/lifecycle-test.ts index a8e7c948a4b..1d10913ed74 100644 --- a/modules/test-utils/src/lifecycle-test.ts +++ b/modules/test-utils/src/lifecycle-test.ts @@ -3,37 +3,13 @@ // Copyright (c) vis.gl contributors import {LayerManager, MapView, DeckRenderer} from '@deck.gl/core'; + import {device} from './utils/setup-gl'; import type {Layer, CompositeLayer, Viewport} from '@deck.gl/core'; import type {Timeline} from '@luma.gl/engine'; import type {StatsManager} from '@luma.gl/core'; -/** - * Spy abstraction - supports both vitest and probe.gl spy implementations. - * This type captures the common interface needed for test assertions. - */ -type Spy = { - // Cleanup methods - mockRestore?: () => void; // vitest - restore?: () => void; // probe.gl - - // Call tracking - mock?: {calls: any[][]}; // vitest - calls?: any[][]; // probe.gl - called?: boolean; // probe.gl - whether the spy was called -}; - -export type SpyFactory = (obj: object, method: string) => Spy; - -function restoreSpy(spy: Spy): void { - if (spy.mockRestore) { - spy.mockRestore(); - } else if (spy.restore) { - spy.restore(); - } -} - const testViewport = new MapView({}).makeViewport({ width: 100, height: 100, @@ -66,12 +42,12 @@ function initializeLayerManager({ layerManager.setProps({ onError: error => onError(error, `initializing ${layer.id}`) }); + layerManager.setLayers([layer]); return layerManager; } -/** - * Test that initializing a layer does not throw. +/** Test that initializing a layer does not throw. * Use `testInitializeLayerAsync` if the layer's initialization flow contains async operations. */ export function testInitializeLayer( @@ -89,6 +65,7 @@ export function testInitializeLayer( /** Finalize the layer and release all resources */ finalize: () => void; }; + export function testInitializeLayer( opts: InitializeLayerTestOptions & { /** Automatically finalize the layer and release all resources after the test */ @@ -100,14 +77,15 @@ export function testInitializeLayer( } | null { const layerManager = initializeLayerManager(opts); if (opts.finalize === false) { - return {finalize: () => layerManager.finalize()}; + return { + finalize: () => layerManager.finalize() + }; } layerManager.finalize(); return null; } -/** - * Test that initializing a layer does not throw. +/** Test that initializing a layer does not throw. * Resolves when the layer's isLoaded flag becomes true. */ export function testInitializeLayerAsync( @@ -125,6 +103,7 @@ export function testInitializeLayerAsync( /** Finalize the layer and release all resources */ finalize: () => void; }>; + export async function testInitializeLayerAsync( opts: InitializeLayerTestOptions & { /** Automatically finalize the layer and release all resources after the test */ @@ -140,12 +119,40 @@ export async function testInitializeLayerAsync( await update({layerManager, deckRenderer, oldResourceCounts: {}}); } if (opts.finalize === false) { - return {finalize: () => layerManager.finalize()}; + return { + finalize: () => layerManager.finalize() + }; } layerManager.finalize(); return null; } +/** Spy object compatible with both vitest and probe.gl */ +export type Spy = { + /** Restore the original method (vitest) */ + mockRestore?: () => void; + /** Restore the original method (probe.gl) */ + restore?: () => void; + /** Call history (vitest) */ + mock?: {calls: unknown[][]}; + /** Call history (probe.gl) */ + calls?: unknown[][]; + /** Whether the spy was called (probe.gl) */ + called?: boolean; +}; + +/** Factory function to create a spy on an object method */ +export type SpyFactory = (obj: object, method: string) => Spy; + +/** Restore a spy to its original implementation */ +function restoreSpy(spy: Spy): void { + if (spy.mockRestore) { + spy.mockRestore(); + } else if (spy.restore) { + spy.restore(); + } +} + export type LayerClass = { new (...args): LayerT; layerName: string; @@ -161,8 +168,10 @@ export type LayerTestCase = { updateProps?: Partial; /** List of layer method names to watch */ spies?: string[]; + /** Called before layer updates */ onBeforeUpdate?: (params: {layer: Layer; testCase: LayerTestCase}) => void; + /** Called after layer is updated */ onAfterUpdate?: (params: { testCase: LayerTestCase; @@ -187,15 +196,19 @@ export type TestLayerOptions = { * @default WebMercatorViewport */ viewport?: Viewport; - /** If provided, used to controls time progression. Useful for testing transitions and animations. */ + /** + * If provided, used to controls time progression. Useful for testing transitions and animations. + */ timeline?: Timeline; testCases?: LayerTestCase[]; - /** List of layer method names to watch */ + /** + * List of layer method names to watch + */ spies?: string[]; - /** Factory function to create spies for layer methods */ - createSpy: SpyFactory; /** Callback if any error is thrown */ onError?: (error: Error, title: string) => void; + /** Factory function to create spies */ + createSpy: SpyFactory; }; /** @@ -212,6 +225,7 @@ export function testLayer(opts: TestLayerOptions): for (const testCase of testCases) { // Save old state before update const oldState = {...layer.state}; + const {layer: newLayer, spyMap} = runLayerTestUpdate( testCase, resources, @@ -219,7 +233,9 @@ export function testLayer(opts: TestLayerOptions): spies, createSpy ); + runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); + // Remove spies Object.keys(spyMap).forEach(k => restoreSpy(spyMap[k])); layer = newLayer; @@ -247,6 +263,7 @@ export async function testLayerAsync( for (const testCase of testCases) { // Save old state before update const oldState = {...layer.state}; + const {layer: newLayer, spyMap} = runLayerTestUpdate( testCase, resources, @@ -254,6 +271,7 @@ export async function testLayerAsync( spies, createSpy ); + runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); while (!newLayer.isLoaded) { @@ -285,6 +303,7 @@ function setupLayerTests( } ): TestResources { const oldResourceCounts = getResourceCounts(); + const layerManager = new LayerManager(device, {viewport, timeline}); const deckRenderer = new DeckRenderer(device); @@ -309,6 +328,7 @@ function cleanupAfterLayerTests({ deckRenderer.finalize(); const resourceCounts = getResourceCounts(); + for (const resourceName in resourceCounts) { if (resourceCounts[resourceName] !== oldResourceCounts[resourceName]) { return new Error( @@ -352,6 +372,7 @@ function runLayerTestPostUpdateCheck( ? (newLayer as Layer as CompositeLayer).getSubLayers() : []; const subLayer = subLayers.length ? subLayers[0] : null; + testCase.onAfterUpdate({ testCase, layer: newLayer, @@ -369,7 +390,10 @@ function runLayerTestUpdate( layer: LayerT, spies: string[], spyFactory: SpyFactory -): {layer: LayerT; spyMap: Record} { +): { + layer: LayerT; + spyMap: Record; +} { const {props, updateProps, onBeforeUpdate, viewport = layerManager.context.viewport} = testCase; if (onBeforeUpdate) { @@ -416,6 +440,7 @@ function update({layerManager, deckRenderer}: TestResources): Promise { const onAnimationFrame = () => { if (layerManager.needsUpdate()) { layerManager.updateLayers(); + deckRenderer.renderLayers({ pass: 'test', views: {}, @@ -427,8 +452,10 @@ function update({layerManager, deckRenderer}: TestResources): Promise { resolve(); return; } + setTimeout(onAnimationFrame, 50); }; + onAnimationFrame(); }); } From 0db418ef3ab56e56a6e75a93cc864fdac6029230 Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Wed, 4 Mar 2026 13:37:39 -0800 Subject: [PATCH 07/10] refactor(test-utils): Add resetSpy injection for framework-agnostic spy cleanup - Remove vitest-specific restoreSpy from core lifecycle-test.ts - Add ResetSpy type and resetSpy option to TestLayerOptions - tape.ts: default resetSpy calls spy.reset() (preserves original behavior) - vitest.ts: default resetSpy calls spy.mockRestore() This keeps the core library framework-agnostic by letting each entry point define its own spy cleanup behavior. Co-Authored-By: Claude Opus 4.6 --- modules/test-utils/src/index.ts | 2 +- modules/test-utils/src/lifecycle-test.ts | 24 ++++++++------------ modules/test-utils/src/tape.ts | 29 +++++++++++++++++++----- modules/test-utils/src/vitest.ts | 25 ++++++++++++++------ 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/modules/test-utils/src/index.ts b/modules/test-utils/src/index.ts index a4ba7fd1ebf..e8ce7a3e780 100644 --- a/modules/test-utils/src/index.ts +++ b/modules/test-utils/src/index.ts @@ -19,6 +19,6 @@ export {SnapshotTestRunner} from './snapshot-test-runner'; // A utility that emulates input events export {InteractionTestRunner} from './interaction-test-runner'; -export type {LayerTestCase, SpyFactory} from './tape'; +export type {LayerTestCase, ResetSpy, SpyFactory} from './tape'; export type {SnapshotTestCase} from './snapshot-test-runner'; export type {InteractionTestCase} from './interaction-test-runner'; diff --git a/modules/test-utils/src/lifecycle-test.ts b/modules/test-utils/src/lifecycle-test.ts index 1d10913ed74..4d835f70ec2 100644 --- a/modules/test-utils/src/lifecycle-test.ts +++ b/modules/test-utils/src/lifecycle-test.ts @@ -144,14 +144,8 @@ export type Spy = { /** Factory function to create a spy on an object method */ export type SpyFactory = (obj: object, method: string) => Spy; -/** Restore a spy to its original implementation */ -function restoreSpy(spy: Spy): void { - if (spy.mockRestore) { - spy.mockRestore(); - } else if (spy.restore) { - spy.restore(); - } -} +/** Function to reset/cleanup a spy after each test case */ +export type ResetSpy = (spy: Spy) => void; export type LayerClass = { new (...args): LayerT; @@ -209,6 +203,8 @@ export type TestLayerOptions = { onError?: (error: Error, title: string) => void; /** Factory function to create spies */ createSpy: SpyFactory; + /** Function to reset/cleanup a spy after each test case */ + resetSpy: ResetSpy; }; /** @@ -216,7 +212,7 @@ export type TestLayerOptions = { * Use `testLayerAsync` if the layer's update flow contains async operations. */ export function testLayer(opts: TestLayerOptions): void { - const {Layer, testCases = [], spies = [], onError = defaultOnError, createSpy} = opts; + const {Layer, testCases = [], spies = [], onError = defaultOnError, createSpy, resetSpy} = opts; const resources = setupLayerTests(`testing ${Layer.layerName}`, opts); @@ -236,8 +232,8 @@ export function testLayer(opts: TestLayerOptions): runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); - // Remove spies - Object.keys(spyMap).forEach(k => restoreSpy(spyMap[k])); + // Reset spies between test cases + Object.keys(spyMap).forEach(k => resetSpy(spyMap[k])); layer = newLayer; } @@ -254,7 +250,7 @@ export function testLayer(opts: TestLayerOptions): export async function testLayerAsync( opts: TestLayerOptions ): Promise { - const {Layer, testCases = [], spies = [], onError = defaultOnError, createSpy} = opts; + const {Layer, testCases = [], spies = [], onError = defaultOnError, createSpy, resetSpy} = opts; const resources = setupLayerTests(`testing ${Layer.layerName}`, opts); @@ -279,8 +275,8 @@ export async function testLayerAsync( runLayerTestPostUpdateCheck(testCase, newLayer, oldState, spyMap); } - // Remove spies - Object.keys(spyMap).forEach(k => restoreSpy(spyMap[k])); + // Reset spies between test cases + Object.keys(spyMap).forEach(k => resetSpy(spyMap[k])); layer = newLayer; } diff --git a/modules/test-utils/src/tape.ts b/modules/test-utils/src/tape.ts index f10400532d3..3926af9135d 100644 --- a/modules/test-utils/src/tape.ts +++ b/modules/test-utils/src/tape.ts @@ -13,10 +13,16 @@ import { testInitializeLayerAsync } from './lifecycle-test'; import type {Layer} from '@deck.gl/core'; -import type {LayerClass, LayerTestCase, SpyFactory, TestLayerOptions} from './lifecycle-test'; +import type { + LayerClass, + LayerTestCase, + ResetSpy, + SpyFactory, + TestLayerOptions +} from './lifecycle-test'; export {testInitializeLayer, testInitializeLayerAsync}; -export type {LayerClass, LayerTestCase, SpyFactory}; +export type {LayerClass, LayerTestCase, ResetSpy, SpyFactory}; let _hasWarnedDeprecation = false; @@ -33,15 +39,22 @@ function getDefaultSpyFactory(): SpyFactory { return makeSpy; } +/** Default reset for probe.gl spies - clears call tracking but keeps spy active */ +const defaultResetSpy: ResetSpy = spy => (spy as ReturnType).reset(); + /** * Initialize and updates a layer over a sequence of scenarios (test cases). * Use `testLayerAsync` if the layer's update flow contains async operations. */ export function testLayer( - opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} + opts: Omit, 'createSpy' | 'resetSpy'> & { + createSpy?: SpyFactory; + resetSpy?: ResetSpy; + } ): void { const createSpy = opts.createSpy || getDefaultSpyFactory(); - testLayerCore({...opts, createSpy}); + const resetSpy = opts.resetSpy || defaultResetSpy; + testLayerCore({...opts, createSpy, resetSpy}); } /** @@ -49,8 +62,12 @@ export function testLayer( * Each test case is awaited until the layer's isLoaded flag is true. */ export async function testLayerAsync( - opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} + opts: Omit, 'createSpy' | 'resetSpy'> & { + createSpy?: SpyFactory; + resetSpy?: ResetSpy; + } ): Promise { const createSpy = opts.createSpy || getDefaultSpyFactory(); - await testLayerAsyncCore({...opts, createSpy}); + const resetSpy = opts.resetSpy || defaultResetSpy; + await testLayerAsyncCore({...opts, createSpy, resetSpy}); } diff --git a/modules/test-utils/src/vitest.ts b/modules/test-utils/src/vitest.ts index 0a48b0bbeb4..fad0e5d0b8d 100644 --- a/modules/test-utils/src/vitest.ts +++ b/modules/test-utils/src/vitest.ts @@ -8,23 +8,34 @@ import {vi} from 'vitest'; import {testLayer as testLayerCore, testLayerAsync as testLayerAsyncCore} from './lifecycle-test'; import type {Layer} from '@deck.gl/core'; -import type {SpyFactory, TestLayerOptions} from './lifecycle-test'; +import type {ResetSpy, SpyFactory, TestLayerOptions} from './lifecycle-test'; -// Default spy factory using vi.spyOn +/** Default spy factory using vi.spyOn */ const defaultSpyFactory: SpyFactory = (obj, method) => vi.spyOn(obj, method as never); +/** Default reset for vitest spies - restores original implementation */ +const defaultResetSpy: ResetSpy = spy => spy.mockRestore?.(); + export function testLayer( - opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} + opts: Omit, 'createSpy' | 'resetSpy'> & { + createSpy?: SpyFactory; + resetSpy?: ResetSpy; + } ) { const createSpy = opts.createSpy || defaultSpyFactory; - return testLayerCore({...opts, createSpy}); + const resetSpy = opts.resetSpy || defaultResetSpy; + return testLayerCore({...opts, createSpy, resetSpy}); } export function testLayerAsync( - opts: Omit, 'createSpy'> & {createSpy?: SpyFactory} + opts: Omit, 'createSpy' | 'resetSpy'> & { + createSpy?: SpyFactory; + resetSpy?: ResetSpy; + } ) { const createSpy = opts.createSpy || defaultSpyFactory; - return testLayerAsyncCore({...opts, createSpy}); + const resetSpy = opts.resetSpy || defaultResetSpy; + return testLayerAsyncCore({...opts, createSpy, resetSpy}); } // Re-export non-spy utilities @@ -35,4 +46,4 @@ export {gl, device} from './utils/setup-gl'; export {generateLayerTests} from './generate-layer-tests'; // Types -export type {LayerTestCase, SpyFactory, TestLayerOptions} from './lifecycle-test'; +export type {LayerTestCase, ResetSpy, SpyFactory, TestLayerOptions} from './lifecycle-test'; From e4412dc7fb26b32d1ecfa45575a53cc1c85fb5ff Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Wed, 4 Mar 2026 14:24:16 -0800 Subject: [PATCH 08/10] feat(test-utils): Add deprecation warning for implicit resetSpy Both createSpy and resetSpy now warn users to explicitly pass them, guiding migration to framework-specific spy handling. Co-Authored-By: Claude Opus 4.6 --- modules/test-utils/src/tape.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/test-utils/src/tape.ts b/modules/test-utils/src/tape.ts index 3926af9135d..87b898a406a 100644 --- a/modules/test-utils/src/tape.ts +++ b/modules/test-utils/src/tape.ts @@ -24,11 +24,12 @@ import type { export {testInitializeLayer, testInitializeLayerAsync}; export type {LayerClass, LayerTestCase, ResetSpy, SpyFactory}; -let _hasWarnedDeprecation = false; +let _hasWarnedCreateSpy = false; +let _hasWarnedResetSpy = false; function getDefaultSpyFactory(): SpyFactory { - if (!_hasWarnedDeprecation) { - _hasWarnedDeprecation = true; + if (!_hasWarnedCreateSpy) { + _hasWarnedCreateSpy = true; // eslint-disable-next-line no-console console.warn( '[@deck.gl/test-utils] Implicit @probe.gl/test-utils usage is deprecated. ' + @@ -40,7 +41,18 @@ function getDefaultSpyFactory(): SpyFactory { } /** Default reset for probe.gl spies - clears call tracking but keeps spy active */ -const defaultResetSpy: ResetSpy = spy => (spy as ReturnType).reset(); +function getDefaultResetSpy(): ResetSpy { + if (!_hasWarnedResetSpy) { + _hasWarnedResetSpy = true; + // eslint-disable-next-line no-console + console.warn( + '[@deck.gl/test-utils] Implicit spy reset is deprecated. ' + + 'Pass resetSpy option: resetSpy: (spy) => spy.mockRestore() for vitest, ' + + 'or resetSpy: (spy) => spy.reset() for probe.gl.' + ); + } + return spy => (spy as ReturnType).reset(); +} /** * Initialize and updates a layer over a sequence of scenarios (test cases). @@ -53,7 +65,7 @@ export function testLayer( } ): void { const createSpy = opts.createSpy || getDefaultSpyFactory(); - const resetSpy = opts.resetSpy || defaultResetSpy; + const resetSpy = opts.resetSpy || getDefaultResetSpy(); testLayerCore({...opts, createSpy, resetSpy}); } @@ -68,6 +80,6 @@ export async function testLayerAsync( } ): Promise { const createSpy = opts.createSpy || getDefaultSpyFactory(); - const resetSpy = opts.resetSpy || defaultResetSpy; + const resetSpy = opts.resetSpy || getDefaultResetSpy(); await testLayerAsyncCore({...opts, createSpy, resetSpy}); } From 30d3d2f75840f7a59cab9e69577884ecacb1bfea Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Wed, 4 Mar 2026 14:47:24 -0800 Subject: [PATCH 09/10] fix(test-utils): Add resetSpy to tape-compat smoke test Avoids triggering deprecation warning during CI by explicitly passing resetSpy alongside createSpy. Co-Authored-By: Claude Opus 4.6 --- test/smoke/tape-compat.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/smoke/tape-compat.ts b/test/smoke/tape-compat.ts index 627e25b7100..e0ac778daac 100644 --- a/test/smoke/tape-compat.ts +++ b/test/smoke/tape-compat.ts @@ -18,7 +18,7 @@ test('tape-compat: testInitializeLayer works', t => { t.end(); }); -test('tape-compat: testLayer works with explicit createSpy', t => { +test('tape-compat: testLayer works with explicit createSpy and resetSpy', t => { testLayer({ Layer: ScatterplotLayer, testCases: [ @@ -28,6 +28,7 @@ test('tape-compat: testLayer works with explicit createSpy', t => { } ], createSpy: makeSpy, + resetSpy: spy => (spy as ReturnType).reset(), onError: e => t.fail(e.message) }); t.pass('testLayer completed'); From c337c4e9cf9466fc5c564da9a0aca0174b813f38 Mon Sep 17 00:00:00 2001 From: Chris Gervang Date: Fri, 6 Mar 2026 14:20:34 -0800 Subject: [PATCH 10/10] fix(test-utils): Add async cleanup to prevent luma.gl unhandled rejections Add cleanupAfterLayerTestsAsync() that yields to the event loop before destroying WebGL resources. This prevents "getProgramInfoLog" errors from luma.gl's async shader error reporting trying to access already-destroyed WebGLProgram handles. Also removes unused imports from setup-gl.ts. Co-Authored-By: Claude Opus 4.6 --- modules/test-utils/src/lifecycle-test.ts | 36 +++++++++++++++++++++++- modules/test-utils/src/utils/setup-gl.ts | 3 +- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/modules/test-utils/src/lifecycle-test.ts b/modules/test-utils/src/lifecycle-test.ts index 4d835f70ec2..e393bf9d8d8 100644 --- a/modules/test-utils/src/lifecycle-test.ts +++ b/modules/test-utils/src/lifecycle-test.ts @@ -280,7 +280,8 @@ export async function testLayerAsync( layer = newLayer; } - const error = cleanupAfterLayerTests(resources); + // Use async cleanup to allow pending luma.gl async operations to complete + const error = await cleanupAfterLayerTestsAsync(resources); if (error) { onError(error, `${Layer.layerName} should delete all resources`); } @@ -335,6 +336,39 @@ function cleanupAfterLayerTests({ return null; } +/** + * Async cleanup that waits for pending async operations before finalizing resources. + * This prevents unhandled rejections from luma.gl's async shader error reporting + * which may try to access destroyed WebGL resources if cleanup happens too early. + */ +async function cleanupAfterLayerTestsAsync({ + layerManager, + deckRenderer, + oldResourceCounts +}: TestResources): Promise { + layerManager.setLayers([]); + + // Wait for any pending async operations (e.g., luma.gl's deferred shader compilation + // error handling) to complete before destroying resources. This prevents + // "getProgramInfoLog" errors when async error reporting tries to access + // already-destroyed WebGL programs. + await new Promise(resolve => setTimeout(resolve, 0)); + + layerManager.finalize(); + deckRenderer.finalize(); + + const resourceCounts = getResourceCounts(); + + for (const resourceName in resourceCounts) { + if (resourceCounts[resourceName] !== oldResourceCounts[resourceName]) { + return new Error( + `${resourceCounts[resourceName] - oldResourceCounts[resourceName]} ${resourceName}s` + ); + } + } + return null; +} + function getResourceCounts(): Record { /* global luma */ const resourceStats = (luma.stats as StatsManager).get('Resource Counts'); diff --git a/modules/test-utils/src/utils/setup-gl.ts b/modules/test-utils/src/utils/setup-gl.ts index c47c2571294..89a61450ba0 100644 --- a/modules/test-utils/src/utils/setup-gl.ts +++ b/modules/test-utils/src/utils/setup-gl.ts @@ -2,10 +2,9 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors -import {CanvasContextProps} from '@luma.gl/core'; -import {WebGLDevice} from '@luma.gl/webgl'; import {webglDevice, NullDevice} from '@luma.gl/test-utils'; +// Use pre-created device from @luma.gl/test-utils, fall back to NullDevice in Node export const device = webglDevice || new NullDevice({}); export const gl = webglDevice?.gl || 1;