Compare commits

..

22 Commits
v6.5.2 ... main

Author SHA1 Message Date
Matt Walsh
c07ebe8bdd 6.5.9 2026-04-09 12:19:03 -05:00
Matt Walsh
a41b0da196 more generalized fix for mapclick enhanced timestamps close #203
moves changes made in 0b47cf79c1 to the mapclick processing for benefit of other mapclick calls
2026-04-09 12:18:56 -05:00
Matt Walsh
30887202c8 6.5.8 2026-04-09 11:30:35 -05:00
Matt Walsh
38d1455a4b fix custom text scroll 2026-04-09 11:29:49 -05:00
Matt Walsh
30ec847ed5 Hide cursor in kiosk
via @iapetusz
2026-04-09 11:22:36 -05:00
Matt Walsh
11c54391b2 6.5.7 2026-04-08 22:42:07 -05:00
Matt Walsh
0b47cf79c1 don't overwrite timestamps when enhancing with mapclick 2026-04-08 22:41:42 -05:00
Matt Walsh
ba36904477 6.5.6 2026-04-08 11:39:36 -05:00
Matt Walsh
dae5b20bc6 fix radar round/floor mismatch in calculations close #200 2026-04-08 11:39:25 -05:00
Matt Walsh
ccc936d81a 6.5.5 2026-04-08 09:57:24 -05:00
Matt Walsh
5dc214c6a5 filter station list upon receipt 2026-04-08 09:57:18 -05:00
Matt Walsh
2a4dc03cf7 don't build screen-enhance images 2026-04-04 11:02:12 -05:00
Matt Walsh
8c13128005 add screen enhancement template 2026-04-04 10:45:31 -05:00
Matt Walsh
942fa8b817 6.5.4 2026-03-26 14:45:41 -05:00
Matt Walsh
15b68eba2f fix extended forecast day names close #190 2026-03-26 14:44:13 -05:00
Matt Walsh
933a289d03 update dependencies 2026-03-26 14:12:38 -05:00
Matt Walsh
e6121327ce 6.5.3 2026-03-16 12:31:36 -05:00
Matt Walsh
678f04fe42 fix extended forecast preload close #189 2026-03-16 12:31:27 -05:00
Matt Walsh
77592a08a3 update test dependencies 2026-03-10 09:33:04 -05:00
Matt Walsh
dadfcb8a5c readme spelling 2026-03-09 13:50:09 -05:00
Matt Walsh
245e9daf9c update eslint 2026-03-09 13:11:31 -05:00
Matt Walsh
177012317b update dependencies 2026-03-09 13:08:22 -05:00
20 changed files with 1433 additions and 1310 deletions

View File

@@ -0,0 +1,11 @@
---
name: Screen Enhancement
about: Items and tasks related to the screen enhancement project
title: '[Project]: '
labels: screen-enhance
projects: ['netbymatt/5']
assignees: ''
---
Describe the task, how it affects the overall project and what is considered complete.

View File

@@ -4,6 +4,8 @@ on:
push: push:
branches: branches:
- '**' - '**'
- '!screen-enhance'
- '!screen-enhance/**'
tags: tags:
- 'v*.*.*' - 'v*.*.*'
- 'v*.*' - 'v*.*'

View File

@@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2020-2025 Matt Walsh Copyright (c) 2020-2026 Matt Walsh
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -34,7 +34,7 @@ From a learning standpoint, this codebase make use of a lot of different methods
* Hand written CSS made easier to mange with SASS * Hand written CSS made easier to mange with SASS
* A linting library to keep code style consistent * A linting library to keep code style consistent
## Quck Start ## Quick Start
Ensure you have Node installed. Ensure you have Node installed.
```bash ```bash

View File

@@ -8,13 +8,11 @@ import states from './stations-states.mjs';
import chunk from './chunk.mjs'; import chunk from './chunk.mjs';
import overrides from './stations-overrides.mjs'; import overrides from './stations-overrides.mjs';
import postProcessor from './stations-postprocessor.mjs'; import postProcessor from './stations-postprocessor.mjs';
import { stationFilter } from '../server/scripts/modules/utils/string.mjs';
// check for cached flag // check for cached flag
const USE_CACHE = process.argv.includes('--use-cache'); const USE_CACHE = process.argv.includes('--use-cache');
// skip stations starting with these letters
const skipStations = ['U', 'C', 'H', 'W', 'Y', 'T', 'S', 'M', 'O', 'L', 'A', 'F', 'B', 'N', 'V', 'R', 'D', 'E', 'I', 'G', 'J'];
// chunk the list of states // chunk the list of states
const chunkStates = chunk(states, 3); const chunkStates = chunk(states, 3);
@@ -41,10 +39,8 @@ if (!USE_CACHE) {
// eslint-disable-next-line no-await-in-loop // eslint-disable-next-line no-await-in-loop
const stationsRaw = await https(next); const stationsRaw = await https(next);
stations = JSON.parse(stationsRaw); stations = JSON.parse(stationsRaw);
// filter stations for 4 letter identifiers
const stationsFiltered4 = stations.features.filter((station) => station.properties.stationIdentifier.match(/^[A-Z]{4}$/));
// filter against starting letter // filter against starting letter
const stationsFiltered = stationsFiltered4.filter((station) => !skipStations.includes(station.properties.stationIdentifier.slice(0, 1))); const stationsFiltered = stations.filter(stationFilter);
// add each resulting station to the output // add each resulting station to the output
stationsFiltered.forEach((station) => { stationsFiltered.forEach((station) => {
const id = station.properties.stationIdentifier; const id = station.properties.stationIdentifier;

2412
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "ws4kp", "name": "ws4kp",
"version": "6.5.2", "version": "6.5.9",
"description": "Welcome to the WeatherStar 4000+ project page!", "description": "Welcome to the WeatherStar 4000+ project page!",
"main": "index.mjs", "main": "index.mjs",
"type": "module", "type": "module",
@@ -31,7 +31,7 @@
"@eslint/eslintrc": "^3.3.1", "@eslint/eslintrc": "^3.3.1",
"ajv": "^8.17.1", "ajv": "^8.17.1",
"del": "^8.0.0", "del": "^8.0.0",
"eslint": "^9.0.0", "eslint": "^10.0.3",
"eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-base": "15.0.0",
"eslint-plugin-import": "^2.10.0", "eslint-plugin-import": "^2.10.0",
"fancy-log": "^2.0.0", "fancy-log": "^2.0.0",
@@ -40,7 +40,7 @@
"gulp-concat": "^2.6.1", "gulp-concat": "^2.6.1",
"gulp-ejs": "^5.1.0", "gulp-ejs": "^5.1.0",
"gulp-file": "^0.4.0", "gulp-file": "^0.4.0",
"gulp-html-minifier-terser": "^7.1.0", "gulp-html-minifier-terser": "^8.0.0",
"gulp-rename": "^2.0.0", "gulp-rename": "^2.0.0",
"gulp-s3-uploader": "^1.0.6", "gulp-s3-uploader": "^1.0.6",
"gulp-sass": "^6.0.0", "gulp-sass": "^6.0.0",
@@ -58,7 +58,7 @@
}, },
"dependencies": { "dependencies": {
"dotenv": "^17.0.1", "dotenv": "^17.0.1",
"ejs": "^3.1.5", "ejs": "^5.0.1",
"express": "^5.1.0" "express": "^5.1.0"
} }
} }

View File

@@ -72,7 +72,7 @@ const init = async () => {
if (!navigator.geolocation) btnGetGps.style.display = 'none'; if (!navigator.geolocation) btnGetGps.style.display = 'none';
document.querySelector('#divTwc').addEventListener('mousemove', () => { document.querySelector('#divTwc').addEventListener('mousemove', () => {
if (document.fullscreenElement) updateFullScreenNavigate(); if (document.fullscreenElement || settings.kiosk?.value) updateFullScreenNavigate();
}); });
document.querySelector('#btnGetLatLng').addEventListener('click', () => autoComplete.directFormSubmit()); document.querySelector('#btnGetLatLng').addEventListener('click', () => autoComplete.directFormSubmit());
@@ -384,7 +384,7 @@ const updateFullScreenNavigate = () => {
} }
navigateFadeIntervalId = setTimeout(() => { navigateFadeIntervalId = setTimeout(() => {
if (document.fullscreenElement) { if (document.fullscreenElement || settings.kiosk?.value) {
divTwcBottom.classList.remove('visible'); divTwcBottom.classList.remove('visible');
divTwcBottom.classList.add('hidden'); divTwcBottom.classList.add('hidden');
document.querySelector('#divTwc').classList.add('no-cursor'); document.querySelector('#divTwc').classList.add('no-cursor');

View File

@@ -15,9 +15,6 @@ import { debugFlag } from './utils/debug.mjs';
import { isDataStale, enhanceObservationWithMapClick } from './utils/mapclick.mjs'; import { isDataStale, enhanceObservationWithMapClick } from './utils/mapclick.mjs';
import { DateTime } from '../vendor/auto/luxon.mjs'; import { DateTime } from '../vendor/auto/luxon.mjs';
// some stations prefixed do not provide all the necessary data
const skipStations = ['U', 'C', 'H', 'W', 'Y', 'T', 'S', 'M', 'O', 'L', 'A', 'F', 'B', 'N', 'V', 'R', 'D', 'E', 'I', 'G', 'J'];
class CurrentWeather extends WeatherDisplay { class CurrentWeather extends WeatherDisplay {
constructor(navId, elemId) { constructor(navId, elemId) {
super(navId, elemId, 'Current Conditions', true); super(navId, elemId, 'Current Conditions', true);
@@ -29,8 +26,8 @@ class CurrentWeather extends WeatherDisplay {
// note: current weather does not use old data on a silent refresh // note: current weather does not use old data on a silent refresh
// this is deliberate because it can pull data from more than one station in sequence // this is deliberate because it can pull data from more than one station in sequence
// filter for 4-letter observation stations, only those contain sky conditions and thus an icon // get the available stations
const filteredStations = this.weatherParameters.stations.filter((station) => station?.properties?.stationIdentifier?.length === 4 && !skipStations.includes(station.properties.stationIdentifier.slice(0, 1))); const { stations } = this.weatherParameters;
// Load the observations // Load the observations
let observations; let observations;
@@ -38,9 +35,9 @@ class CurrentWeather extends WeatherDisplay {
// station number counter // station number counter
let stationNum = 0; let stationNum = 0;
while (!observations && stationNum < filteredStations.length) { while (!observations && stationNum < stations.length) {
// get the station // get the station
station = filteredStations[stationNum]; station = stations[stationNum];
const stationId = station.properties.stationIdentifier; const stationId = station.properties.stationIdentifier;
stationNum += 1; stationNum += 1;
@@ -104,7 +101,10 @@ class CurrentWeather extends WeatherDisplay {
debugContext: 'currentweather', debugContext: 'currentweather',
}); });
// copy enhanced data and restore the timestamp if it was overwritten by older data from mapclick
candidateObservation.features[0].properties = enhancedResult.data; candidateObservation.features[0].properties = enhancedResult.data;
const { missingFields } = enhancedResult; const { missingFields } = enhancedResult;
const missingRequired = missingFields.filter((fieldName) => { const missingRequired = missingFields.filter((fieldName) => {
const field = requiredFields.find((f) => f.name === fieldName && f.required); const field = requiredFields.find((f) => f.name === fieldName && f.required);

View File

@@ -261,6 +261,7 @@ const parseMessage = (event) => {
if (event?.data?.type === 'current-weather-scroll') { if (event?.data?.type === 'current-weather-scroll') {
if (event.data?.method === 'start') start(); if (event.data?.method === 'start') start();
if (event.data?.method === 'reload') stop(true); if (event.data?.method === 'reload') stop(true);
if (event.data?.method === 'non-display') nonDisplay();
if (event.data?.method === 'show') show(); if (event.data?.method === 'show') show();
if (event.data?.method === 'hide') hide(); if (event.data?.method === 'hide') hide();
} }
@@ -274,6 +275,20 @@ const hide = () => {
mainScroll.style.display = 'none'; mainScroll.style.display = 'none';
}; };
const nonDisplay = () => {
if (interval) {
clearInterval(interval);
interval = null;
stop();
// if greater than default update (typically long scroll) skip to the next weather screen
if (nextUpdate > DEFAULT_UPDATE) {
screenIndex = (screenIndex + 1) % (workingScreens.length);
sinceLastUpdate = 0;
nextUpdate = DEFAULT_UPDATE;
}
}
};
const screenCount = () => workingScreens.length; const screenCount = () => workingScreens.length;
const atDefault = () => defaultScreensLoaded; const atDefault = () => defaultScreensLoaded;

View File

@@ -3,8 +3,6 @@ import { reset as resetScroll, addScreen as addScroll, hazards } from './current
let firstRun = true; let firstRun = true;
const parser = new DOMParser();
// change of enable handler // change of enable handler
const changeEnable = (newValue) => { const changeEnable = (newValue) => {
let newDisplay; let newDisplay;
@@ -19,7 +17,7 @@ const changeEnable = (newValue) => {
// hide the string entry // hide the string entry
newDisplay = 'none'; newDisplay = 'none';
} }
const stringEntry = document.getElementById('settings-customText-label'); const stringEntry = document.getElementById('settings-customText-string');
if (stringEntry) { if (stringEntry) {
stringEntry.style.display = newDisplay; stringEntry.style.display = newDisplay;
} }

View File

@@ -97,11 +97,9 @@ const parse = (fullForecast, forecastUrl) => {
// Skip the first period if it's nighttime (like "Tonight") since extended forecast // Skip the first period if it's nighttime (like "Tonight") since extended forecast
// should focus on upcoming full days, not the end of the current day // should focus on upcoming full days, not the end of the current day
let startIndex = 0; let startIndex = 0;
let dateOffset = 0; // offset for date labels when we skip periods
if (activePeriods.length > 0 && !activePeriods[0].isDaytime) { if (activePeriods.length > 0 && !activePeriods[0].isDaytime) {
startIndex = 1; startIndex = 1;
dateOffset = 1; // start date labels from tomorrow since we're skipping tonight
if (debugFlag('extendedforecast')) { if (debugFlag('extendedforecast')) {
console.log(`ExtendedForecast: Skipping first period "${activePeriods[0].name}" because it's nighttime`); console.log(`ExtendedForecast: Skipping first period "${activePeriods[0].name}" because it's nighttime`);
} }
@@ -111,25 +109,14 @@ const parse = (fullForecast, forecastUrl) => {
} }
} }
// create a list of days starting with the appropriate day
const Days = [0, 1, 2, 3, 4, 5, 6];
const dates = Days.map((shift) => {
const date = DateTime.local().startOf('day').plus({ days: shift + dateOffset });
return date.toLocaleString({ weekday: 'short' });
});
if (debugFlag('extendedforecast')) {
console.log(`ExtendedForecast: Generated date labels: [${dates.join(', ')}]`);
}
// track the destination forecast index // track the destination forecast index
let destIndex = 0; let destIndex = 0;
const forecast = []; const forecast = [];
// if the first period is nighttime it is skipped above via startIndex
for (let i = startIndex; i < activePeriods.length; i += 1) { for (let i = startIndex; i < activePeriods.length; i += 1) {
const period = activePeriods[i]; const period = activePeriods[i];
// create the destination object if necessary
if (!forecast[destIndex]) { if (!forecast[destIndex]) {
forecast.push({ forecast.push({
dayName: '', low: undefined, high: undefined, text: undefined, icon: undefined, dayName: '', low: undefined, high: undefined, text: undefined, icon: undefined,
@@ -138,15 +125,14 @@ const parse = (fullForecast, forecastUrl) => {
// get the object to modify/populate // get the object to modify/populate
const fDay = forecast[destIndex]; const fDay = forecast[destIndex];
// preload the icon
preloadImg(fDay.icon);
if (period.isDaytime) { if (period.isDaytime) {
// day time is the high temperature // day time is the high temperature
fDay.high = period.temperature; fDay.high = period.temperature;
fDay.icon = getLargeIcon(period.icon); fDay.icon = getLargeIcon(period.icon);
fDay.text = shortenExtendedForecastText(period.shortForecast); fDay.text = shortenExtendedForecastText(period.shortForecast);
fDay.dayName = dates[destIndex]; fDay.dayName = DateTime.fromISO(period.startTime).startOf('day').toLocaleString({ weekday: 'short' });
// preload the icon
preloadImg(fDay.icon);
// Wait for the corresponding night period to increment // Wait for the corresponding night period to increment
} else { } else {
// low temperature // low temperature

View File

@@ -6,6 +6,7 @@ import { safeJson } from './utils/fetch.mjs';
import { getPoint } from './utils/weather.mjs'; import { getPoint } from './utils/weather.mjs';
import { debugFlag } from './utils/debug.mjs'; import { debugFlag } from './utils/debug.mjs';
import settings from './settings.mjs'; import settings from './settings.mjs';
import { stationFilter } from './utils/string.mjs';
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
init(); init();
@@ -85,7 +86,15 @@ const getWeather = async (latLon, haveDataCallback) => {
return; return;
} }
const StationId = stations.features[0].properties.stationIdentifier; // filter stations for proper format
const stationsFiltered = stations.features.filter(stationFilter);
// check for stations available after filtering
if (stationsFiltered.length === 0) {
console.warn('No observation stations left for location after filtering');
return;
}
const StationId = stationsFiltered[0].properties.stationIdentifier;
let { city } = point.properties.relativeLocation.properties; let { city } = point.properties.relativeLocation.properties;
const { state } = point.properties.relativeLocation.properties; const { state } = point.properties.relativeLocation.properties;
@@ -108,7 +117,7 @@ const getWeather = async (latLon, haveDataCallback) => {
weatherParameters.timeZone = point.properties.timeZone; weatherParameters.timeZone = point.properties.timeZone;
weatherParameters.forecast = point.properties.forecast; weatherParameters.forecast = point.properties.forecast;
weatherParameters.forecastGridData = point.properties.forecastGridData; weatherParameters.forecastGridData = point.properties.forecastGridData;
weatherParameters.stations = stations.features; weatherParameters.stations = stationsFiltered;
weatherParameters.relativeLocation = point.properties.relativeLocation.properties; weatherParameters.relativeLocation = point.properties.relativeLocation.properties;
// update the main process for display purposes // update the main process for display purposes

View File

@@ -9,10 +9,12 @@ const pixelToFile = (xPixel, yPixel) => {
return `${yTile}-${xTile}`; return `${yTile}-${xTile}`;
}; };
// convert a pixel location in the overall map to a pixel location on the tile // convert a pixel location in the overall map to a pixel location on the tile set
const modTile = (xPixel, yPixel) => { const modTile = (xPixel, yPixel) => {
const x = Math.round(xPixel) % TILE_SIZE.x; // adjust for additional 1 tile when odd
const y = Math.round(yPixel) % TILE_SIZE.y; const x = (Math.floor(xPixel) % (TILE_SIZE.x));
const y = (Math.floor(yPixel) % (TILE_SIZE.y));
return { x, y }; return { x, y };
}; };
@@ -46,8 +48,8 @@ const setTiles = (data) => {
// determine which tiles are used // determine which tiles are used
const usedTiles = [ const usedTiles = [
true, true,
TILE_SIZE.x - tileShift.x < RADAR_FINAL_SIZE.width, tileShift.x + TILE_SIZE.x > RADAR_FINAL_SIZE.width,
TILE_SIZE.y - tileShift.y < RADAR_FINAL_SIZE.width, tileShift.y + TILE_SIZE.y > RADAR_FINAL_SIZE.height,
]; ];
// if we need t[1] and t[2] then we also need t[3] // if we need t[1] and t[2] then we also need t[3]
usedTiles.push(usedTiles[1] && usedTiles[2]); usedTiles.push(usedTiles[1] && usedTiles[2]);

View File

@@ -44,9 +44,11 @@ const kioskChange = (value) => {
if (value) { if (value) {
body.classList.add('kiosk'); body.classList.add('kiosk');
document.querySelector('#divTwc')?.classList.add('no-cursor');
window.dispatchEvent(new Event('resize')); window.dispatchEvent(new Event('resize'));
} else { } else {
body.classList.remove('kiosk'); body.classList.remove('kiosk');
document.querySelector('#divTwc')?.classList.remove('no-cursor');
window.dispatchEvent(new Event('resize')); window.dispatchEvent(new Event('resize'));
} }

View File

@@ -650,7 +650,7 @@ export const enhanceObservationWithMapClick = async (observationData, options =
} }
return { return {
data: mapClickProps, data: { ...mapClickProps, timestamp: observationData.timestamp },
wasImproved: true, wasImproved: true,
improvements, improvements,
missingFields: [...mapClickMissingRequired, ...mapClickMissingOptional], missingFields: [...mapClickMissingRequired, ...mapClickMissingOptional],

View File

@@ -13,7 +13,12 @@ const locationCleanup = (input) => {
return regexes.reduce((value, regex) => value.replace(regex, ''), input); return regexes.reduce((value, regex) => value.replace(regex, ''), input);
}; };
// stations must be 4 alpha characters and not start with the provided list
const skipStations = ['U', 'C', 'H', 'W', 'Y', 'T', 'S', 'M', 'O', 'L', 'A', 'F', 'B', 'N', 'V', 'R', 'D', 'E', 'I', 'G', 'J'];
const stationFilter = (station) => station.properties.stationIdentifier.match(/^[A-Z]{4}$/) && !skipStations.includes(station.properties.stationIdentifier.slice(0, 1));
export { export {
// eslint-disable-next-line import/prefer-default-export
locationCleanup, locationCleanup,
stationFilter,
}; };

View File

@@ -172,6 +172,7 @@ class WeatherDisplay {
if (this.screenIndex < 0) this.screenIndex = 0; if (this.screenIndex < 0) this.screenIndex = 0;
if (this.okToDrawCurrentDateTime) this.drawCurrentDateTime(); if (this.okToDrawCurrentDateTime) this.drawCurrentDateTime();
if (this.okToDrawCurrentConditions) postMessage({ type: 'current-weather-scroll', method: 'start' }); if (this.okToDrawCurrentConditions) postMessage({ type: 'current-weather-scroll', method: 'start' });
if (!this.okToDrawCurrentConditions) postMessage({ type: 'current-weather-scroll', method: 'non-display' });
if (this.okToDrawCurrentConditions === false) postMessage({ type: 'current-weather-scroll', method: 'hide' }); if (this.okToDrawCurrentConditions === false) postMessage({ type: 'current-weather-scroll', method: 'hide' });
} }

View File

@@ -346,7 +346,7 @@ var TimeIndicator;
TimeIndicator["TL"] = "TL"; TimeIndicator["TL"] = "TL";
})(TimeIndicator || (TimeIndicator = {})); })(TimeIndicator || (TimeIndicator = {}));
/** /**
* https://www.aviationweather.gov/taf/decoder * https://web.archive.org/web/20230318235549/https://aviationweather.gov/taf/decoder
*/ */
var WeatherChangeType; var WeatherChangeType;
(function (WeatherChangeType) { (function (WeatherChangeType) {
@@ -2535,7 +2535,8 @@ class MetarParser extends AbstractParser {
while (i < trendParts.length && while (i < trendParts.length &&
trendParts[i] !== this.TEMPO && trendParts[i] !== this.TEMPO &&
trendParts[i] !== this.INTER && trendParts[i] !== this.INTER &&
trendParts[i] !== this.BECMG) { trendParts[i] !== this.BECMG &&
trendParts[i] !== this.RMK) {
if (trendParts[i].startsWith(this.FM) || if (trendParts[i].startsWith(this.FM) ||
trendParts[i].startsWith(this.TL) || trendParts[i].startsWith(this.TL) ||
trendParts[i].startsWith(this.AT)) { trendParts[i].startsWith(this.AT)) {

197
tests/package-lock.json generated
View File

@@ -14,12 +14,12 @@
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.27.1", "version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5",
"js-tokens": "^4.0.0", "js-tokens": "^4.0.0",
"picocolors": "^1.1.1" "picocolors": "^1.1.1"
}, },
@@ -37,16 +37,16 @@
} }
}, },
"node_modules/@puppeteer/browsers": { "node_modules/@puppeteer/browsers": {
"version": "2.10.13", "version": "2.13.0",
"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz",
"integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"debug": "^4.4.3", "debug": "^4.4.3",
"extract-zip": "^2.0.1", "extract-zip": "^2.0.1",
"progress": "^2.0.3", "progress": "^2.0.3",
"proxy-agent": "^6.5.0", "proxy-agent": "^6.5.0",
"semver": "^7.7.3", "semver": "^7.7.4",
"tar-fs": "^3.1.1", "tar-fs": "^3.1.1",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
@@ -64,13 +64,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "24.10.1", "version": "25.5.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz",
"integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"undici-types": "~7.16.0" "undici-types": "~7.18.0"
} }
}, },
"node_modules/@types/yauzl": { "node_modules/@types/yauzl": {
@@ -135,9 +135,9 @@
} }
}, },
"node_modules/b4a": { "node_modules/b4a": {
"version": "1.7.3", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
"integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peerDependencies": { "peerDependencies": {
"react-native-b4a": "*" "react-native-b4a": "*"
@@ -163,11 +163,10 @@
} }
}, },
"node_modules/bare-fs": { "node_modules/bare-fs": {
"version": "4.5.1", "version": "4.5.6",
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.1.tgz", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz",
"integrity": "sha512-zGUCsm3yv/ePt2PHNbVxjjn0nNB1MkIaR4wOCxJ2ig5pCf5cCVAYJXVhQg/3OhhJV6DB1ts7Hv0oUaElc2TPQg==", "integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true,
"dependencies": { "dependencies": {
"bare-events": "^2.5.4", "bare-events": "^2.5.4",
"bare-path": "^3.0.0", "bare-path": "^3.0.0",
@@ -188,11 +187,10 @@
} }
}, },
"node_modules/bare-os": { "node_modules/bare-os": {
"version": "3.6.2", "version": "3.8.0",
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz",
"integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true,
"engines": { "engines": {
"bare": ">=1.14.0" "bare": ">=1.14.0"
} }
@@ -202,25 +200,28 @@
"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
"integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true,
"dependencies": { "dependencies": {
"bare-os": "^3.0.1" "bare-os": "^3.0.1"
} }
}, },
"node_modules/bare-stream": { "node_modules/bare-stream": {
"version": "2.7.0", "version": "2.11.0",
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.11.0.tgz",
"integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", "integrity": "sha512-Y/+iQ49fL3rIn6w/AVxI/2+BRrpmzJvdWt5Jv8Za6Ngqc6V227c+pYjYYgLdpR3MwQ9ObVXD0ZrqoBztakM0rw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true,
"dependencies": { "dependencies": {
"streamx": "^2.21.0" "streamx": "^2.25.0",
"teex": "^1.0.1"
}, },
"peerDependencies": { "peerDependencies": {
"bare-abort-controller": "*",
"bare-buffer": "*", "bare-buffer": "*",
"bare-events": "*" "bare-events": "*"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"bare-abort-controller": {
"optional": true
},
"bare-buffer": { "bare-buffer": {
"optional": true "optional": true
}, },
@@ -230,19 +231,18 @@
} }
}, },
"node_modules/bare-url": { "node_modules/bare-url": {
"version": "2.3.2", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz",
"integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true,
"dependencies": { "dependencies": {
"bare-path": "^3.0.0" "bare-path": "^3.0.0"
} }
}, },
"node_modules/basic-ftp": { "node_modules/basic-ftp": {
"version": "5.0.5", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz",
"integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
@@ -279,9 +279,9 @@
} }
}, },
"node_modules/chromium-bidi": { "node_modules/chromium-bidi": {
"version": "11.0.0", "version": "14.0.0",
"resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz",
"integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==", "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"mitt": "^3.0.1", "mitt": "^3.0.1",
@@ -324,9 +324,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/cosmiconfig": { "node_modules/cosmiconfig": {
"version": "9.0.0", "version": "9.0.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz",
"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"env-paths": "^2.2.1", "env-paths": "^2.2.1",
@@ -390,11 +390,10 @@
} }
}, },
"node_modules/devtools-protocol": { "node_modules/devtools-protocol": {
"version": "0.0.1521046", "version": "0.0.1581282",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz",
"integrity": "sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==", "integrity": "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==",
"license": "BSD-3-Clause", "license": "BSD-3-Clause"
"peer": true
}, },
"node_modules/emoji-regex": { "node_modules/emoji-regex": {
"version": "8.0.0", "version": "8.0.0",
@@ -816,9 +815,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/pump": { "node_modules/pump": {
"version": "3.0.3", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
"integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"end-of-stream": "^1.1.0", "end-of-stream": "^1.1.0",
@@ -826,18 +825,18 @@
} }
}, },
"node_modules/puppeteer": { "node_modules/puppeteer": {
"version": "24.31.0", "version": "24.40.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.31.0.tgz", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.40.0.tgz",
"integrity": "sha512-q8y5yLxLD8xdZdzNWqdOL43NbfvUOp60SYhaLZQwHC9CdKldxQKXOyJAciOr7oUJfyAH/KgB2wKvqT2sFKoVXA==", "integrity": "sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@puppeteer/browsers": "2.10.13", "@puppeteer/browsers": "2.13.0",
"chromium-bidi": "11.0.0", "chromium-bidi": "14.0.0",
"cosmiconfig": "^9.0.0", "cosmiconfig": "^9.0.0",
"devtools-protocol": "0.0.1521046", "devtools-protocol": "0.0.1581282",
"puppeteer-core": "24.31.0", "puppeteer-core": "24.40.0",
"typed-query-selector": "^2.12.0" "typed-query-selector": "^2.12.1"
}, },
"bin": { "bin": {
"puppeteer": "lib/cjs/puppeteer/node/cli.js" "puppeteer": "lib/cjs/puppeteer/node/cli.js"
@@ -847,18 +846,18 @@
} }
}, },
"node_modules/puppeteer-core": { "node_modules/puppeteer-core": {
"version": "24.31.0", "version": "24.40.0",
"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.31.0.tgz", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.40.0.tgz",
"integrity": "sha512-pnAohhSZipWQoFpXuGV7xCZfaGhqcBR9C4pVrU0QSrcMi7tQMH9J9lDBqBvyMAHQqe8HCARuREqFuVKRQOgTvg==", "integrity": "sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@puppeteer/browsers": "2.10.13", "@puppeteer/browsers": "2.13.0",
"chromium-bidi": "11.0.0", "chromium-bidi": "14.0.0",
"debug": "^4.4.3", "debug": "^4.4.3",
"devtools-protocol": "0.0.1521046", "devtools-protocol": "0.0.1581282",
"typed-query-selector": "^2.12.0", "typed-query-selector": "^2.12.1",
"webdriver-bidi-protocol": "0.3.9", "webdriver-bidi-protocol": "0.4.1",
"ws": "^8.18.3" "ws": "^8.19.0"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
@@ -883,9 +882,9 @@
} }
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.7.3", "version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
@@ -943,9 +942,9 @@
} }
}, },
"node_modules/streamx": { "node_modules/streamx": {
"version": "2.23.0", "version": "2.25.0",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz",
"integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"events-universal": "^1.0.0", "events-universal": "^1.0.0",
@@ -980,9 +979,9 @@
} }
}, },
"node_modules/tar-fs": { "node_modules/tar-fs": {
"version": "3.1.1", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz",
"integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"pump": "^3.0.0", "pump": "^3.0.0",
@@ -994,20 +993,30 @@
} }
}, },
"node_modules/tar-stream": { "node_modules/tar-stream": {
"version": "3.1.7", "version": "3.1.8",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz",
"integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"b4a": "^1.6.4", "b4a": "^1.6.4",
"bare-fs": "^4.5.5",
"fast-fifo": "^1.2.0", "fast-fifo": "^1.2.0",
"streamx": "^2.15.0" "streamx": "^2.15.0"
} }
}, },
"node_modules/teex": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
"integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
"license": "MIT",
"dependencies": {
"streamx": "^2.12.5"
}
},
"node_modules/text-decoder": { "node_modules/text-decoder": {
"version": "1.2.3", "version": "1.2.7",
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
"integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"b4a": "^1.6.4" "b4a": "^1.6.4"
@@ -1020,22 +1029,22 @@
"license": "0BSD" "license": "0BSD"
}, },
"node_modules/typed-query-selector": { "node_modules/typed-query-selector": {
"version": "2.12.0", "version": "2.12.1",
"resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz",
"integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "7.16.0", "version": "7.18.2",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
"node_modules/webdriver-bidi-protocol": { "node_modules/webdriver-bidi-protocol": {
"version": "0.3.9", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.9.tgz", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz",
"integrity": "sha512-uIYvlRQ0PwtZR1EzHlTMol1G0lAlmOe6wPykF9a77AK3bkpvZHzIVxRE2ThOx5vjy2zISe0zhwf5rzuUfbo1PQ==", "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==",
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/wrap-ansi": { "node_modules/wrap-ansi": {
@@ -1062,9 +1071,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/ws": { "node_modules/ws": {
"version": "8.18.3", "version": "8.20.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
"integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"