From 6bb00b5b4d67098b1ff3a044450113b214423507 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Wed, 22 Jul 2026 18:55:51 +0530 Subject: [PATCH 1/7] feat: add WebView Plugin API Add cordova-plugin-acode-webview allowing plugins to create and manage isolated WebView instances with fullscreen, window, panel, and hidden modes. Features: - Create independent WebView instances via acode.webview.create() - Load URLs, HTML content, and execute JavaScript - Bidirectional messaging between plugin and WebView - Lifecycle management: show, hide, reload, destroy - Lifecycle events: pageFinished, titleChanged, closed --- package-lock.json | 11 + package.json | 4 +- src/index.d.ts | 38 +- src/lib/acode.js | 2 + src/lib/webview.js | 155 +++++++ src/plugins/webview/package.json | 11 + src/plugins/webview/plugin.xml | 26 ++ .../com/foxdebug/webview/WebViewActivity.java | 198 ++++++++ .../com/foxdebug/webview/WebViewInstance.java | 423 ++++++++++++++++++ .../com/foxdebug/webview/WebViewPlugin.java | 266 +++++++++++ src/plugins/webview/www/webview.js | 88 ++++ 11 files changed, 1220 insertions(+), 2 deletions(-) create mode 100644 src/lib/webview.js create mode 100644 src/plugins/webview/package.json create mode 100644 src/plugins/webview/plugin.xml create mode 100644 src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java create mode 100644 src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java create mode 100644 src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java create mode 100644 src/plugins/webview/www/webview.js diff --git a/package-lock.json b/package-lock.json index 50540a937..3af595deb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,6 +111,7 @@ "com.foxdebug.acode.rk.plugin.plugincontext": "file:src/plugins/pluginContext", "cordova-android": "^15.0.0", "cordova-clipboard": "^1.3.0", + "cordova-plugin-acode-webview": "file:src/plugins/webview", "cordova-plugin-advanced-http": "file:src/plugins/cordova-plugin-advanced-http", "cordova-plugin-browser": "file:src/plugins/browser", "cordova-plugin-buildinfo": "file:src/plugins/cordova-plugin-buildinfo", @@ -8242,6 +8243,10 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/cordova-plugin-acode-webview": { + "resolved": "src/plugins/webview", + "link": true + }, "node_modules/cordova-plugin-advanced-http": { "resolved": "src/plugins/cordova-plugin-advanced-http", "link": true @@ -18565,6 +18570,12 @@ "version": "0.0.1", "dev": true, "license": "Apache-2.0" + }, + "src/plugins/webview": { + "name": "cordova-plugin-acode-webview", + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0" } } } diff --git a/package.json b/package.json index 39fc2f685..e7de0b9f3 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,8 @@ "com.foxdebug.acode.rk.customtabs": {}, "cordova-plugin-system": {}, "cordova-plugin-crashhandler": {}, - "cordova-plugin-advanced-http": {} + "cordova-plugin-advanced-http": {}, + "cordova-plugin-acode-webview": {} }, "platforms": [ "android" @@ -84,6 +85,7 @@ "com.foxdebug.acode.rk.plugin.plugincontext": "file:src/plugins/pluginContext", "cordova-android": "^15.0.0", "cordova-clipboard": "^1.3.0", + "cordova-plugin-acode-webview": "file:src/plugins/webview", "cordova-plugin-advanced-http": "file:src/plugins/cordova-plugin-advanced-http", "cordova-plugin-browser": "file:src/plugins/browser", "cordova-plugin-buildinfo": "file:src/plugins/cordova-plugin-buildinfo", diff --git a/src/index.d.ts b/src/index.d.ts index 7f6cbaeb2..2b0c2b1e1 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -8,7 +8,10 @@ declare const PLUGIN_DIR: string; declare const KEYBINDING_FILE: string; declare const ANDROID_SDK_INT: number; declare const DOES_SUPPORT_THEME: boolean; -declare const acode: object; +declare const acode: { + webview: AcodeWebViewAPI; + [key: string]: unknown; +}; interface Window { ASSETS_DIRECTORY: string; @@ -107,3 +110,36 @@ interface AcodeFile { declare global { var Executor: Executor | undefined; } + +interface WebViewOptions { + title?: string; + mode?: "fullscreen" | "window" | "panel" | "hidden"; + width?: number; + height?: number; + x?: number; + y?: number; + allowNavigation?: boolean; + allowDownloads?: boolean; + visible?: boolean; +} + +interface AcodeWebView { + readonly id: string; + readonly options: WebViewOptions; + loadURL(url: string): Promise; + loadHTML(html: string): Promise; + evaluate(js: string): Promise; + onMessage(callback: (message: unknown) => void): void; + offMessage(callback: (message: unknown) => void): void; + on(event: string, callback: (event: string, data?: unknown) => void): void; + off(event: string, callback: (event: string, data?: unknown) => void): void; + postMessage(message: unknown): Promise; + show(): Promise; + hide(): Promise; + reload(): Promise; + destroy(): Promise; +} + +interface AcodeWebViewAPI { + create(options?: WebViewOptions): Promise; +} diff --git a/src/lib/acode.js b/src/lib/acode.js index 81c82f08a..341e2d7de 100644 --- a/src/lib/acode.js +++ b/src/lib/acode.js @@ -73,6 +73,7 @@ import encodings, { decode, encode } from "utils/encodings"; import helpers from "utils/helpers"; import KeyboardEvent from "utils/keyboardEvent"; import Url from "utils/Url"; +import webview from "./webview"; import config from "./config"; class Acode { @@ -396,6 +397,7 @@ class Acode { this.define("selectionMenu", selectionMenu); this.define("sidebarApps", sidebarAppsModule); this.define("terminal", terminalModule); + this.define("webview", webview); this.define("codemirror", codemirrorModule); this.define("@codemirror/autocomplete", cmAutocomplete); this.define("@codemirror/commands", cmCommands); diff --git a/src/lib/webview.js b/src/lib/webview.js new file mode 100644 index 000000000..b237fe38d --- /dev/null +++ b/src/lib/webview.js @@ -0,0 +1,155 @@ +import nativeBridge from "../plugins/webview/www/webview"; + +let initialized = false; +const instances = new Map(); +const eventCallbacks = new Map(); + +function ensureInit() { + if (!initialized) { + nativeBridge.setMessageCallback((payload) => { + const { id, message, event, data } = payload; + + if (event) { + const callbacks = eventCallbacks.get(id); + if (callbacks) { + callbacks.forEach((cb) => { + try { + cb(event, data); + } catch (e) { + console.error("WebView event callback error:", e); + } + }); + } + return; + } + + if (message !== undefined) { + const instance = instances.get(id); + if (instance && instance._messageCallbacks) { + let parsed = message; + try { + parsed = JSON.parse(message); + } catch (_) {} + instance._messageCallbacks.forEach((cb) => { + try { + cb(parsed); + } catch (e) { + console.error("WebView message callback error:", e); + } + }); + } + } + }); + initialized = true; + } +} + +class WebView { + constructor(id, options = {}) { + this.id = id; + this.options = options; + this._messageCallbacks = []; + this._eventCallbacks = []; + this._destroyed = false; + + instances.set(id, this); + eventCallbacks.set(id, this._eventCallbacks); + } + + async loadURL(url) { + this._checkDestroyed(); + await nativeBridge.loadURL(this.id, url); + } + + async loadHTML(html) { + this._checkDestroyed(); + await nativeBridge.loadHTML(this.id, html); + } + + async evaluate(js) { + this._checkDestroyed(); + return await nativeBridge.evaluate(this.id, js); + } + + onMessage(callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._messageCallbacks.push(callback); + } + } + + offMessage(callback) { + this._messageCallbacks = this._messageCallbacks.filter((cb) => cb !== callback); + } + + on(event, callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._eventCallbacks.push({ event, callback }); + } + } + + off(event, callback) { + this._eventCallbacks = this._eventCallbacks.filter( + (cb) => !(cb.event === event && cb.callback === callback) + ); + } + + async postMessage(message) { + this._checkDestroyed(); + await nativeBridge.postMessage(this.id, message); + } + + async show() { + this._checkDestroyed(); + await nativeBridge.show(this.id); + } + + async hide() { + this._checkDestroyed(); + await nativeBridge.hide(this.id); + } + + async reload() { + this._checkDestroyed(); + await nativeBridge.reload(this.id); + } + + async destroy() { + this._checkDestroyed(); + this._destroyed = true; + await nativeBridge.destroy(this.id); + instances.delete(this.id); + eventCallbacks.delete(this.id); + this._messageCallbacks = []; + this._eventCallbacks = []; + } + + _checkDestroyed() { + if (this._destroyed) { + throw new Error("WebView has been destroyed"); + } + } +} + +const webviewAPI = { + async create(options = {}) { + ensureInit(); + + const id = await nativeBridge.create({ + title: options.title || "", + mode: options.mode || "hidden", + width: options.width || 0, + height: options.height || 0, + x: options.x || 0, + y: options.y || 0, + allowNavigation: options.allowNavigation !== false, + allowDownloads: options.allowDownloads === true, + visible: options.visible !== false, + }); + + return new WebView(id, options); + }, +}; + +export default webviewAPI; diff --git a/src/plugins/webview/package.json b/src/plugins/webview/package.json new file mode 100644 index 000000000..673be361c --- /dev/null +++ b/src/plugins/webview/package.json @@ -0,0 +1,11 @@ +{ + "name": "cordova-plugin-acode-webview", + "version": "1.0.0", + "description": "Acode WebView Plugin API", + "main": "", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "Apache-2.0" +} diff --git a/src/plugins/webview/plugin.xml b/src/plugins/webview/plugin.xml new file mode 100644 index 000000000..c7a6ff773 --- /dev/null +++ b/src/plugins/webview/plugin.xml @@ -0,0 +1,26 @@ + + + cordova-plugin-acode-webview + Acode WebView Plugin API - Create and manage isolated WebView instances + Apache 2.0 + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java new file mode 100644 index 000000000..7c9c337f8 --- /dev/null +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java @@ -0,0 +1,198 @@ +package com.foxdebug.webview; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.Insets; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowInsets; +import android.view.WindowInsetsController; +import android.webkit.JavascriptInterface; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.graphics.drawable.GradientDrawable; + +public class WebViewActivity extends Activity { + + private static final String TAG = "WebViewActivity"; + private static WebViewPlugin plugin; + + private WebView webView; + private String webviewId; + private String title; + private boolean allowNavigation; + private boolean allowDownloads; + + public static void setPlugin(WebViewPlugin p) { + plugin = p; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = getIntent(); + webviewId = intent.getStringExtra("webviewId"); + title = intent.getStringExtra("title"); + allowNavigation = intent.getBooleanExtra("allowNavigation", true); + allowDownloads = intent.getBooleanExtra("allowDownloads", false); + + LinearLayout layout = new LinearLayout(this); + layout.setOrientation(LinearLayout.VERTICAL); + layout.setLayoutParams(new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + )); + + TextView titleBar = new TextView(this); + titleBar.setText(title != null ? title : "WebView"); + titleBar.setTextColor(Color.WHITE); + titleBar.setPadding(dpToPx(16), dpToPx(8), dpToPx(16), dpToPx(8)); + titleBar.setTextSize(16); + titleBar.setBackgroundColor(Color.argb(255, 33, 33, 33)); + + GradientDrawable closeBg = new GradientDrawable(); + closeBg.setColor(Color.argb(255, 80, 80, 80)); + closeBg.setCornerRadius(dpToPx(4)); + + TextView closeButton = new TextView(this); + closeButton.setText("✕"); + closeButton.setTextColor(Color.WHITE); + closeButton.setTextSize(18); + closeButton.setPadding(dpToPx(12), dpToPx(4), dpToPx(12), dpToPx(4)); + closeButton.setBackground(closeBg); + closeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + LinearLayout titleLayout = new LinearLayout(this); + titleLayout.setOrientation(LinearLayout.HORIZONTAL); + titleLayout.setBackgroundColor(Color.argb(255, 33, 33, 33)); + titleLayout.setPadding(dpToPx(12), 0, dpToPx(12), 0); + + LinearLayout.LayoutParams titleParams = new LinearLayout.LayoutParams( + 0, ViewGroup.LayoutParams.WRAP_CONTENT, 1 + ); + titleLayout.addView(titleBar, titleParams); + titleLayout.addView(closeButton, new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )); + + webView = new WebView(this); + webView.setWebViewClient(new FullscreenWebViewClient()); + webView.addJavascriptInterface(new JsBridge(), "AcodeWebViewNative"); + + WebSettings settings = webView.getSettings(); + settings.setJavaScriptEnabled(true); + settings.setDomStorageEnabled(true); + settings.setAllowContentAccess(true); + settings.setDisplayZoomControls(false); + settings.setLoadWithOverviewMode(true); + settings.setUseWideViewPort(true); + settings.setAllowFileAccess(true); + + String bridgeJs = + "(function() {" + + " window.webview = window.webview || {};" + + " window.webview._callbacks = [];" + + " window.webview.onMessage = function(cb) { window.webview._callbacks.push(cb); };" + + " window.webview.postMessage = function(msg) {" + + " var data = typeof msg === 'string' ? msg : JSON.stringify(msg);" + + " window.AcodeWebViewNative.postMessage(data);" + + " };" + + " window.webview.offMessage = function(cb) {" + + " window.webview._callbacks = window.webview._callbacks.filter(function(c) { return c !== cb; });" + + " };" + + "})();"; + + webView.evaluateJavascript(bridgeJs, null); + + FrameLayout webViewContainer = new FrameLayout(this); + webViewContainer.setBackgroundColor(Color.WHITE); + webViewContainer.addView(webView, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + )); + + layout.addView(titleLayout); + layout.addView(webViewContainer, new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + 0, 1 + )); + + setContentView(layout); + + if (Build.VERSION.SDK_INT >= 30) { + getWindow().setDecorFitsSystemWindows(false); + } + + WebViewInstance instance = plugin != null ? plugin.getInstance(webviewId) : null; + if (instance != null) { + instance.createWebView(this); + webView = instance.getWebView(); + webViewContainer.removeAllViews(); + webViewContainer.addView(webView, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + )); + } + } + + @Override + public void onBackPressed() { + if (webView != null && webView.canGoBack()) { + webView.goBack(); + } else { + finish(); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (plugin != null) { + plugin.sendEventToCordova(webviewId, "closed", null); + } + } + + private int dpToPx(int dp) { + return (int) (dp * getResources().getDisplayMetrics().density); + } + + private class FullscreenWebViewClient extends WebViewClient { + @Override + public boolean shouldOverrideUrlLoading(WebView view, android.webkit.WebResourceRequest request) { + if (!allowNavigation) { + return true; + } + return false; + } + } + + private class JsBridge { + @JavascriptInterface + public void postMessage(String message) { + if (plugin != null) { + plugin.sendMessageToCordova(webviewId, message); + } + } + + @JavascriptInterface + public String getWebViewId() { + return webviewId; + } + } +} diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java new file mode 100644 index 000000000..6844c6b13 --- /dev/null +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java @@ -0,0 +1,423 @@ +package com.foxdebug.webview; + +import android.app.Activity; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.DownloadListener; +import android.webkit.JavascriptInterface; +import android.webkit.URLUtil; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.app.AlertDialog; +import android.app.DownloadManager; +import android.content.Context; +import android.net.Uri; +import android.os.Environment; +import android.widget.FrameLayout; +import android.widget.Toast; +import org.apache.cordova.CallbackContext; +import org.json.JSONException; +import org.json.JSONObject; + +public class WebViewInstance { + + private static final String TAG = "WebViewInstance"; + + final String id; + final String mode; + final String title; + final int width; + final int height; + final int x; + final int y; + final boolean allowNavigation; + final boolean allowDownloads; + final boolean initiallyVisible; + final WebViewPlugin plugin; + + private WebView webView; + private FrameLayout container; + private boolean isDestroyed = false; + + WebViewInstance( + String id, String mode, String title, + int width, int height, int x, int y, + boolean allowNavigation, boolean allowDownloads, + boolean initiallyVisible, + Activity activity, + WebViewPlugin plugin + ) { + this.id = id; + this.mode = mode; + this.title = title; + this.width = width; + this.height = height; + this.x = x; + this.y = y; + this.allowNavigation = allowNavigation; + this.allowDownloads = allowDownloads; + this.initiallyVisible = initiallyVisible; + this.plugin = plugin; + } + + public WebView getWebView() { + return webView; + } + + void createWebView(Activity activity) { + webView = new WebView(activity); + + WebSettings settings = webView.getSettings(); + settings.setJavaScriptEnabled(true); + settings.setDomStorageEnabled(true); + settings.setAllowContentAccess(true); + settings.setDisplayZoomControls(false); + settings.setLoadWithOverviewMode(true); + settings.setUseWideViewPort(true); + settings.setAllowFileAccess(true); + settings.setAllowFileAccessFromFileURLs(true); + settings.setAllowUniversalAccessFromFileURLs(true); + + webView.setWebViewClient(new InstanceWebViewClient()); + webView.setWebChromeClient(new InstanceWebChromeClient()); + webView.setFocusable(true); + webView.setFocusableInTouchMode(true); + + webView.addJavascriptInterface(new JsBridge(), "AcodeWebViewNative"); + + if (allowDownloads) { + webView.setDownloadListener(new InstanceDownloadListener(activity)); + } + + String bridgeJs = + "(function() {" + + " window.webview = window.webview || {};" + + " window.webview._callbacks = [];" + + " window.webview.onMessage = function(cb) { window.webview._callbacks.push(cb); };" + + " window.webview.postMessage = function(msg) {" + + " var data = typeof msg === 'string' ? msg : JSON.stringify(msg);" + + " window.AcodeWebViewNative.postMessage(data);" + + " };" + + " window.webview.offMessage = function(cb) {" + + " window.webview._callbacks = window.webview._callbacks.filter(function(c) { return c !== cb; });" + + " };" + + "})();"; + + webView.evaluateJavascript(bridgeJs, null); + } + + void attachToActivity(Activity activity) { + container = new FrameLayout(activity); + + FrameLayout.LayoutParams webViewParams = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ); + + container.setBackgroundColor(Color.argb(180, 0, 0, 0)); + + if (mode.equals("window")) { + int w = width > 0 ? width : ViewGroup.LayoutParams.WRAP_CONTENT; + int h = height > 0 ? height : ViewGroup.LayoutParams.WRAP_CONTENT; + + webViewParams = new FrameLayout.LayoutParams( + w > 0 ? dpToPx(activity, w) : ViewGroup.LayoutParams.MATCH_PARENT, + h > 0 ? dpToPx(activity, h) : ViewGroup.LayoutParams.MATCH_PARENT + ); + webViewParams.gravity = Gravity.CENTER; + webViewParams.setMargins(dpToPx(activity, 16), dpToPx(activity, 48), dpToPx(activity, 16), dpToPx(activity, 48)); + + container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + hideInner(); + } + }); + } else if (mode.equals("panel")) { + webViewParams = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + height > 0 ? dpToPx(activity, height) : (int)(getScreenHeight(activity) * 0.4) + ); + webViewParams.gravity = Gravity.BOTTOM; + } + + container.addView(webView, webViewParams); + + ViewGroup rootView = activity.findViewById(android.R.id.content); + if (rootView instanceof FrameLayout) { + rootView.addView(container, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + )); + } + } + + void loadURL(String url) { + if (isDestroyed || webView == null) return; + final String safeUrl = (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file://")) + ? url : "http://" + url; + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + webView.loadUrl(safeUrl); + } + }); + } + + void loadHTML(String html) { + if (isDestroyed || webView == null) return; + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + webView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); + } + }); + } + + void evaluate(String js, final CallbackContext callbackContext) { + if (isDestroyed || webView == null) { + callbackContext.error("WebView destroyed"); + return; + } + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + webView.evaluateJavascript(js, new ValueCallback() { + @Override + public void onReceiveValue(String value) { + if (value != null && value.startsWith("\"") && value.endsWith("\"")) { + value = value.substring(1, value.length() - 1) + .replace("\\\"", "\"") + .replace("\\\\", "\\"); + } + callbackContext.success(value); + } + }); + } + }); + } + + void postMessage(String message, CallbackContext callbackContext) { + if (isDestroyed || webView == null) { + callbackContext.error("WebView destroyed"); + return; + } + String escaped = message + .replace("\\", "\\\\") + .replace("'", "\\'") + .replace("\n", "\\n") + .replace("\r", "\\r"); + + String js = "if(window.webview&&window.webview._callbacks){" + + "var msg=" + safeParseJSON(message) + ";" + + "window.webview._callbacks.forEach(function(cb){try{cb(msg)}catch(e){console.error(e)}});" + + "}"; + + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + webView.evaluateJavascript(js, null); + callbackContext.success(); + } + }); + } + + private String safeParseJSON(String message) { + try { + new JSONObject(message); + return message; + } catch (JSONException e1) { + try { + new org.json.JSONArray(message); + return message; + } catch (JSONException e2) { + return "\"" + message.replace("\"", "\\\"").replace("\n", "\\n") + "\""; + } + } + } + + void show(final CallbackContext callbackContext) { + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + if (isDestroyed || container == null) { + if (callbackContext != null) callbackContext.error("Cannot show"); + return; + } + container.setVisibility(View.VISIBLE); + if (callbackContext != null) callbackContext.success(); + } + }); + } + + void hide(final CallbackContext callbackContext) { + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + if (isDestroyed || container == null) { + if (callbackContext != null) callbackContext.error("Cannot hide"); + return; + } + container.setVisibility(View.GONE); + if (callbackContext != null) callbackContext.success(); + } + }); + } + + private void hideInner() { + if (container != null) { + container.setVisibility(View.GONE); + } + } + + void reload(CallbackContext callbackContext) { + if (isDestroyed || webView == null) { + callbackContext.error("WebView destroyed"); + return; + } + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + webView.reload(); + callbackContext.success(); + } + }); + } + + void destroy() { + isDestroyed = true; + + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + if (container != null && container.getParent() != null) { + ((ViewGroup) container.getParent()).removeView(container); + } + if (webView != null) { + webView.removeJavascriptInterface("AcodeWebViewNative"); + webView.setWebViewClient(null); + webView.setWebChromeClient(null); + webView.loadUrl("about:blank"); + webView.destroy(); + } + webView = null; + container = null; + } + }); + } + + void onPageFinished() { + try { + JSONObject data = new JSONObject(); + data.put("url", webView.getUrl()); + data.put("title", webView.getTitle()); + plugin.sendEventToCordova(id, "pageFinished", data); + } catch (Exception e) { + Log.e(TAG, "onPageFinished error", e); + } + } + + private static int dpToPx(Context context, int dp) { + return (int) (dp * context.getResources().getDisplayMetrics().density); + } + + private static int getScreenHeight(Activity activity) { + return activity.getResources().getDisplayMetrics().heightPixels; + } + + private class InstanceWebViewClient extends WebViewClient { + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + if (!allowNavigation) { + return true; + } + return false; + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + WebViewInstance.this.onPageFinished(); + } + } + + private class InstanceWebChromeClient extends WebChromeClient { + @Override + public void onReceivedTitle(WebView view, String pageTitle) { + super.onReceivedTitle(view, pageTitle); + try { + JSONObject data = new JSONObject(); + data.put("title", pageTitle); + plugin.sendEventToCordova(id, "titleChanged", data); + } catch (Exception e) { + Log.e(TAG, "onReceivedTitle error", e); + } + } + } + + private class InstanceDownloadListener implements DownloadListener { + private final Context context; + + InstanceDownloadListener(Context context) { + this.context = context; + } + + @Override + public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) { + final String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType); + + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + new AlertDialog.Builder(context) + .setTitle("Download file") + .setMessage("Do you want to download \"" + fileName + "\"?") + .setPositiveButton("Yes", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); + request.setMimeType(mimeType); + request.addRequestHeader("User-Agent", userAgent); + request.setDescription("Downloading file..."); + request.setTitle(fileName); + request.allowScanningByMediaScanner(); + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); + + DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + dm.enqueue(request); + Toast.makeText(context, "Download started...", Toast.LENGTH_SHORT).show(); + } + }) + .setNegativeButton("Cancel", null) + .show(); + } + }); + } + } + + public class JsBridge { + @JavascriptInterface + public void postMessage(String message) { + plugin.sendMessageToCordova(id, message); + } + + @JavascriptInterface + public String getWebViewId() { + return id; + } + } +} diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java new file mode 100644 index 000000000..e060d007f --- /dev/null +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java @@ -0,0 +1,266 @@ +package com.foxdebug.webview; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.JavascriptInterface; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; +import java.util.HashMap; +import java.util.UUID; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class WebViewPlugin extends CordovaPlugin { + + private static final String TAG = "AcodeWebView"; + private static WebViewPlugin instance; + + private final HashMap instances = new HashMap<>(); + private CallbackContext messageCallback; + + @Override + protected void pluginInitialize() { + instance = this; + } + + public static WebViewPlugin getInstance() { + return instance; + } + + @Override + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + try { + switch (action) { + case "setMessageCallback": + this.messageCallback = callbackContext; + PluginResult keepResult = new PluginResult(PluginResult.Status.NO_RESULT); + keepResult.setKeepCallback(true); + callbackContext.sendPluginResult(keepResult); + return true; + case "create": + create(args.getJSONObject(0), callbackContext); + return true; + case "loadURL": + loadURL(args.getString(0), args.getString(1), callbackContext); + return true; + case "loadHTML": + loadHTML(args.getString(0), args.getString(1), callbackContext); + return true; + case "evaluate": + evaluate(args.getString(0), args.getString(1), callbackContext); + return true; + case "postMessage": + postMessage(args.getString(0), args.getString(1), callbackContext); + return true; + case "show": + show(args.getString(0), callbackContext); + return true; + case "hide": + hide(args.getString(0), callbackContext); + return true; + case "reload": + reload(args.getString(0), callbackContext); + return true; + case "destroy": + destroy(args.getString(0), callbackContext); + return true; + default: + callbackContext.error("Unknown action: " + action); + return true; + } + } catch (Exception e) { + Log.e(TAG, "Error: " + action, e); + callbackContext.error(e.getMessage()); + } + return true; + } + + private String generateId() { + return "wv_" + UUID.randomUUID().toString().replace("-", "").substring(0, 12); + } + + private void create(JSONObject options, final CallbackContext callbackContext) throws JSONException { + final String id = generateId(); + final String mode = options.optString("mode", "hidden"); + final String title = options.optString("title", "WebView"); + final int width = options.optInt("width", 0); + final int height = options.optInt("height", 0); + final int x = options.optInt("x", 0); + final int y = options.optInt("y", 0); + final boolean allowNavigation = options.optBoolean("allowNavigation", true); + final boolean allowDownloads = options.optBoolean("allowDownloads", false); + final boolean visible = options.optBoolean("visible", true); + + final String effectiveMode = visible ? mode : "hidden"; + + cordova.getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + try { + WebViewInstance instance = new WebViewInstance( + id, effectiveMode, title, + width, height, x, y, + allowNavigation, allowDownloads, + visible, cordova.getActivity(), + WebViewPlugin.this + ); + + if (effectiveMode.equals("fullscreen")) { + instances.put(id, instance); + launchFullscreenActivity(id, title, allowNavigation, allowDownloads); + callbackContext.success(id); + return; + } + + instance.createWebView(cordova.getActivity()); + + if (effectiveMode.equals("window") || effectiveMode.equals("panel")) { + instance.attachToActivity(cordova.getActivity()); + } + + instances.put(id, instance); + callbackContext.success(id); + } catch (Exception e) { + Log.e(TAG, "Create error: " + e.getMessage(), e); + callbackContext.error(e.getMessage()); + } + } + }); + } + + private void launchFullscreenActivity( + String id, String title, boolean allowNavigation, boolean allowDownloads + ) { + Intent intent = new Intent(cordova.getActivity(), WebViewActivity.class); + intent.putExtra("webviewId", id); + intent.putExtra("title", title); + intent.putExtra("allowNavigation", allowNavigation); + intent.putExtra("allowDownloads", allowDownloads); + cordova.getActivity().startActivity(intent); + } + + public WebViewInstance getInstance(String id) { + return instances.get(id); + } + + private void loadURL(String id, String url, CallbackContext callbackContext) { + WebViewInstance instance = getInstance(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + instance.loadURL(url); + callbackContext.success(); + } + + private void loadHTML(String id, String html, CallbackContext callbackContext) { + WebViewInstance instance = getInstance(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + instance.loadHTML(html); + callbackContext.success(); + } + + private void evaluate(String id, String js, CallbackContext callbackContext) { + WebViewInstance instance = getInstance(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + instance.evaluate(js, callbackContext); + } + + private void postMessage(String id, String message, CallbackContext callbackContext) { + WebViewInstance instance = getInstance(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + instance.postMessage(message, callbackContext); + } + + private void show(String id, CallbackContext callbackContext) { + WebViewInstance instance = getInstance(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + instance.show(callbackContext); + } + + private void hide(String id, CallbackContext callbackContext) { + WebViewInstance instance = getInstance(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + instance.hide(callbackContext); + } + + private void reload(String id, CallbackContext callbackContext) { + WebViewInstance instance = getInstance(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + instance.reload(callbackContext); + } + + private void destroy(String id, CallbackContext callbackContext) { + final WebViewInstance instance = instances.remove(id); + if (instance == null) { callbackContext.error("WebView not found: " + id); return; } + + cordova.getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + instance.destroy(); + callbackContext.success(); + } + }); + } + + public void sendMessageToCordova(String id, String message) { + if (messageCallback == null) return; + + try { + JSONObject payload = new JSONObject(); + payload.put("id", id); + payload.put("message", message); + + PluginResult result = new PluginResult(PluginResult.Status.OK, payload); + result.setKeepCallback(true); + messageCallback.sendPluginResult(result); + } catch (JSONException e) { + Log.e(TAG, "Error building message payload", e); + } + } + + public void sendEventToCordova(String id, String event, JSONObject data) { + if (messageCallback == null) return; + + try { + JSONObject payload = new JSONObject(); + payload.put("id", id); + payload.put("event", event); + if (data != null) { + payload.put("data", data); + } + + PluginResult result = new PluginResult(PluginResult.Status.OK, payload); + result.setKeepCallback(true); + messageCallback.sendPluginResult(result); + } catch (JSONException e) { + Log.e(TAG, "Error building event payload", e); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + for (WebViewInstance instance : instances.values()) { + try { instance.destroy(); } catch (Exception ignored) {} + } + instances.clear(); + instance = null; + } +} diff --git a/src/plugins/webview/www/webview.js b/src/plugins/webview/www/webview.js new file mode 100644 index 000000000..b1935dddf --- /dev/null +++ b/src/plugins/webview/www/webview.js @@ -0,0 +1,88 @@ +const SERVICE = "AcodeWebView"; + +let messageCallback = null; + +function setMessageCallback(callback) { + messageCallback = callback; + cordova.exec( + (payload) => { + if (messageCallback) { + messageCallback(payload); + } + }, + (error) => { + console.error("WebView message callback error:", error); + }, + SERVICE, + "setMessageCallback", + [] + ); +} + +function create(options) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "create", [options || {}]); + }); +} + +function loadURL(id, url) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "loadURL", [id, url]); + }); +} + +function loadHTML(id, html) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "loadHTML", [id, html]); + }); +} + +function evaluate(id, js) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "evaluate", [id, js]); + }); +} + +function postMessage(id, message) { + return new Promise((resolve, reject) => { + const payload = typeof message === "string" ? message : JSON.stringify(message); + cordova.exec(resolve, reject, SERVICE, "postMessage", [id, payload]); + }); +} + +function show(id) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "show", [id]); + }); +} + +function hide(id) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "hide", [id]); + }); +} + +function reload(id) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "reload", [id]); + }); +} + +function destroy(id) { + return new Promise((resolve, reject) => { + cordova.exec(resolve, reject, SERVICE, "destroy", [id]); + }); +} + +export default { + setMessageCallback, + create, + loadURL, + loadHTML, + evaluate, + postMessage, + show, + hide, + reload, + destroy, +}; From fdbca224b49949e0bfe2dcfd38170f0dc3be1188 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Wed, 22 Jul 2026 19:00:34 +0530 Subject: [PATCH 2/7] format --- src/lib/acode.js | 2 +- src/lib/webview.js | 280 +++++++++++++++++++++++---------------------- 2 files changed, 142 insertions(+), 140 deletions(-) diff --git a/src/lib/acode.js b/src/lib/acode.js index 341e2d7de..3e0ecf694 100644 --- a/src/lib/acode.js +++ b/src/lib/acode.js @@ -73,8 +73,8 @@ import encodings, { decode, encode } from "utils/encodings"; import helpers from "utils/helpers"; import KeyboardEvent from "utils/keyboardEvent"; import Url from "utils/Url"; -import webview from "./webview"; import config from "./config"; +import webview from "./webview"; class Acode { #modules = {}; diff --git a/src/lib/webview.js b/src/lib/webview.js index b237fe38d..70965c27b 100644 --- a/src/lib/webview.js +++ b/src/lib/webview.js @@ -5,151 +5,153 @@ const instances = new Map(); const eventCallbacks = new Map(); function ensureInit() { - if (!initialized) { - nativeBridge.setMessageCallback((payload) => { - const { id, message, event, data } = payload; - - if (event) { - const callbacks = eventCallbacks.get(id); - if (callbacks) { - callbacks.forEach((cb) => { - try { - cb(event, data); - } catch (e) { - console.error("WebView event callback error:", e); - } - }); - } - return; - } - - if (message !== undefined) { - const instance = instances.get(id); - if (instance && instance._messageCallbacks) { - let parsed = message; - try { - parsed = JSON.parse(message); - } catch (_) {} - instance._messageCallbacks.forEach((cb) => { - try { - cb(parsed); - } catch (e) { - console.error("WebView message callback error:", e); - } - }); - } - } - }); - initialized = true; - } + if (!initialized) { + nativeBridge.setMessageCallback((payload) => { + const { id, message, event, data } = payload; + + if (event) { + const callbacks = eventCallbacks.get(id); + if (callbacks) { + callbacks.forEach((cb) => { + try { + cb(event, data); + } catch (e) { + console.error("WebView event callback error:", e); + } + }); + } + return; + } + + if (message !== undefined) { + const instance = instances.get(id); + if (instance && instance._messageCallbacks) { + let parsed = message; + try { + parsed = JSON.parse(message); + } catch (_) {} + instance._messageCallbacks.forEach((cb) => { + try { + cb(parsed); + } catch (e) { + console.error("WebView message callback error:", e); + } + }); + } + } + }); + initialized = true; + } } class WebView { - constructor(id, options = {}) { - this.id = id; - this.options = options; - this._messageCallbacks = []; - this._eventCallbacks = []; - this._destroyed = false; - - instances.set(id, this); - eventCallbacks.set(id, this._eventCallbacks); - } - - async loadURL(url) { - this._checkDestroyed(); - await nativeBridge.loadURL(this.id, url); - } - - async loadHTML(html) { - this._checkDestroyed(); - await nativeBridge.loadHTML(this.id, html); - } - - async evaluate(js) { - this._checkDestroyed(); - return await nativeBridge.evaluate(this.id, js); - } - - onMessage(callback) { - this._checkDestroyed(); - if (typeof callback === "function") { - this._messageCallbacks.push(callback); - } - } - - offMessage(callback) { - this._messageCallbacks = this._messageCallbacks.filter((cb) => cb !== callback); - } - - on(event, callback) { - this._checkDestroyed(); - if (typeof callback === "function") { - this._eventCallbacks.push({ event, callback }); - } - } - - off(event, callback) { - this._eventCallbacks = this._eventCallbacks.filter( - (cb) => !(cb.event === event && cb.callback === callback) - ); - } - - async postMessage(message) { - this._checkDestroyed(); - await nativeBridge.postMessage(this.id, message); - } - - async show() { - this._checkDestroyed(); - await nativeBridge.show(this.id); - } - - async hide() { - this._checkDestroyed(); - await nativeBridge.hide(this.id); - } - - async reload() { - this._checkDestroyed(); - await nativeBridge.reload(this.id); - } - - async destroy() { - this._checkDestroyed(); - this._destroyed = true; - await nativeBridge.destroy(this.id); - instances.delete(this.id); - eventCallbacks.delete(this.id); - this._messageCallbacks = []; - this._eventCallbacks = []; - } - - _checkDestroyed() { - if (this._destroyed) { - throw new Error("WebView has been destroyed"); - } - } + constructor(id, options = {}) { + this.id = id; + this.options = options; + this._messageCallbacks = []; + this._eventCallbacks = []; + this._destroyed = false; + + instances.set(id, this); + eventCallbacks.set(id, this._eventCallbacks); + } + + async loadURL(url) { + this._checkDestroyed(); + await nativeBridge.loadURL(this.id, url); + } + + async loadHTML(html) { + this._checkDestroyed(); + await nativeBridge.loadHTML(this.id, html); + } + + async evaluate(js) { + this._checkDestroyed(); + return await nativeBridge.evaluate(this.id, js); + } + + onMessage(callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._messageCallbacks.push(callback); + } + } + + offMessage(callback) { + this._messageCallbacks = this._messageCallbacks.filter( + (cb) => cb !== callback, + ); + } + + on(event, callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._eventCallbacks.push({ event, callback }); + } + } + + off(event, callback) { + this._eventCallbacks = this._eventCallbacks.filter( + (cb) => !(cb.event === event && cb.callback === callback), + ); + } + + async postMessage(message) { + this._checkDestroyed(); + await nativeBridge.postMessage(this.id, message); + } + + async show() { + this._checkDestroyed(); + await nativeBridge.show(this.id); + } + + async hide() { + this._checkDestroyed(); + await nativeBridge.hide(this.id); + } + + async reload() { + this._checkDestroyed(); + await nativeBridge.reload(this.id); + } + + async destroy() { + this._checkDestroyed(); + this._destroyed = true; + await nativeBridge.destroy(this.id); + instances.delete(this.id); + eventCallbacks.delete(this.id); + this._messageCallbacks = []; + this._eventCallbacks = []; + } + + _checkDestroyed() { + if (this._destroyed) { + throw new Error("WebView has been destroyed"); + } + } } const webviewAPI = { - async create(options = {}) { - ensureInit(); - - const id = await nativeBridge.create({ - title: options.title || "", - mode: options.mode || "hidden", - width: options.width || 0, - height: options.height || 0, - x: options.x || 0, - y: options.y || 0, - allowNavigation: options.allowNavigation !== false, - allowDownloads: options.allowDownloads === true, - visible: options.visible !== false, - }); - - return new WebView(id, options); - }, + async create(options = {}) { + ensureInit(); + + const id = await nativeBridge.create({ + title: options.title || "", + mode: options.mode || "hidden", + width: options.width || 0, + height: options.height || 0, + x: options.x || 0, + y: options.y || 0, + allowNavigation: options.allowNavigation !== false, + allowDownloads: options.allowDownloads === true, + visible: options.visible !== false, + }); + + return new WebView(id, options); + }, }; export default webviewAPI; From d58b26c1dcb47d26fdb019e9a859b73041fcb6fa Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Wed, 22 Jul 2026 19:03:30 +0530 Subject: [PATCH 3/7] fix: remove title bar and close button from fullscreen WebView Fullscreen mode is now a clean full-screen WebView with no chrome. Back button handles navigation and closing. --- .../com/foxdebug/webview/WebViewActivity.java | 157 +++++------------- .../com/foxdebug/webview/WebViewPlugin.java | 8 +- 2 files changed, 42 insertions(+), 123 deletions(-) diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java index 7c9c337f8..00ee0f07b 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java @@ -2,35 +2,22 @@ import android.app.Activity; import android.content.Intent; -import android.graphics.Color; -import android.graphics.Insets; import android.os.Build; import android.os.Bundle; -import android.util.Log; -import android.view.View; import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowInsets; -import android.view.WindowInsetsController; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.graphics.drawable.GradientDrawable; public class WebViewActivity extends Activity { - private static final String TAG = "WebViewActivity"; private static WebViewPlugin plugin; private WebView webView; private String webviewId; - private String title; private boolean allowNavigation; - private boolean allowDownloads; public static void setPlugin(WebViewPlugin p) { plugin = p; @@ -42,113 +29,56 @@ public void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); webviewId = intent.getStringExtra("webviewId"); - title = intent.getStringExtra("title"); allowNavigation = intent.getBooleanExtra("allowNavigation", true); - allowDownloads = intent.getBooleanExtra("allowDownloads", false); - LinearLayout layout = new LinearLayout(this); - layout.setOrientation(LinearLayout.VERTICAL); - layout.setLayoutParams(new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - )); + WebViewInstance instance = plugin != null ? plugin.getInstance(webviewId) : null; - TextView titleBar = new TextView(this); - titleBar.setText(title != null ? title : "WebView"); - titleBar.setTextColor(Color.WHITE); - titleBar.setPadding(dpToPx(16), dpToPx(8), dpToPx(16), dpToPx(8)); - titleBar.setTextSize(16); - titleBar.setBackgroundColor(Color.argb(255, 33, 33, 33)); - - GradientDrawable closeBg = new GradientDrawable(); - closeBg.setColor(Color.argb(255, 80, 80, 80)); - closeBg.setCornerRadius(dpToPx(4)); - - TextView closeButton = new TextView(this); - closeButton.setText("✕"); - closeButton.setTextColor(Color.WHITE); - closeButton.setTextSize(18); - closeButton.setPadding(dpToPx(12), dpToPx(4), dpToPx(12), dpToPx(4)); - closeButton.setBackground(closeBg); - closeButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - LinearLayout titleLayout = new LinearLayout(this); - titleLayout.setOrientation(LinearLayout.HORIZONTAL); - titleLayout.setBackgroundColor(Color.argb(255, 33, 33, 33)); - titleLayout.setPadding(dpToPx(12), 0, dpToPx(12), 0); - - LinearLayout.LayoutParams titleParams = new LinearLayout.LayoutParams( - 0, ViewGroup.LayoutParams.WRAP_CONTENT, 1 - ); - titleLayout.addView(titleBar, titleParams); - titleLayout.addView(closeButton, new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - )); + if (instance != null && instance.getWebView() == null) { + instance.createWebView(this); + webView = instance.getWebView(); + } else if (instance != null) { + webView = instance.getWebView(); + } else { + webView = new WebView(this); + webView.addJavascriptInterface(new JsBridge(), "AcodeWebViewNative"); + + WebSettings settings = webView.getSettings(); + settings.setJavaScriptEnabled(true); + settings.setDomStorageEnabled(true); + settings.setAllowContentAccess(true); + settings.setDisplayZoomControls(false); + settings.setLoadWithOverviewMode(true); + settings.setUseWideViewPort(true); + settings.setAllowFileAccess(true); + + webView.setWebViewClient(new FullscreenWebViewClient()); + + String bridgeJs = + "(function() {" + + " window.webview = window.webview || {};" + + " window.webview._callbacks = [];" + + " window.webview.onMessage = function(cb) { window.webview._callbacks.push(cb); };" + + " window.webview.postMessage = function(msg) {" + + " var data = typeof msg === 'string' ? msg : JSON.stringify(msg);" + + " window.AcodeWebViewNative.postMessage(data);" + + " };" + + " window.webview.offMessage = function(cb) {" + + " window.webview._callbacks = window.webview._callbacks.filter(function(c) { return c !== cb; });" + + " };" + + "})();"; + webView.evaluateJavascript(bridgeJs, null); + } - webView = new WebView(this); - webView.setWebViewClient(new FullscreenWebViewClient()); - webView.addJavascriptInterface(new JsBridge(), "AcodeWebViewNative"); - - WebSettings settings = webView.getSettings(); - settings.setJavaScriptEnabled(true); - settings.setDomStorageEnabled(true); - settings.setAllowContentAccess(true); - settings.setDisplayZoomControls(false); - settings.setLoadWithOverviewMode(true); - settings.setUseWideViewPort(true); - settings.setAllowFileAccess(true); - - String bridgeJs = - "(function() {" + - " window.webview = window.webview || {};" + - " window.webview._callbacks = [];" + - " window.webview.onMessage = function(cb) { window.webview._callbacks.push(cb); };" + - " window.webview.postMessage = function(msg) {" + - " var data = typeof msg === 'string' ? msg : JSON.stringify(msg);" + - " window.AcodeWebViewNative.postMessage(data);" + - " };" + - " window.webview.offMessage = function(cb) {" + - " window.webview._callbacks = window.webview._callbacks.filter(function(c) { return c !== cb; });" + - " };" + - "})();"; - - webView.evaluateJavascript(bridgeJs, null); - - FrameLayout webViewContainer = new FrameLayout(this); - webViewContainer.setBackgroundColor(Color.WHITE); - webViewContainer.addView(webView, new FrameLayout.LayoutParams( + FrameLayout container = new FrameLayout(this); + container.addView(webView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT )); - - layout.addView(titleLayout); - layout.addView(webViewContainer, new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - 0, 1 - )); - - setContentView(layout); + setContentView(container); if (Build.VERSION.SDK_INT >= 30) { getWindow().setDecorFitsSystemWindows(false); } - - WebViewInstance instance = plugin != null ? plugin.getInstance(webviewId) : null; - if (instance != null) { - instance.createWebView(this); - webView = instance.getWebView(); - webViewContainer.removeAllViews(); - webViewContainer.addView(webView, new FrameLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - )); - } } @Override @@ -168,17 +98,10 @@ protected void onDestroy() { } } - private int dpToPx(int dp) { - return (int) (dp * getResources().getDisplayMetrics().density); - } - private class FullscreenWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, android.webkit.WebResourceRequest request) { - if (!allowNavigation) { - return true; - } - return false; + return !allowNavigation; } } diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java index e060d007f..17b7e51aa 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java @@ -126,7 +126,7 @@ public void run() { if (effectiveMode.equals("fullscreen")) { instances.put(id, instance); - launchFullscreenActivity(id, title, allowNavigation, allowDownloads); + launchFullscreenActivity(id, allowNavigation); callbackContext.success(id); return; } @@ -147,14 +147,10 @@ public void run() { }); } - private void launchFullscreenActivity( - String id, String title, boolean allowNavigation, boolean allowDownloads - ) { + private void launchFullscreenActivity(String id, boolean allowNavigation) { Intent intent = new Intent(cordova.getActivity(), WebViewActivity.class); intent.putExtra("webviewId", id); - intent.putExtra("title", title); intent.putExtra("allowNavigation", allowNavigation); - intent.putExtra("allowDownloads", allowDownloads); cordova.getActivity().startActivity(intent); } From f30398a48081c7a1115f0160983780f6ef15b4c4 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Wed, 22 Jul 2026 19:10:12 +0530 Subject: [PATCH 4/7] fix: lifecycle events, hidden show, fullscreen disconnect, and security - Fix event dispatch: filter callbacks by event name instead of calling {event,callback} objects as functions (webview.js) - Make hidden WebViews showable: attachToActivity() on first show() - Remove universal file access (setAllowFileAccessFromFileURLs, setAllowUniversalAccessFromFileURLs) for untrusted content - Clean up fullscreen path: remove throwaway WebView in Activity, register instance cleanup in onDestroy - Add deprecated shouldOverrideUrlLoading(String) for compat - Use Handler(Looper.getMainLooper()) instead of View.post() so hidden WebViews can process loadURL/evaluate without a window - Remove unused constructor params (title, x, y, initiallyVisible) --- src/lib/webview.js | 284 +++++++++--------- .../com/foxdebug/webview/WebViewActivity.java | 68 +---- .../com/foxdebug/webview/WebViewInstance.java | 102 +++---- .../com/foxdebug/webview/WebViewPlugin.java | 22 +- 4 files changed, 203 insertions(+), 273 deletions(-) diff --git a/src/lib/webview.js b/src/lib/webview.js index 70965c27b..ae96cb662 100644 --- a/src/lib/webview.js +++ b/src/lib/webview.js @@ -5,153 +5,155 @@ const instances = new Map(); const eventCallbacks = new Map(); function ensureInit() { - if (!initialized) { - nativeBridge.setMessageCallback((payload) => { - const { id, message, event, data } = payload; - - if (event) { - const callbacks = eventCallbacks.get(id); - if (callbacks) { - callbacks.forEach((cb) => { - try { - cb(event, data); - } catch (e) { - console.error("WebView event callback error:", e); - } - }); - } - return; - } - - if (message !== undefined) { - const instance = instances.get(id); - if (instance && instance._messageCallbacks) { - let parsed = message; - try { - parsed = JSON.parse(message); - } catch (_) {} - instance._messageCallbacks.forEach((cb) => { - try { - cb(parsed); - } catch (e) { - console.error("WebView message callback error:", e); - } - }); - } - } - }); - initialized = true; - } + if (!initialized) { + nativeBridge.setMessageCallback((payload) => { + const { id, message, event, data } = payload; + + if (event) { + const callbacks = eventCallbacks.get(id); + if (callbacks) { + callbacks.forEach((entry) => { + if (entry.event === event) { + try { + entry.callback(event, data); + } catch (e) { + console.error("WebView event callback error:", e); + } + } + }); + } + return; + } + + if (message !== undefined) { + const instance = instances.get(id); + if (instance && instance._messageCallbacks) { + let parsed = message; + try { + parsed = JSON.parse(message); + } catch (_) {} + instance._messageCallbacks.forEach((cb) => { + try { + cb(parsed); + } catch (e) { + console.error("WebView message callback error:", e); + } + }); + } + } + }); + initialized = true; + } } class WebView { - constructor(id, options = {}) { - this.id = id; - this.options = options; - this._messageCallbacks = []; - this._eventCallbacks = []; - this._destroyed = false; - - instances.set(id, this); - eventCallbacks.set(id, this._eventCallbacks); - } - - async loadURL(url) { - this._checkDestroyed(); - await nativeBridge.loadURL(this.id, url); - } - - async loadHTML(html) { - this._checkDestroyed(); - await nativeBridge.loadHTML(this.id, html); - } - - async evaluate(js) { - this._checkDestroyed(); - return await nativeBridge.evaluate(this.id, js); - } - - onMessage(callback) { - this._checkDestroyed(); - if (typeof callback === "function") { - this._messageCallbacks.push(callback); - } - } - - offMessage(callback) { - this._messageCallbacks = this._messageCallbacks.filter( - (cb) => cb !== callback, - ); - } - - on(event, callback) { - this._checkDestroyed(); - if (typeof callback === "function") { - this._eventCallbacks.push({ event, callback }); - } - } - - off(event, callback) { - this._eventCallbacks = this._eventCallbacks.filter( - (cb) => !(cb.event === event && cb.callback === callback), - ); - } - - async postMessage(message) { - this._checkDestroyed(); - await nativeBridge.postMessage(this.id, message); - } - - async show() { - this._checkDestroyed(); - await nativeBridge.show(this.id); - } - - async hide() { - this._checkDestroyed(); - await nativeBridge.hide(this.id); - } - - async reload() { - this._checkDestroyed(); - await nativeBridge.reload(this.id); - } - - async destroy() { - this._checkDestroyed(); - this._destroyed = true; - await nativeBridge.destroy(this.id); - instances.delete(this.id); - eventCallbacks.delete(this.id); - this._messageCallbacks = []; - this._eventCallbacks = []; - } - - _checkDestroyed() { - if (this._destroyed) { - throw new Error("WebView has been destroyed"); - } - } + constructor(id, options = {}) { + this.id = id; + this.options = options; + this._messageCallbacks = []; + this._eventCallbacks = []; + this._destroyed = false; + + instances.set(id, this); + eventCallbacks.set(id, this._eventCallbacks); + } + + async loadURL(url) { + this._checkDestroyed(); + await nativeBridge.loadURL(this.id, url); + } + + async loadHTML(html) { + this._checkDestroyed(); + await nativeBridge.loadHTML(this.id, html); + } + + async evaluate(js) { + this._checkDestroyed(); + return await nativeBridge.evaluate(this.id, js); + } + + onMessage(callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._messageCallbacks.push(callback); + } + } + + offMessage(callback) { + this._messageCallbacks = this._messageCallbacks.filter( + (cb) => cb !== callback, + ); + } + + on(event, callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._eventCallbacks.push({ event, callback }); + } + } + + off(event, callback) { + this._eventCallbacks = this._eventCallbacks.filter( + (entry) => !(entry.event === event && entry.callback === callback), + ); + } + + async postMessage(message) { + this._checkDestroyed(); + await nativeBridge.postMessage(this.id, message); + } + + async show() { + this._checkDestroyed(); + await nativeBridge.show(this.id); + } + + async hide() { + this._checkDestroyed(); + await nativeBridge.hide(this.id); + } + + async reload() { + this._checkDestroyed(); + await nativeBridge.reload(this.id); + } + + async destroy() { + this._checkDestroyed(); + this._destroyed = true; + await nativeBridge.destroy(this.id); + instances.delete(this.id); + eventCallbacks.delete(this.id); + this._messageCallbacks = []; + this._eventCallbacks = []; + } + + _checkDestroyed() { + if (this._destroyed) { + throw new Error("WebView has been destroyed"); + } + } } const webviewAPI = { - async create(options = {}) { - ensureInit(); - - const id = await nativeBridge.create({ - title: options.title || "", - mode: options.mode || "hidden", - width: options.width || 0, - height: options.height || 0, - x: options.x || 0, - y: options.y || 0, - allowNavigation: options.allowNavigation !== false, - allowDownloads: options.allowDownloads === true, - visible: options.visible !== false, - }); - - return new WebView(id, options); - }, + async create(options = {}) { + ensureInit(); + + const id = await nativeBridge.create({ + title: options.title || "", + mode: options.mode || "hidden", + width: options.width || 0, + height: options.height || 0, + x: options.x || 0, + y: options.y || 0, + allowNavigation: options.allowNavigation !== false, + allowDownloads: options.allowDownloads === true, + visible: options.visible !== false, + }); + + return new WebView(id, options); + }, }; export default webviewAPI; diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java index 00ee0f07b..54b7304c6 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java @@ -5,10 +5,7 @@ import android.os.Build; import android.os.Bundle; import android.view.ViewGroup; -import android.webkit.JavascriptInterface; -import android.webkit.WebSettings; import android.webkit.WebView; -import android.webkit.WebViewClient; import android.widget.FrameLayout; public class WebViewActivity extends Activity { @@ -17,7 +14,6 @@ public class WebViewActivity extends Activity { private WebView webView; private String webviewId; - private boolean allowNavigation; public static void setPlugin(WebViewPlugin p) { plugin = p; @@ -29,46 +25,16 @@ public void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); webviewId = intent.getStringExtra("webviewId"); - allowNavigation = intent.getBooleanExtra("allowNavigation", true); WebViewInstance instance = plugin != null ? plugin.getInstance(webviewId) : null; - - if (instance != null && instance.getWebView() == null) { - instance.createWebView(this); - webView = instance.getWebView(); - } else if (instance != null) { - webView = instance.getWebView(); - } else { - webView = new WebView(this); - webView.addJavascriptInterface(new JsBridge(), "AcodeWebViewNative"); - - WebSettings settings = webView.getSettings(); - settings.setJavaScriptEnabled(true); - settings.setDomStorageEnabled(true); - settings.setAllowContentAccess(true); - settings.setDisplayZoomControls(false); - settings.setLoadWithOverviewMode(true); - settings.setUseWideViewPort(true); - settings.setAllowFileAccess(true); - - webView.setWebViewClient(new FullscreenWebViewClient()); - - String bridgeJs = - "(function() {" + - " window.webview = window.webview || {};" + - " window.webview._callbacks = [];" + - " window.webview.onMessage = function(cb) { window.webview._callbacks.push(cb); };" + - " window.webview.postMessage = function(msg) {" + - " var data = typeof msg === 'string' ? msg : JSON.stringify(msg);" + - " window.AcodeWebViewNative.postMessage(data);" + - " };" + - " window.webview.offMessage = function(cb) {" + - " window.webview._callbacks = window.webview._callbacks.filter(function(c) { return c !== cb; });" + - " };" + - "})();"; - webView.evaluateJavascript(bridgeJs, null); + if (instance == null) { + finish(); + return; } + instance.createWebView(this); + webView = instance.getWebView(); + FrameLayout container = new FrameLayout(this); container.addView(webView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -95,27 +61,7 @@ protected void onDestroy() { super.onDestroy(); if (plugin != null) { plugin.sendEventToCordova(webviewId, "closed", null); - } - } - - private class FullscreenWebViewClient extends WebViewClient { - @Override - public boolean shouldOverrideUrlLoading(WebView view, android.webkit.WebResourceRequest request) { - return !allowNavigation; - } - } - - private class JsBridge { - @JavascriptInterface - public void postMessage(String message) { - if (plugin != null) { - plugin.sendMessageToCordova(webviewId, message); - } - } - - @JavascriptInterface - public String getWebViewId() { - return webviewId; + plugin.removeInstance(webviewId); } } } diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java index 6844c6b13..592ce2fdf 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java @@ -3,15 +3,12 @@ import android.app.Activity; import android.content.DialogInterface; import android.graphics.Color; -import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; import android.webkit.DownloadListener; import android.webkit.JavascriptInterface; import android.webkit.URLUtil; @@ -38,38 +35,32 @@ public class WebViewInstance { final String id; final String mode; - final String title; final int width; final int height; - final int x; - final int y; final boolean allowNavigation; final boolean allowDownloads; - final boolean initiallyVisible; final WebViewPlugin plugin; private WebView webView; private FrameLayout container; + private Activity activity; private boolean isDestroyed = false; + private boolean isAttached = false; WebViewInstance( - String id, String mode, String title, - int width, int height, int x, int y, + String id, String mode, + int width, int height, boolean allowNavigation, boolean allowDownloads, - boolean initiallyVisible, Activity activity, WebViewPlugin plugin ) { this.id = id; this.mode = mode; - this.title = title; this.width = width; this.height = height; - this.x = x; - this.y = y; this.allowNavigation = allowNavigation; this.allowDownloads = allowDownloads; - this.initiallyVisible = initiallyVisible; + this.activity = activity; this.plugin = plugin; } @@ -78,6 +69,7 @@ public WebView getWebView() { } void createWebView(Activity activity) { + this.activity = activity; webView = new WebView(activity); WebSettings settings = webView.getSettings(); @@ -87,9 +79,7 @@ void createWebView(Activity activity) { settings.setDisplayZoomControls(false); settings.setLoadWithOverviewMode(true); settings.setUseWideViewPort(true); - settings.setAllowFileAccess(true); - settings.setAllowFileAccessFromFileURLs(true); - settings.setAllowUniversalAccessFromFileURLs(true); + settings.setAllowFileAccess(false); webView.setWebViewClient(new InstanceWebViewClient()); webView.setWebChromeClient(new InstanceWebChromeClient()); @@ -119,34 +109,29 @@ void createWebView(Activity activity) { webView.evaluateJavascript(bridgeJs, null); } - void attachToActivity(Activity activity) { - container = new FrameLayout(activity); - - FrameLayout.LayoutParams webViewParams = new FrameLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - ); + void attachToActivity() { + if (isAttached || isDestroyed || webView == null || activity == null) return; + container = new FrameLayout(activity); container.setBackgroundColor(Color.argb(180, 0, 0, 0)); + FrameLayout.LayoutParams webViewParams; if (mode.equals("window")) { - int w = width > 0 ? width : ViewGroup.LayoutParams.WRAP_CONTENT; - int h = height > 0 ? height : ViewGroup.LayoutParams.WRAP_CONTENT; - - webViewParams = new FrameLayout.LayoutParams( - w > 0 ? dpToPx(activity, w) : ViewGroup.LayoutParams.MATCH_PARENT, - h > 0 ? dpToPx(activity, h) : ViewGroup.LayoutParams.MATCH_PARENT - ); + int w = width > 0 ? dpToPx(activity, width) : ViewGroup.LayoutParams.MATCH_PARENT; + int h = height > 0 ? dpToPx(activity, height) : ViewGroup.LayoutParams.MATCH_PARENT; + webViewParams = new FrameLayout.LayoutParams(w, h); webViewParams.gravity = Gravity.CENTER; - webViewParams.setMargins(dpToPx(activity, 16), dpToPx(activity, 48), dpToPx(activity, 16), dpToPx(activity, 48)); - + webViewParams.setMargins( + dpToPx(activity, 16), dpToPx(activity, 48), + dpToPx(activity, 16), dpToPx(activity, 48) + ); container.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - hideInner(); + container.setVisibility(View.GONE); } }); - } else if (mode.equals("panel")) { + } else { webViewParams = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, height > 0 ? dpToPx(activity, height) : (int)(getScreenHeight(activity) * 0.4) @@ -154,6 +139,9 @@ public void onClick(View v) { webViewParams.gravity = Gravity.BOTTOM; } + if (webView.getParent() != null) { + ((ViewGroup) webView.getParent()).removeView(webView); + } container.addView(webView, webViewParams); ViewGroup rootView = activity.findViewById(android.R.id.content); @@ -163,6 +151,8 @@ public void onClick(View v) { ViewGroup.LayoutParams.MATCH_PARENT )); } + + isAttached = true; } void loadURL(String url) { @@ -215,11 +205,6 @@ void postMessage(String message, CallbackContext callbackContext) { callbackContext.error("WebView destroyed"); return; } - String escaped = message - .replace("\\", "\\\\") - .replace("'", "\\'") - .replace("\n", "\\n") - .replace("\r", "\\r"); String js = "if(window.webview&&window.webview._callbacks){" + "var msg=" + safeParseJSON(message) + ";" + @@ -253,12 +238,19 @@ void show(final CallbackContext callbackContext) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { - if (isDestroyed || container == null) { - if (callbackContext != null) callbackContext.error("Cannot show"); + if (isDestroyed) { + if (callbackContext != null) callbackContext.error("WebView destroyed"); return; } - container.setVisibility(View.VISIBLE); - if (callbackContext != null) callbackContext.success(); + if (!isAttached) { + attachToActivity(); + } + if (container != null) { + container.setVisibility(View.VISIBLE); + if (callbackContext != null) callbackContext.success(); + } else { + if (callbackContext != null) callbackContext.error("Cannot show"); + } } }); } @@ -277,12 +269,6 @@ public void run() { }); } - private void hideInner() { - if (container != null) { - container.setVisibility(View.GONE); - } - } - void reload(CallbackContext callbackContext) { if (isDestroyed || webView == null) { callbackContext.error("WebView destroyed"); @@ -315,6 +301,7 @@ public void run() { } webView = null; container = null; + isAttached = false; } }); } @@ -339,12 +326,14 @@ private static int getScreenHeight(Activity activity) { } private class InstanceWebViewClient extends WebViewClient { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return !allowNavigation; + } + @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { - if (!allowNavigation) { - return true; - } - return false; + return !allowNavigation; } @Override @@ -414,10 +403,5 @@ public class JsBridge { public void postMessage(String message) { plugin.sendMessageToCordova(id, message); } - - @JavascriptInterface - public String getWebViewId() { - return id; - } } } diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java index 17b7e51aa..22104bcfa 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java @@ -101,30 +101,24 @@ private String generateId() { private void create(JSONObject options, final CallbackContext callbackContext) throws JSONException { final String id = generateId(); final String mode = options.optString("mode", "hidden"); - final String title = options.optString("title", "WebView"); final int width = options.optInt("width", 0); final int height = options.optInt("height", 0); - final int x = options.optInt("x", 0); - final int y = options.optInt("y", 0); final boolean allowNavigation = options.optBoolean("allowNavigation", true); final boolean allowDownloads = options.optBoolean("allowDownloads", false); - final boolean visible = options.optBoolean("visible", true); - - final String effectiveMode = visible ? mode : "hidden"; cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { try { WebViewInstance instance = new WebViewInstance( - id, effectiveMode, title, - width, height, x, y, + id, mode, + width, height, allowNavigation, allowDownloads, - visible, cordova.getActivity(), + cordova.getActivity(), WebViewPlugin.this ); - if (effectiveMode.equals("fullscreen")) { + if (mode.equals("fullscreen")) { instances.put(id, instance); launchFullscreenActivity(id, allowNavigation); callbackContext.success(id); @@ -133,8 +127,8 @@ public void run() { instance.createWebView(cordova.getActivity()); - if (effectiveMode.equals("window") || effectiveMode.equals("panel")) { - instance.attachToActivity(cordova.getActivity()); + if (mode.equals("window") || mode.equals("panel")) { + instance.attachToActivity(); } instances.put(id, instance); @@ -158,6 +152,10 @@ public WebViewInstance getInstance(String id) { return instances.get(id); } + public void removeInstance(String id) { + instances.remove(id); + } + private void loadURL(String id, String url, CallbackContext callbackContext) { WebViewInstance instance = getInstance(id); if (instance == null) { callbackContext.error("WebView not found: " + id); return; } From b8e35dd6fb13d66caffdbe9e980da768ffe14835 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Sun, 26 Jul 2026 18:43:43 +0530 Subject: [PATCH 5/7] fixes --- src/index.d.ts | 27 ++ src/lib/webview.js | 292 ++++++------ .../com/foxdebug/webview/WebViewActivity.java | 43 +- .../com/foxdebug/webview/WebViewInstance.java | 438 ++++++++++++++---- .../com/foxdebug/webview/WebViewPlugin.java | 87 ++-- 5 files changed, 588 insertions(+), 299 deletions(-) diff --git a/src/index.d.ts b/src/index.d.ts index 2b0c2b1e1..914103538 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -112,29 +112,56 @@ declare global { } interface WebViewOptions { + /** Title applied to the hosting activity in fullscreen mode. */ title?: string; + /** Display mode. Defaults to "hidden". */ mode?: "fullscreen" | "window" | "panel" | "hidden"; + /** Width in dp ("window" mode). */ width?: number; + /** Height in dp ("window"/"panel" modes). */ height?: number; + /** Left offset in dp ("window" mode, centered when unset). */ x?: number; + /** Top offset in dp ("window" mode, centered when unset). */ y?: number; + /** + * Allow in-WebView navigation. Defaults to true. Only http(s) targets + * ever load; other schemes are always blocked for isolation. + */ allowNavigation?: boolean; + /** Ask the user before downloading files. Defaults to false. */ allowDownloads?: boolean; + /** + * Show immediately after creation. Defaults to true. When false, window + * and panel instances stay detached and fullscreen instances defer their + * activity launch until show() is called. + */ visible?: boolean; } interface AcodeWebView { readonly id: string; readonly options: WebViewOptions; + /** Load an http(s) URL. Other schemes are rejected. */ loadURL(url: string): Promise; loadHTML(html: string): Promise; evaluate(js: string): Promise; onMessage(callback: (message: unknown) => void): void; offMessage(callback: (message: unknown) => void): void; + /** + * Subscribe to lifecycle events: "pageFinished", "titleChanged", + * "dismissed" (backdrop tap in "window" mode) and "closed" (fullscreen + * closed by the user or by hide()). After "closed" the instance is + * destroyed and cannot be reused. + */ on(event: string, callback: (event: string, data?: unknown) => void): void; off(event: string, callback: (event: string, data?: unknown) => void): void; postMessage(message: unknown): Promise; show(): Promise; + /** + * Hide the WebView. In fullscreen mode this closes the hosting activity, + * which destroys the instance and emits "closed". + */ hide(): Promise; reload(): Promise; destroy(): Promise; diff --git a/src/lib/webview.js b/src/lib/webview.js index ae96cb662..00f22ab0c 100644 --- a/src/lib/webview.js +++ b/src/lib/webview.js @@ -2,158 +2,162 @@ import nativeBridge from "../plugins/webview/www/webview"; let initialized = false; const instances = new Map(); -const eventCallbacks = new Map(); function ensureInit() { - if (!initialized) { - nativeBridge.setMessageCallback((payload) => { - const { id, message, event, data } = payload; - - if (event) { - const callbacks = eventCallbacks.get(id); - if (callbacks) { - callbacks.forEach((entry) => { - if (entry.event === event) { - try { - entry.callback(event, data); - } catch (e) { - console.error("WebView event callback error:", e); - } - } - }); - } - return; - } - - if (message !== undefined) { - const instance = instances.get(id); - if (instance && instance._messageCallbacks) { - let parsed = message; - try { - parsed = JSON.parse(message); - } catch (_) {} - instance._messageCallbacks.forEach((cb) => { - try { - cb(parsed); - } catch (e) { - console.error("WebView message callback error:", e); - } - }); - } - } - }); - initialized = true; - } + if (!initialized) { + nativeBridge.setMessageCallback((payload) => { + const { id, message, event, data } = payload; + const instance = instances.get(id); + if (!instance) return; + + if (event) { + // Iterate a copy so callbacks can unsubscribe during dispatch. + for (const entry of instance._eventCallbacks.slice()) { + if (entry.event === event) { + try { + entry.callback(event, data); + } catch (e) { + console.error("WebView event callback error:", e); + } + } + } + + // A fullscreen WebView closed by the user (or by hide()) is + // gone natively; mark it destroyed so later calls fail fast + // and its listeners can be garbage collected. + if (event === "closed") { + instance._destroyed = true; + instances.delete(id); + instance._messageCallbacks = []; + instance._eventCallbacks = []; + } + return; + } + + if (message !== undefined) { + let parsed = message; + try { + parsed = JSON.parse(message); + } catch (_) {} + for (const cb of instance._messageCallbacks.slice()) { + try { + cb(parsed); + } catch (e) { + console.error("WebView message callback error:", e); + } + } + } + }); + initialized = true; + } } class WebView { - constructor(id, options = {}) { - this.id = id; - this.options = options; - this._messageCallbacks = []; - this._eventCallbacks = []; - this._destroyed = false; - - instances.set(id, this); - eventCallbacks.set(id, this._eventCallbacks); - } - - async loadURL(url) { - this._checkDestroyed(); - await nativeBridge.loadURL(this.id, url); - } - - async loadHTML(html) { - this._checkDestroyed(); - await nativeBridge.loadHTML(this.id, html); - } - - async evaluate(js) { - this._checkDestroyed(); - return await nativeBridge.evaluate(this.id, js); - } - - onMessage(callback) { - this._checkDestroyed(); - if (typeof callback === "function") { - this._messageCallbacks.push(callback); - } - } - - offMessage(callback) { - this._messageCallbacks = this._messageCallbacks.filter( - (cb) => cb !== callback, - ); - } - - on(event, callback) { - this._checkDestroyed(); - if (typeof callback === "function") { - this._eventCallbacks.push({ event, callback }); - } - } - - off(event, callback) { - this._eventCallbacks = this._eventCallbacks.filter( - (entry) => !(entry.event === event && entry.callback === callback), - ); - } - - async postMessage(message) { - this._checkDestroyed(); - await nativeBridge.postMessage(this.id, message); - } - - async show() { - this._checkDestroyed(); - await nativeBridge.show(this.id); - } - - async hide() { - this._checkDestroyed(); - await nativeBridge.hide(this.id); - } - - async reload() { - this._checkDestroyed(); - await nativeBridge.reload(this.id); - } - - async destroy() { - this._checkDestroyed(); - this._destroyed = true; - await nativeBridge.destroy(this.id); - instances.delete(this.id); - eventCallbacks.delete(this.id); - this._messageCallbacks = []; - this._eventCallbacks = []; - } - - _checkDestroyed() { - if (this._destroyed) { - throw new Error("WebView has been destroyed"); - } - } + constructor(id, options = {}) { + this.id = id; + this.options = options; + this._messageCallbacks = []; + this._eventCallbacks = []; + this._destroyed = false; + + instances.set(id, this); + } + + async loadURL(url) { + this._checkDestroyed(); + await nativeBridge.loadURL(this.id, url); + } + + async loadHTML(html) { + this._checkDestroyed(); + await nativeBridge.loadHTML(this.id, html); + } + + async evaluate(js) { + this._checkDestroyed(); + return await nativeBridge.evaluate(this.id, js); + } + + onMessage(callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._messageCallbacks.push(callback); + } + } + + offMessage(callback) { + this._messageCallbacks = this._messageCallbacks.filter( + (cb) => cb !== callback, + ); + } + + on(event, callback) { + this._checkDestroyed(); + if (typeof callback === "function") { + this._eventCallbacks.push({ event, callback }); + } + } + + off(event, callback) { + this._eventCallbacks = this._eventCallbacks.filter( + (entry) => !(entry.event === event && entry.callback === callback), + ); + } + + async postMessage(message) { + this._checkDestroyed(); + await nativeBridge.postMessage(this.id, message); + } + + async show() { + this._checkDestroyed(); + await nativeBridge.show(this.id); + } + + async hide() { + this._checkDestroyed(); + await nativeBridge.hide(this.id); + } + + async reload() { + this._checkDestroyed(); + await nativeBridge.reload(this.id); + } + + async destroy() { + this._checkDestroyed(); + this._destroyed = true; + await nativeBridge.destroy(this.id); + instances.delete(this.id); + this._messageCallbacks = []; + this._eventCallbacks = []; + } + + _checkDestroyed() { + if (this._destroyed) { + throw new Error("WebView has been destroyed"); + } + } } const webviewAPI = { - async create(options = {}) { - ensureInit(); - - const id = await nativeBridge.create({ - title: options.title || "", - mode: options.mode || "hidden", - width: options.width || 0, - height: options.height || 0, - x: options.x || 0, - y: options.y || 0, - allowNavigation: options.allowNavigation !== false, - allowDownloads: options.allowDownloads === true, - visible: options.visible !== false, - }); - - return new WebView(id, options); - }, + async create(options = {}) { + ensureInit(); + + const id = await nativeBridge.create({ + title: options.title || "", + mode: options.mode || "hidden", + width: options.width || 0, + height: options.height || 0, + x: options.x || 0, + y: options.y || 0, + allowNavigation: options.allowNavigation !== false, + allowDownloads: options.allowDownloads === true, + visible: options.visible !== false, + }); + + return new WebView(id, options); + }, }; export default webviewAPI; diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java index 54b7304c6..6e55a44cb 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java @@ -1,7 +1,6 @@ package com.foxdebug.webview; import android.app.Activity; -import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.view.ViewGroup; @@ -10,22 +9,20 @@ public class WebViewActivity extends Activity { - private static WebViewPlugin plugin; - private WebView webView; private String webviewId; - public static void setPlugin(WebViewPlugin p) { - plugin = p; - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Intent intent = getIntent(); - webviewId = intent.getStringExtra("webviewId"); + webviewId = getIntent().getStringExtra("webviewId"); + // The plugin registers itself in pluginInitialize(), so the singleton is + // always available while the app is alive. Previously this read a static + // field that was never set, which made every fullscreen WebView close + // instantly because the instance lookup returned null. + WebViewPlugin plugin = WebViewPlugin.getInstance(); WebViewInstance instance = plugin != null ? plugin.getInstance(webviewId) : null; if (instance == null) { finish(); @@ -34,7 +31,19 @@ public void onCreate(Bundle savedInstanceState) { instance.createWebView(this); webView = instance.getWebView(); + if (webView == null) { + finish(); + return; + } + String title = instance.getTitle(); + if (title != null && !title.isEmpty()) { + setTitle(title); + } + + if (webView.getParent() != null) { + ((ViewGroup) webView.getParent()).removeView(webView); + } FrameLayout container = new FrameLayout(this); container.addView(webView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -59,9 +68,21 @@ public void onBackPressed() { @Override protected void onDestroy() { super.onDestroy(); - if (plugin != null) { + + WebViewPlugin plugin = WebViewPlugin.getInstance(); + if (plugin != null && webviewId != null) { + WebViewInstance instance = plugin.getInstance(webviewId); + if (instance != null) { + // Actually destroy the WebView instead of leaking it, then drop the + // instance so later calls fail instead of touching a dead WebView. + // destroy() is idempotent, so this is safe when the JS side already + // called destroy() and finishing this activity is what tore us down. + instance.destroy(); + plugin.removeInstance(webviewId); + } plugin.sendEventToCordova(webviewId, "closed", null); - plugin.removeInstance(webviewId); } + + webView = null; } } diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java index 592ce2fdf..c03991710 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java @@ -1,8 +1,14 @@ package com.foxdebug.webview; import android.app.Activity; +import android.app.AlertDialog; +import android.app.DownloadManager; +import android.content.Context; import android.content.DialogInterface; +import android.graphics.Bitmap; import android.graphics.Color; +import android.net.Uri; +import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -18,25 +24,50 @@ import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; -import android.app.AlertDialog; -import android.app.DownloadManager; -import android.content.Context; -import android.net.Uri; -import android.os.Environment; import android.widget.FrameLayout; import android.widget.Toast; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.cordova.CallbackContext; import org.json.JSONException; import org.json.JSONObject; +import org.json.JSONTokener; public class WebViewInstance { private static final String TAG = "WebViewInstance"; + /** + * Page-side messaging bridge. Injected on page started (best effort, runs + * before page scripts in most cases) and again on page finished (guaranteed). + * It is idempotent and non-destructive: the guard keeps callbacks registered + * by the page between the two injections intact. + */ + private static final String BRIDGE_JS = + "(function(){" + + "if(window.webview&&window.webview.__acodeBridge){return;}" + + "var callbacks=[];" + + "window.webview={" + + "__acodeBridge:true," + + "onMessage:function(cb){if(typeof cb==='function'){callbacks.push(cb);}}," + + "offMessage:function(cb){callbacks=callbacks.filter(function(c){return c!==cb;});}," + + "postMessage:function(msg){" + + "var data=(typeof msg==='string')?msg:JSON.stringify(msg);" + + "window.AcodeWebViewNative.postMessage(String(data));" + + "}," + + "_dispatch:function(msg){" + + "callbacks.slice().forEach(function(cb){try{cb(msg);}catch(e){console.error(e);}});" + + "}" + + "};" + + "})();"; + final String id; final String mode; + final String title; final int width; final int height; + final int x; + final int y; final boolean allowNavigation; final boolean allowDownloads; final WebViewPlugin plugin; @@ -46,18 +77,26 @@ public class WebViewInstance { private Activity activity; private boolean isDestroyed = false; private boolean isAttached = false; + /** Whether the hosting fullscreen activity has been launched. */ + private boolean launched = false; + /** Content requested before the fullscreen WebView exists yet. */ + private String pendingUrl = null; + private String pendingHtml = null; WebViewInstance( - String id, String mode, - int width, int height, + String id, String mode, String title, + int width, int height, int x, int y, boolean allowNavigation, boolean allowDownloads, Activity activity, WebViewPlugin plugin ) { this.id = id; this.mode = mode; + this.title = title; this.width = width; this.height = height; + this.x = x; + this.y = y; this.allowNavigation = allowNavigation; this.allowDownloads = allowDownloads; this.activity = activity; @@ -68,18 +107,40 @@ public WebView getWebView() { return webView; } + String getTitle() { + return title; + } + + boolean isFullscreen() { + return "fullscreen".equals(mode); + } + + void markLaunched() { + launched = true; + } + void createWebView(Activity activity) { + // Idempotent: a recreated hosting activity reuses the existing WebView + // (and its page state) instead of leaking one instance per recreation. + if (webView != null) { + this.activity = activity; + return; + } this.activity = activity; webView = new WebView(activity); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); - settings.setAllowContentAccess(true); + // Isolation: hosted content must not reach app/device data. File and + // content scheme access stay disabled, and loadURL()/navigation below + // only allow http(s), so these cannot be bypassed with a crafted URL. + settings.setAllowFileAccess(false); + settings.setAllowContentAccess(false); + setFileUrlAccessFlags(settings); settings.setDisplayZoomControls(false); settings.setLoadWithOverviewMode(true); settings.setUseWideViewPort(true); - settings.setAllowFileAccess(false); webView.setWebViewClient(new InstanceWebViewClient()); webView.setWebChromeClient(new InstanceWebChromeClient()); @@ -92,25 +153,33 @@ void createWebView(Activity activity) { webView.setDownloadListener(new InstanceDownloadListener(activity)); } - String bridgeJs = - "(function() {" + - " window.webview = window.webview || {};" + - " window.webview._callbacks = [];" + - " window.webview.onMessage = function(cb) { window.webview._callbacks.push(cb); };" + - " window.webview.postMessage = function(msg) {" + - " var data = typeof msg === 'string' ? msg : JSON.stringify(msg);" + - " window.AcodeWebViewNative.postMessage(data);" + - " };" + - " window.webview.offMessage = function(cb) {" + - " window.webview._callbacks = window.webview._callbacks.filter(function(c) { return c !== cb; });" + - " };" + - "})();"; + injectBridge(webView); + + // Apply content requested while the WebView did not exist yet + // (fullscreen instances are created lazily by WebViewActivity). + if (pendingUrl != null) { + webView.loadUrl(pendingUrl); + pendingUrl = null; + pendingHtml = null; + } else if (pendingHtml != null) { + webView.loadDataWithBaseURL(null, pendingHtml, "text/html", "UTF-8", null); + pendingHtml = null; + } + } - webView.evaluateJavascript(bridgeJs, null); + @SuppressWarnings("deprecation") + private static void setFileUrlAccessFlags(WebSettings settings) { + settings.setAllowFileAccessFromFileURLs(false); + settings.setAllowUniversalAccessFromFileURLs(false); + } + + private static void injectBridge(WebView view) { + view.evaluateJavascript(BRIDGE_JS, null); } void attachToActivity() { if (isAttached || isDestroyed || webView == null || activity == null) return; + if (activity.isFinishing()) return; container = new FrameLayout(activity); container.setBackgroundColor(Color.argb(180, 0, 0, 0)); @@ -120,21 +189,27 @@ void attachToActivity() { int w = width > 0 ? dpToPx(activity, width) : ViewGroup.LayoutParams.MATCH_PARENT; int h = height > 0 ? dpToPx(activity, height) : ViewGroup.LayoutParams.MATCH_PARENT; webViewParams = new FrameLayout.LayoutParams(w, h); - webViewParams.gravity = Gravity.CENTER; - webViewParams.setMargins( - dpToPx(activity, 16), dpToPx(activity, 48), - dpToPx(activity, 16), dpToPx(activity, 48) - ); + if (x > 0 || y > 0) { + webViewParams.gravity = Gravity.TOP | Gravity.START; + webViewParams.setMargins(dpToPx(activity, x), dpToPx(activity, y), 0, 0); + } else { + webViewParams.gravity = Gravity.CENTER; + webViewParams.setMargins( + dpToPx(activity, 16), dpToPx(activity, 48), + dpToPx(activity, 16), dpToPx(activity, 48) + ); + } container.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { container.setVisibility(View.GONE); + plugin.sendEventToCordova(id, "dismissed", null); } }); } else { webViewParams = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - height > 0 ? dpToPx(activity, height) : (int)(getScreenHeight(activity) * 0.4) + height > 0 ? dpToPx(activity, height) : (int) (getScreenHeight(activity) * 0.4) ); webViewParams.gravity = Gravity.BOTTOM; } @@ -155,63 +230,142 @@ public void onClick(View v) { isAttached = true; } - void loadURL(String url) { - if (isDestroyed || webView == null) return; - final String safeUrl = (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file://")) - ? url : "http://" + url; - new Handler(Looper.getMainLooper()).post(new Runnable() { + private static final Pattern SCHEME_PATTERN = + Pattern.compile("^([a-zA-Z][a-zA-Z0-9+\\-.]*)://"); + + /** + * Allows only http and https URLs, so hosted pages can never reach local + * files, app content providers or execute javascript: URLs. Input without + * a "scheme://" prefix ("example.com", "localhost:8080/page") is treated + * as a host and loaded over https; anything that is not clearly a URL + * degrades into a harmless failed https load. + */ + private static String sanitizeUrl(String url) { + if (url == null) return null; + String trimmed = url.trim(); + if (trimmed.isEmpty()) return null; + Matcher matcher = SCHEME_PATTERN.matcher(trimmed); + if (matcher.find()) { + String scheme = matcher.group(1); + if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) { + return trimmed; + } + return null; // file://, content://, intent://, etc. + } + return "https://" + trimmed; + } + + void loadURL(String url, final CallbackContext callbackContext) { + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); + return; + } + + final String safeUrl = sanitizeUrl(url); + if (safeUrl == null) { + callbackContext.error("Blocked URL: only http:// and https:// URLs are allowed"); + return; + } + + // Fullscreen instances create their WebView lazily in WebViewActivity. + if (webView == null) { + pendingUrl = safeUrl; + pendingHtml = null; + callbackContext.success(); + return; + } + + runOnUiThread(new Runnable() { @Override public void run() { webView.loadUrl(safeUrl); + callbackContext.success(); } }); } - void loadHTML(String html) { - if (isDestroyed || webView == null) return; - new Handler(Looper.getMainLooper()).post(new Runnable() { + void loadHTML(final String html, final CallbackContext callbackContext) { + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); + return; + } + + if (webView == null) { + pendingHtml = html; + pendingUrl = null; + callbackContext.success(); + return; + } + + runOnUiThread(new Runnable() { @Override public void run() { webView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); + callbackContext.success(); } }); } void evaluate(String js, final CallbackContext callbackContext) { - if (isDestroyed || webView == null) { - callbackContext.error("WebView destroyed"); + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); return; } - new Handler(Looper.getMainLooper()).post(new Runnable() { + if (webView == null) { + callbackContext.error("WebView is not ready"); + return; + } + runOnUiThread(new Runnable() { @Override public void run() { webView.evaluateJavascript(js, new ValueCallback() { @Override public void onReceiveValue(String value) { - if (value != null && value.startsWith("\"") && value.endsWith("\"")) { - value = value.substring(1, value.length() - 1) - .replace("\\\"", "\"") - .replace("\\\\", "\\"); - } - callbackContext.success(value); + callbackContext.success(decodeJsResult(value)); } }); } }); } - void postMessage(String message, CallbackContext callbackContext) { - if (isDestroyed || webView == null) { - callbackContext.error("WebView destroyed"); + /** + * evaluateJavascript() delivers the result as a JSON-encoded string. + * Decode it properly instead of stripping quotes by hand so escapes + * (newlines, unicode, quotes) survive the round trip. + */ + private static String decodeJsResult(String value) { + if (value == null) return null; + try { + Object parsed = new JSONTokener(value).nextValue(); + if (parsed == JSONObject.NULL) return null; + return String.valueOf(parsed); + } catch (JSONException e) { + return value; + } + } + + void postMessage(String message, final CallbackContext callbackContext) { + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); + return; + } + if (webView == null) { + callbackContext.error("WebView is not ready"); return; } - String js = "if(window.webview&&window.webview._callbacks){" + - "var msg=" + safeParseJSON(message) + ";" + - "window.webview._callbacks.forEach(function(cb){try{cb(msg)}catch(e){console.error(e)}});" + - "}"; + // JSONObject.quote() produces a safe JS string literal for any input, + // so a malicious or sloppy payload cannot break out of the string and + // inject code into the page context. The page receives a parsed value + // for JSON payloads and the raw string otherwise. + final String js = + "(function(){" + + "var raw=" + JSONObject.quote(message) + ";" + + "var msg;try{msg=JSON.parse(raw);}catch(e){msg=raw;}" + + "if(window.webview&&window.webview._dispatch){window.webview._dispatch(msg);}" + + "})();"; - new Handler(Looper.getMainLooper()).post(new Runnable() { + runOnUiThread(new Runnable() { @Override public void run() { webView.evaluateJavascript(js, null); @@ -220,26 +374,16 @@ public void run() { }); } - private String safeParseJSON(String message) { - try { - new JSONObject(message); - return message; - } catch (JSONException e1) { - try { - new org.json.JSONArray(message); - return message; - } catch (JSONException e2) { - return "\"" + message.replace("\"", "\\\"").replace("\n", "\\n") + "\""; - } - } - } - void show(final CallbackContext callbackContext) { - new Handler(Looper.getMainLooper()).post(new Runnable() { + if (isFullscreen()) { + showFullscreen(callbackContext); + return; + } + runOnUiThread(new Runnable() { @Override public void run() { if (isDestroyed) { - if (callbackContext != null) callbackContext.error("WebView destroyed"); + callbackContext.error("WebView has been destroyed"); return; } if (!isAttached) { @@ -247,34 +391,90 @@ public void run() { } if (container != null) { container.setVisibility(View.VISIBLE); - if (callbackContext != null) callbackContext.success(); + callbackContext.success(); } else { - if (callbackContext != null) callbackContext.error("Cannot show"); + callbackContext.error("Cannot show"); } } }); } + private void showFullscreen(CallbackContext callbackContext) { + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); + return; + } + if (launched) { + callbackContext.success(); + return; + } + launched = true; + runOnUiThread(new Runnable() { + @Override + public void run() { + plugin.launchFullscreenActivity(id); + } + }); + callbackContext.success(); + } + void hide(final CallbackContext callbackContext) { - new Handler(Looper.getMainLooper()).post(new Runnable() { + if (isFullscreen()) { + hideFullscreen(callbackContext); + return; + } + runOnUiThread(new Runnable() { @Override public void run() { - if (isDestroyed || container == null) { - if (callbackContext != null) callbackContext.error("Cannot hide"); + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); return; } - container.setVisibility(View.GONE); - if (callbackContext != null) callbackContext.success(); + // Hiding an already hidden (never attached) WebView is a no-op. + if (container != null) { + container.setVisibility(View.GONE); + } + callbackContext.success(); } }); } - void reload(CallbackContext callbackContext) { - if (isDestroyed || webView == null) { - callbackContext.error("WebView destroyed"); + /** + * A fullscreen WebView is hosted by its own activity, so hiding it means + * closing that activity. WebViewActivity.onDestroy() then destroys the + * instance and emits the "closed" event. + */ + private void hideFullscreen(CallbackContext callbackContext) { + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); return; } - new Handler(Looper.getMainLooper()).post(new Runnable() { + if (!launched) { + callbackContext.success(); + return; + } + launched = false; + runOnUiThread(new Runnable() { + @Override + public void run() { + if (activity instanceof WebViewActivity && !activity.isFinishing()) { + activity.finish(); + } + } + }); + callbackContext.success(); + } + + void reload(final CallbackContext callbackContext) { + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); + return; + } + if (webView == null) { + callbackContext.error("WebView is not ready"); + return; + } + runOnUiThread(new Runnable() { @Override public void run() { webView.reload(); @@ -284,18 +484,29 @@ public void run() { } void destroy() { + if (isDestroyed) return; isDestroyed = true; - new Handler(Looper.getMainLooper()).post(new Runnable() { + // Finish the hosting fullscreen activity, if any. Its onDestroy() calls + // destroy() again, which is a no-op now that isDestroyed is set. + if (activity instanceof WebViewActivity && !activity.isFinishing()) { + activity.finish(); + } + + runOnUiThread(new Runnable() { @Override public void run() { if (container != null && container.getParent() != null) { ((ViewGroup) container.getParent()).removeView(container); } if (webView != null) { + if (webView.getParent() != null) { + ((ViewGroup) webView.getParent()).removeView(webView); + } webView.removeJavascriptInterface("AcodeWebViewNative"); - webView.setWebViewClient(null); + webView.setDownloadListener(null); webView.setWebChromeClient(null); + webView.setWebViewClient(null); webView.loadUrl("about:blank"); webView.destroy(); } @@ -306,17 +517,26 @@ public void run() { }); } - void onPageFinished() { + void onPageFinished(WebView view) { + // Navigation replaced the page's JS context, so the bridge injected into + // the previous document is gone. Re-inject (no-op if already present). + injectBridge(view); try { JSONObject data = new JSONObject(); - data.put("url", webView.getUrl()); - data.put("title", webView.getTitle()); + String url = view.getUrl(); + String pageTitle = view.getTitle(); + data.put("url", url != null ? url : ""); + data.put("title", pageTitle != null ? pageTitle : ""); plugin.sendEventToCordova(id, "pageFinished", data); - } catch (Exception e) { + } catch (JSONException e) { Log.e(TAG, "onPageFinished error", e); } } + private static void runOnUiThread(Runnable runnable) { + new Handler(Looper.getMainLooper()).post(runnable); + } + private static int dpToPx(Context context, int dp) { return (int) (dp * context.getResources().getDisplayMetrics().density); } @@ -326,20 +546,41 @@ private static int getScreenHeight(Activity activity) { } private class InstanceWebViewClient extends WebViewClient { + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return shouldBlockNavigation(request.getUrl()); + } + + @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { - return !allowNavigation; + return shouldBlockNavigation(Uri.parse(url)); + } + + /** + * Blocks all navigation when allowNavigation is false. Even when it is + * true, only http(s) targets may load inside the WebView; other schemes + * (file:, content:, intent:, javascript:, tel:, ...) are blocked so + * hostile pages cannot escape the sandbox or launch other apps. + */ + private boolean shouldBlockNavigation(Uri uri) { + if (!allowNavigation) return true; + String scheme = uri.getScheme(); + return scheme == null + || !(scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")); } @Override - public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { - return !allowNavigation; + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + // Best effort: gets the bridge in before the page's own scripts run. + injectBridge(view); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); - WebViewInstance.this.onPageFinished(); + WebViewInstance.this.onPageFinished(view); } } @@ -349,9 +590,9 @@ public void onReceivedTitle(WebView view, String pageTitle) { super.onReceivedTitle(view, pageTitle); try { JSONObject data = new JSONObject(); - data.put("title", pageTitle); + data.put("title", pageTitle != null ? pageTitle : ""); plugin.sendEventToCordova(id, "titleChanged", data); - } catch (Exception e) { + } catch (JSONException e) { Log.e(TAG, "onReceivedTitle error", e); } } @@ -365,10 +606,11 @@ private class InstanceDownloadListener implements DownloadListener { } @Override - public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) { + public void onDownloadStart(final String url, final String userAgent, String contentDisposition, final String mimeType, long contentLength) { + if (context instanceof Activity && ((Activity) context).isFinishing()) return; final String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType); - new Handler(Looper.getMainLooper()).post(new Runnable() { + runOnUiThread(new Runnable() { @Override public void run() { new AlertDialog.Builder(context) @@ -387,8 +629,10 @@ public void onClick(DialogInterface dialog, int which) { request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); - dm.enqueue(request); - Toast.makeText(context, "Download started...", Toast.LENGTH_SHORT).show(); + if (dm != null) { + dm.enqueue(request); + Toast.makeText(context, "Download started...", Toast.LENGTH_SHORT).show(); + } } }) .setNegativeButton("Cancel", null) diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java index 22104bcfa..1f2f48f2b 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java @@ -1,25 +1,8 @@ package com.foxdebug.webview; -import android.app.Activity; import android.content.Intent; -import android.graphics.Color; -import android.net.Uri; -import android.os.Handler; -import android.os.Looper; import android.util.Log; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.webkit.JavascriptInterface; -import android.webkit.ValueCallback; -import android.webkit.WebChromeClient; -import android.webkit.WebResourceRequest; -import android.webkit.WebSettings; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import android.widget.FrameLayout; +import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; import org.apache.cordova.CallbackContext; @@ -101,39 +84,50 @@ private String generateId() { private void create(JSONObject options, final CallbackContext callbackContext) throws JSONException { final String id = generateId(); final String mode = options.optString("mode", "hidden"); + final String title = options.optString("title", ""); final int width = options.optInt("width", 0); final int height = options.optInt("height", 0); + final int x = options.optInt("x", 0); + final int y = options.optInt("y", 0); final boolean allowNavigation = options.optBoolean("allowNavigation", true); final boolean allowDownloads = options.optBoolean("allowDownloads", false); + final boolean visible = options.optBoolean("visible", true); cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { - try { - WebViewInstance instance = new WebViewInstance( - id, mode, - width, height, - allowNavigation, allowDownloads, - cordova.getActivity(), - WebViewPlugin.this - ); - - if (mode.equals("fullscreen")) { - instances.put(id, instance); - launchFullscreenActivity(id, allowNavigation); - callbackContext.success(id); - return; - } + WebViewInstance instance = new WebViewInstance( + id, mode, title, + width, height, x, y, + allowNavigation, allowDownloads, + cordova.getActivity(), + WebViewPlugin.this + ); + instances.put(id, instance); - instance.createWebView(cordova.getActivity()); - - if (mode.equals("window") || mode.equals("panel")) { - instance.attachToActivity(); + try { + if (instance.isFullscreen()) { + // The WebView is created lazily by WebViewActivity. When the + // caller asked for an initially hidden instance, the launch is + // deferred until show() is called. + if (visible) { + instance.markLaunched(); + launchFullscreenActivity(id); + } + } else { + instance.createWebView(cordova.getActivity()); + // Keep visibility separate from mode: window/panel instances that + // should start hidden stay detached until show() attaches them. + if (visible && (mode.equals("window") || mode.equals("panel"))) { + instance.attachToActivity(); + } } - - instances.put(id, instance); callbackContext.success(id); } catch (Exception e) { + instances.remove(id); + try { + instance.destroy(); + } catch (Exception ignored) {} Log.e(TAG, "Create error: " + e.getMessage(), e); callbackContext.error(e.getMessage()); } @@ -141,10 +135,9 @@ public void run() { }); } - private void launchFullscreenActivity(String id, boolean allowNavigation) { + void launchFullscreenActivity(String id) { Intent intent = new Intent(cordova.getActivity(), WebViewActivity.class); intent.putExtra("webviewId", id); - intent.putExtra("allowNavigation", allowNavigation); cordova.getActivity().startActivity(intent); } @@ -159,15 +152,13 @@ public void removeInstance(String id) { private void loadURL(String id, String url, CallbackContext callbackContext) { WebViewInstance instance = getInstance(id); if (instance == null) { callbackContext.error("WebView not found: " + id); return; } - instance.loadURL(url); - callbackContext.success(); + instance.loadURL(url, callbackContext); } private void loadHTML(String id, String html, CallbackContext callbackContext) { WebViewInstance instance = getInstance(id); if (instance == null) { callbackContext.error("WebView not found: " + id); return; } - instance.loadHTML(html); - callbackContext.success(); + instance.loadHTML(html, callbackContext); } private void evaluate(String id, String js, CallbackContext callbackContext) { @@ -200,7 +191,7 @@ private void reload(String id, CallbackContext callbackContext) { instance.reload(callbackContext); } - private void destroy(String id, CallbackContext callbackContext) { + private void destroy(String id, final CallbackContext callbackContext) { final WebViewInstance instance = instances.remove(id); if (instance == null) { callbackContext.error("WebView not found: " + id); return; } @@ -251,7 +242,9 @@ public void sendEventToCordova(String id, String event, JSONObject data) { @Override public void onDestroy() { super.onDestroy(); - for (WebViewInstance instance : instances.values()) { + // Copy: destroying a fullscreen instance finishes its activity, whose + // onDestroy() removes it from the map. + for (WebViewInstance instance : new ArrayList<>(instances.values())) { try { instance.destroy(); } catch (Exception ignored) {} } instances.clear(); From 035844b36ba3b45a7bff4ed48a281b52d27c7163 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Sun, 26 Jul 2026 19:21:01 +0530 Subject: [PATCH 6/7] improvements --- src/index.d.ts | 42 +-- src/lib/webview.js | 13 +- .../com/foxdebug/webview/WebViewActivity.java | 5 + .../com/foxdebug/webview/WebViewInstance.java | 266 +++++++----------- .../com/foxdebug/webview/WebViewPlugin.java | 66 ++++- 5 files changed, 189 insertions(+), 203 deletions(-) diff --git a/src/index.d.ts b/src/index.d.ts index 914103538..12e76f127 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -114,27 +114,25 @@ declare global { interface WebViewOptions { /** Title applied to the hosting activity in fullscreen mode. */ title?: string; - /** Display mode. Defaults to "hidden". */ - mode?: "fullscreen" | "window" | "panel" | "hidden"; - /** Width in dp ("window" mode). */ - width?: number; - /** Height in dp ("window"/"panel" modes). */ - height?: number; - /** Left offset in dp ("window" mode, centered when unset). */ - x?: number; - /** Top offset in dp ("window" mode, centered when unset). */ - y?: number; + /** + * "fullscreen" displays the WebView in its own activity, "hidden" runs it + * headless (never displayed). Defaults to "hidden". + */ + mode?: "fullscreen" | "hidden"; /** * Allow in-WebView navigation. Defaults to true. Only http(s) targets * ever load; other schemes are always blocked for isolation. */ allowNavigation?: boolean; - /** Ask the user before downloading files. Defaults to false. */ + /** + * Ask the user with a confirmation dialog before downloading files via + * the system DownloadManager. Defaults to false. + */ allowDownloads?: boolean; /** - * Show immediately after creation. Defaults to true. When false, window - * and panel instances stay detached and fullscreen instances defer their - * activity launch until show() is called. + * Show immediately after creation. Defaults to true. Only meaningful for + * fullscreen mode: when false, the activity launch is deferred until + * show() is called. */ visible?: boolean; } @@ -149,18 +147,22 @@ interface AcodeWebView { onMessage(callback: (message: unknown) => void): void; offMessage(callback: (message: unknown) => void): void; /** - * Subscribe to lifecycle events: "pageFinished", "titleChanged", - * "dismissed" (backdrop tap in "window" mode) and "closed" (fullscreen - * closed by the user or by hide()). After "closed" the instance is - * destroyed and cannot be reused. + * Subscribe to lifecycle events: "pageFinished", "titleChanged" and + * "closed" (fullscreen closed by the user or the system). After "closed" + * the instance is destroyed and cannot be reused. */ on(event: string, callback: (event: string, data?: unknown) => void): void; off(event: string, callback: (event: string, data?: unknown) => void): void; postMessage(message: unknown): Promise; + /** + * Show the WebView. Only fullscreen instances can be shown; rejects for + * "hidden" mode. + */ show(): Promise; /** - * Hide the WebView. In fullscreen mode this closes the hosting activity, - * which destroys the instance and emits "closed". + * Hide the WebView. Fullscreen instances are moved to the background; + * show() brings the same WebView back with its page state intact. + * No-op for "hidden" mode. */ hide(): Promise; reload(): Promise; diff --git a/src/lib/webview.js b/src/lib/webview.js index 00f22ab0c..26a3bb7c3 100644 --- a/src/lib/webview.js +++ b/src/lib/webview.js @@ -144,13 +144,16 @@ const webviewAPI = { async create(options = {}) { ensureInit(); + const mode = options.mode || "hidden"; + if (mode !== "fullscreen" && mode !== "hidden") { + throw new Error( + `Unsupported WebView mode: "${mode}". Use "fullscreen" or "hidden".`, + ); + } + const id = await nativeBridge.create({ title: options.title || "", - mode: options.mode || "hidden", - width: options.width || 0, - height: options.height || 0, - x: options.x || 0, - y: options.y || 0, + mode, allowNavigation: options.allowNavigation !== false, allowDownloads: options.allowDownloads === true, visible: options.visible !== false, diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java index 6e55a44cb..6090979a7 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewActivity.java @@ -35,6 +35,7 @@ public void onCreate(Bundle savedInstanceState) { finish(); return; } + instance.setHostingActivity(this); String title = instance.getTitle(); if (title != null && !title.isEmpty()) { @@ -45,6 +46,9 @@ public void onCreate(Bundle savedInstanceState) { ((ViewGroup) webView.getParent()).removeView(webView); } FrameLayout container = new FrameLayout(this); + // Edge-to-edge is enforced on newer Android versions, so pad the content + // out from under the status and navigation bars. + WebViewInstance.applySystemBarInsets(container); container.addView(webView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT @@ -73,6 +77,7 @@ protected void onDestroy() { if (plugin != null && webviewId != null) { WebViewInstance instance = plugin.getInstance(webviewId); if (instance != null) { + instance.clearHostingActivity(this); // Actually destroy the WebView instead of leaking it, then drop the // instance so later calls fail instead of touching a dead WebView. // destroy() is idempotent, so this is safe when the JS side already diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java index c03991710..72ecefc67 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewInstance.java @@ -2,19 +2,18 @@ import android.app.Activity; import android.app.AlertDialog; -import android.app.DownloadManager; import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; -import android.graphics.Color; +import android.graphics.Insets; import android.net.Uri; -import android.os.Environment; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.Log; -import android.view.Gravity; import android.view.View; import android.view.ViewGroup; +import android.view.WindowInsets; import android.webkit.DownloadListener; import android.webkit.JavascriptInterface; import android.webkit.URLUtil; @@ -24,8 +23,8 @@ import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; -import android.widget.FrameLayout; import android.widget.Toast; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.cordova.CallbackContext; @@ -64,42 +63,28 @@ public class WebViewInstance { final String id; final String mode; final String title; - final int width; - final int height; - final int x; - final int y; final boolean allowNavigation; final boolean allowDownloads; final WebViewPlugin plugin; private WebView webView; - private FrameLayout container; - private Activity activity; + /** The activity hosting this instance in fullscreen mode, while alive. */ + private WebViewActivity hostingActivity = null; private boolean isDestroyed = false; - private boolean isAttached = false; - /** Whether the hosting fullscreen activity has been launched. */ - private boolean launched = false; /** Content requested before the fullscreen WebView exists yet. */ private String pendingUrl = null; private String pendingHtml = null; WebViewInstance( String id, String mode, String title, - int width, int height, int x, int y, boolean allowNavigation, boolean allowDownloads, - Activity activity, WebViewPlugin plugin ) { this.id = id; this.mode = mode; this.title = title; - this.width = width; - this.height = height; - this.x = x; - this.y = y; this.allowNavigation = allowNavigation; this.allowDownloads = allowDownloads; - this.activity = activity; this.plugin = plugin; } @@ -115,18 +100,24 @@ boolean isFullscreen() { return "fullscreen".equals(mode); } - void markLaunched() { - launched = true; + WebViewActivity getHostingActivity() { + return hostingActivity; + } + + void setHostingActivity(WebViewActivity activity) { + hostingActivity = activity; + } + + void clearHostingActivity(WebViewActivity activity) { + if (hostingActivity == activity) { + hostingActivity = null; + } } void createWebView(Activity activity) { // Idempotent: a recreated hosting activity reuses the existing WebView // (and its page state) instead of leaking one instance per recreation. - if (webView != null) { - this.activity = activity; - return; - } - this.activity = activity; + if (webView != null) return; webView = new WebView(activity); WebSettings settings = webView.getSettings(); @@ -177,57 +168,34 @@ private static void injectBridge(WebView view) { view.evaluateJavascript(BRIDGE_JS, null); } - void attachToActivity() { - if (isAttached || isDestroyed || webView == null || activity == null) return; - if (activity.isFinishing()) return; - - container = new FrameLayout(activity); - container.setBackgroundColor(Color.argb(180, 0, 0, 0)); - - FrameLayout.LayoutParams webViewParams; - if (mode.equals("window")) { - int w = width > 0 ? dpToPx(activity, width) : ViewGroup.LayoutParams.MATCH_PARENT; - int h = height > 0 ? dpToPx(activity, height) : ViewGroup.LayoutParams.MATCH_PARENT; - webViewParams = new FrameLayout.LayoutParams(w, h); - if (x > 0 || y > 0) { - webViewParams.gravity = Gravity.TOP | Gravity.START; - webViewParams.setMargins(dpToPx(activity, x), dpToPx(activity, y), 0, 0); - } else { - webViewParams.gravity = Gravity.CENTER; - webViewParams.setMargins( - dpToPx(activity, 16), dpToPx(activity, 48), - dpToPx(activity, 16), dpToPx(activity, 48) - ); - } - container.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - container.setVisibility(View.GONE); - plugin.sendEventToCordova(id, "dismissed", null); + /** + * Pads the view so content stays clear of the status and navigation bars. + * Required on API 35+ where edge-to-edge is enforced for the app; on older + * versions the window usually consumes the insets first, making the padding + * zero and this a no-op. + */ + @SuppressWarnings("deprecation") + static void applySystemBarInsets(final View view) { + view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { + @Override + public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { + int left, top, right, bottom; + if (Build.VERSION.SDK_INT >= 30) { + Insets bars = insets.getInsets(WindowInsets.Type.systemBars()); + left = bars.left; + top = bars.top; + right = bars.right; + bottom = bars.bottom; + } else { + left = insets.getSystemWindowInsetLeft(); + top = insets.getSystemWindowInsetTop(); + right = insets.getSystemWindowInsetRight(); + bottom = insets.getSystemWindowInsetBottom(); } - }); - } else { - webViewParams = new FrameLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - height > 0 ? dpToPx(activity, height) : (int) (getScreenHeight(activity) * 0.4) - ); - webViewParams.gravity = Gravity.BOTTOM; - } - - if (webView.getParent() != null) { - ((ViewGroup) webView.getParent()).removeView(webView); - } - container.addView(webView, webViewParams); - - ViewGroup rootView = activity.findViewById(android.R.id.content); - if (rootView instanceof FrameLayout) { - rootView.addView(container, new FrameLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - )); - } - - isAttached = true; + v.setPadding(left, top, right, bottom); + return insets; + } + }); } private static final Pattern SCHEME_PATTERN = @@ -375,90 +343,57 @@ public void run() { } void show(final CallbackContext callbackContext) { - if (isFullscreen()) { - showFullscreen(callbackContext); - return; - } - runOnUiThread(new Runnable() { - @Override - public void run() { - if (isDestroyed) { - callbackContext.error("WebView has been destroyed"); - return; - } - if (!isAttached) { - attachToActivity(); - } - if (container != null) { - container.setVisibility(View.VISIBLE); - callbackContext.success(); - } else { - callbackContext.error("Cannot show"); - } - } - }); - } - - private void showFullscreen(CallbackContext callbackContext) { if (isDestroyed) { callbackContext.error("WebView has been destroyed"); return; } - if (launched) { - callbackContext.success(); + if (!isFullscreen()) { + callbackContext.error("Hidden WebViews cannot be shown; use mode \"fullscreen\" to display content"); return; } - launched = true; + // Launches the hosting activity, or brings it back to the front if it + // is still alive (e.g. after hide() backgrounded it). runOnUiThread(new Runnable() { @Override public void run() { - plugin.launchFullscreenActivity(id); + plugin.showFullscreenActivity(id); } }); callbackContext.success(); } void hide(final CallbackContext callbackContext) { - if (isFullscreen()) { - hideFullscreen(callbackContext); + if (isDestroyed) { + callbackContext.error("WebView has been destroyed"); return; } - runOnUiThread(new Runnable() { - @Override - public void run() { - if (isDestroyed) { - callbackContext.error("WebView has been destroyed"); - return; - } - // Hiding an already hidden (never attached) WebView is a no-op. - if (container != null) { - container.setVisibility(View.GONE); - } - callbackContext.success(); - } - }); + if (!isFullscreen()) { + // A hidden (headless) WebView is already hidden. + callbackContext.success(); + return; + } + hideFullscreen(callbackContext); } /** - * A fullscreen WebView is hosted by its own activity, so hiding it means - * closing that activity. WebViewActivity.onDestroy() then destroys the - * instance and emits the "closed" event. + * Hiding a fullscreen WebView moves its hosting activity (and its task) + * to the background. Nothing is destroyed, so show() brings the same + * WebView back with its page state intact. The instance is only destroyed + * when the user actually closes it (back button/task removal) or when + * destroy() is called. */ private void hideFullscreen(CallbackContext callbackContext) { if (isDestroyed) { callbackContext.error("WebView has been destroyed"); return; } - if (!launched) { - callbackContext.success(); - return; - } - launched = false; runOnUiThread(new Runnable() { @Override public void run() { - if (activity instanceof WebViewActivity && !activity.isFinishing()) { - activity.finish(); + if (hostingActivity != null + && !hostingActivity.isFinishing() + && !hostingActivity.isDestroyed()) { + hostingActivity.moveTaskToBack(true); } } }); @@ -489,16 +424,15 @@ void destroy() { // Finish the hosting fullscreen activity, if any. Its onDestroy() calls // destroy() again, which is a no-op now that isDestroyed is set. - if (activity instanceof WebViewActivity && !activity.isFinishing()) { - activity.finish(); + WebViewActivity hosting = hostingActivity; + hostingActivity = null; + if (hosting != null && !hosting.isFinishing()) { + hosting.finish(); } runOnUiThread(new Runnable() { @Override public void run() { - if (container != null && container.getParent() != null) { - ((ViewGroup) container.getParent()).removeView(container); - } if (webView != null) { if (webView.getParent() != null) { ((ViewGroup) webView.getParent()).removeView(webView); @@ -511,8 +445,6 @@ public void run() { webView.destroy(); } webView = null; - container = null; - isAttached = false; } }); } @@ -537,14 +469,6 @@ private static void runOnUiThread(Runnable runnable) { new Handler(Looper.getMainLooper()).post(runnable); } - private static int dpToPx(Context context, int dp) { - return (int) (dp * context.getResources().getDisplayMetrics().density); - } - - private static int getScreenHeight(Activity activity) { - return activity.getResources().getDisplayMetrics().heightPixels; - } - private class InstanceWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { @@ -607,32 +531,38 @@ private class InstanceDownloadListener implements DownloadListener { @Override public void onDownloadStart(final String url, final String userAgent, String contentDisposition, final String mimeType, long contentLength) { + if (isDestroyed) return; if (context instanceof Activity && ((Activity) context).isFinishing()) return; + + // DownloadManager can only fetch http(s) URLs. + String scheme = Uri.parse(url).getScheme(); + if (scheme == null + || !(scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https"))) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(context, "This download type is not supported", Toast.LENGTH_SHORT).show(); + } + }); + return; + } + final String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType); + String size = formatSize(contentLength); + final String message = size.isEmpty() + ? "Do you want to download \"" + fileName + "\"?" + : "Do you want to download \"" + fileName + "\" (" + size + ")?"; runOnUiThread(new Runnable() { @Override public void run() { new AlertDialog.Builder(context) .setTitle("Download file") - .setMessage("Do you want to download \"" + fileName + "\"?") - .setPositiveButton("Yes", new DialogInterface.OnClickListener() { + .setMessage(message) + .setPositiveButton("Download", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); - request.setMimeType(mimeType); - request.addRequestHeader("User-Agent", userAgent); - request.setDescription("Downloading file..."); - request.setTitle(fileName); - request.allowScanningByMediaScanner(); - request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); - request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); - - DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); - if (dm != null) { - dm.enqueue(request); - Toast.makeText(context, "Download started...", Toast.LENGTH_SHORT).show(); - } + plugin.download(url, userAgent, mimeType, fileName); } }) .setNegativeButton("Cancel", null) @@ -642,6 +572,14 @@ public void onClick(DialogInterface dialog, int which) { } } + private static String formatSize(long bytes) { + if (bytes <= 0) return ""; + if (bytes < 1024) return bytes + " B"; + if (bytes < 1024 * 1024) return String.format(Locale.US, "%.1f KB", bytes / 1024.0); + if (bytes < 1024L * 1024 * 1024) return String.format(Locale.US, "%.1f MB", bytes / (1024.0 * 1024)); + return String.format(Locale.US, "%.1f GB", bytes / (1024.0 * 1024 * 1024)); + } + public class JsBridge { @JavascriptInterface public void postMessage(String message) { diff --git a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java index 1f2f48f2b..db6adb85c 100644 --- a/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java +++ b/src/plugins/webview/src/android/com/foxdebug/webview/WebViewPlugin.java @@ -1,7 +1,13 @@ package com.foxdebug.webview; +import android.app.DownloadManager; +import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Environment; import android.util.Log; +import android.webkit.CookieManager; +import android.widget.Toast; import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; @@ -85,10 +91,6 @@ private void create(JSONObject options, final CallbackContext callbackContext) t final String id = generateId(); final String mode = options.optString("mode", "hidden"); final String title = options.optString("title", ""); - final int width = options.optInt("width", 0); - final int height = options.optInt("height", 0); - final int x = options.optInt("x", 0); - final int y = options.optInt("y", 0); final boolean allowNavigation = options.optBoolean("allowNavigation", true); final boolean allowDownloads = options.optBoolean("allowDownloads", false); final boolean visible = options.optBoolean("visible", true); @@ -98,9 +100,7 @@ private void create(JSONObject options, final CallbackContext callbackContext) t public void run() { WebViewInstance instance = new WebViewInstance( id, mode, title, - width, height, x, y, allowNavigation, allowDownloads, - cordova.getActivity(), WebViewPlugin.this ); instances.put(id, instance); @@ -111,16 +111,11 @@ public void run() { // caller asked for an initially hidden instance, the launch is // deferred until show() is called. if (visible) { - instance.markLaunched(); - launchFullscreenActivity(id); + showFullscreenActivity(id); } } else { + // "hidden" mode: a headless WebView that is never displayed. instance.createWebView(cordova.getActivity()); - // Keep visibility separate from mode: window/panel instances that - // should start hidden stay detached until show() attaches them. - if (visible && (mode.equals("window") || mode.equals("panel"))) { - instance.attachToActivity(); - } } callbackContext.success(id); } catch (Exception e) { @@ -135,9 +130,19 @@ public void run() { }); } - void launchFullscreenActivity(String id) { + /** + * Shows a fullscreen WebView: launches its hosting activity, or brings the + * existing one back to the front if it is still alive (e.g. after hide() + * backgrounded it), preserving the WebView's page state. + */ + void showFullscreenActivity(String id) { Intent intent = new Intent(cordova.getActivity(), WebViewActivity.class); intent.putExtra("webviewId", id); + WebViewInstance target = getInstance(id); + WebViewActivity hosting = target != null ? target.getHostingActivity() : null; + if (hosting != null && !hosting.isFinishing() && !hosting.isDestroyed()) { + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + } cordova.getActivity().startActivity(intent); } @@ -204,6 +209,39 @@ public void run() { }); } + /** + * Starts a confirmed download via the system DownloadManager into the + * public Downloads directory. The WebView's cookies are forwarded so + * authenticated downloads work. + */ + void download(String url, String userAgent, String mimeType, String fileName) { + Context context = cordova.getActivity(); + try { + DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); + request.setMimeType(mimeType); + request.addRequestHeader("User-Agent", userAgent); + String cookie = CookieManager.getInstance().getCookie(url); + if (cookie != null && !cookie.isEmpty()) { + request.addRequestHeader("Cookie", cookie); + } + request.setDescription("Downloading file..."); + request.setTitle(fileName); + request.allowScanningByMediaScanner(); + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); + + DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + if (dm == null) { + throw new IllegalStateException("DownloadManager unavailable"); + } + dm.enqueue(request); + Toast.makeText(context, "Download started...", Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + Log.e(TAG, "Download failed", e); + Toast.makeText(context, "Download failed", Toast.LENGTH_SHORT).show(); + } + } + public void sendMessageToCordova(String id, String message) { if (messageCallback == null) return; From 0fff73138896ab832c12dc30407b224b0d6fc18d Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Sun, 26 Jul 2026 19:47:55 +0530 Subject: [PATCH 7/7] fix: lock --- package-lock.json | 3447 ++++++++++++++++----------------------------- 1 file changed, 1196 insertions(+), 2251 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a92c4018..938600165 100644 --- a/package-lock.json +++ b/package-lock.json @@ -160,18 +160,17 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", + "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/helper-validator-identifier": "^8.0.0", + "js-tokens": "^10.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/compat-data": { @@ -216,20 +215,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/core/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -248,44 +233,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/core/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -294,83 +249,34 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/core/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/core/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/core/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -379,48 +285,48 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-8.0.0.tgz", - "integrity": "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==", + "node_modules/@babel/generator/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^8.0.0" - }, "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "node_modules/@babel/helper-annotate-as-pure": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-8.0.0.tgz", + "integrity": "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" + "@babel/types": "^8.0.0" }, "engines": { "node": "^22.18.0 || >=24.11.0" @@ -443,19 +349,6 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.1.tgz", @@ -478,20 +371,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -510,44 +389,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -556,74 +405,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-8.0.1.tgz", @@ -642,19 +442,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-1.0.0.tgz", @@ -674,13 +461,13 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", + "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { @@ -697,20 +484,6 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -729,107 +502,41 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/parser": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^8.0.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/traverse": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/helper-module-imports": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-8.0.0.tgz", @@ -844,20 +551,6 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-module-imports/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -876,44 +569,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-module-imports/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -922,61 +585,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-module-imports/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-module-imports/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/helper-module-transforms": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-8.0.1.tgz", @@ -995,20 +622,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -1027,44 +640,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -1073,61 +656,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/helper-optimise-call-expression": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-8.0.0.tgz", @@ -1141,40 +688,6 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", @@ -1206,20 +719,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -1238,44 +737,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -1284,61 +753,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/helper-replace-supers": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-8.0.1.tgz", @@ -1357,20 +790,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -1389,44 +808,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-replace-supers/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -1435,61 +824,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-8.0.0.tgz", @@ -1504,20 +857,6 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -1536,44 +875,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -1582,79 +891,43 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "node_modules/@babel/helper-string-parser": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-validator-option": { @@ -1682,20 +955,6 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -1714,44 +973,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -1760,61 +989,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/helpers": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.0.tgz", @@ -1829,106 +1022,54 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", + "node_modules/@babel/parser/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", + "node_modules/@babel/parser/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, "engines": { - "node": "^22.18.0 || >=24.11.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "node_modules/@babel/parser/node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -2031,9 +1172,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-8.0.1.tgz", - "integrity": "sha512-YBpIeuOZSUZx7RGH/U+dIAsHDHyojBVDRHNBUgOiUDS5IIcgBm1uyu9xs/2kM27B/bmDfOxzJ9k8cU2QuOwGIA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-8.0.3.tgz", + "integrity": "sha512-jmTPwps7oSQSZaV1SxkQ3C12UWyufGysGc5OzDpZzvPAIX4mO7dJT3hoqkWVrSImvkcMiknir1iLN1SNV/CZzg==", "dev": true, "license": "MIT", "dependencies": { @@ -2080,20 +1221,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -2112,44 +1239,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -2158,61 +1255,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-8.0.1.tgz", @@ -2318,20 +1379,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/plugin-transform-classes/node_modules/@babel/generator": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", @@ -2350,44 +1397,14 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-globals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", - "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-string-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", - "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/plugin-transform-classes/node_modules/@babel/parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0.tgz", - "integrity": "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.0" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -2396,61 +1413,25 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/template": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", - "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "@babel/parser": "^8.0.0", - "@babel/types": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/plugin-transform-classes/node_modules/@babel/traverse": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0.tgz", - "integrity": "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", - "@babel/parser": "^8.0.0", + "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.0", + "@babel/types": "^8.0.4", "obug": "^2.1.1" }, "engines": { "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0.tgz", - "integrity": "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0", - "@babel/helper-validator-identifier": "^8.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-8.0.1.tgz", @@ -2748,16 +1729,6 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz", - "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-8.0.1.tgz", @@ -2977,9 +1948,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.1.tgz", - "integrity": "sha512-1WjCi/45Mn5e0uvz26FdvRe6bTAvN6WAtkHgIjl0w/LkBvrv4Y5bDR+8YY72r7cefXBfwYUXIHSoxQkrIfnjXQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.2.tgz", + "integrity": "sha512-aFfsjCRYducRV4dPnpsBbdRkLjboca9FVDg6HZCgy0Ahvk2ZQ/2exmCRC5qS9P6rsWwrmIheNaIM6A1j2F8KMA==", "dev": true, "license": "MIT", "dependencies": { @@ -3211,9 +2182,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.1.tgz", - "integrity": "sha512-tiwl69ZQGIbPif28GK8vI/Nm1nYdP+UHXWRnqXl0fjfBS7DWmAs2XvlpVkZyZjVVDxcprcbzCnN93SbuSgz8WQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.2.tgz", + "integrity": "sha512-CUGLn9hNBCF/eXnwdFAWERbniCcXCRvnKwLV9fegeUEIqv7YlU2MepsWMMM54GcILx5XYMnRh+JAL+K5G+mK6g==", "dev": true, "license": "MIT", "dependencies": { @@ -3266,7 +2237,7 @@ "@babel/plugin-transform-private-methods": "^8.0.1", "@babel/plugin-transform-private-property-in-object": "^8.0.1", "@babel/plugin-transform-property-literals": "^8.0.1", - "@babel/plugin-transform-regenerator": "^8.0.1", + "@babel/plugin-transform-regenerator": "^8.0.2", "@babel/plugin-transform-regexp-modifiers": "^8.0.1", "@babel/plugin-transform-reserved-words": "^8.0.1", "@babel/plugin-transform-shorthand-properties": "^8.0.1", @@ -3278,8 +2249,8 @@ "@babel/plugin-transform-unicode-property-regex": "^8.0.1", "@babel/plugin-transform-unicode-regex": "^8.0.1", "@babel/plugin-transform-unicode-sets-regex": "^8.0.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs3": "^1.0.0-rc.2", + "@babel/preset-modules": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^1.0.0", "core-js-compat": "^3.48.0", "semver": "^7.7.3" }, @@ -3290,42 +2261,21 @@ "@babel/core": "^8.0.0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.2.0.tgz", + "integrity": "sha512-yz0RBN2fx4fjCeFcTWsWgL7PxSRltvTa0Qg14HkWCU3qS8MO7ZSJlBVbGceynd5C9NsJwwUHNQD3dc6tYO+jqQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/plugin-transform-dotall-regex": "^8.0.1", + "@babel/plugin-transform-unicode-property-regex": "^8.0.1", + "@babel/types": "^8.0.0", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-modules/node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/preset-typescript": { @@ -3348,9 +2298,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", "engines": { @@ -3358,9 +2308,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", - "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz", + "integrity": "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3371,53 +2321,150 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", + "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^8.0.0", + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, "node_modules/@biomejs/biome": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.11.tgz", @@ -3487,6 +2534,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -3504,6 +2554,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -3521,6 +2574,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -3538,6 +2594,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -3606,13 +2665,13 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", - "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.4.tgz", + "integrity": "sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } @@ -3765,9 +2824,9 @@ } }, "node_modules/@codemirror/lang-markdown": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", - "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.1.tgz", + "integrity": "sha512-6re5avCNfyRMIoi3XNjbEfQM1vTeVD3JS3g/Fyegyso/eoANFM71Cyvbb66LDyYtQLMEcRFlzioywCqDo9SlLA==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.7.1", @@ -3898,9 +2957,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", - "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -3990,9 +3049,9 @@ } }, "node_modules/@codemirror/state": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", - "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -4011,9 +3070,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.43.4", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.4.tgz", - "integrity": "sha512-YImu23iyKfncJzT7sRy+rEqEhSc8RhOHqDxwy4WzXRKJwYm6iwf/9OJk5ctCAdZ6yi2ZqaGEvmf55fSVqMDrgg==", + "version": "6.43.6", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.6.tgz", + "integrity": "sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -4081,21 +3140,21 @@ "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", + "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", "dev": true, "license": "MIT", "optional": true, @@ -4104,9 +3163,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, "license": "MIT", "optional": true, @@ -4137,9 +3196,9 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", - "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", "license": "MIT", "dependencies": { "@antfu/install-pkg": "^1.1.0", @@ -4223,9 +3282,9 @@ "license": "MIT" }, "node_modules/@lezer/cpp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.5.tgz", - "integrity": "sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.6.tgz", + "integrity": "sha512-vh9gWWJOXFVY8HBHK3Twzq8MgwG2iN4GSyzBP9sCGTe37P15x2R14VaBQk0VA0ezTRN1KHYBBsHhvpGZ2Xy/pA==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -4234,9 +3293,9 @@ } }, "node_modules/@lezer/css": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.3.tgz", - "integrity": "sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.4.tgz", + "integrity": "sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -4332,9 +3391,9 @@ } }, "node_modules/@lezer/markdown": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.3.tgz", - "integrity": "sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.2.tgz", + "integrity": "sha512-iTkYvoVcKt3WkeL7qUDyXHONZEwLio4wj8KTNi2dnjQEXBZKMV63BpQrPqfsM+OkvuRbiSTAcycYAsQzLhRNoQ==", "license": "MIT", "dependencies": { "@lezer/common": "^1.5.0", @@ -4353,9 +3412,9 @@ } }, "node_modules/@lezer/python": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz", - "integrity": "sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.19.tgz", + "integrity": "sha512-MhQIURHRytsNzP/YXnqpYKW6la6voAH3kyplTOOiCdjyFY6cWWGFVmYVdHIPrElqSDf4iCDktQCockB9FxuhzQ==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -4408,29 +3467,29 @@ } }, "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.3.tgz", + "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", "license": "MIT" }, "node_modules/@mermaid-js/parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz", - "integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.0.tgz", + "integrity": "sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==", "license": "MIT", "dependencies": { - "@chevrotain/types": "~11.1.1" + "@chevrotain/types": "~11.1.2" } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.3" }, "funding": { "type": "github", @@ -4488,9 +3547,9 @@ } }, "node_modules/@npmcli/agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", - "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz", + "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", "license": "ISC", "dependencies": { "agent-base": "^7.1.0", @@ -4504,9 +3563,9 @@ } }, "node_modules/@npmcli/arborist": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.5.0.tgz", - "integrity": "sha512-qS+TtKWC58sjBjD+szLrhEj2TCLnwzUA9vlMyCnU9ztw01ZjQSu25iQPxeBa0sk9sS9/Hzs/xJMWl7J/vRCjGQ==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.9.0.tgz", + "integrity": "sha512-tzsb1R8mx0k0drlLDT/9ckEYaQHIaWnUti/ci2IaFoQqdqwfmYrc+90p1+QEZC/ocvqcxBep9P1xKw4FbAGofw==", "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", @@ -4551,18 +3610,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/arborist/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/fs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", @@ -4575,18 +3622,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/git": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", @@ -4606,18 +3641,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/installed-package-contents": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", @@ -4665,18 +3688,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/metavuln-calculator/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/move-file": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", @@ -4741,18 +3752,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/package-json/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/promise-spawn": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", @@ -4803,9 +3802,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4814,7 +3813,7 @@ "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">= 10.0.0" @@ -4824,25 +3823,24 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", "cpu": [ "arm64" ], @@ -4861,9 +3859,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", "cpu": [ "arm64" ], @@ -4882,9 +3880,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", "cpu": [ "x64" ], @@ -4903,9 +3901,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", "cpu": [ "x64" ], @@ -4924,13 +3922,16 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4945,13 +3946,16 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4966,13 +3970,16 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4987,13 +3994,16 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -5008,13 +4018,16 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -5029,13 +4042,16 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -5050,9 +4066,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", "cpu": [ "arm64" ], @@ -5070,12 +4086,12 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", "cpu": [ - "ia32" + "x64" ], "dev": true, "license": "MIT", @@ -5091,96 +4107,117 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "node_modules/@rspack/binding": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.1.5.tgz", + "integrity": "sha512-lF3ZLeeyV0AN3BL0m2jAmNZD5pP9IHsQ8gUXN7mo0g4xsW6nf6hsN7o9CnEHECz5uUZb+EoWsuWzAAmnA9Ip8Q==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "2.1.5", + "@rspack/binding-darwin-x64": "2.1.5", + "@rspack/binding-linux-arm64-gnu": "2.1.5", + "@rspack/binding-linux-arm64-musl": "2.1.5", + "@rspack/binding-linux-riscv64-gnu": "2.1.5", + "@rspack/binding-linux-riscv64-musl": "2.1.5", + "@rspack/binding-linux-x64-gnu": "2.1.5", + "@rspack/binding-linux-x64-musl": "2.1.5", + "@rspack/binding-wasm32-wasi": "2.1.5", + "@rspack/binding-win32-arm64-msvc": "2.1.5", + "@rspack/binding-win32-ia32-msvc": "2.1.5", + "@rspack/binding-win32-x64-msvc": "2.1.5" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.1.5.tgz", + "integrity": "sha512-XLAN6YSU36qkciJtV9DY9z57pdHOjKy/f1HyoqpZenRg8p46jnXPziV45lfrTZpG+FF6g/jtTUc4dKbeyoWqPw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "darwin" + ] }, - "node_modules/@rspack/binding": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.0.3.tgz", - "integrity": "sha512-4exVNhGhW5RFHjK87XeTKbkA/qAgI5NHJlT1jNqiJv0gcUXLqTOEU3w7f8+f9zUo4JMFvPc0c9veOi4M19YYTg==", + "node_modules/@rspack/binding-darwin-x64": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.1.5.tgz", + "integrity": "sha512-KLW7PV86jyCOyqJSqrkZdvYUWYCFX/Q4LsGmVc8tyDA8jBYLMHJDewC/lNf9ot3rU2SoLDZKhDUh7q7dX0FRmg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "optionalDependencies": { - "@rspack/binding-darwin-arm64": "2.0.3", - "@rspack/binding-darwin-x64": "2.0.3", - "@rspack/binding-linux-arm64-gnu": "2.0.3", - "@rspack/binding-linux-arm64-musl": "2.0.3", - "@rspack/binding-linux-x64-gnu": "2.0.3", - "@rspack/binding-linux-x64-musl": "2.0.3", - "@rspack/binding-wasm32-wasi": "2.0.3", - "@rspack/binding-win32-arm64-msvc": "2.0.3", - "@rspack/binding-win32-ia32-msvc": "2.0.3", - "@rspack/binding-win32-x64-msvc": "2.0.3" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@rspack/binding-darwin-arm64": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.0.3.tgz", - "integrity": "sha512-4UyCjLJwU/WxR6K1/gG4u3+jUsoaRHJ5rNu9fto/UbvrItwdlVNULChAApqZFw6mcSetMddSjSICeuj5pSB6sA==", + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.1.5.tgz", + "integrity": "sha512-KOooAC8L+Ljx5sY7ZuMeaXCQ310FNWaPWXcYQJpFPApF3qyLeSfuOftUGwxcxeo5U0mS5OY3zxp7/5CaHWKYjg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ] }, - "node_modules/@rspack/binding-darwin-x64": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.0.3.tgz", - "integrity": "sha512-K3evrbTgZNa8emEqk+AjDtbuoXZp5tPZz3pcEgETxuu3KanW8Zu+Fb+TUp1DEUcL0xOmHPPox8H2cZ3pF4Zmug==", + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.1.5.tgz", + "integrity": "sha512-0GFc07gT71+uRbHtejDecBfSL0fs7dQAwCtXYieXboACauL7UvS3Hwr6v8A91aGtAcvLotnCaIa3CWWYwtYlYQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ] }, - "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.0.3.tgz", - "integrity": "sha512-aPLDaaTtX1wqjLYAIHc2MGDQZtv1Hbjx47oaaefbWz5GbAnSA4P8jdYIeeGRyrqvQ0WqJXIWXgT0d/iXtes00A==", + "node_modules/@rspack/binding-linux-riscv64-gnu": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-2.1.5.tgz", + "integrity": "sha512-isQQDp3fBzPSZpLVFzPqVXIVA4I9b9mKs58TfUgOzDP/1g1582YSV3iFopgFogvEliihXDuuXvM6aAkP+w8Z+Q==", "cpu": [ - "arm64" + "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.0.3.tgz", - "integrity": "sha512-0WulUQPop6vmSDfrTxghmVlm+6crU8/XqD2f0dOWbEniZVuDZJ5/Y/cBqTRyk3rjl0vrmUv3lc87/t7UgQJQSw==", + "node_modules/@rspack/binding-linux-riscv64-musl": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-2.1.5.tgz", + "integrity": "sha512-/SP6VknY4kH60BYplI2FDNAJCo4U4DUszLxhKsgVlgA5ImgHC8Ew2AsKgidk7ceiYV9OcKzYuWYe9tVpysBYVA==", "cpu": [ - "arm64" + "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -5188,13 +4225,16 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.0.3.tgz", - "integrity": "sha512-fAhiMuV5omT53YMft+f3Y9euAFgspuyBAk9ZpeW2buL2TkuUMwP07adhhvQfKdQ5gpELfzmjQaRDGqaIT8UWiA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.1.5.tgz", + "integrity": "sha512-/GJmS+buA4pilT10gs5mfAhAZxSHXpDD8veZ3QpYvNUuoU9gvempAq9TgjbyNN/vc5pf76GdXPXKFMiehudYSA==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -5202,13 +4242,16 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.0.3.tgz", - "integrity": "sha512-0kcuFoZ8vy2iNWoISFOZt+/Ujo7LRLrzE7h07AV5r+oN/mv+/v14Sd/8NUtDIScCkrYOszYq/QS31e6t0UrVfw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.1.5.tgz", + "integrity": "sha512-iwS3t75nZ2TnUjB05KtvpvjpdkOy/nLxbaOnwjbdnNZZXpUaMadLbllGAWayHPGCMsL2yKBEhVEESZpR7tK3SA==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -5216,9 +4259,9 @@ ] }, "node_modules/@rspack/binding-wasm32-wasi": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.0.3.tgz", - "integrity": "sha512-x2fsw7GzNZEnw444ikj4/b8kVjM0Y0TllxmizHpYZ9gmaQrOk5OXo9RQdz+l4zzoGors0l2IZP5Cc4GJNCaSoQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.1.5.tgz", + "integrity": "sha512-jOhW69t1H/jcRaSMB5U8jVzWP18j0YQIlo0nT8W+KvNVScJeyOze4FFc+5RIS7VmuT8/jid7hUyydZOfm6UgqA==", "cpu": [ "wasm32" ], @@ -5226,15 +4269,15 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "1.1.4" + "@emnapi/core": "1.11.2", + "@emnapi/runtime": "1.11.2", + "@napi-rs/wasm-runtime": "1.1.6" } }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.0.3.tgz", - "integrity": "sha512-jqlxuVPdrgMuwj/HEjSkC/jmhl4fAuKyob36zJXq2uAusn2FRJ4kClGe1fLFpfxRXFVQAWwlAOwLJg8T0suuaA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.1.5.tgz", + "integrity": "sha512-OLfMXmtFBcrWr9BRGKXJYrWgYR0JSaoAWr3EVFDjKGi/YR5aUwQSGc3AJPBph9g0YsdSqRuUhtQGtCk84DeeEA==", "cpu": [ "arm64" ], @@ -5246,9 +4289,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.0.3.tgz", - "integrity": "sha512-QM4JEuyk5QaZ5gnvnAIaCwVQzCkrD2E4Sud77kx/MVGDsRkcOlMx3blMC5QNHPDamRmWGk+7314YOQvRhKuWyg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.1.5.tgz", + "integrity": "sha512-p4OSmnj21+AY8vpIADveLEBXfXJRXonOTYim2VLVWV4TbXfhYNMLiX3qESHCdNnn6lVJM0q6zxxzEUfTyAKydw==", "cpu": [ "ia32" ], @@ -5260,9 +4303,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.0.3.tgz", - "integrity": "sha512-vSQNnAy0wswG6AfNRuArTHQBiXOXl+A9ddQxBFup4PMHUzXxKtsBLQzw7BgFC0EgrPeHbt+30j7sXVZKYukj4A==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.1.5.tgz", + "integrity": "sha512-YCkLLDGMkHsw5CpcsFtFhzCu+JZEsNrcH9O1GpWMkyxR2ku2Fq1i2wEHYSm26HyW+PJ3+Fv347MPWMFZIz9q2g==", "cpu": [ "x64" ], @@ -5274,9 +4317,9 @@ ] }, "node_modules/@rspack/cli": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-2.0.3.tgz", - "integrity": "sha512-h/Xbkupx82UaPr5Ye3hNORi5eXmpEGSPri7WkEOrKIcT+Y3h603kujCQziNIPX3G4UURWPiksIArp1GBTF+A9w==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-2.1.5.tgz", + "integrity": "sha512-N6Bm8sxHwatNoiZR68+/VKvVMDh19ya39t2Nfxu1/fBmGCrQX1ct8uPooVSysLtUF2Qx31sSRl1DX1SS0eYt2A==", "dev": true, "license": "MIT", "bin": { @@ -5293,20 +4336,20 @@ } }, "node_modules/@rspack/core": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.0.3.tgz", - "integrity": "sha512-2ufO/8FHIA/lX6UOgSsKPhpDvHr0sh9lYq/n/LsIZsTwu3973BGbu2fg1Akvuu3rEnskPqXjsqH2EPBzEA42uA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.1.5.tgz", + "integrity": "sha512-YHjL7xVXycAWsjJtF39cRZ2u+ddiNFxY+FcNgEBe6Y8OaLeUfMfjba3gK+B1Oj32UcKD6BmXGsPfu9p+OII/Yw==", "dev": true, "license": "MIT", "dependencies": { - "@rspack/binding": "2.0.3" + "@rspack/binding": "2.1.5" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", - "@swc/helpers": ">=0.5.1" + "@swc/helpers": "^0.5.23" }, "peerDependenciesMeta": { "@module-federation/runtime-tools": { @@ -5453,9 +4496,9 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, "license": "MIT", "optional": true, @@ -5658,9 +4701,9 @@ "license": "MIT" }, "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", "license": "MIT" }, "node_modules/@types/d3-scale": { @@ -5730,30 +4773,6 @@ "@types/d3-selection": "*" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -5815,14 +4834,14 @@ "peer": true }, "node_modules/@types/node": { - "version": "25.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz", - "integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==", + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", + "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": ">=7.24.0 <7.24.7" + "undici-types": "~8.3.0" } }, "node_modules/@types/trusted-types": { @@ -5862,6 +4881,12 @@ "d3-transition": "^3.0.1" } }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "license": "MIT" + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -6171,9 +5196,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6182,20 +5207,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -6281,28 +5292,15 @@ } }, "node_modules/android-versions": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-2.1.1.tgz", - "integrity": "sha512-dYeO3KHDO81WvEwZFK+OF0dJl/ESvxV3QZE/qo/AAnG/uijco6DOXJJla3CdoC8Eg53YBlbRIyobRGYqIAGw8Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-2.2.0.tgz", + "integrity": "sha512-lrad0HHmy9406sSmBHYIetx4n3WMnVVD+HMv7C+YJrByLFGPYWvlM1WcYrYL+e2s1GErvRF85nWsRY7RpwIGLw==", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.2" } }, - "node_modules/android-versions/node_modules/semver": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", - "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ansi": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", @@ -6495,9 +5493,9 @@ "license": "MIT" }, "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -6548,9 +5546,9 @@ "license": "MIT" }, "node_modules/archiver/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -6719,9 +5717,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "dev": true, "funding": [ { @@ -6739,8 +5737,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -6851,9 +5849,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.30", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz", - "integrity": "sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==", + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.3.tgz", + "integrity": "sha512-sbT0Ui/CZwyAyy7icT1Gw5P1LKRlFaHwaF6tDCW5YHq2X5SeeZFphBuIagopSfwSSZq3sQcbmEL072yphxm7ew==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6893,9 +5891,9 @@ } }, "node_modules/bin-links": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-6.0.0.tgz", - "integrity": "sha512-X4CiKlcV2GjnCMwnKAfbVWpHa++65th9TuzAEYtZoATiOE2DQKhSp4CJlyLoTqdhBKlXjpXjCTYPNNFS33Fi6w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-6.0.2.tgz", + "integrity": "sha512-frE1t78WOwJ45PKV2cF2tNPjTcs9L1J9s6VkrV59wanRP4GlaomuxYPVma7BwthMg8WnfSory4w5PTE6FZZ81w==", "license": "ISC", "dependencies": { "cmd-shim": "^8.0.0", @@ -6973,9 +5971,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "dev": true, "license": "MIT", "dependencies": { @@ -7143,15 +6141,15 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -7174,9 +6172,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ { @@ -7194,10 +6192,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -7387,9 +6385,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { @@ -7578,9 +6576,9 @@ "license": "MIT" }, "node_modules/cli/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -7637,6 +6635,23 @@ "node": ">=20" } }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -7909,19 +6924,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conf/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -8047,9 +7049,9 @@ } }, "node_modules/cordova-android": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-15.0.0.tgz", - "integrity": "sha512-EpFSKUtBLJ7bTpuVD7NeC6toAooi5PI6VIR2jd8Ut5PJu7HSR5tPRwS87Q1DS03RSyDTlroB64JPUWC0pmAhnw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-15.1.0.tgz", + "integrity": "sha512-mnOnOisYUVhyrLCPVlHJBKh4ro+X6nZA7nPqBrpVnyTpiiDiakNCfbBJjSs1MTBUJZ6dcmhhvNKZWPT9w6aGPA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8070,19 +7072,6 @@ "node": ">=20.17.0 || >=22.9.0" } }, - "node_modules/cordova-android/node_modules/semver": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", - "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cordova-app-hello-world": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-7.0.0.tgz", @@ -8164,18 +7153,6 @@ "node": ">=18" } }, - "node_modules/cordova-fetch/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cordova-fetch/node_modules/which": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", @@ -8211,18 +7188,6 @@ "node": ">=20.17.0 || >=22.9.0" } }, - "node_modules/cordova-lib/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cordova-lib/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -8388,18 +7353,6 @@ "node": ">= 8" } }, - "node_modules/cordova/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/core-js": { "version": "3.49.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", @@ -8453,9 +7406,9 @@ } }, "node_modules/cosmiconfig": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", "dependencies": { @@ -8519,9 +7472,9 @@ } }, "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", "license": "MIT" }, "node_modules/cross-spawn": { @@ -8604,19 +7557,6 @@ } } }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -8643,9 +7583,9 @@ } }, "node_modules/cytoscape": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.3.tgz", - "integrity": "sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz", + "integrity": "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==", "license": "MIT", "engines": { "node": ">=0.10" @@ -9170,9 +8110,9 @@ "dev": true }, "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "license": "MIT" }, "node_modules/debounce-fn": { @@ -9460,9 +8400,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", - "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", + "integrity": "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -9537,9 +8477,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.357", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz", - "integrity": "sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==", + "version": "1.5.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz", + "integrity": "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==", "dev": true, "license": "ISC" }, @@ -9646,11 +8586,12 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.21.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", - "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", + "version": "5.24.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", + "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" @@ -9717,9 +8658,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true, "license": "MIT", "peer": true @@ -9738,13 +8679,14 @@ } }, "node_modules/es-toolkit": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", - "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types" ] }, "node_modules/escalade": { @@ -10114,9 +9056,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", "dev": true, "funding": [ { @@ -10180,9 +9122,9 @@ } }, "node_modules/filesize": { - "version": "11.0.17", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.17.tgz", - "integrity": "sha512-oHLTvMLw6imZUl1se/RBQrFlyy50nXce4sU7yGR6Qc0JgCwqnfiFsAnEwotdGmfKLD7SArGUk2/5STU0k8LOBQ==", + "version": "11.0.22", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.22.tgz", + "integrity": "sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw==", "license": "BSD-3-Clause", "engines": { "node": ">= 10.8.0" @@ -10336,12 +9278,12 @@ } }, "node_modules/framer-motion": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.0.tgz", - "integrity": "sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==", + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.2.tgz", + "integrity": "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==", "license": "MIT", "dependencies": { - "motion-dom": "^12.42.0", + "motion-dom": "^12.42.2", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, @@ -10637,14 +9579,6 @@ "node": ">= 6" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -10852,9 +9786,9 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -11101,9 +10035,9 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", - "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", "dev": true, "license": "MIT" }, @@ -11256,19 +10190,6 @@ "node": ">=10" } }, - "node_modules/init-package-json/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/init-package-json/node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -11279,6 +10200,13 @@ "builtins": "^1.0.3" } }, + "node_modules/init-package-json/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/inquirer": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", @@ -11520,9 +10448,9 @@ } }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", + "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", "license": "MIT", "engines": { "node": ">= 12" @@ -11834,16 +10762,16 @@ } }, "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, "funding": [ { @@ -11910,9 +10838,9 @@ "license": "MIT" }, "node_modules/jshint/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -12006,6 +10934,12 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, "node_modules/jsonfile": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", @@ -12158,9 +11092,9 @@ "license": "MIT" }, "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "funding": [ { "type": "github", @@ -12176,21 +11110,6 @@ "uc.micro": "^2.0.0" } }, - "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -12328,9 +11247,9 @@ } }, "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -12364,10 +11283,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/make-fetch-happen": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz", - "integrity": "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==", + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", + "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", @@ -12388,9 +11316,9 @@ } }, "node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", "funding": [ { "type": "github", @@ -12404,8 +11332,8 @@ "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -12415,9 +11343,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", - "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.1.tgz", + "integrity": "sha512-p6APiLJDFAW2GEvaavDvhIBn7jrX2jLv77NkBGgNacFTurbORYc4pyYySg/mI6mpR6cHQuAtzKtmqgQr4K8dsQ==", "license": "Unlicense", "peerDependencies": { "@types/markdown-it": "*", @@ -12425,9 +11353,9 @@ } }, "node_modules/markdown-it-emoji": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", - "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.1.0.tgz", + "integrity": "sha512-NhmMEH2ywduD4Nty1E8uB5NqfLhAT1VR0dyvoJyStKOqCzbZmVdn/+8wj7zpDsb/fLBikpCPsWwxqKlvMmbz4g==", "license": "MIT" }, "node_modules/markdown-it-footnote": { @@ -12496,9 +11424,9 @@ } }, "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", "license": "MIT" }, "node_modules/media-typer": { @@ -12537,26 +11465,26 @@ } }, "node_modules/mermaid": { - "version": "11.15.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.15.0.tgz", - "integrity": "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==", + "version": "11.16.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.16.0.tgz", + "integrity": "sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA==", "license": "MIT", "dependencies": { - "@braintree/sanitize-url": "^7.1.1", + "@braintree/sanitize-url": "^7.1.2", "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.1.1", + "@mermaid-js/parser": "^1.2.0", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", - "cytoscape": "^3.33.1", + "cytoscape": "^3.33.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", - "dayjs": "^1.11.19", - "dompurify": "^3.3.1", + "dayjs": "^1.11.20", + "dompurify": "^3.3.3", "es-toolkit": "^1.45.1", - "katex": "^0.16.25", + "katex": "^0.16.45", "khroma": "^2.1.0", "marked": "^16.3.0", "roughjs": "^4.6.6", @@ -12715,6 +11643,68 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -12754,9 +11744,9 @@ } }, "node_modules/minipass-fetch/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "license": "MIT", "optional": true, "dependencies": { @@ -12794,6 +11784,12 @@ "node": ">=8" } }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/minipass-json-stream": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", @@ -12818,6 +11814,13 @@ "node": ">=8" } }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -12842,6 +11845,12 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/minipass-sized": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", @@ -12941,9 +11950,9 @@ "license": "MIT" }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -13264,12 +12273,12 @@ } }, "node_modules/motion": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.42.0.tgz", - "integrity": "sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA==", + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.42.2.tgz", + "integrity": "sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==", "license": "MIT", "dependencies": { - "framer-motion": "^12.42.0", + "framer-motion": "^12.42.2", "tslib": "^2.4.0" }, "peerDependencies": { @@ -13290,9 +12299,9 @@ } }, "node_modules/motion-dom": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.0.tgz", - "integrity": "sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==", + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.2.tgz", + "integrity": "sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==", "license": "MIT", "dependencies": { "motion-utils": "^12.39.0" @@ -13327,9 +12336,9 @@ "license": "ISC" }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, "funding": [ { @@ -13370,9 +12379,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", - "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", "license": "MIT", "dependencies": { "env-paths": "^2.2.0", @@ -13393,24 +12402,15 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-releases": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nopt": { "version": "9.0.0", @@ -13469,18 +12469,12 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "license": "ISC" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -13526,18 +12520,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-normalize-package-bin": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", @@ -13562,18 +12544,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-packlist": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", @@ -13602,18 +12572,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-registry-fetch": { "version": "19.1.1", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", @@ -13709,9 +12667,9 @@ "license": "ISC" }, "node_modules/obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -13867,9 +12825,9 @@ } }, "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "license": "MIT", "engines": { "node": ">=18" @@ -13904,16 +12862,26 @@ "node": ">=8" } }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", "license": "MIT" }, "node_modules/pacote": { - "version": "21.5.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.0.tgz", - "integrity": "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ==", + "version": "21.5.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz", + "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==", "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", @@ -13992,6 +12960,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-json/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-json/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-json/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/parse-json/node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -14120,9 +13120,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "license": "MIT", "engines": { "node": ">=12" @@ -14251,9 +13251,9 @@ } }, "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "dev": true, "funding": [ { @@ -14271,7 +13271,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -14311,19 +13311,6 @@ } } }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", @@ -14388,9 +13375,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14418,9 +13405,9 @@ } }, "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, "license": "MIT", "bin": { @@ -14434,13 +13421,13 @@ } }, "node_modules/prettier-plugin-java": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-2.9.1.tgz", - "integrity": "sha512-qdvMRgSlx5li5fkbIQlMAUSJQn8rIwP2Ux0U1Xg8ganHMAK4UOUoOG00GeZfoLRllSgNt5V3dZOlwUXPLoamSQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-2.10.3.tgz", + "integrity": "sha512-/g52mTbsN2ee8JjLRpBWGGmcmRhdv2zRWyj4QbsL9CQ+nKR022GRJhebwEpRyaCc8hLV6aO3JPGNQyXp1DPrCA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "web-tree-sitter": "0.26.8" + "web-tree-sitter": "0.26.11" }, "peerDependencies": { "prettier": "^3.0.0" @@ -14892,9 +13879,9 @@ "license": "MIT" }, "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -15279,9 +14266,9 @@ "license": "MIT" }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -15414,13 +14401,13 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.99.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", - "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "version": "1.102.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.102.0.tgz", + "integrity": "sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", + "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -15428,7 +14415,7 @@ "sass": "sass.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" @@ -15475,6 +14462,36 @@ } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", @@ -15502,12 +14519,15 @@ } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-diff": { @@ -15523,6 +14543,16 @@ "node": ">=8" } }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/send": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", @@ -15715,17 +14745,17 @@ "license": "ISC" }, "node_modules/sigstore": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", - "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz", + "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.0", - "@sigstore/tuf": "^4.0.1", - "@sigstore/verify": "^3.1.0" + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -15944,17 +14974,16 @@ } }, "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16069,9 +15098,9 @@ } }, "node_modules/systeminformation": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.6.tgz", - "integrity": "sha512-Uv2b2uGGM6ns+26czgW2cYRabYdnswM0ddSOOlryHOaelzsmDSet1iM/NT7VOYxW8x/BW+HkY+b1Ve2pLTSGSA==", + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.1.tgz", + "integrity": "sha512-DEN6ICHk3Tk0Uf/hrAHh7xlt7iL5CJFBtPZinA0H62DrGG/KPKqq/Nzj6lCXPS4Ay/sf/14zNnk9LpqKzBIc+w==", "license": "MIT", "os": [ "darwin", @@ -16087,7 +15116,7 @@ "systeminformation": "lib/cli.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" }, "funding": { "type": "Buy me a coffee", @@ -16109,9 +15138,9 @@ } }, "node_modules/tar": { - "version": "7.5.16", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", - "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -16156,15 +15185,6 @@ "node": ">= 6" } }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/terminal": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/terminal/-/terminal-0.1.4.tgz", @@ -16173,90 +15193,28 @@ "dependencies": { "sprintf": ">= 0.1.1" }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/terser": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.47.1.tgz", - "integrity": "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/terser": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.0.tgz", + "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, - "peerDependencies": { - "webpack": "^5.1.0" + "bin": { + "terser": "bin/terser" }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "engines": { + "node": ">=10" } }, "node_modules/terser/node_modules/commander": { @@ -16275,18 +15233,18 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", - "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -16371,46 +15329,37 @@ } }, "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", "license": "MIT", "engines": { "node": ">=6.10" } }, "node_modules/ts-loader": { - "version": "9.5.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", - "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.2.tgz", + "integrity": "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", + "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" }, "peerDependencies": { + "loader-utils": "*", "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "webpack": "^4.0.0 || ^5.0.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "loader-utils": { + "optional": true + } } }, "node_modules/tslib": { @@ -16557,18 +15506,18 @@ "license": "MIT" }, "node_modules/undici": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", - "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", "license": "MIT", "engines": { "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", - "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "dev": true, "license": "MIT", "peer": true @@ -16739,19 +15688,6 @@ "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -16802,9 +15738,9 @@ } }, "node_modules/uuid": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", - "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -16901,29 +15837,84 @@ "dev": true, "license": "MIT" }, + "node_modules/vscode-css-languageservice": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-html-languageservice": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-json-languageservice": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.7.2.tgz", + "integrity": "sha512-WtKRDtJfFEmLrgtu+ODexOHm/6/krRF0k6t+uvkKIKW1Jh9ZIyxZQwJJwB3qhrEgvAxa37zbUg+vn+UyUK/U2w==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "jsonc-parser": "^3.3.1", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", + "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", + "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" + "vscode-jsonrpc": "9.0.1", + "vscode-languageserver-types": "3.18.0" } }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "license": "MIT" }, "node_modules/w3c-keyname": { @@ -16942,14 +15933,13 @@ } }, "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { @@ -16980,44 +15970,40 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.26.8", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.8.tgz", - "integrity": "sha512-4sUwi7ZyOrIk5KLgYLkc2A/F0LFMQnBhfb+2Cdl7ik4ePJ6JD+fk4ofI2sA5eGawBKBaK4Vntt7Ww5KcEsay4A==", + "version": "0.26.11", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.11.tgz", + "integrity": "sha512-Q5Dm3YTIXSXuH6FxX6RuzX2Qwpc4DPGiYMU87Wg5Z8OIStiQFiUex4zMDc0vBTw78EphaYJacncJghCHzbZptg==", "dev": true, "license": "MIT" }, "node_modules/webpack": { - "version": "5.106.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", - "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "version": "5.109.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.0.tgz", + "integrity": "sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.20.0", - "es-module-lexer": "^2.0.0", + "enhanced-resolve": "^5.24.2", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.1", "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.17", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.4" + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -17036,9 +16022,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", - "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "dev": true, "license": "MIT", "peer": true, @@ -17291,6 +16277,23 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -17311,9 +16314,9 @@ } }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, "license": "MIT", "engines": { @@ -17384,21 +16387,24 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", + "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" }, @@ -17622,9 +16628,9 @@ } }, "src/plugins/cordova-plugin-advanced-http/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -18353,19 +17359,6 @@ "node": ">= 6" } }, - "src/plugins/cordova-plugin-advanced-http/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "src/plugins/cordova-plugin-advanced-http/node_modules/socks-proxy-agent": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", @@ -18474,6 +17467,13 @@ "node": ">= 8" } }, + "src/plugins/cordova-plugin-advanced-http/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "src/plugins/cordova-plugin-buildinfo": { "version": "4.0.0", "dev": true, @@ -18575,66 +17575,11 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/vscode-css-languageservice": { - "version": "6.3.10", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", - "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", - "license": "MIT", - "dependencies": { - "@vscode/l10n": "^0.0.18", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "3.17.5", - "vscode-uri": "^3.1.0" - } - }, - "node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "license": "MIT" - }, - "node_modules/vscode-html-languageservice": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", - "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", - "license": "MIT", - "dependencies": { - "@vscode/l10n": "^0.0.18", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "^3.17.5", - "vscode-uri": "^3.1.0" - } - }, - "node_modules/vscode-json-languageservice": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.7.2.tgz", - "integrity": "sha512-WtKRDtJfFEmLrgtu+ODexOHm/6/krRF0k6t+uvkKIKW1Jh9ZIyxZQwJJwB3qhrEgvAxa37zbUg+vn+UyUK/U2w==", - "license": "MIT", - "dependencies": { - "@vscode/l10n": "^0.0.18", - "jsonc-parser": "^3.3.1", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "^3.17.5", - "vscode-uri": "^3.1.0" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" + "src/plugins/webview": { + "name": "cordova-plugin-acode-webview", + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0" } } }