diff --git a/.gitignore b/.gitignore index d2eb8083f..76f0bcc7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # dependencies -/node_modules +node_modules /.pnp .pnp.js @@ -28,7 +28,8 @@ yarn-error.log* out/ build/ dist/ - +sdk-dist +wander-embedded-sdk/wallet-api-dist/ # plasmo - https://www.plasmo.com .plasmo @@ -39,4 +40,4 @@ keys.json .tsbuildinfo # temporary remove development icon -assets/icon.development.png \ No newline at end of file +assets/icon.development.png diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} diff --git a/README.md b/README.md new file mode 100644 index 000000000..bcc17bd4a --- /dev/null +++ b/README.md @@ -0,0 +1,135 @@ +# WanderEmbedded SDK Documentation + +WanderEmbedded SDK provides a seamless way to integrate Wander functionality into your web application. + +## Installation + +```bash +npm install wander-embedded-sdk +# or +yarn add wander-embedded-sdk +``` + +## Quick Start + +```javascript +import { WanderEmbedded } from "wander-embedded-sdk"; + +// Initialize with default options +const wander = new WanderEmbedded(); + +// Or initialize with custom options +const wander = new WanderEmbedded({ + buttonStyles: "custom", + iframeStyles: { + /* custom styles */ + }, + logo: "custom-logo-url" +}); +``` + +## API Reference + +### Constructor Options + +The `WanderEmbedded` constructor accepts an optional configuration object with the following properties: + +| **Option** | **Type** | **Default** | **Description** | +| -------------- | ---------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- | +| `buttonStyles` | object \| 'none' | `undefined` | Customize the button’s appearance: - **object**: inline style object ; **'none'**: hide the button | +| `iframeRef` | `HTMLIFrameElement` | `undefined` | Use an existing iframe element instead of creating a new one. | +| `iframeStyles` | `object` | `undefined` | Inline styles for the iframe (e.g., `{ border: 'none', borderRadius: '12px' }`). | +| `logo` | `string` | `undefined` | URL for a custom logo displayed on the Wander button. | +| `balance` | `string` | `undefined` | Show balance information on the button. | +| `onOpen` | `() => void` | `undefined` | Callback fired when the Wander iframe is opened. | +| `onClose` | `() => void` | `undefined` | Callback fired when the Wander iframe is closed. | +| `onResize` | `(data: ResizeData) => void` | `undefined` | Callback fired when the Wander iframe is resized. The `data` object typically includes new width and height values. | + +### Methods + +#### `open()` + +Opens the Wander iframe. + +```javascript +wander.open(); +``` + +#### `close()` + +Closes the Wander iframe. + +```javascript +wander.close(); +``` + +#### `destroy()` + +Removes all Wander elements from the DOM and cleans up resources. + +```javascript +wander.destroy(); +``` + +## Examples + +### Basic Integration + +```javascript +const wander = new WanderEmbedded(); +``` + +### Custom Styling + +```javascript +const wander = new WanderEmbedded({ + buttonStyles: { + backgroundColor: "#000000", + color: "#ffffff" + // Add more custom styles + }, + iframeStyles: { + border: "none", + borderRadius: "12px" + // Add more custom styles + } +}); +``` + +### With Event Handlers + +```javascript +const wander = new WanderEmbedded({ + onOpen: () => { + console.log("Wander iframe opened"); + }, + onClose: () => { + console.log("Wander iframe closed"); + }, + onResize: (data) => { + console.log("Iframe resized:", data); + } +}); +``` + +### Using Custom iframe + +```javascript +const customIframe = document.getElementById("my-iframe"); +const wander = new WanderEmbedded({ + iframeRef: customIframe +}); +``` + +### Button-less Integration + +```javascript +const wander = new WanderEmbedded({ + buttonStyles: "none" +}); +``` + +## Notes + +- The SDK automatically injects necessary elements into your webpage unless custom references are provided. +- Make sure to call `destroy()` when cleaning up to prevent memory leaks. diff --git a/assets/popup.js b/assets/popup.js index a49ef20f3..80b03c398 100644 --- a/assets/popup.js +++ b/assets/popup.js @@ -1,5 +1,5 @@ -const backgroundColor = localStorage.getItem("ARCONNECT_THEME_BACKGROUND_COLOR"); -const textColor = localStorage.getItem("ARCONNECT_THEME_TEXT_COLOR"); +const backgroundColor = localStorage.getItem("APP_THEME_BACKGROUND_COLOR"); +const textColor = localStorage.getItem("APP_THEME_TEXT_COLOR"); if (backgroundColor) document.documentElement.style.setProperty('--backgroundColor', backgroundColor); if (textColor) document.documentElement.style.setProperty('--textColor', textColor); diff --git a/package.json b/package.json index 962ad546e..2ebcf759a 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dev:iframe": "vite", "build:iframe": "vite build", "preview:iframe": "vite preview", + "build:wallet-api": "vite build --config vite.wallet-config.js", "nuke": "rm -rf node_modules build .plasmo", "fmt": "prettier --write .", "fmt:check": "prettier --check .", @@ -99,6 +100,7 @@ "styled-components": "^5.3.6", "typed-assert": "^1.0.9", "uuid": "^9.0.0", + "vite-plugin-dts": "^4.5.0", "webextension-polyfill": "^0.10.0", "wouter": "^3.3.5" }, diff --git a/shim.d.ts b/shim.d.ts index 2cb8a00f2..5109ea128 100644 --- a/shim.d.ts +++ b/shim.d.ts @@ -60,13 +60,10 @@ declare module "@arconnect/webext-bridge" { // EMBEDDED: - embedded_open: any; - embedded_close: any; - embedded_resize: any; - // TODO: Maybe yes, maybe not (we should not drift too far away from the BE wallet API) - // embedded_auth: any; - // embedded_balance: any; - // embedded_info: any; + embedded_auth: EmbeddedAuthMessageData; + embedded_balance: EmbeddedBalanceMessageData; + embedded_resize: EmbeddedResizeMessageData; + embedded_close: void; // OTHER: @@ -78,9 +75,11 @@ declare module "@arconnect/webext-bridge" { } interface ApiCall extends JsonValue { + app: "wander" | "wanderEmbedded"; + version: string; + callID: number | string; type: string; data?: DataType; - callID: number | string; } interface ApiResponse extends ApiCall { diff --git a/src/api/background/background-setup.ts b/src/api/background/background-setup.ts index 5b4fd4975..46824a5dd 100644 --- a/src/api/background/background-setup.ts +++ b/src/api/background/background-setup.ts @@ -28,6 +28,7 @@ import { } from "~api/background/handlers/browser/tabs/tabs.handler"; import { log, LOG_GROUP } from "~utils/log/log.utils"; import { handleAuthStateChange } from "./handlers/storage/auth-state-change/auth-state-change.handler"; +import { EMBEDDED_PARENT_ORIGIN } from "~utils/embedded/sdk/utils/url/sdk-url.utils"; export function setupBackgroundService() { log( @@ -42,6 +43,48 @@ export function setupBackgroundService() { onMessage("api_call", handleApiCallMessage); onMessage("chunk", handleChunkMessage); + if (import.meta.env?.VITE_IS_EMBEDDED_APP === "1") { + window.addEventListener("message", (event: MessageEvent) => { + if ( + !event.data || + event.data.app !== "wanderEmbedded" || + event.origin !== EMBEDDED_PARENT_ORIGIN + ) + return; + + console.log("MESSAGE FROM PARENT =", event.data); + + handleApiCallMessage({ + id: "", + timestamp: Date.now(), + data: event.data, + sender: { + tabId: 0, + context: "content-script" + } + }); + + // Example: check if the message is from our SDK + + /* + if (event.data.type === "FROM_SDK") { + const incomingMsg = event.data.payload; + console.log( + "Iframe received message from WanderEmbedded:", + incomingMsg + ); + + // Respond back + event.source?.postMessage({ + type: "FROM_IFRAME", + payload: `Got your message: ${incomingMsg}` + }); + } + */ + }); + } else { + } + // LIFECYCLE: // Open welcome page on extension install. diff --git a/src/api/background/handlers/message/api-call-message/api-call-message.handler.ts b/src/api/background/handlers/message/api-call-message/api-call-message.handler.ts index 66a40b240..2f7730376 100644 --- a/src/api/background/handlers/message/api-call-message/api-call-message.handler.ts +++ b/src/api/background/handlers/message/api-call-message/api-call-message.handler.ts @@ -28,7 +28,7 @@ export const handleApiCallMessage: OnMessageCallback< isExactly( sender.context, "content-script", - "Chunk calls are only accepted from the injected-script -> content-script" + "API call messages are only accepted from the injected-script -> content-script" ); isApiCall(data); diff --git a/src/api/background/handlers/message/chunk-message/chunk-message.handler.ts b/src/api/background/handlers/message/chunk-message/chunk-message.handler.ts index 5bd19ca60..9897865d2 100644 --- a/src/api/background/handlers/message/chunk-message/chunk-message.handler.ts +++ b/src/api/background/handlers/message/chunk-message/chunk-message.handler.ts @@ -23,7 +23,7 @@ export const handleChunkMessage: OnMessageCallback< isExactly( sender.context, "content-script", - "Chunk calls are only accepted from the injected-script -> content-script" + "Chunk messages are only accepted from the injected-script -> content-script" ); isChunk(data.data); diff --git a/src/api/foreground/foreground-setup-wallet-sdk.ts b/src/api/foreground/foreground-setup-wallet-sdk.ts index 5a3b4cb5a..bcc1ebc22 100644 --- a/src/api/foreground/foreground-setup-wallet-sdk.ts +++ b/src/api/foreground/foreground-setup-wallet-sdk.ts @@ -1,113 +1,175 @@ import type { ApiCall, ApiResponse, Event } from "shim"; import type { InjectedEvents } from "~utils/events"; import { nanoid } from "nanoid"; -import { foregroundModules } from "~api/foreground/foreground-modules"; +import { + foregroundModules, + type ForegroundModule +} from "~api/foreground/foreground-modules"; import mitt from "mitt"; import { log, LOG_GROUP } from "~utils/log/log.utils"; import { version } from "../../../package.json"; +// import { version as sdkVersion } from "../../../wander-embedded-sdk/package.json"; export function setupWalletSDK(targetWindow: Window = window) { log(LOG_GROUP.SETUP, "setupWalletSDK()"); + const isEmbedded = import.meta.env?.VITE_IS_EMBEDDED_APP === "1"; /** Init events */ const events = mitt(); - /** Init wallet API */ - const WalletAPI: Record = { - walletName: "ArConnect", + // TODO: Can we get the right type here?: + const walletAPI = { + walletName: isEmbedded ? "ArConnect Embedded" : "ArConnect", walletVersion: version, events - }; + } as const; - /** Inject each module */ for (const mod of foregroundModules) { - /** Handle foreground module and forward the result to the background */ - WalletAPI[mod.functionName] = (...params: any[]) => - new Promise(async (resolve, reject) => { - // execute foreground module - // TODO: Use a default function for those that do not have/need one and see if chunking can be done automatically or if it is needed at all: - const foregroundResult = await mod.function(...params); - - // construct data to send to the background - const callID = nanoid(); - const data: ApiCall & { ext: "wander" } = { - type: `api_${mod.functionName}`, - ext: "wander", - callID, - data: { - params: foregroundResult || params - } - }; + walletAPI[mod.functionName] = (...params: any[]) => { + return callForegroundThenBackground(mod, params); + }; + } - // TODO: Replace `postMessage` with `isomorphicSendMessage`, which should be updated to handle - // chunking automatically based on data size, rather than relying on `sendChunk` to be called from - // the foreground scripts manually. + /** + * Utility function to handle the actual "call-foreground-then-background" flow. + * This can be reused by the Proxy handler below. + */ + async function callForegroundThenBackground( + foregroundModule: string | ForegroundModule, + params: any[] + ): Promise { + return new Promise(async (resolve, reject) => { + // 1. Find out what function are we calling: + + const functionName = + typeof foregroundModule === "string" + ? foregroundModule + : foregroundModule.functionName; + + // 2. Get & prepare its params: + // For `sign` and `dispatch`, this is where the params are send in chunks. + const functionParams = + typeof foregroundModule === "string" + ? params + : await foregroundModule.function(...params); + + // TODO: Use a default function for those that do not have/need one and + // see if chunking can be done automatically or if it is needed at all: + + // 3. Prepare the message & payload to send: + const callID = nanoid(); + const data: ApiCall = { + app: isEmbedded ? "wanderEmbedded" : "wander", + version, + callID, + type: `api_${functionName}`, + data: { + params: functionParams + } + }; - // Send message to background script (Wander Extension) or to the iframe window (Wander Embedded): - targetWindow.postMessage(data, window.location.origin); + // 4. Send message to background script (ArConnect Extension) or to the iframe window (ArConnect Embedded): - // TODO: Note this is replacing the following from `api.content-script.ts`, so the logic to await and get the response is missing with just the - // one-line change above. - // - // const res = await sendMessage( - // data.type === "chunk" ? "chunk" : "api_call", - // data, - // "background" - // ); - // - // window.postMessage(res, window.location.origin); + const targetOrigin = isEmbedded + ? "http://localhost:5173" + : window.location.origin; - // wait for result from background - window.addEventListener("message", callback); + targetWindow.postMessage(data, targetOrigin); - // TODO: Declare outside (factory) to facilitate testing? - async function callback(e: MessageEvent) { - // TODO: Make sure the response comes from targetWindow. - // See https://stackoverflow.com/questions/16266474/javascript-listen-for-postmessage-events-from-specific-iframe. + // TODO: Note this is replacing the following from `api.content-script.ts`, so the logic to await and get the response is missing with just the + // one-line change above. + // + // const res = await sendMessage( + // data.type === "chunk" ? "chunk" : "api_call", + // data, + // "background" + // ); + // + // window.postMessage(res, window.location.origin); - let { data: res } = e; + // TODO: Replace `postMessage` with `isomorphicSendMessage`, which should be updated to handle + // chunking automatically based on data size, rather than relying on `sendChunk` to be called from + // the foreground scripts manually. - // validate return message - if (`${data.type}_result` !== res.type) return; + // 5. Wait for result from background: + window.addEventListener("message", callback); - // only resolve when the result matching our callID is deleivered - if (data.callID !== res.callID) return; + // TODO: Declare outside (factory) to facilitate testing? + async function callback(e: MessageEvent) { + // TODO: Make sure the response comes from targetWindow. + // See https://stackoverflow.com/questions/16266474/javascript-listen-for-postmessage-events-from-specific-iframe. - window.removeEventListener("message", callback); + let { data: res } = e; - // check for errors - if (res.error) { - return reject(res.data); - } + // validate return message + if (`${data.type}_result` !== res.type) return; - // call the finalizer function if it exists - if (mod.finalizer) { - const finalizerResult = await mod.finalizer( - res.data, - foregroundResult, - params - ); - - // if the finalizer transforms data - // update the result - if (finalizerResult) { - res.data = finalizerResult; - } - } + // only resolve when the result matching our callID is deleivered + if (data.callID !== res.callID) return; + + window.removeEventListener("message", callback); - // check for errors after the finalizer - if (res.error) { - return reject(res.data); + // check for errors + if (res.error) { + return reject(res.data); + } + + const finalizerFn = + typeof foregroundModule === "string" + ? null + : foregroundModule.finalizer; + + // call the finalizer function if it exists + if (finalizerFn) { + const finalizerResult = await finalizerFn( + res.data, + functionParams, + params + ); + + // if the finalizer transforms data + // update the result + if (finalizerResult) { + res.data = finalizerResult; } + } - // resolve promise - return resolve(res.data); + // check for errors after the finalizer + if (res.error) { + return reject(res.data); } - }); + + // resolve promise + return resolve(res.data); + } + }); } + /** + * Create the Proxy object. + */ + const proxyWallet = new Proxy>(walletAPI, { + get(target, propKey: string) { + // If the property is a symbol or some internal property: + if (typeof propKey !== "string") { + return Reflect.get(target, propKey); + } + + // Get value from target if it exists + const value = Reflect.get(target, propKey); + if (value !== undefined) { + return value; + } + + // Forward generically or throw: + return (...args: any[]) => { + return callForegroundThenBackground(propKey, args); + }; + } + }); + // @ts-expect-error - window.arweaveWallet = WalletAPI; + window.arweaveWallet = proxyWallet; // at the end of the injected script, // we dispatch the wallet loaded event diff --git a/src/components/dev/button/button.component.tsx b/src/components/dev/button/button.component.tsx index db6504d87..199bc548f 100644 --- a/src/components/dev/button/button.component.tsx +++ b/src/components/dev/button/button.component.tsx @@ -1,4 +1,4 @@ -import type { ArConnectRoutePath } from "~wallets/router/router.types"; +import type { WanderRoutePath } from "~wallets/router/router.types"; import { Link } from "~wallets/router/components/link/Link"; import { DevSpinner } from "~components/dev/spinner/spinner.component"; @@ -6,7 +6,7 @@ import styles from "./button.module.scss"; export interface DevButtonProps { label: string; - to?: ArConnectRoutePath; + to?: WanderRoutePath; onClick?: (e: React.MouseEvent) => void; variant?: "primary" | "secondary" | "dev"; isLoading?: boolean; diff --git a/src/components/dev/figma-screen/figma-screen.module.scss b/src/components/dev/figma-screen/figma-screen.module.scss index 3afcbf073..2f57983d1 100644 --- a/src/components/dev/figma-screen/figma-screen.module.scss +++ b/src/components/dev/figma-screen/figma-screen.module.scss @@ -1,9 +1,7 @@ .root { position: relative; - margin: 16px auto; - min-height: calc(100dvh - 32px); + margin: 0 auto; border-radius: 4px; - border: 2px solid rgba(255, 255, 255, 0.25); font-family: monospace; } diff --git a/src/components/page/page.component.tsx b/src/components/page/page.component.tsx index 229188b3c..67b2c1921 100644 --- a/src/components/page/page.component.tsx +++ b/src/components/page/page.component.tsx @@ -1,24 +1,85 @@ import { type Variants, motion } from "framer-motion"; -import type { PropsWithChildren } from "react"; +import { useEffect, useRef, useState, type PropsWithChildren } from "react"; import styled from "styled-components"; +import { postEmbeddedMessage } from "~utils/embedded/utils/messages/embedded-messages.utils"; +import { + locationToRouteType, + routeTypeToPreferredLayout +} from "~utils/embedded/utils/routes/embedded-routes.utils"; +import type { WanderRoutePath } from "~wallets/router/router.types"; export interface PageProps extends PropsWithChildren {} export function Page({ children }: PageProps) { + const mainRef = useRef(null); + const opacityAnimation: Variants = { initial: { opacity: 0 }, enter: { opacity: 1 }, exit: { opacity: 0, y: 0, transition: { duration: 0.2 } } }; + const [height, setHeight] = useState(0); + + useEffect(() => { + const mainElement = mainRef.current; + + if (!mainElement || import.meta.env?.VITE_IS_EMBEDDED_APP !== "1") return; + + const resizeObserver = new ResizeObserver((entries) => { + const size = entries?.[0]?.contentBoxSize?.[0] || { + inlineSize: 0, + blockSize: 0 + }; + const width = Math.ceil(size.inlineSize); + const height = Math.ceil(size.blockSize); + + if (width > 0 && height > 0) { + // We get the path manually to avoid causing duplicate re-renders of the `Page` component if using the + // `useLocation` hook: + const path = location.hash.replace("#", "") as WanderRoutePath; + const routeType = locationToRouteType(path); + const preferredLayoutType = routeTypeToPreferredLayout(routeType); + + postEmbeddedMessage({ + type: "embedded_resize", + data: { + routeType, + preferredLayoutType, + width, + height + } + }); + + // For debugging only:; + setHeight(height); + } + }); + + resizeObserver.observe(mainElement); + + return () => { + resizeObserver.disconnect(); + }; + }, []); + return (
+ {process.env.NODE_ENV === "development" && + import.meta.env?.VITE_IS_EMBEDDED_APP === "1" ? ( + + ) : null} + {children}
); @@ -28,6 +89,32 @@ const Main = styled(motion.main)` position: relative; top: 0; width: 100%; - min-height: 100vh; - max-height: max-content; + min-height: ${import.meta.env?.VITE_IS_EMBEDDED_APP === "1" + ? "none" + : "100vh"}; + max-height: ${import.meta.env?.VITE_IS_EMBEDDED_APP === "1" + ? "none" + : "max-content"}; +`; + +const DivLine = styled(motion.div)` + position: absolute; + top: 0; + left: 0; + width: 100%; + border-bottom: 2px dashed red; + z-index: 9999; + pointer-events: none; + + &::before { + content: attr(data-height); + position: absolute; + top: 2px; + left: 16px; + transform: translate(0, -100%); + padding: 4px 8px; + background: red; + font: bold 11px monospace; + border-radius: 4px 4px 0 0; + } `; diff --git a/src/iframe/README.md b/src/iframe/README.md index 2c3ec0198..687387550 100644 --- a/src/iframe/README.md +++ b/src/iframe/README.md @@ -1,9 +1,7 @@ -# ArConnect Embedded +# Wander Embedded ## Testing -### Embedded - Scenarios to test: **New account & wallet:** diff --git a/src/iframe/browser/index.ts b/src/iframe/browser/index.ts index 3a5d48076..5c5c773c4 100644 --- a/src/iframe/browser/index.ts +++ b/src/iframe/browser/index.ts @@ -3,11 +3,13 @@ import { i18n } from "~iframe/browser/i18n/i18n.mock"; import { runtime } from "~iframe/browser/runtime/runtime.mock"; import { storage } from "~iframe/browser/storage/storage.mock"; import { tabs } from "~iframe/browser/tabs/tabs.mock"; +import { windows } from "~iframe/browser/windows/windows.mock"; export default { alarms, i18n, runtime, storage, - tabs + tabs, + windows }; diff --git a/src/iframe/browser/tabs/tabs.mock.ts b/src/iframe/browser/tabs/tabs.mock.ts index 595405155..520aeb723 100644 --- a/src/iframe/browser/tabs/tabs.mock.ts +++ b/src/iframe/browser/tabs/tabs.mock.ts @@ -1,3 +1,5 @@ +import { EMBEDDED_PARENT_ORIGIN } from "~utils/embedded/sdk/utils/url/sdk-url.utils"; + export const tabs = { create: async ({ url }) => { if (process.env.NODE_ENV === "development") @@ -31,13 +33,17 @@ export const tabs = { } }, - query: async () => { - const parentURL = - window.location.href === window.parent.location.href - ? document.location.href - : document.referrer; + get: async () => { + return null; + }, - return [{ url: parentURL }]; // satisfies browser.Tabs.Tab + query: async () => { + return [ + { + id: 0, + url: EMBEDDED_PARENT_ORIGIN + } + ]; // satisfies browser.Tabs.Tab }, onConnect: { diff --git a/src/iframe/browser/windows/windows.mock.ts b/src/iframe/browser/windows/windows.mock.ts new file mode 100644 index 000000000..24de21b08 --- /dev/null +++ b/src/iframe/browser/windows/windows.mock.ts @@ -0,0 +1,37 @@ +export const windows = { + create: async ({ url }) => { + debugger; + + if (process.env.NODE_ENV === "development") + console.log(`tabs.create({ ${url} })`); + + // URL = + // browser.runtime.getURL("tabs/welcome.html") + // browser.runtime.getURL("tabs/dashboard.html#/contacts") + // browser.runtime.getURL("assets/animation/arweave.png"); + // browser.runtime.getURL("tabs/auth.html")}?${objectToUrlParams(...)} + // `tabs/dashboard.html#/apps/${activeApp.url}` + + if (url.includes("tabs/welcome.html")) { + throw new Error("Welcome routes not added to ArConnect Embedded"); + + // location.hash = "/welcome"; + } else if (url.includes("tabs/dashboard.html#")) { + throw new Error("Dashboard not added to ArConnect Embedded"); + + // const hash = url.split("#").pop(); + // location.hash = `/quick-settings${hash}`; + } else if (url.includes("tabs/auth.html")) { + console.warn("Trying to open `tabs/auth.html`"); + + // const paramsAndHash = url.split("tabs/auth.html")[1]; + // location.hash = `/auth-requests${paramsAndHash}`; + + location.hash = `/auth-requests`; + } else if (url.includes("assets")) { + throw new Error(`Cannot create tab for URL = ${url}`); + } else { + throw new Error(`Cannot create tab for URL = ${url}`); + } + } +}; diff --git a/src/utils/auth/auth.provider.tsx b/src/utils/auth/auth.provider.tsx index 1905ac94c..aa07ceef4 100644 --- a/src/utils/auth/auth.provider.tsx +++ b/src/utils/auth/auth.provider.tsx @@ -38,6 +38,7 @@ import type { RouteOverride, RouteRedirect } from "~wallets/router/router.types"; +import { postEmbeddedMessage } from "~utils/embedded/utils/messages/embedded-messages.utils"; interface AuthRequestsContextState { authRequests: AuthRequest[]; @@ -88,13 +89,19 @@ export function AuthRequestsProvider({ ); const closeAuthPopup = useCallback((delay: number = 0) => { - // TODO: In the embedded wallet, maybe we need to store (but not show) unlock requests so that this doesn't - // clear automatically. - function closeOrClear() { if (import.meta.env?.VITE_IS_EMBEDDED_APP === "1") { // TODO: This might cause an infinite loop in the embedded wallet: - setAuthRequestContextState(AUTH_REQUESTS_CONTEXT_INITIAL_STATE); + // setAuthRequestContextState(AUTH_REQUESTS_CONTEXT_INITIAL_STATE); + + // TODO: We could improve this to detect if we opened the wallet to show an AuthRequest, or if it was already + // open. In the former case, when all AuthRequests are handled, we close it. In the latter, we just clear the + // AuthRequests from the state but leave it open. + + postEmbeddedMessage({ + type: "embedded_close", + data: null + }); } else { window.top.close(); } @@ -445,7 +452,11 @@ export function AuthRequestsProvider({ authRequests.length > 0 && authRequests.every((authRequest) => authRequest.status !== "pending"); - if (statusOverride === null && authRequests.length === 0) { + if ( + import.meta.env?.VITE_IS_EMBEDDED_APP !== "1" && + statusOverride === null && + authRequests.length === 0 + ) { // TODO: Maybe move to the app entry point? // Close the popup if an AuthRequest doesn't arrive in less than `AUTH_POPUP_REQUEST_WAIT_MS` (1s), unless the // wallet is locked (no timeout in that case): diff --git a/src/utils/auth/auth.utils.ts b/src/utils/auth/auth.utils.ts index 5f3cc3791..039c36639 100644 --- a/src/utils/auth/auth.utils.ts +++ b/src/utils/auth/auth.utils.ts @@ -127,90 +127,101 @@ export async function createAuthPopup( ) { const unlock = await popupMutex.lock(); - const [activeAddress, wallets] = await Promise.all([ - getActiveAddress(), - getWallets() - ]); + try { + const [activeAddress, wallets] = await Promise.all([ + getActiveAddress(), + getWallets() + ]); - const hasWallets = activeAddress && wallets.length > 0; + const hasWallets = activeAddress && wallets.length > 0; - if (!hasWallets) { - openOrSelectWelcomePage(true); + if (!hasWallets) { + openOrSelectWelcomePage(true); - unlock(); + unlock(); - throw new Error(ERR_MSG_NO_WALLETS_ADDED); - } + throw new Error(ERR_MSG_NO_WALLETS_ADDED); + } - const popupWindowTab: browser.Tabs.Tab | null = await browser.tabs - .get(POPUP_TAB_ID) - .catch(() => null); + const popupWindowTab: browser.Tabs.Tab | null = await browser.tabs + .get(POPUP_TAB_ID) + .catch(() => null); - if ( - popupWindowTab && - !popupWindowTab.url.startsWith(browser.runtime.getURL("tabs/auth.html")) - ) { - console.warn( - `Auth popup URL (${popupWindowTab.url}) doesn't match "tabs/auth.html"` - ); - } - - try { - if (!popupWindowTab) { - // TODO: To center this, the injected tab should send the center or dimensions of the screen: - - const window = await browser.windows.create({ - url: `${browser.runtime.getURL("tabs/auth.html")}#/`, - focused: true, - type: "popup", - width: 385, - height: 720 - }); + if ( + popupWindowTab && + !popupWindowTab.url.startsWith(browser.runtime.getURL("tabs/auth.html")) + ) { + console.warn( + `Auth popup URL (${popupWindowTab.url}) doesn't match "tabs/auth.html"` + ); + } - setPopupTabID(window.tabs[0].id); - } else { - log(LOG_GROUP.AUTH, "reusePopupTabID =", POPUP_TAB_ID); + // TODO: In Embedded we are already in the right window, so no need to create one, just skip + // this and make the authRequestData make it to the AuthRequestsProvider. - await browser.windows.update(popupWindowTab.windowId, { focused: true }); - } - } catch (err) { - console.warn( - `Could not ${popupWindowTab ? "focus" : "open"} "tabs/auth.html":`, - err - ); - } + try { + if (!popupWindowTab) { + // TODO: To center this, the injected tab should send the center or dimensions of the screen: - let authID: string | undefined; + const window = await browser.windows.create({ + url: `${browser.runtime.getURL("tabs/auth.html")}#/`, + focused: true, + type: "popup", - if (authRequestData) { - // Generate an unique id for the authentication to be checked later: - authID = nanoid(); + // TODO: Use these dimensions for embedded too... (pass them rather than using a hardcoded value so that we can control updates) + width: 385, + height: 720 + }); - log( - LOG_GROUP.AUTH, - `isomorphicSendMessage(authID = "${authID}", tabId = ${POPUP_TAB_ID})` - ); + setPopupTabID(window.tabs[0].id); + } else { + log(LOG_GROUP.AUTH, "reusePopupTabID =", POPUP_TAB_ID); - await isomorphicSendMessage({ - messageId: "auth_request", - tabId: POPUP_TAB_ID, - data: { - ...authRequestData, - url: moduleAppData.url, - tabID: moduleAppData.tabID, - authID, - requestedAt: Date.now(), - status: "pending" + await browser.windows.update(popupWindowTab.windowId, { + focused: true + }); } - }); - } + } catch (err) { + console.warn( + `Could not ${popupWindowTab ? "focus" : "open"} "tabs/auth.html":`, + err + ); + } - unlock(); + let authID: string | undefined; - return { - authID, - popupWindowTabID: POPUP_TAB_ID - }; + if (authRequestData) { + // Generate an unique id for the authentication to be checked later: + authID = nanoid(); + + log( + LOG_GROUP.AUTH, + `isomorphicSendMessage(authID = "${authID}", tabId = ${POPUP_TAB_ID})` + ); + + await isomorphicSendMessage({ + messageId: "auth_request", + tabId: POPUP_TAB_ID, + data: { + ...authRequestData, + url: moduleAppData.url, + tabID: moduleAppData.tabID, + authID, + requestedAt: Date.now(), + status: "pending" + } + }); + } + + return { + authID, + popupWindowTabID: POPUP_TAB_ID + }; + } catch (err) { + console.warn("Unexpected error in `createAuthPopup` =", err); + } finally { + unlock(); + } } type AuthResultCallback = (data: T) => void; diff --git a/src/utils/embedded/embedded.provider.tsx b/src/utils/embedded/embedded.provider.tsx index b4d544bff..5474ee571 100644 --- a/src/utils/embedded/embedded.provider.tsx +++ b/src/utils/embedded/embedded.provider.tsx @@ -28,10 +28,8 @@ import type { TempWalletPromise, RecoveryJSON } from "~utils/embedded/embedded.types"; -import { isTempWalletPromiseExpired } from "~utils/embedded/embedded.utils"; import { log, LOG_GROUP } from "~utils/log/log.utils"; - -export type AuthStatusCopy = AuthStatus; +import { isTempWalletPromiseExpired } from "~utils/embedded/utils/wallets/embedded-wallets.utils"; const EMBEDDED_CONTEXT_INITIAL_STATE: EmbeddedContextState = { authStatus: "unknown", diff --git a/src/utils/embedded/sdk/domains/authentication/sdk-authentication.utils.ts b/src/utils/embedded/sdk/domains/authentication/sdk-authentication.utils.ts new file mode 100644 index 000000000..93146ed31 --- /dev/null +++ b/src/utils/embedded/sdk/domains/authentication/sdk-authentication.utils.ts @@ -0,0 +1,101 @@ +// TODO: Please, add TS Docs. Not all interfaces here are needed. + +import { setAuthorization } from "~utils/embedded/sdk/utils/axios-client/sdk-axios-client.utils"; +import { postEmbeddedMessage } from "~utils/embedded/utils/messages/embedded-messages.utils"; + +export interface AuthenticateParams {} + +export interface AuthenticateReturn {} + +export function authenticate() { + // TODO: Authenticate... + + const authToken = ""; + const userDetails = {}; + + setAuthorization(authToken); + + postEmbeddedMessage({ + type: "embedded_auth", + data: { + userDetails + } + }); +} + +export interface RefreshSessionParams {} + +export interface RefreshSessionReturn {} + +export function refreshSession() { + // TODO: Refresh session... + + const authToken = ""; + const userDetails = {}; + + setAuthorization(authToken); + + postEmbeddedMessage({ + type: "embedded_auth", + data: { + userDetails + } + }); +} + +export interface SignOutParams {} + +export interface SignOutReturn {} + +export function signOut() { + // TODO: Sign out... + + setAuthorization(null); + + postEmbeddedMessage({ + type: "embedded_auth", + data: { + userDetails: null + } + }); +} + +export interface FakeAuthenticateParams {} + +export interface FakeAuthenticateReturn {} + +export function fakeAuthenticate() { + // TODO: Fake authenticate... + + const authToken = ""; + const userDetails = {}; + + setAuthorization(authToken); + + postEmbeddedMessage({ + type: "embedded_auth", + data: { + userDetails + } + }); +} + +export interface FakeRefreshSessionParams {} + +export interface FakeRefreshSessionReturn {} + +export function fakeRefreshSession() { + // TODO: Fake refresh session... + + const authToken = ""; + const userDetails = {}; + + setAuthorization(authToken); + + postEmbeddedMessage({ + type: "embedded_auth", + data: { + userDetails + } + }); +} diff --git a/src/utils/embedded/sdk/domains/backup/sdk-backup.utils.ts b/src/utils/embedded/sdk/domains/backup/sdk-backup.utils.ts new file mode 100644 index 000000000..172549475 --- /dev/null +++ b/src/utils/embedded/sdk/domains/backup/sdk-backup.utils.ts @@ -0,0 +1,13 @@ +// TODO: Please, add TS Docs. Not all interfaces here are needed. + +export interface RegisterRecoveryShareParams {} + +export interface RegisterRecoveryShareReturn {} + +export function registerRecoveryShare() {} + +export interface RegisterWalletExportParams {} + +export interface RegisterWalletExportReturn {} + +export function registerWalletExport() {} diff --git a/src/utils/embedded/sdk/domains/share-recovery/sdk-share-recovery.utils.ts b/src/utils/embedded/sdk/domains/share-recovery/sdk-share-recovery.utils.ts new file mode 100644 index 000000000..40ab595b2 --- /dev/null +++ b/src/utils/embedded/sdk/domains/share-recovery/sdk-share-recovery.utils.ts @@ -0,0 +1,25 @@ +// TODO: Please, add TS Docs. Not all interfaces here are needed. + +export interface GenerateWalletRecoveryChallengeParams {} + +export interface GenerateWalletRecoveryChallengeReturn {} + +export function generateWalletRecoveryChallenge() {} + +export interface FetchRecoverableAccountsParams {} + +export interface FetchRecoverableAccountsReturn {} + +export function fetchRecoverableAccounts() {} + +export interface GenerateAccountRecoveryChallengeParams {} + +export interface GenerateAccountRecoveryChallengeReturn {} + +export function generateAccountRecoveryChallenge() {} + +export interface RecoverAccountParams {} + +export interface RecoverAccountReturn {} + +export function recoverAccount() {} diff --git a/src/utils/embedded/sdk/domains/shares/sdk-shares.utils.ts b/src/utils/embedded/sdk/domains/shares/sdk-shares.utils.ts new file mode 100644 index 000000000..3e58ad41c --- /dev/null +++ b/src/utils/embedded/sdk/domains/shares/sdk-shares.utils.ts @@ -0,0 +1,19 @@ +// TODO: Please, add TS Docs. Not all interfaces here are needed. + +export interface GenerateAuthShareChallengeParams {} + +export interface GenerateAuthShareChallengeReturn {} + +export function generateAuthShareChallenge() {} + +export interface ActivateWalletParams {} + +export interface ActivateWalletReturn {} + +export function activateWallet() {} + +export interface RotateAuthShareParams {} + +export interface RotateAuthShareReturn {} + +export function rotateAuthShare() {} diff --git a/src/utils/embedded/sdk/domains/wallet-recovery/sdk-wallet-recovery.utils.ts b/src/utils/embedded/sdk/domains/wallet-recovery/sdk-wallet-recovery.utils.ts new file mode 100644 index 000000000..d84b97440 --- /dev/null +++ b/src/utils/embedded/sdk/domains/wallet-recovery/sdk-wallet-recovery.utils.ts @@ -0,0 +1,13 @@ +// TODO: Please, add TS Docs. Not all interfaces here are needed. + +export interface GenerateShareRecoveryChallengeParams {} + +export interface GenerateShareRecoveryChallengeReturn {} + +export function generateShareRecoveryChallenge() {} + +export interface RecoverWalletParams {} + +export interface RecoverWalletReturn {} + +export function recoverWallet() {} diff --git a/src/utils/embedded/sdk/domains/wallets/sdk-wallets.utils.ts b/src/utils/embedded/sdk/domains/wallets/sdk-wallets.utils.ts new file mode 100644 index 000000000..3f159ac69 --- /dev/null +++ b/src/utils/embedded/sdk/domains/wallets/sdk-wallets.utils.ts @@ -0,0 +1,25 @@ +// TODO: Please, add TS Docs. Not all interfaces here are needed. + +export interface FetchWalletsParams {} + +export interface FetchWalletsReturn {} + +export function fetchWallets() {} + +export interface CreateWalletParams {} + +export interface CreateWalletReturn {} + +export function createWallet() {} + +export interface UpdateWalletParams {} + +export interface UpdateWalletReturn {} + +export function updateWallet() {} + +export interface DeleteWalletParams {} + +export interface DeleteWalletReturn {} + +export function deleteWallet() {} diff --git a/src/utils/embedded/sdk/embedded-sdk.ts b/src/utils/embedded/sdk/embedded-sdk.ts new file mode 100644 index 000000000..f8777bd00 --- /dev/null +++ b/src/utils/embedded/sdk/embedded-sdk.ts @@ -0,0 +1,72 @@ +import { + authenticate, + refreshSession, + fakeAuthenticate, + fakeRefreshSession, + signOut +} from "~utils/embedded/sdk/domains/authentication/sdk-authentication.utils"; +import { + registerRecoveryShare, + registerWalletExport +} from "~utils/embedded/sdk/domains/backup/sdk-backup.utils"; +import { + generateWalletRecoveryChallenge, + fetchRecoverableAccounts, + generateAccountRecoveryChallenge, + recoverAccount +} from "~utils/embedded/sdk/domains/share-recovery/sdk-share-recovery.utils"; +import { + generateAuthShareChallenge, + activateWallet, + rotateAuthShare +} from "~utils/embedded/sdk/domains/shares/sdk-shares.utils"; +import { + generateShareRecoveryChallenge, + recoverWallet +} from "~utils/embedded/sdk/domains/wallet-recovery/sdk-wallet-recovery.utils"; +import { + fetchWallets, + createWallet, + updateWallet, + deleteWallet +} from "~utils/embedded/sdk/domains/wallets/sdk-wallets.utils"; + +export const EmbeddedSDK = { + Auth: { + authenticate, + refreshSession, + signOut, + fakeAuthenticate, + fakeRefreshSession + }, + + Wallets: { + fetchWallets, + createWallet, + updateWallet, + deleteWallet + }, + + Shares: { + generateAuthShareChallenge, + activateWallet, + rotateAuthShare + }, + + BackUp: { + registerRecoveryShare, + registerWalletExport + }, + + WalletRecovery: { + generateShareRecoveryChallenge, + recoverWallet + }, + + ShareRecovery: { + generateWalletRecoveryChallenge, + fetchRecoverableAccounts, + generateAccountRecoveryChallenge, + recoverAccount + } +}; diff --git a/src/utils/embedded/sdk/utils/axios-client/sdk-axios-client.utils.ts b/src/utils/embedded/sdk/utils/axios-client/sdk-axios-client.utils.ts new file mode 100644 index 000000000..a11e24c01 --- /dev/null +++ b/src/utils/embedded/sdk/utils/axios-client/sdk-axios-client.utils.ts @@ -0,0 +1,14 @@ +import axios from "axios"; +import { EMBEDDED_API_KEY } from "~utils/embedded/sdk/utils/url/sdk-url.utils"; + +const instance = axios.create({ + baseURL: "https://arconnect-embedded.com/api/" +}); + +instance.defaults.headers["x-api-key"] = EMBEDDED_API_KEY; + +export function setAuthorization(jwtString: string | null) { + if (jwtString) + instance.defaults.headers.Authorization = `Bearer ${jwtString}`; + else delete instance.defaults.headers.Authorization; +} diff --git a/src/utils/embedded/sdk/utils/url/sdk-url.utils.ts b/src/utils/embedded/sdk/utils/url/sdk-url.utils.ts new file mode 100644 index 000000000..d7857124c --- /dev/null +++ b/src/utils/embedded/sdk/utils/url/sdk-url.utils.ts @@ -0,0 +1,25 @@ +export const PARAM_API_KEY = "api-key"; +export const PARAM_ORIGIN = "origin"; + +const searchParams = new URLSearchParams(document.location.search); + +export const EMBEDDED_API_KEY = searchParams.get(PARAM_API_KEY); +export const EMBEDDED_PARENT_ORIGIN = searchParams.get(PARAM_ORIGIN); + +// TODO: We still need to validate EMBEDDED_API_KEY & EMBEDDED_PARENT_ORIGIN are allowed (e.g. the developer registered +// the app and whitelisted the domain(s) correctly). We should probably use a mechanism like Google Search Console where +// they need to create a file at the root of their domain, or add an HTML tag. + +export function getEmbeddedURL(apiKey: string) { + const base = + process.env.NODE_ENV === "development" + ? "http://localhost:5173/" + : "https://embedded-iframe.arconnect.io/"; + + const searchParams = new URLSearchParams(); + + searchParams.set(EMBEDDED_API_KEY, apiKey); + searchParams.set(EMBEDDED_PARENT_ORIGIN, window.location.origin); + + return `${base}?${searchParams.toString()}`; +} diff --git a/src/utils/embedded/utils/messages/embedded-messages.types.ts b/src/utils/embedded/utils/messages/embedded-messages.types.ts new file mode 100644 index 000000000..03d1aeb0a --- /dev/null +++ b/src/utils/embedded/utils/messages/embedded-messages.types.ts @@ -0,0 +1,39 @@ +import type { + EmbeddedLayout, + RouteType +} from "~utils/embedded/utils/routes/embedded-routes.utils"; + +export type EmbeddedMessageId = + | "embedded_auth" + | "embedded_balance" + | "embedded_resize" + | "embedded_close"; + +export interface EmbeddedAuthMessageData { + userDetails: any; // TODO: TBD +} + +export interface EmbeddedBalanceMessageData { + amount: number; + currency: "USD" | "EUR"; // TODO: Replace with a type that includes all options in the settings? +} + +export interface EmbeddedResizeMessageData { + routeType: RouteType; + preferredLayoutType: EmbeddedLayout; + width?: number; + height: number; +} + +export interface EmbeddedMessageMap { + embedded_auth: EmbeddedAuthMessageData; + embedded_balance: EmbeddedBalanceMessageData; + embedded_resize: EmbeddedResizeMessageData; + embedded_close: void; +} + +export interface EmbeddedCall { + id: string; + type: K; + data: EmbeddedMessageMap[K]; +} diff --git a/src/utils/embedded/utils/messages/embedded-messages.utils.ts b/src/utils/embedded/utils/messages/embedded-messages.utils.ts new file mode 100644 index 000000000..98fd5439b --- /dev/null +++ b/src/utils/embedded/utils/messages/embedded-messages.utils.ts @@ -0,0 +1,54 @@ +import { nanoid } from "nanoid"; +import { EMBEDDED_PARENT_ORIGIN } from "~utils/embedded/sdk/utils/url/sdk-url.utils"; +import type { + EmbeddedCall, + EmbeddedMessageId, + EmbeddedMessageMap +} from "~utils/embedded/utils/messages/embedded-messages.types"; + +const EMBEDDED_MESSAGE_IDS = [ + "embedded_auth", + "embedded_balance", + "embedded_resize", + "embedded_close" +] as const satisfies EmbeddedMessageId[]; + +export interface PostEmbeddedMessageData { + type: K; + data: EmbeddedMessageMap[K]; +} + +export function postEmbeddedMessage({ + type, + data +}: PostEmbeddedMessageData) { + if (!EMBEDDED_MESSAGE_IDS.includes(type)) + throw new Error( + `Only the following message types are allowed: ${EMBEDDED_MESSAGE_IDS.join( + ", " + )}.` + ); + + const parent = window.parent; + + if (parent === null) { + throw new Error("Unexpected `null` parent Window."); + } + + const call: EmbeddedCall = { + id: nanoid(), + type, + data + }; + + if (parent === window) { + console.warn( + "ArConnect Embedded running as a standalone page. There's no parent Window to send this to =", + call + ); + + return; + } + + parent.postMessage(call, EMBEDDED_PARENT_ORIGIN); +} diff --git a/src/utils/embedded/utils/routes/embedded-routes.utils.ts b/src/utils/embedded/utils/routes/embedded-routes.utils.ts new file mode 100644 index 000000000..e971e31ff --- /dev/null +++ b/src/utils/embedded/utils/routes/embedded-routes.utils.ts @@ -0,0 +1,38 @@ +import type { WanderRoutePath } from "~wallets/router/router.types"; + +export type RouteType = + | "auth" + | "account" + | "settings" + | "auth-request" + | "default"; + +const routeTypeByLocationPrefix: Record = { + auth: "auth", + account: "account", + "quick-settings": "settings", + "auth-request": "auth-request" +}; + +export function locationToRouteType(path: WanderRoutePath): RouteType { + const pathPrefix = path.split("/")[1] || ""; + + return routeTypeByLocationPrefix[pathPrefix] || "default"; +} + +// TODO: This should match SDK's options: +export type EmbeddedLayout = "modal" | "popup" | "sidebar" | "half"; + +const preferredLayoutByRouteType: Record = { + auth: "modal", + account: "modal", + settings: "modal", + "auth-request": "popup", + default: "popup" +}; + +export function routeTypeToPreferredLayout( + routeType: RouteType +): EmbeddedLayout { + return preferredLayoutByRouteType[routeType] || "popup"; +} diff --git a/src/utils/embedded/embedded.utils.ts b/src/utils/embedded/utils/wallets/embedded-wallets.utils.ts similarity index 100% rename from src/utils/embedded/embedded.utils.ts rename to src/utils/embedded/utils/wallets/embedded-wallets.utils.ts diff --git a/src/wallets/router/auth/auth-router.hook.ts b/src/wallets/router/auth/auth-router.hook.ts index 8a274a319..8288a1bfa 100644 --- a/src/wallets/router/auth/auth-router.hook.ts +++ b/src/wallets/router/auth/auth-router.hook.ts @@ -16,7 +16,7 @@ export const useAuthRequestsLocation: BaseLocationHook = () => { // The authID has been added to the URL so that the auto-scroll and view transition effect work when switching // between different `AuthRequest`s of the same type: const location = - `/${currentAuthRequest.type}/${currentAuthRequest.authID}` satisfies AuthRoutePath; + `/auth-request/${currentAuthRequest.type}/${currentAuthRequest.authID}` satisfies AuthRoutePath; // TODO: Implement a navigate function that selects a different AuthRequest and also use whenever possible: return [location, (authID: string) => {}]; diff --git a/src/wallets/router/auth/auth.routes.ts b/src/wallets/router/auth/auth.routes.ts index 9bd1f534b..70864f96b 100644 --- a/src/wallets/router/auth/auth.routes.ts +++ b/src/wallets/router/auth/auth.routes.ts @@ -13,29 +13,29 @@ import { getExtensionOverrides } from "~wallets/router/extension/extension.route import type { RouteConfig } from "~wallets/router/router.types"; export type AuthRoutePath = - | "/" - | `/connect/${string}` - | `/allowance/${string}` - | `/token/${string}` - | `/decrypt/${string}` - | `/sign/${string}` - | `/signKeystone/${string}` - | `/signature/${string}` - | `/signDataItem/${string}` - | `/batchSignDataItem/${string}` - | `/subscription/${string}`; + | "/auth-request" + | `/auth-request/connect/${string}` + | `/auth-request/allowance/${string}` + | `/auth-request/token/${string}` + | `/auth-request/decrypt/${string}` + | `/auth-request/sign/${string}` + | `/auth-request/signKeystone/${string}` + | `/auth-request/signature/${string}` + | `/auth-request/signDataItem/${string}` + | `/auth-request/batchSignDataItem/${string}` + | `/auth-request/subscription/${string}`; export const AuthPaths = { - Connect: "/connect/:authID", - Allowance: "/allowance/:authID", - Token: "/token/:authID", - Decrypt: "/decrypt/:authID", - Sign: "/sign/:authID", - SignKeystone: "/signKeystone/:authID", - Signature: "/signature/:authID", - SignDataItem: "/signDataItem/:authID", - BatchSignDataItem: "/batchSignDataItem/:authID", - Subscription: "/subscription/:authID" + Connect: "/auth-request/connect/:authID", + Allowance: "/auth-request/allowance/:authID", + Token: "/auth-request/token/:authID", + Decrypt: "/auth-request/decrypt/:authID", + Sign: "/auth-request/sign/:authID", + SignKeystone: "/auth-request/signKeystone/:authID", + Signature: "/auth-request/signature/:authID", + SignDataItem: "/auth-request/signDataItem/:authID", + BatchSignDataItem: "/auth-request/batchSignDataItem/:authID", + Subscription: "/auth-request/subscription/:authID" } as const satisfies Record; export const AUTH_ROUTES = [ diff --git a/src/wallets/router/extension/extension-router.hook.ts b/src/wallets/router/extension/extension-router.hook.ts index 835c26b97..a0984a16b 100644 --- a/src/wallets/router/extension/extension-router.hook.ts +++ b/src/wallets/router/extension/extension-router.hook.ts @@ -4,7 +4,7 @@ import { useWallets } from "~utils/wallets/wallets.hooks"; import type { WalletStatus } from "~utils/wallets/wallets.provider"; import type { ExtensionRouteOverride } from "~wallets/router/extension/extension.routes"; import type { - ArConnectRoutePath, + WanderRoutePath, BaseLocationHook } from "~wallets/router/router.types"; @@ -30,5 +30,5 @@ export const useExtensionLocation: BaseLocationHook = () => { if (override) return [override, NOOP]; - return [wocation as ArConnectRoutePath, wavigate]; + return [wocation as WanderRoutePath, wavigate]; }; diff --git a/src/wallets/router/iframe/iframe-router.hook.ts b/src/wallets/router/iframe/iframe-router.hook.ts index 6f91fa27a..231543efa 100644 --- a/src/wallets/router/iframe/iframe-router.hook.ts +++ b/src/wallets/router/iframe/iframe-router.hook.ts @@ -1,6 +1,6 @@ import { useHashLocation } from "wouter/use-hash-location"; import { useEmbedded } from "~utils/embedded/embedded.hooks"; -import type { AuthStatusCopy as AuthStatus } from "~utils/embedded/embedded.provider"; +import type { AuthStatus } from "~utils/embedded/embedded.types"; import { NOOP } from "~utils/misc"; import { useAuthRequestsLocation } from "~wallets/router/auth/auth-router.hook"; import type { ExtensionRouteOverride } from "~wallets/router/extension/extension.routes"; diff --git a/tsconfig.json b/tsconfig.json index 650425b88..2314f10e6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "plasmo/templates/tsconfig.base", - "exclude": ["node_modules"], + "exclude": ["node_modules", "wander-embedded-sdk"], "include": [ ".plasmo/index.d.ts", ".plasmo/**/*", diff --git a/vite.wallet-config.js b/vite.wallet-config.js new file mode 100644 index 000000000..9f0ef46a7 --- /dev/null +++ b/vite.wallet-config.js @@ -0,0 +1,65 @@ +import { defineConfig } from "vite"; +import path from "path"; +import nodePolyfills from "vite-plugin-node-stdlib-browser"; +import dts from "vite-plugin-dts"; +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + dts({ + insertTypesEntry: true, + tsconfigPath: "./tsconfig.json" + }), + nodePolyfills() + ], + build: { + lib: { + entry: path.resolve( + __dirname, + "src/api/foreground/foreground-setup-wallet-sdk.ts" + ), + name: "WalletSDK", + formats: ["es", "umd"], + fileName: (format) => `wallet-sdk.${format}.js` + }, + outDir: "wander-embedded-sdk/wallet-api-dist", + sourcemap: true, + rollupOptions: { + external: [ + "webextension-polyfill", + "~subscriptions/subscription", + "~iframe/plasmo-storage/plasmo-storage.mock" + ], + output: { + globals: { + "webextension-polyfill": "browser", + "~subscriptions/subscription": "ArConnectSubscription", + "~iframe/plasmo-storage/plasmo-storage.mock": "PlasmoStorageMock" + } + }, + treeshake: { + moduleSideEffects: false, + propertyReadSideEffects: false + } + } + }, + define: { + "process.env": { + ...(process?.env || {}) + } + }, + resolve: { + alias: { + "~": path.resolve(__dirname, "./src"), + "~api": path.resolve(__dirname, "./src/api"), + "~lib": path.resolve(__dirname, "./src/lib"), + "~utils": path.resolve(__dirname, "./src/utils"), + "~gateways": path.resolve(__dirname, "./src/gateways"), + "~wallets": path.resolve(__dirname, "./src/wallets"), + "~applications": path.resolve(__dirname, "./src/applications"), + "~subscriptions": path.resolve(__dirname, "./src/subscriptions"), + "~iframe": path.resolve(__dirname, "./src/iframe"), + // Polyfill `webextension-polyfill` for embedded, as that's not a BE but a regular SPA: + "webextension-polyfill": path.resolve(__dirname, "./src/iframe/browser") + } + } +}); diff --git a/wander-embedded-sdk/package.json b/wander-embedded-sdk/package.json new file mode 100644 index 000000000..62d83270f --- /dev/null +++ b/wander-embedded-sdk/package.json @@ -0,0 +1,36 @@ +{ + "name": "wander-embedded-sdk", + "version": "0.0.5", + "description": "Wander Embedded SDK.", + "author": "kranthicodes", + "license": "MIT", + "files": [ + "sdk-dist/", + "package.json" + ], + "exports": { + ".": { + "types": "./sdk-dist/index.d.ts", + "import": "./sdk-dist/index.js", + "require": "./sdk-dist/index.cjs" + } + }, + "type": "module", + "main": "sdk-dist/index.cjs", + "module": "sdk-dist/index.js", + "unpkg": "sdk-dist/index.global.js", + "jsdelivr": "sdk-dist/index.global.js", + "types": "sdk-dist/index.d.ts", + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "rm -rf sdk-dist" + }, + "devDependencies": { + "tsup": "^8.3.5", + "typescript": "^5.2.2" + }, + "dependencies": { + "ts-deepmerge": "^7.0.2" + } +} diff --git a/wander-embedded-sdk/src/assets/arconnect.svg b/wander-embedded-sdk/src/assets/arconnect.svg new file mode 100644 index 000000000..9baae698e --- /dev/null +++ b/wander-embedded-sdk/src/assets/arconnect.svg @@ -0,0 +1,4 @@ + + + + diff --git a/wander-embedded-sdk/src/components/button/wander-button.component.ts b/wander-embedded-sdk/src/components/button/wander-button.component.ts new file mode 100644 index 000000000..dbacfa032 --- /dev/null +++ b/wander-embedded-sdk/src/components/button/wander-button.component.ts @@ -0,0 +1,167 @@ +import { CSSProperties } from "react"; +import { + BalanceInfo, + WanderEmbeddedButtonOptions, + WanderEmbeddedButtonStatus +} from "../../wander-embedded.types"; +import { createWanderSVG } from "../logo/wander-logo.component"; +// import { asCSSVars } from "../../utils/styles/styles.utils"; + +export class WanderButton { + static DEFAULT_BUTTON_ID = "wanderEmbeddedButton" as const; + + // Elements: + private button: HTMLButtonElement; + private logo: HTMLImageElement | SVGElement; + private label: HTMLSpanElement; + private balance: HTMLSpanElement; + private notifications: HTMLSpanElement; + + // Options: + private options: WanderEmbeddedButtonOptions; + + // State: + private status: Partial> = {}; + + constructor(options: WanderEmbeddedButtonOptions = {}) { + this.options = options; + + const elements = WanderButton.initializeButton(options); + + this.button = elements.button; + this.logo = elements.logo; + this.label = elements.label; + this.balance = elements.balance; + this.notifications = elements.notifications; + } + + // TODO: Button needs 3 states/labels: + // noAuth => Sign in + // noConnect => Open (show "connected" / "not connected" icon)? The dApp has to connect by itself. + // connected => Open + // pending auth requests => Review requests + // (and hover for each of them?) + + static initializeButton(options: WanderEmbeddedButtonOptions) { + // TODO: Always add all elements (logo and balance) but show/hide them + + const button = document.createElement("button"); + + button.id = WanderButton.DEFAULT_BUTTON_ID; + + const logo = + typeof options.logo === "string" + ? document.createElement("img") + : createWanderSVG({ + width: "30px", + height: "30px" + }); + + if (typeof options.logo === "string" && logo instanceof Image) { + logo.src = options.logo; + logo.width = 30; + logo.height = 30; + } + + const label = document.createElement("span"); + + label.textContent = "Sign in"; + + const balance = document.createElement("span"); + + balance.textContent = new Intl.NumberFormat().format(0); + + const notifications = document.createElement("span"); + + notifications.textContent = "2"; + + const buttonStyle: CSSProperties = { + position: "fixed", + bottom: "40px", + right: "40px", + display: "flex", + alignItems: "center", + padding: "16px", + gap: "8px", + borderRadius: "50px", + border: "1px solid rgba(51, 51, 51, 1)", + outline: "none", + backgroundColor: "rgba(25, 25, 25, 1)", + boxShadow: "0px 4px 40px 0px rgba(0, 0, 0, 0.25)", + fontSize: "24px", + // lineHeight: "28.8px", + color: "white", + zIndex: "9999" + }; + + Object.assign(button.style, buttonStyle); + + const logoStyle: CSSProperties = {}; + + Object.assign(logo.style, logoStyle); + + const labelStyle: CSSProperties = {}; + + Object.assign(label.style, labelStyle); + + const balanceStyle: CSSProperties = {}; + + Object.assign(balance.style, balanceStyle); + + const notificationsStyle: CSSProperties = { + position: "absolute", + right: "-4px", + bottom: "-4px", + zIndex: -1, + padding: "2px 4px", + background: "red", + borderRadius: "16px", + fontSize: "12px", + fontWeight: "bold", + minHeight: "22px", + minWidth: "22px", + textAlign: "center" + }; + + Object.assign(notifications.style, notificationsStyle); + + button.appendChild(logo); + button.appendChild(label); + button.appendChild(balance); + button.appendChild(notifications); + + return { + button, + logo, + label, + balance, + notifications + }; + } + + getElement(): HTMLButtonElement { + return this.button; + } + + setBalance(balanceInfo: BalanceInfo) { + // TODO: Show label if no balance? + const formattedBalance = new Intl.NumberFormat(undefined, { + currency: balanceInfo.currency + }).format(balanceInfo.amount); + + this.balance.textContent = `${formattedBalance}`; + } + + setNotifications(notificationsCount: number) { + // TODO: Show / hide if there aren't any: + this.notifications.textContent = `${notificationsCount}`; + } + + setStatus(status: WanderEmbeddedButtonStatus) { + this.status[status] = true; + } + + unsetStatus(status: WanderEmbeddedButtonStatus) { + this.status[status] = false; + } +} diff --git a/wander-embedded-sdk/src/components/iframe/wander-iframe.component.ts b/wander-embedded-sdk/src/components/iframe/wander-iframe.component.ts new file mode 100644 index 000000000..1863214d6 --- /dev/null +++ b/wander-embedded-sdk/src/components/iframe/wander-iframe.component.ts @@ -0,0 +1,357 @@ +import { CSSProperties } from "react"; +import { + HalfLayoutConfig, + isRouteConfig, + LayoutConfig, + LayoutType, + ModalLayoutConfig, + PopupLayoutConfig, + RouteConfig, + RouteType, + SidebarLayoutConfig, + WanderEmbeddedIframeOptions, + WanderEmbeddedModalCSSVars +} from "../../wander-embedded.types"; +import { addCSSVariables } from "../../utils/styles/styles.utils"; + +export class WanderIframe { + static DEFAULT_BACKDROP_ID = "wanderEmbeddedBackdrop" as const; + static DEFAULT_IFRAME_ID = "wanderEmbeddedIframe" as const; + + static IFRAME_BASE_STYLE: CSSProperties = { + position: "fixed", + zIndex: "calc(var(--zIndex, 9999) + 1)", + background: "var(--background, white)", + borderWidth: "var(--borderWidth, 2px)", + borderStyle: "solid", + borderColor: "var(--borderColor, rgba(0, 0, 0, .125))", + borderRadius: "var(--borderRadius, 10px)", + boxShadow: "var(--boxShadow, 0 0 16px 0 rgba(0, 0, 0, 0.125))", + width: "calc(var(--preferredWidth, 400px) - 2 * var(--borderWidth, 2px))", + height: "calc(var(--preferredHeight, 600px) - 2 * var(--borderWidth, 2px))", + // TODO: No min on mobile: + minWidth: "400px", + minHeight: "400px", + maxWidth: + "calc(100dvw - 2 * var(--backdropPadding, 32px) - 2 * var(--borderWidth, 2px))", + maxHeight: + "calc(100dvh - 2 * var(--backdropPadding, 32px) - 2 * var(--borderWidth, 2px))", + boxSizing: "content-box" + }; + + static BACKDROP_HIDE_STYLE: CSSProperties = { + pointerEvents: "none", + opacity: 0 + }; + + static BACKDROP_SHOW_STYLE: CSSProperties = { + pointerEvents: "auto", + opacity: 1 + }; + + static MODAL_HIDE_STYLE: CSSProperties = { + pointerEvents: "none", + opacity: 0 + }; + + static MODAL_SHOW_STYLE: CSSProperties = { + pointerEvents: "auto", + opacity: 1 + }; + + static POPUP_HIDE_STYLE: CSSProperties = { + pointerEvents: "none", + opacity: 0 + }; + + static POPUP_SHOW_STYLE: CSSProperties = { + pointerEvents: "auto", + opacity: 1 + }; + + static BACKDROP_BASE_STYLE: CSSProperties = { + position: "fixed", + zIndex: "var(--zIndex, 9999)", + inset: 0, + background: "var(--backdropBackground, rgba(255, 255, 255, .0625))", + backdropFilter: "var(--backdropBackdropFilter, blur(12px))", + padding: "var(--backdropPadding, 32px)", + // TODO: Add CSS var for transition duration. + transition: "opacity linear 150ms" + }; + + static DEFAULT_ROUTE_LAYOUT = { + modal: { + type: "modal" + } as ModalLayoutConfig, + popup: { + type: "popup" + } as PopupLayoutConfig, + sidebar: { + type: "sidebar" + } as SidebarLayoutConfig, + half: { + type: "half" + } as HalfLayoutConfig + }; + + // Elements: + private backdrop: HTMLDivElement; + private iframe: HTMLIFrameElement; + + // Options: + private options: WanderEmbeddedIframeOptions; + private routeLayout: Partial>; + private iframeHideStyle: CSSProperties = {}; + private iframeShowStyle: CSSProperties = {}; + + // State: + private currentLayoutType: LayoutType | null = null; + private isOpen = false; + + constructor(src: string, options: WanderEmbeddedIframeOptions = {}) { + this.options = options; + + const { routeLayout } = options; + + if (typeof routeLayout === "string" || isRouteConfig(routeLayout)) { + // If a single value is passed, we use it for default and auth-requests. Anything else fallbacks to the default + // (currently modal): + + const defaultLayoutConfig = WanderIframe.getLayoutConfig(routeLayout); + + this.routeLayout = { + default: defaultLayoutConfig, + "auth-request": defaultLayoutConfig + }; + } else { + // If only default and auth are defined by the developer, default is used for both default and auth-request, and + // auth is used for auth, account and settings: + + const defaultLayoutConfig = WanderIframe.getLayoutConfig( + routeLayout?.default + ); + const authLayoutConfig = WanderIframe.getLayoutConfig(routeLayout?.auth); + + this.routeLayout = { + default: defaultLayoutConfig, + auth: authLayoutConfig, + account: + WanderIframe.getLayoutConfig(routeLayout?.account) || + authLayoutConfig, + settings: + WanderIframe.getLayoutConfig(routeLayout?.settings) || + authLayoutConfig, + "auth-request": + WanderIframe.getLayoutConfig(routeLayout?.["auth-request"]) || + defaultLayoutConfig + }; + } + + const elements = WanderIframe.initializeIframe(src, options); + + this.backdrop = elements.backdrop; + this.iframe = elements.iframe; + + // Apply initial styling: + + this.resize({ + routeType: "auth", + preferredLayoutType: this.routeLayout.auth?.type || "modal", + height: 0 + }); + } + + static getLayoutConfig( + layoutConfig?: LayoutConfig | LayoutType + ): LayoutConfig | undefined { + if (!layoutConfig) return undefined; + + return typeof layoutConfig === "object" + ? layoutConfig + : WanderIframe.DEFAULT_ROUTE_LAYOUT[layoutConfig]; + } + + static initializeIframe(src: string, options: WanderEmbeddedIframeOptions) { + // TODO: Considering using a `` element or adding proper aria- tags. + + const backdrop = document.createElement("div"); + + backdrop.id = WanderIframe.DEFAULT_BACKDROP_ID; + + const iframe = document.createElement("iframe"); + + iframe.id = options.id || WanderIframe.DEFAULT_IFRAME_ID; + iframe.src = src; + + // We don't add the iframe as a child of backdrop to have more control over the hide/show transitions: + + return { + iframe, + backdrop + }; + } + + getElements() { + return { + backdrop: this.backdrop, + iframe: this.iframe + }; + } + + show(): void { + console.log("SHOW"); + + this.isOpen = true; + + Object.assign(this.backdrop.style, WanderIframe.BACKDROP_SHOW_STYLE); + Object.assign(this.iframe.style, this.iframeShowStyle); + } + + hide(): void { + console.log("HIDE"); + + this.isOpen = false; + + Object.assign(this.backdrop.style, WanderIframe.BACKDROP_HIDE_STYLE); + Object.assign(this.iframe.style, this.iframeHideStyle); + } + + resize(routeConfig: RouteConfig): void { + const layoutConfig = + this.routeLayout[routeConfig.routeType] || + WanderIframe.DEFAULT_ROUTE_LAYOUT[routeConfig.preferredLayoutType]; + + const layoutType: LayoutType = layoutConfig.type; + const resetLayout = layoutType !== this.currentLayoutType; + + this.currentLayoutType = layoutType; + + const backdropStyle: CSSProperties = {}; + const iframeStyle: CSSProperties = {}; + const cssVars: WanderEmbeddedModalCSSVars = { ...this.options.cssVars }; + + switch (layoutConfig.type) { + case "modal": { + iframeStyle.top = "50%"; + iframeStyle.left = "50%"; + iframeStyle.transform = "translate(-50%, -50%)"; // TODO: Add scale effect when appearing? + iframeStyle.transition = + "height linear 300ms, width linear 300ms, opacity linear 150ms"; + cssVars.preferredWidth ??= layoutConfig.fixedWidth || routeConfig.width; + cssVars.preferredHeight ??= + layoutConfig.fixedHeight || routeConfig.height; + this.iframeHideStyle = WanderIframe.MODAL_HIDE_STYLE; + this.iframeShowStyle = WanderIframe.MODAL_SHOW_STYLE; + + break; + } + + case "popup": { + const [y, x] = (layoutConfig.position || "bottom-right").split("-") as [ + "top" | "bottom", + "left" | "right" + ]; + + iframeStyle[y] = "var(--backdropPadding, 32px)"; + iframeStyle[x] = "var(--backdropPadding, 32px)"; + iframeStyle.transition = + "height linear 300ms, width linear 300ms, opacity linear 150ms"; + // iframeStyle.minWidth = 0; + // iframeStyle.minHeight = 0; + cssVars.preferredWidth ??= layoutConfig.fixedWidth || routeConfig.width; + cssVars.preferredHeight ??= + layoutConfig.fixedHeight || routeConfig.height; + this.iframeHideStyle = WanderIframe.POPUP_HIDE_STYLE; + this.iframeShowStyle = WanderIframe.POPUP_SHOW_STYLE; + + break; + } + + case "sidebar": + case "half": { + const y = layoutConfig.position || "right"; + const sign = y === "right" ? "+" : "-"; + + iframeStyle.top = layoutConfig.expanded + ? 0 + : `var(--backdropPadding, 0)`; + iframeStyle[y] = layoutConfig.expanded + ? 0 + : `var(--backdropPadding, 0)`; + iframeStyle.transition = "transform linear 150ms"; + + this.iframeHideStyle = { + transform: `translate(calc(${sign}100% ${sign} var(--backdropPadding, 32px)), 0)` + }; + + this.iframeShowStyle = { + transform: `translate(0, 0)` + }; + + if (layoutConfig.expanded) { + iframeStyle.borderWidth = + y === "right" + ? "0 0 0 var(--borderWidth, 2px)" + : "0 var(--borderWidth, 2px) 0 0"; + + // TODO: Create defaultCssVars property to avoid having to use default values in "var" and get rid of these overrides: + iframeStyle.width = "var(--preferredWidth, 400px)"; + iframeStyle.height = "var(--preferredHeight, 600px)"; + iframeStyle.maxWidth = "var(--preferredWidth, 400px)"; + iframeStyle.maxHeight = "var(--preferredHeight, 600px)"; + + cssVars.backdropPadding = 0; + cssVars.borderRadius ??= 0; + } else { + cssVars.backdropPadding ??= 8; + } + + if (layoutConfig.type === "sidebar") { + cssVars.preferredWidth ??= + layoutConfig.fixedWidth || routeConfig.width; + cssVars.preferredHeight ??= + "calc(100dvw - 2 * var(--backdropPadding, 0))"; + } else { + cssVars.preferredWidth ??= + "calc(50vw - 2 * var(--backdropPadding, 0))"; + cssVars.preferredHeight ??= + "calc(100dvw - 2 * var(--backdropPadding, 0))"; + + // TODO Set imgSrc + } + + break; + } + } + + // Every time we change the layout type (e.g. going from the auth routes "modal" to the default routes "popup"), the + // style attribute must be reset to avoid conflicts with leftover properties from the previous layout + if (resetLayout) { + this.backdrop.removeAttribute("style"); + this.iframe.removeAttribute("style"); + + Object.assign(this.backdrop.style, WanderIframe.BACKDROP_BASE_STYLE); + Object.assign(this.iframe.style, WanderIframe.IFRAME_BASE_STYLE); + + // TODO: Animate/transition this. First close the old layout. Then open the new one. + } + + Object.assign( + this.backdrop.style, + backdropStyle, + this.isOpen + ? WanderIframe.BACKDROP_SHOW_STYLE + : WanderIframe.BACKDROP_HIDE_STYLE + ); + + Object.assign( + this.iframe.style, + iframeStyle, + this.isOpen ? this.iframeShowStyle : this.iframeHideStyle + ); + + addCSSVariables(this.backdrop, cssVars); + addCSSVariables(this.iframe, cssVars); + } +} diff --git a/wander-embedded-sdk/src/components/logo/wander-logo.component.ts b/wander-embedded-sdk/src/components/logo/wander-logo.component.ts new file mode 100644 index 000000000..69593d88a --- /dev/null +++ b/wander-embedded-sdk/src/components/logo/wander-logo.component.ts @@ -0,0 +1,31 @@ +export function createWanderSVG( + styles?: Partial +): SVGElement { + const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + svg.setAttribute("width", "30"); + svg.setAttribute("height", "30"); + svg.setAttribute("viewBox", "0 0 30 30"); + svg.setAttribute("fill", "none"); + + const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.setAttribute("width", "30"); + rect.setAttribute("height", "30"); + rect.setAttribute("rx", "15"); + rect.setAttribute("fill", "#AB9AFF"); + + const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); + path.setAttribute( + "d", + "M23.3076 17.8373L24.9362 17.5457L23.4604 15.8935L24.7387 15.1794L23.1218 13.9738L24.1616 11.4738H21.8865L22.4843 9.01847L20.0469 10.2688L20.7151 7.03218L18.2526 9.06325L17.9912 5.93858L16.1292 8.74983L14.9678 5L13.8076 8.74983L11.9461 5.93746L11.6853 9.06213L9.22276 7.03106L9.88877 10.2677L7.45082 9.01847L8.04912 11.4738H5.77515L6.81503 13.9738L5.19813 15.1794L6.47587 15.8935L5 17.5457L6.62866 17.8373L5.50931 19.9641L6.95327 20.503L6.54135 21.872L7.71219 21.614L7.82916 23.3014L8.80244 22.8055L8.89087 24.353L9.66546 24.095C9.66546 24.095 11.0372 25.5188 13.7931 24.7946C13.9519 24.7547 14.0995 24.679 14.2245 24.5732C14.3495 24.4675 14.4487 24.3346 14.5145 24.1846C14.6578 23.8488 14.6102 23.4368 13.6906 23.2857C12.0704 23.0193 9.82889 23.3316 9.01568 21.2978C9.00991 21.2835 9.00872 21.2678 9.01226 21.2528C9.0158 21.2378 9.02389 21.2243 9.03543 21.2141C9.04697 21.2039 9.06139 21.1976 9.0767 21.1959C9.092 21.1942 9.10744 21.1974 9.1209 21.2049C10.121 21.7707 12.4638 22.2817 12.6592 21.2121C12.8674 20.0721 11.8667 19.6954 11.3008 19.3837C10.735 19.0719 8.16665 18.2391 8.28418 16.7073C8.40171 15.1755 10.0751 15.5852 10.454 15.8902C10.7954 16.114 14.1703 18.1893 14.1703 18.1893C14.1703 18.1893 12.9468 19.8124 14.9678 19.8124C16.9888 19.8124 15.7665 18.1893 15.7665 18.1893C15.7665 18.1893 19.1402 16.1129 19.4827 15.8902C19.8616 15.5852 21.534 15.1766 21.6526 16.7073C21.7713 18.238 19.2001 19.0691 18.6348 19.3837C18.0696 19.6982 17.0677 20.0721 17.2771 21.2121C17.4729 22.2811 19.8141 21.7718 20.8148 21.2049C20.8283 21.1973 20.8438 21.1941 20.8592 21.1957C20.8746 21.1974 20.8891 21.2038 20.9007 21.2141C20.9123 21.2244 20.9204 21.238 20.9238 21.2531C20.9273 21.2682 20.9259 21.284 20.92 21.2983C20.1079 23.3316 17.8653 23.0193 16.245 23.2857C15.326 23.4368 15.2779 23.8454 15.4217 24.1846C15.4873 24.3345 15.5863 24.4674 15.7111 24.5732C15.836 24.6789 15.9834 24.7547 16.142 24.7946C18.899 25.5188 20.2713 24.095 20.2713 24.095L21.0459 24.353L21.1343 22.8055L22.1071 23.3014L22.2246 21.6145L23.3954 21.8726L22.9835 20.503L24.4252 19.9674L23.3076 17.8373ZM12.812 15.6719C12.5927 15.6719 12.3783 15.6069 12.196 15.4851C12.0137 15.3632 11.8716 15.1901 11.7876 14.9875C11.7037 14.7849 11.6818 14.562 11.7245 14.3469C11.7673 14.1318 11.8729 13.9343 12.028 13.7792C12.183 13.6241 12.3806 13.5186 12.5957 13.4758C12.8107 13.433 13.0337 13.4549 13.2362 13.5389C13.4388 13.6228 13.612 13.7649 13.7338 13.9472C13.8557 14.1295 13.9207 14.3439 13.9207 14.5632C13.9207 14.8572 13.8039 15.1392 13.5959 15.3472C13.388 15.5551 13.106 15.6719 12.812 15.6719ZM17.1243 15.6719C16.905 15.6719 16.6906 15.6069 16.5083 15.4851C16.326 15.3632 16.1839 15.1901 16.0999 14.9875C16.016 14.7849 15.9941 14.562 16.0368 14.3469C16.0796 14.1318 16.1852 13.9343 16.3403 13.7792C16.4953 13.6241 16.6929 13.5186 16.908 13.4758C17.123 13.433 17.346 13.4549 17.5486 13.5389C17.7511 13.6228 17.9243 13.7649 18.0461 13.9472C18.168 14.1295 18.233 14.3439 18.233 14.5632C18.2331 14.7088 18.2044 14.853 18.1487 14.9876C18.093 15.1221 18.0114 15.2444 17.9084 15.3473C17.8054 15.4503 17.6832 15.532 17.5486 15.5877C17.4141 15.6434 17.2699 15.672 17.1243 15.6719Z" + ); + path.setAttribute("fill", "white"); + + svg.appendChild(rect); + svg.appendChild(path); + + if (styles) { + Object.assign(svg.style, styles); + } + + return svg; +} diff --git a/wander-embedded-sdk/src/index.ts b/wander-embedded-sdk/src/index.ts new file mode 100644 index 000000000..3b2d43d3a --- /dev/null +++ b/wander-embedded-sdk/src/index.ts @@ -0,0 +1,3 @@ +export { WanderEmbedded } from "./wander-embedded"; + +export type * from "./wander-embedded.types"; diff --git a/wander-embedded-sdk/src/types/global.d.ts b/wander-embedded-sdk/src/types/global.d.ts new file mode 100644 index 000000000..fbbd5ea5b --- /dev/null +++ b/wander-embedded-sdk/src/types/global.d.ts @@ -0,0 +1,7 @@ +declare global { + interface Window { + arweaveWallet: any; + } +} + +export {}; diff --git a/wander-embedded-sdk/src/utils/message/message.types.ts b/wander-embedded-sdk/src/utils/message/message.types.ts new file mode 100644 index 000000000..0855ffa3c --- /dev/null +++ b/wander-embedded-sdk/src/utils/message/message.types.ts @@ -0,0 +1,69 @@ +// INCOMING MESSAGES (iframe => SDK): + +import { BalanceInfo, RouteConfig } from "../../wander-embedded.types"; + +// embedded_auth: + +export interface UserDetails { + // TODO: Add props +} + +export interface IncomingAuthMessageData { + userDetails: null | UserDetails; +} + +// embedded_resize + +export type IncomingResizeMessageData = RouteConfig; + +// embedded_balance: + +export type IncomingBalanceMessageData = BalanceInfo; + +// embedded_notification + +export interface IncomingNotificationMessageData { + notificationsCount: number; +} + +// IncomingMessage: + +export interface BaseIncomingMessage { + id: string; + type: K; + data: D; +} + +export type IncomingAuthMessage = BaseIncomingMessage< + "embedded_auth", + IncomingAuthMessageData +>; +export type IncomingCloseMessage = BaseIncomingMessage<"embedded_close", void>; +export type IncomingResizeMessage = BaseIncomingMessage< + "embedded_resize", + IncomingResizeMessageData +>; +export type IncomingBalanceMessage = BaseIncomingMessage< + "embedded_balance", + IncomingBalanceMessageData +>; +export type IncomingNotificationMessage = BaseIncomingMessage< + "embedded_notification", + IncomingNotificationMessageData +>; + +export type IncomingMessage = + | IncomingAuthMessage + | IncomingCloseMessage + | IncomingResizeMessage + | IncomingBalanceMessage + | IncomingNotificationMessage; + +export type IncomingMessageId = IncomingMessage["type"]; + +// OUTGOING MESSAGES (SDK => iframe): + +export type OutgoingMessage = { + type: "THEME_UPDATE" | "BALANCE_CURRENCY"; + payload: string; +}; diff --git a/wander-embedded-sdk/src/utils/message/message.utils.ts b/wander-embedded-sdk/src/utils/message/message.utils.ts new file mode 100644 index 000000000..3a332b435 --- /dev/null +++ b/wander-embedded-sdk/src/utils/message/message.utils.ts @@ -0,0 +1,95 @@ +import { + IncomingAuthMessageData, + IncomingBalanceMessageData, + IncomingMessage, + IncomingMessageId, + IncomingNotificationMessageData, + IncomingResizeMessage, + IncomingResizeMessageData, + OutgoingMessage +} from "./message.types"; + +// Type guard for incoming messages +export function isIncomingMessage( + message: unknown +): message is IncomingMessage { + if ( + !message || + typeof message !== "object" || + !("id" in message && "type" in message && "data" in message) + ) { + return false; + } + + switch (message.type as IncomingMessageId) { + case "embedded_auth": { + const data = message.data as IncomingAuthMessageData; + + return !!(data && typeof data === "object" && "userDetails" in data); + } + + case "embedded_close": + return true; + + case "embedded_resize": { + const data = message.data as IncomingResizeMessageData; + + return !!( + data && + typeof data === "object" && + typeof data.routeType === "string" && + typeof data.preferredLayoutType === "string" && + typeof data.height === "number" + ); + } + + case "embedded_balance": { + const data = message.data as IncomingBalanceMessageData; + + return !!( + data && + typeof data === "object" && + typeof data.amount === "number" && + typeof data.currency === "string" + ); + } + + case "embedded_notification": { + const data = message.data as IncomingNotificationMessageData; + + return !!( + data && + typeof data === "object" && + typeof data.notificationsCount === "number" + ); + } + + default: + return false; + } +} + +// Type guard for outgoing messages +export function isOutgoingMessage(message: any): message is OutgoingMessage { + if (!message || typeof message !== "object" || !message.type) return false; + + switch (message.type) { + case "THEME_UPDATE": + return ( + message.payload && + typeof message.payload === "object" && + typeof message.payload.primary === "string" && + typeof message.payload.secondary === "string" + ); + case "WALLET_CONNECTED": + return ( + message.payload && + typeof message.payload === "object" && + typeof message.payload.address === "string" + ); + case "WALLET_DISCONNECTED": + return true; + default: + return false; + } +} diff --git a/wander-embedded-sdk/src/utils/styles/styles.utils.ts b/wander-embedded-sdk/src/utils/styles/styles.utils.ts new file mode 100644 index 000000000..e3ac4357d --- /dev/null +++ b/wander-embedded-sdk/src/utils/styles/styles.utils.ts @@ -0,0 +1,9 @@ +export function addCSSVariables(element: HTMLElement, vars: T) { + for (const key in vars) { + const value = vars[key]; + + if (typeof value === "string") element.style.setProperty(`--${key}`, value); + else if (typeof value === "number") + element.style.setProperty(`--${key}`, `${value}px`); + } +} diff --git a/wander-embedded-sdk/src/wander-embedded.ts b/wander-embedded-sdk/src/wander-embedded.ts new file mode 100644 index 000000000..514731654 --- /dev/null +++ b/wander-embedded-sdk/src/wander-embedded.ts @@ -0,0 +1,319 @@ +import { setupWalletSDK } from "wallet-api/wallet-sdk.es.js"; +import { WanderButton } from "./components/button/wander-button.component"; +import { WanderIframe } from "./components/iframe/wander-iframe.component"; +import { merge } from "ts-deepmerge"; +import { + BalanceInfo, + RouteConfig, + WanderEmbeddedOptions +} from "./wander-embedded.types"; +import { + IncomingBalanceMessageData, + IncomingResizeMessageData, + UserDetails +} from "./utils/message/message.types"; +import { isIncomingMessage } from "./utils/message/message.utils"; + +const NOOP = () => {}; + +export class WanderEmbedded { + static DEFAULT_IFRAME_SRC = "http://localhost:5173/" as const; + + // Callbacks: + private onAuth: (userDetails: UserDetails | null) => void = NOOP; + private onOpen: () => void = NOOP; + private onClose: () => void = NOOP; + private onResize: (data: IncomingResizeMessageData) => void = NOOP; + private onBalance: (data: IncomingBalanceMessageData) => void = NOOP; + private onNotification: (notificationsCount: number) => void = NOOP; + + // Components: + private buttonComponent: null | WanderButton = null; + private iframeComponent: null | WanderIframe = null; + + // HTML elements: + private buttonRef: null | HTMLButtonElement = null; + private backdropRef: null | HTMLDivElement = null; + private iframeRef: null | HTMLIFrameElement = null; + + // State: + public isOpen = false; + public userDetails: UserDetails | null = null; // TODO: Should we expose this? + public routeConfig: RouteConfig | null = null; + public balanceInfo: BalanceInfo | null = null; + public notificationsCount: number = 0; + + /* + + TODO: + + - TODO: Support themes (after shadow dom) + - TODO: Create defaultCssVars property to avoid having to use default values in "var" and get rid of these overrides: + - TODO: Animate/transition this. First close the old layout. Then open the new one. + - Initialize CSS variables with options? + - Add popup transition like Passkeys + - The modal should only open automatically for auth request, and if the user closes it it should remain open until all are + cleared. + - Animate button when it first appears. + - Pass "App wrapper (inside iframe):" to iframe. + - Add option to configure the size-images based on route on the side-by-side view (or send them from the modal) + - "popup" layout should probably not resize, only modal. + - Add logic to increase/decrease pending notifications (e.g. when an auth request has been viewed). + - Add black and white logo option? Consider overlaying the app logo to indicate "connected". + - Add styling shortcuts (different defaults): sketch, smooth, rounded + - Add function to change layouts and cssVars later + - On mobile, just take the whole screen. One desktop, leave space for button. + - Add slight rotation towards/against the mouse (except when directly on top)? + - TODO: Pass theme, balance config and max width/height to iframe: + - Make sure this cannot be called twice, or that it first destroys the previous instance(s) + - Use shadow DOM instead and add :hover, :focus and media queries. + - Add customizable default size for each layout. + - Add close button inside iframe and make sure the spinner shows straight away. + - TODO: Add CSS var for transition duration. + - Considering having different transitions. + - Add effect when spending/signing + - Fix embedded issue: If generation was too long ago and it expires, it just throws an error instead of generating a new one when needed. + + */ + + constructor(options: WanderEmbeddedOptions = {}) { + // Callbacks: + this.onAuth = options.onAuth ?? NOOP; + this.onOpen = options.onOpen ?? NOOP; + this.onClose = options.onClose ?? NOOP; + this.onResize = options.onResize ?? NOOP; + this.onBalance = options.onBalance ?? NOOP; + this.onNotification = options.onNotification ?? NOOP; + + const optionsWithDefaults = merge(options, { + iframe: { + clickOutsideBehavior: "auto" + }, + button: true + } satisfies WanderEmbeddedOptions); + + // Create or get references to iframe and, maybe, button: + this.initializeComponents(optionsWithDefaults); + + if (!this.iframeRef) throw new Error("Error creating iframe"); + + // TODO: Pass theme, balance config and max width/height to iframe: + // this.iframeRef.contentWindow.postMessage(message, "*"); + + // Once we have all the elements in place, start listening for wallet messages... + this.handleMessage = this.handleMessage.bind(this); + window.addEventListener("message", this.handleMessage); + + // ...and set `window.arweaveWallet`: + setupWalletSDK(this.iframeRef.contentWindow as Window); + + // And also the button click handler, if needed: + if (this.buttonRef) { + this.handleButtonClick = this.handleButtonClick.bind(this); + this.buttonRef.addEventListener("click", this.handleButtonClick); + } + } + + private initializeComponents(options: WanderEmbeddedOptions): void { + const { + src = WanderEmbedded.DEFAULT_IFRAME_SRC, + iframe: iframeOptions, + button: buttonOptions + } = options; + + // TODO Use PARAM_ORIGIN_KEY and PARAM_API_KEY instead of hardcoded values: + const srcWithParams = `${src}?origin=${location.origin}&api-key=123`; + + if (iframeOptions instanceof HTMLElement) { + if ( + iframeOptions.src && + iframeOptions.src !== WanderEmbedded.DEFAULT_IFRAME_SRC + ) { + console.warn( + `Replacing iframe.src ("${iframeOptions.src}") with ${WanderEmbedded.DEFAULT_IFRAME_SRC}` + ); + } + + iframeOptions.src = srcWithParams; + + this.iframeRef = iframeOptions; + } else { + this.iframeComponent = new WanderIframe(srcWithParams, iframeOptions); + + const elements = this.iframeComponent.getElements(); + + this.backdropRef = elements.backdrop; + this.iframeRef = elements.iframe; + + document.body.appendChild(elements.backdrop); + document.body.appendChild(elements.iframe); + } + + if (typeof buttonOptions === "object" || buttonOptions === true) { + this.buttonComponent = new WanderButton( + buttonOptions === true ? {} : buttonOptions + ); + + this.buttonRef = this.buttonComponent.getElement(); + + document.body.appendChild(this.buttonRef); + } + + const clickOutsideBehavior = + iframeOptions instanceof HTMLElement + ? false + : iframeOptions?.clickOutsideBehavior; + + if (clickOutsideBehavior) { + document.body.addEventListener("click", ({ target }) => { + // Do not check if `target` is the backdrop
as it might have pointer-events: none. + + const shouldClose = + clickOutsideBehavior === true || + (this.iframeRef !== target && + this.buttonRef !== target && + !this.iframeRef?.contains(target as HTMLElement) && + !this.buttonRef?.contains(target as HTMLElement) && + this.backdropRef && + (getComputedStyle(this.backdropRef).backdropFilter !== "none" || + // TODO: This is not a good way to check if it's totally transparent: + getComputedStyle(this.backdropRef).background !== "transparent")); + + if (shouldClose) this.close(); + }); + } + } + + private handleMessage(event: MessageEvent): void { + const message = event.data; + + if (!isIncomingMessage(message)) return; + + console.log("MESSAGE", message); + + switch (message.type) { + case "embedded_auth": + const { userDetails } = message.data; + this.userDetails = userDetails; + + if (userDetails) { + this.buttonComponent?.setStatus("isAuthenticated"); + + this.iframeComponent?.resize({ + routeType: "default", + preferredLayoutType: "popup", + height: 0 + }); + } else { + this.buttonComponent?.unsetStatus("isAuthenticated"); + + this.iframeComponent?.resize({ + routeType: "auth", + preferredLayoutType: "modal", + height: 0 + }); + } + + this.onAuth(message.data); + break; + + case "embedded_close": + if (this.isOpen) { + this.isOpen = false; + + this.buttonComponent?.unsetStatus("isOpen"); + + this.onClose(); + } + break; + + case "embedded_resize": + const routeConfig = message.data; + + this.iframeComponent?.resize(routeConfig); + + this.onResize(routeConfig); + + if (!this.isOpen) { + this.isOpen = true; + this.buttonComponent?.setStatus("isOpen"); + this.iframeComponent?.show(); + this.onOpen(); + } + + break; + + case "embedded_balance": + const balanceInfo = message.data; + this.balanceInfo = balanceInfo; + + this.buttonComponent?.setBalance(balanceInfo); + + this.onBalance(balanceInfo); + break; + + case "embedded_notification": + const { notificationsCount } = message.data; + this.notificationsCount = notificationsCount; + + this.buttonComponent?.setNotifications(notificationsCount); + + this.onNotification(notificationsCount); + break; + } + } + + private handleButtonClick() { + if (this.isOpen) this.close(); + else this.open(); + } + + public open(): void { + if (!this.iframeComponent && !this.buttonComponent) { + throw new Error( + "Wander Embedded's iframe and button has been created manually" + ); + } + + if (this.iframeComponent && !this.isOpen) { + this.isOpen = true; + this.buttonComponent?.setStatus("isOpen"); + this.iframeComponent.show(); + } + } + + public close(): void { + if (!this.iframeComponent && !this.buttonComponent) { + throw new Error( + "Wander Embedded's iframe and button has been created manually" + ); + } + + if (this.iframeComponent && this.isOpen) { + this.isOpen = false; + this.buttonComponent?.unsetStatus("isOpen"); + this.iframeComponent.hide(); + } + } + + public destroy(): void { + window.removeEventListener("message", this.handleMessage); + window.removeEventListener("click", this.handleButtonClick); + + // Only remove the elements we crated: + if (this.iframeComponent) this.iframeRef?.remove(); + if (this.buttonComponent) this.buttonRef?.remove(); + } + + get isAuthenticated() { + return !!this.userDetails; + } + + get width() { + return this.routeConfig?.width; + } + + get height() { + return this.routeConfig?.height; + } +} diff --git a/wander-embedded-sdk/src/wander-embedded.types.ts b/wander-embedded-sdk/src/wander-embedded.types.ts new file mode 100644 index 000000000..135a986e2 --- /dev/null +++ b/wander-embedded-sdk/src/wander-embedded.types.ts @@ -0,0 +1,209 @@ +import { UserDetails } from "./utils/message/message.types"; + +export type RouteType = + | "default" + | "auth" + | "account" + | "settings" + | "auth-request"; + +export interface ModalLayoutConfig { + type: "modal"; + fixedWidth?: number; + fixedHeight?: number; +} + +export interface PopupLayoutConfig { + type: "popup"; + position?: WanderEmbeddedButtonPosition; + fixedWidth?: number; + fixedHeight?: number; +} + +export interface SidebarLayoutConfig { + type: "sidebar"; + position?: "left" | "right"; + expanded?: boolean; + fixedWidth?: number; +} + +export interface HalfLayoutConfig { + type: "half"; + position?: "left" | "right"; + expanded?: boolean; + imgSrc?: string | boolean; +} + +export type LayoutConfig = + | ModalLayoutConfig + | PopupLayoutConfig + | SidebarLayoutConfig + | HalfLayoutConfig; + +export type LayoutType = LayoutConfig["type"]; + +export const LAYOUT_TYPES = [ + "modal", + "popup", + "sidebar", + "half" +] as const satisfies LayoutType[]; + +export function isRouteConfig(obj: unknown): obj is LayoutConfig { + return !!( + obj && + typeof obj === "object" && + "type" in obj && + LAYOUT_TYPES.includes(obj.type as LayoutType) + ); +} + +export interface RouteConfig { + routeType: RouteType; + preferredLayoutType: LayoutType; + width?: number; + height: number; +} + +export interface BalanceInfo { + amount: number; + currency: "USD" | "EUR"; // TODO: Replace with a type that includes all options in the settings? +} + +export interface WanderEmbeddedOptions { + src?: string; + iframe?: WanderEmbeddedIframeOptions | HTMLIFrameElement; + button?: WanderEmbeddedButtonOptions | boolean; + + // TODO: Also export the messages types: + onAuth?: (userDetails: UserDetails | null) => void; + onOpen?: () => void; + onClose?: () => void; + onResize?: (routeConfig: RouteConfig) => void; + onBalance?: (balanceInfo: BalanceInfo) => void; + onNotification?: (notificationsCount: number) => void; +} + +// Common: + +export type ThemeVariant = "light" | "dark"; + +export type ThemeSetting = "system" | ThemeVariant; + +export interface WanderEmbeddedComponentOptions { + id?: string; + className?: string; + // TODO: Support themes + // cssVars?: ThemeSetting | T | Record; + cssVars?: T; +} + +// Modal (iframe): + +export type WanderEmbeddedClickOutsideBehavior = "auto" | boolean; + +export interface WanderEmbeddedIframeOptions + extends WanderEmbeddedComponentOptions { + // TODO: Default should automatically be used for auth-requests, and auth for account and settings? + routeLayout?: + | LayoutType + | LayoutConfig + | Partial>; + + /** + * Close Wander Embedded when clicking outside of it: + * + * - "auto": Will close if `backdropBackground` is not transparent or if `backdropBackdropFilter` is used. + * - false: Will never close. Use this if you want Wander Embedded to close by clicking the close icon. + * - true: Will always close. Use this if you want Wander Embedded to close when clicking outside, even if the + * backdrop is not visible. + */ + clickOutsideBehavior?: WanderEmbeddedClickOutsideBehavior; +} + +// Button: + +export type WanderEmbeddedButtonStatus = "isAuthenticated" | "isOpen"; + +export interface WanderEmbeddedButtonOptions + extends WanderEmbeddedComponentOptions { + position?: WanderEmbeddedButtonPosition; + logo?: boolean | string; + balance?: boolean | WanderEmbeddedBalanceOptions; + notifications?: WanderEmbeddedButtonNotifications; +} + +export type WanderEmbeddedButtonPosition = + | "top-right" + | "bottom-right" + | "top-left" + | "bottom-left"; + +export interface WanderEmbeddedBalanceOptions { + balanceOf: "total" | string; // string would be a token id + currency: "auto" | string; // "auto" would be the one the user selected on the wallet, string would be a token id or currency symbol (e.g. USD). +} + +export type WanderEmbeddedButtonNotifications = "off" | "counter" | "alert"; + +// Styles: + +export interface WanderEmbeddedModalCSSVars { + // Modal (iframe): + background?: string; + borderWidth?: number; + borderColor?: string; + borderRadius?: number | string; + boxShadow?: string; + zIndex?: string; + preferredWidth?: number | string; + preferredHeight?: number | string; + + // App wrapper (inside iframe): + iframePadding?: number; + iframeMaxWidth?: number; + iframeMaxHeight?: number; + + // Backdrop (div): + backdropBackground?: string; + backdropBackdropFilter?: string; + backdropPadding?: number | string; + + /** + * TODO: If `backdropBackground` is transparent and `backdropBackdropFilter` is not set, this will be set to "none", unless + * a different value is specified. In any other case, this is ignored. + */ + backdropPointerEvents?: string; +} + +export interface WanderEmbeddedButtonCSSVars { + // Button (button): + background?: string; + borderWidth?: number | string; + borderColor?: string; + borderRadius?: number | string; + boxShadow?: string; + zIndex?: string; + minWidth?: number | string; + minHeight?: number | string; + padding?: number | string; + font?: string; + + // Logo (img / svg): + logoBackground?: string; + logoBorder?: string; // TODO: Border-right only? + logoBorderRadius?: number | string; + + // Labels (span): + + // Balance (span): + + // Notifications (span): + notificationsBackground?: string; + notificationsBorder?: string; + notificationsBorderRadius?: number | string; + notificationsBoxShadow?: string; + notificationsPadding?: number | string; + + // TODO: :hover and :focus specific styling. +} diff --git a/wander-embedded-sdk/tsconfig.json b/wander-embedded-sdk/tsconfig.json new file mode 100644 index 000000000..a62630ce3 --- /dev/null +++ b/wander-embedded-sdk/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "Node", + "lib": ["DOM", "ES2020"], + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "./sdk-dist", + "sourceMap": true, + "paths": { + "wallet-api/*": ["./wallet-api-dist/*"] + } + }, + "include": ["src", "wallet-api-dist"], + "exclude": ["node_modules", "sdk-dist"] +} diff --git a/wander-embedded-sdk/tsup.config.ts b/wander-embedded-sdk/tsup.config.ts new file mode 100644 index 000000000..67f525c4d --- /dev/null +++ b/wander-embedded-sdk/tsup.config.ts @@ -0,0 +1,26 @@ +import type { Options } from "tsup"; + +const env = process.env.NODE_ENV; + +export const tsup: Options = { + splitting: false, + clean: true, // clean up the dist folder + dts: true, // generate dts files + format: ["cjs", "esm", "iife"], // generate cjs, iife and esm files + minify: env === "production", + bundle: true, + skipNodeModulesBundle: true, + entryPoints: ["src/index.ts"], + watch: env === "development", + target: "es2020", + outDir: "sdk-dist", + entry: ["src/**/*.ts", "!src/**/__tests__/**", "!src/**/*.test.*"], //include all files under src + shims: true, + sourcemap: true, + treeshake: true, + esbuildOptions: (options) => { + options.alias = { + "wallet-api": "./wallet-api-dist" + }; + } +}; diff --git a/wander-embedded-sdk/yarn.lock b/wander-embedded-sdk/yarn.lock new file mode 100644 index 000000000..2069bd4f3 --- /dev/null +++ b/wander-embedded-sdk/yarn.lock @@ -0,0 +1,798 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/aix-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" + integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== + +"@esbuild/android-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" + integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== + +"@esbuild/android-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" + integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== + +"@esbuild/android-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" + integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== + +"@esbuild/darwin-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" + integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== + +"@esbuild/darwin-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" + integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== + +"@esbuild/freebsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" + integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== + +"@esbuild/freebsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" + integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== + +"@esbuild/linux-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" + integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== + +"@esbuild/linux-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" + integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== + +"@esbuild/linux-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" + integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== + +"@esbuild/linux-loong64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" + integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== + +"@esbuild/linux-mips64el@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" + integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== + +"@esbuild/linux-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" + integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== + +"@esbuild/linux-riscv64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" + integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== + +"@esbuild/linux-s390x@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" + integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== + +"@esbuild/linux-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" + integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== + +"@esbuild/netbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" + integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== + +"@esbuild/netbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" + integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== + +"@esbuild/openbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" + integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== + +"@esbuild/openbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" + integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== + +"@esbuild/sunos-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" + integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== + +"@esbuild/win32-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" + integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== + +"@esbuild/win32-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" + integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== + +"@esbuild/win32-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" + integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@rollup/rollup-android-arm-eabi@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285" + integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA== + +"@rollup/rollup-android-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d" + integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g== + +"@rollup/rollup-darwin-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844" + integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g== + +"@rollup/rollup-darwin-x64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf" + integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ== + +"@rollup/rollup-freebsd-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c" + integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew== + +"@rollup/rollup-freebsd-x64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467" + integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA== + +"@rollup/rollup-linux-arm-gnueabihf@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b" + integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw== + +"@rollup/rollup-linux-arm-musleabihf@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327" + integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg== + +"@rollup/rollup-linux-arm64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae" + integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA== + +"@rollup/rollup-linux-arm64-musl@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05" + integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g== + +"@rollup/rollup-linux-loongarch64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee" + integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba" + integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ== + +"@rollup/rollup-linux-riscv64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e" + integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw== + +"@rollup/rollup-linux-s390x-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e" + integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ== + +"@rollup/rollup-linux-x64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0" + integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g== + +"@rollup/rollup-linux-x64-musl@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80" + integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA== + +"@rollup/rollup-win32-arm64-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691" + integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw== + +"@rollup/rollup-win32-ia32-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3" + integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ== + +"@rollup/rollup-win32-x64-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645" + integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw== + +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +bundle-require@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee" + integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== + dependencies: + load-tsconfig "^0.2.3" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +consola@^3.2.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.0.tgz#4cfc9348fd85ed16a17940b3032765e31061ab88" + integrity sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA== + +cross-spawn@^7.0.0: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.3.7: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +esbuild@^0.24.0: + version "0.24.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" + integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.24.2" + "@esbuild/android-arm" "0.24.2" + "@esbuild/android-arm64" "0.24.2" + "@esbuild/android-x64" "0.24.2" + "@esbuild/darwin-arm64" "0.24.2" + "@esbuild/darwin-x64" "0.24.2" + "@esbuild/freebsd-arm64" "0.24.2" + "@esbuild/freebsd-x64" "0.24.2" + "@esbuild/linux-arm" "0.24.2" + "@esbuild/linux-arm64" "0.24.2" + "@esbuild/linux-ia32" "0.24.2" + "@esbuild/linux-loong64" "0.24.2" + "@esbuild/linux-mips64el" "0.24.2" + "@esbuild/linux-ppc64" "0.24.2" + "@esbuild/linux-riscv64" "0.24.2" + "@esbuild/linux-s390x" "0.24.2" + "@esbuild/linux-x64" "0.24.2" + "@esbuild/netbsd-arm64" "0.24.2" + "@esbuild/netbsd-x64" "0.24.2" + "@esbuild/openbsd-arm64" "0.24.2" + "@esbuild/openbsd-x64" "0.24.2" + "@esbuild/sunos-x64" "0.24.2" + "@esbuild/win32-arm64" "0.24.2" + "@esbuild/win32-ia32" "0.24.2" + "@esbuild/win32-x64" "0.24.2" + +fdir@^6.4.2: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +lilconfig@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-tsconfig@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +postcss-load-config@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +readdirp@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.1.tgz#bd115327129672dc47f87408f05df9bd9ca3ef55" + integrity sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +rollup@^4.24.0: + version "4.31.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4" + integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.31.0" + "@rollup/rollup-android-arm64" "4.31.0" + "@rollup/rollup-darwin-arm64" "4.31.0" + "@rollup/rollup-darwin-x64" "4.31.0" + "@rollup/rollup-freebsd-arm64" "4.31.0" + "@rollup/rollup-freebsd-x64" "4.31.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.31.0" + "@rollup/rollup-linux-arm-musleabihf" "4.31.0" + "@rollup/rollup-linux-arm64-gnu" "4.31.0" + "@rollup/rollup-linux-arm64-musl" "4.31.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.31.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.31.0" + "@rollup/rollup-linux-riscv64-gnu" "4.31.0" + "@rollup/rollup-linux-s390x-gnu" "4.31.0" + "@rollup/rollup-linux-x64-gnu" "4.31.0" + "@rollup/rollup-linux-x64-musl" "4.31.0" + "@rollup/rollup-win32-arm64-msvc" "4.31.0" + "@rollup/rollup-win32-ia32-msvc" "4.31.0" + "@rollup/rollup-win32-x64-msvc" "4.31.0" + fsevents "~2.3.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +sucrase@^3.35.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +tinyexec@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-deepmerge@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/ts-deepmerge/-/ts-deepmerge-7.0.2.tgz#6333adcde83e4c42366e9a9a7f955c74ee913547" + integrity sha512-akcpDTPuez4xzULo5NwuoKwYRtjQJ9eoNfBACiBMaXwNAx7B1PKfe5wqUFJuW5uKzQ68YjDFwPaWHDG1KnFGsA== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsup@^8.3.5: + version "8.3.5" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.3.5.tgz#d55344e4756e924bf6f442e54e7d324b4471eee0" + integrity sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA== + dependencies: + bundle-require "^5.0.0" + cac "^6.7.14" + chokidar "^4.0.1" + consola "^3.2.3" + debug "^4.3.7" + esbuild "^0.24.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.24.0" + source-map "0.8.0-beta.0" + sucrase "^3.35.0" + tinyexec "^0.3.1" + tinyglobby "^0.2.9" + tree-kill "^1.2.2" + +typescript@^5.2.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" diff --git a/yarn.lock b/yarn.lock index 5a1186b5d..a01f905cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,7 @@ "@arconnect/components-rebrand@github:arconnectio/components-rebrand.git#master": version "1.0.0" - resolved "git+ssh://git@github.com/arconnectio/components-rebrand.git#d8d6f0698f2f651391d3ca082af32e3c98ca03da" + resolved "https://codeload.github.com/arconnectio/components-rebrand/tar.gz/d8d6f0698f2f651391d3ca082af32e3c98ca03da" dependencies: "@iconicicons/react" "^1.5.1" "@untitled-ui/icons-react" "^0.1.4" @@ -161,7 +161,7 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.7" -"@babel/parser@^7.1.0", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": +"@babel/parser@^7.1.0", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== @@ -1236,6 +1236,49 @@ globby "^11.0.0" read-yaml-file "^1.1.0" +"@microsoft/api-extractor-model@7.30.3": + version "7.30.3" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz#d1256b6955c8c2a1115e0cfe99e1e8f9802e52cc" + integrity sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w== + dependencies: + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.11.0" + +"@microsoft/api-extractor@^7.49.1": + version "7.49.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.49.2.tgz#bc08c5fef1a3064f86657fd2e2f84c0ea64462f5" + integrity sha512-DI/WnvhbkHcucxxc4ys00ejCiViFls5EKPrEfe4NV3GGpVkoM5ZXF61HZNSGA8IG0oEV4KfTqIa59Rc3wdMopw== + dependencies: + "@microsoft/api-extractor-model" "7.30.3" + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.11.0" + "@rushstack/rig-package" "0.5.3" + "@rushstack/terminal" "0.14.6" + "@rushstack/ts-command-line" "4.23.4" + lodash "~4.17.15" + minimatch "~3.0.3" + resolve "~1.22.1" + semver "~7.5.4" + source-map "~0.6.1" + typescript "5.7.2" + +"@microsoft/tsdoc-config@~0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" + integrity sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw== + dependencies: + "@microsoft/tsdoc" "0.15.1" + ajv "~8.12.0" + jju "~1.4.0" + resolve "~1.22.2" + +"@microsoft/tsdoc@0.15.1", "@microsoft/tsdoc@~0.15.1": + version "0.15.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" + integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw== + "@mischnic/json-sourcemap@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz#38af657be4108140a548638267d02a2ea3336507" @@ -2965,7 +3008,7 @@ estree-walker "^2.0.2" magic-string "^0.30.3" -"@rollup/pluginutils@^5.0.1": +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.4": version "5.1.4" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== @@ -2974,100 +3017,140 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.1.tgz#a09cb0718297a2f0cc7f9b4dfca4d08753ea5c9b" - integrity sha512-kwctwVlswSEsr4ljpmxKrRKp1eG1v2NAhlzFzDf1x1OdYaMjBYjDCbHkzWm57ZXzTwqn8stMXgROrnMw8dJK3w== - -"@rollup/rollup-android-arm64@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.1.tgz#cbb3cad15748794b8dfec7f1e427e633f8f06d61" - integrity sha512-4H5ZtZitBPlbPsTv6HBB8zh1g5d0T8TzCmpndQdqq20Ugle/nroOyDMf9p7f88Gsu8vBLU78/cuh8FYHZqdXxw== - -"@rollup/rollup-darwin-arm64@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.1.tgz#7f5127bca8892d0287a53fb17be9c7af32748234" - integrity sha512-f2AJ7Qwx9z25hikXvg+asco8Sfuc5NCLg8rmqQBIOUoWys5sb/ZX9RkMZDPdnnDevXAMJA5AWLnRBmgdXGEUiA== - -"@rollup/rollup-darwin-x64@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.1.tgz#bbf8aa9fe655d75b5fb858b5bdbb1c790c36a3cd" - integrity sha512-+/2JBrRfISCsWE4aEFXxd+7k9nWGXA8+wh7ZUHn/u8UDXOU9LN+QYKKhd57sIn6WRcorOnlqPMYFIwie/OHXWw== - -"@rollup/rollup-freebsd-arm64@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.1.tgz#43f75cb686a23fc0aef3ce6bfe44501bf934e412" - integrity sha512-SUeB0pYjIXwT2vfAMQ7E4ERPq9VGRrPR7Z+S4AMssah5EHIilYqjWQoTn5dkDtuIJUSTs8H+C9dwoEcg3b0sCA== - -"@rollup/rollup-freebsd-x64@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.1.tgz#1d0377ef7a06bb3a6543bbbf18b6d65b55074802" - integrity sha512-L3T66wAZiB/ooiPbxz0s6JEX6Sr2+HfgPSK+LMuZkaGZFAFCQAHiP3dbyqovYdNaiUXcl9TlgnIbcsIicAnOZg== - -"@rollup/rollup-linux-arm-gnueabihf@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.1.tgz#1ca88b1244678e74984efe89b1e39b9ae74671c7" - integrity sha512-UBXdQ4+ATARuFgsFrQ+tAsKvBi/Hly99aSVdeCUiHV9dRTTpMU7OrM3WXGys1l40wKVNiOl0QYY6cZQJ2xhKlQ== - -"@rollup/rollup-linux-arm-musleabihf@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.1.tgz#33cdcac1befc32d7217b94b78c56fa5c194660cc" - integrity sha512-m/yfZ25HGdcCSwmopEJm00GP7xAUyVcBPjttGLRAqZ60X/bB4Qn6gP7XTwCIU6bITeKmIhhwZ4AMh2XLro+4+w== - -"@rollup/rollup-linux-arm64-gnu@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.1.tgz#4de1e8ade39d0da1e981ab05f94a69f3de72725a" - integrity sha512-Wy+cUmFuvziNL9qWRRzboNprqSQ/n38orbjRvd6byYWridp5TJ3CD+0+HUsbcWVSNz9bxkDUkyASGP0zS7GAvg== - -"@rollup/rollup-linux-arm64-musl@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.1.tgz#314f56ea347323d94107b8eb0dc6cb60ba4e0a35" - integrity sha512-CQ3MAGgiFmQW5XJX5W3wnxOBxKwFlUAgSXFA2SwgVRjrIiVt5LHfcQLeNSHKq5OEZwv+VCBwlD1+YKCjDG8cpg== - -"@rollup/rollup-linux-loongarch64-gnu@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.1.tgz#64f7871f5718a086786485b9c4d22fd263a37b44" - integrity sha512-rSzb1TsY4lSwH811cYC3OC2O2mzNMhM13vcnA7/0T6Mtreqr3/qs6WMDriMRs8yvHDI54qxHgOk8EV5YRAHFbw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.1.tgz#ad5902358a0d91bda75b3cbd45d61d1f6698b6f5" - integrity sha512-fwr0n6NS0pG3QxxlqVYpfiY64Fd1Dqd8Cecje4ILAV01ROMp4aEdCj5ssHjRY3UwU7RJmeWd5fi89DBqMaTawg== - -"@rollup/rollup-linux-riscv64-gnu@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.1.tgz#1d917841458ccc34dcc34be32ea0a4b33437370f" - integrity sha512-4uJb9qz7+Z/yUp5RPxDGGGUcoh0PnKF33QyWgEZ3X/GocpWb6Mb+skDh59FEt5d8+Skxqs9mng6Swa6B2AmQZg== - -"@rollup/rollup-linux-s390x-gnu@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.1.tgz#0c224baa3e1823f2b7b0e45dfaf43a99a18e8248" - integrity sha512-QlIo8ndocWBEnfmkYqj8vVtIUpIqJjfqKggjy7IdUncnt8BGixte1wDON7NJEvLg3Kzvqxtbo8tk+U1acYEBlw== - -"@rollup/rollup-linux-x64-gnu@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.1.tgz#f5fba18eda523cbe04f82cbf3e0685e461e71613" - integrity sha512-hzpleiKtq14GWjz3ahWvJXgU1DQC9DteiwcsY4HgqUJUGxZThlL66MotdUEK9zEo0PK/2ADeZGM9LIondE302A== - -"@rollup/rollup-linux-x64-musl@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.1.tgz#7439d15ffe62ac0468ef2d539d4c39b4686e1276" - integrity sha512-jqtKrO715hDlvUcEsPn55tZt2TEiBvBtCMkUuU0R6fO/WPT7lO9AONjPbd8II7/asSiNVQHCMn4OLGigSuxVQA== - -"@rollup/rollup-win32-arm64-msvc@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.1.tgz#125f09f40719ea7a02a76607428a0366ff9dca4d" - integrity sha512-RnHy7yFf2Wz8Jj1+h8klB93N0NHNHXFhNwAmiy9zJdpY7DE01VbEVtPdrK1kkILeIbHGRJjvfBDBhnxBr8kD4g== - -"@rollup/rollup-win32-ia32-msvc@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.1.tgz#04e36410a55fa36278a627ed769a60576c882d1d" - integrity sha512-i7aT5HdiZIcd7quhzvwQ2oAuX7zPYrYfkrd1QFfs28Po/i0q6kas/oRrzGlDhAEyug+1UfUtkWdmoVlLJj5x9Q== - -"@rollup/rollup-win32-x64-msvc@4.34.1": - version "4.34.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.1.tgz#37cddc33f8cd961a615f5f854d2b1994c90fe547" - integrity sha512-k3MVFD9Oq+laHkw2N2v7ILgoa9017ZMF/inTtHzyTVZjYs9cSH18sdyAf6spBAJIGwJ5UaC7et2ZH1WCdlhkMw== +"@rollup/rollup-android-arm-eabi@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.5.tgz#35f3e4bbd9e7ccf72e0beaa91052f3eb4274ad27" + integrity sha512-JXmmQcKQtpf3Z6lvA8akkrHDZ5AEfgc2hLMix1/X5BhQbezBQ0AP5GYLdU8jsQRme8qr2sscCe3wizp7UT0L9g== + +"@rollup/rollup-android-arm64@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.5.tgz#500406f6ad1d8cf39cbdb4af9decd47d8b6e46c6" + integrity sha512-9/A8/ZBOprUjkrJoP9BBEq2vdSud6BPd3LChw09bJQiEZH5oN4kWIkHu90cA0Cj0cSF5cIaD76+0lA+d5KHmpQ== + +"@rollup/rollup-darwin-arm64@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.5.tgz#76a2ed9d6c11d9a26ffbe7081e080c5a4e2e77d3" + integrity sha512-b9oCfgHKfc1AJEQ5sEpE8Kf6s7aeygj5bZAsl1hTpZc1V9cfZASFSXzzNj7o/BQNPbjmVkVxpCCLRhBfLXhJ5g== + +"@rollup/rollup-darwin-x64@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.5.tgz#cdf9913cca30ff5730005cb35d8dda315f1944bc" + integrity sha512-Gz42gKBQPoFdMYdsVqkcpttYOO/0aP7f+1CgMaeZEz0gss7dop1TsO3hT77Iroz/TV7PdPUG/RYlj9EA39L4dw== + +"@rollup/rollup-freebsd-arm64@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.5.tgz#791ae6793c4f18e2afaa630bf45366120b9151e3" + integrity sha512-JPkafjkOFaupd8VQYsXfGFKC2pfMr7hwSYGkVGNwhbW0k0lHHyIdhCSNBendJ4O7YlT4yRyKXoms1TL7saO7SQ== + +"@rollup/rollup-freebsd-x64@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.5.tgz#0dc91ebdde6973e3a48afe4f44d170b9d0585a5e" + integrity sha512-j6Q8VFqyI8hZM33h1JC6DZK2w8ejkXqEMozTrtIEGfRVMpVZL3GrLOOYEUkAgUSpJ9sb2w+FEpjGj7IHRcQfdw== + +"@rollup/rollup-linux-arm-gnueabihf@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.5.tgz#4481c1b9b64c64f5c41f88d33733b899a6326919" + integrity sha512-6jyiXKF9Xq6x9yQjct5xrRT0VghJk5VzAfed3o0hgncwacZkzOdR0TXLRNjexsEXWN8tG7jWWwsVk7WeFi//gw== + +"@rollup/rollup-linux-arm-musleabihf@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.5.tgz#d09deae1d92576bde9096fe20e3fb7438aed6120" + integrity sha512-cOTYe5tLcGAvGztRLIqx87LE7j/qjaAqFrrHsPFlnuhhhFO5LSr2AzvdQYuxomJMzMBrXkMRNl9bQEpDZ5bjLQ== + +"@rollup/rollup-linux-arm64-gnu@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.5.tgz#2c6ca31de0ff8d764162ab4ffec37ffa1e8bf0c5" + integrity sha512-KHlrd+YqmS7rriW+LBb1kQNYmd5w1sAIG3z7HEpnQOrg/skeYYv9DAcclGL9gpFdpnzmiAEkzsTT74kZWUtChQ== + +"@rollup/rollup-linux-arm64-musl@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.5.tgz#39a15d9e3baebbb10af6cc1cf953cbec23987774" + integrity sha512-uOb6hzDqym4Sw+qw3+svS3SmwQGVUhyTdPKyHDdlYg1Z0aHjdNmjwRY7zw/90/UfBe/yD7Mv2mYKhQpOfy4RYA== + +"@rollup/rollup-linux-loongarch64-gnu@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.5.tgz#7b59ce9aa4d181e8394555a34ed7bbb5818d69af" + integrity sha512-pARu8ZKANZH4wINLdHLKG69EPwJswM6A+Ox1a9LpiclRQoyjacFFTtXN3akKQ2ufJXDasO/pWvxKN9ZfCgEoFA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.5.tgz#66b0f7ca788ec1c6e9154556a77984307f855299" + integrity sha512-crUWn12NRmCdao2YwS1GvlPCVypMBMJlexTaantaP2+dAMd2eZBErFcKG8hZYEHjSbbk2UoH1aTlyeA4iKLqSA== + +"@rollup/rollup-linux-riscv64-gnu@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.5.tgz#642fd9af7fc9bd7bb4b9afde39460c48839348a4" + integrity sha512-XtD/oMhCdixi3x8rCNyDRMUsLo1Z+1UQcK+oR7AsjglGov9ETiT3TNFhUPzaGC1jH+uaMtPhxrVRUub+pnAKTg== + +"@rollup/rollup-linux-s390x-gnu@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.5.tgz#e3a00ac613313a30ab2a26afa0e2728d3c40b01a" + integrity sha512-V3+BvgyHb21aF7lw0sc78Tv0+xLp4lm2OM7CKFVrBuppsMvtl/9O5y2OX4tdDT0EhIsDP/ObJPqDuEg1ZoTwSQ== + +"@rollup/rollup-linux-x64-gnu@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.5.tgz#471a161af5053b5b220f6b4e11154fccfc6be27b" + integrity sha512-SkCIXLGk42yldTcH8UXh++m0snVxp9DLf4meb1mWm0lC8jzxjFBwSLGtUSeLgQDsC05iBaIhyjNX46DlByrApQ== + +"@rollup/rollup-linux-x64-musl@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.5.tgz#50246753c1f1cdaea03db264e0eff0f0ac5c4ad4" + integrity sha512-iUcH3FBtBN2/Ce0rI84suRhD0+bB5BVEffqOwsGaX5py5TuYLOQa7S7oVBP0NKtB5rub3i9IvZtMXiD96l5v0A== + +"@rollup/rollup-win32-arm64-msvc@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.5.tgz#d9f4a433addf4d36264ddc15130144ee8506665a" + integrity sha512-PUbWd+h/h6rUowalDYIdc9S9LJXbQDMcJe0BjABl3oT3efYRgZ8aUe8ZZDSie7y+fz6Z+rueNfdorIbkWv5Eqg== + +"@rollup/rollup-win32-ia32-msvc@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.5.tgz#7f1263e0ea24ee098952a89c42eb5a1a5345a32f" + integrity sha512-3vncGhOJiAUR85fnAXJyvSp2GaDWYByIQmW68ZAr+e8kIxgvJ1VaZbfHD5BO5X6hwRQdY6Um/XfA3l5c2lV+OQ== + +"@rollup/rollup-win32-x64-msvc@4.34.5": + version "4.34.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.5.tgz#a8996c4726a28caa7c68105101ca4ec655ffd65e" + integrity sha512-Mi8yVUlQOoeBpY72n75VLATptPGvj2lHa47rQdK9kZ4MoG5Ve86aVIU+PO3tBklTCBtILtdRfXS0EvIbXgmCAg== + +"@rushstack/node-core-library@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz#8ceb980f3a591e1254167bb5ffdc200d1893b783" + integrity sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ== + dependencies: + ajv "~8.13.0" + ajv-draft-04 "~1.0.0" + ajv-formats "~3.0.1" + fs-extra "~11.3.0" + import-lazy "~4.0.0" + jju "~1.4.0" + resolve "~1.22.1" + semver "~7.5.4" + +"@rushstack/rig-package@0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.3.tgz#ea4d8a3458540b1295500149c04e645f23134e5d" + integrity sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow== + dependencies: + resolve "~1.22.1" + strip-json-comments "~3.1.1" + +"@rushstack/terminal@0.14.6": + version "0.14.6" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.6.tgz#a58a6bbbd1dead6c0701960b583645f10e5577ec" + integrity sha512-4nMUy4h0u5PGXVG71kEA9uYI3l8GjVqewoHOFONiM6fuqS51ORdaJZ5ZXB2VZEGUyfg1TOTSy88MF2cdAy+lqA== + dependencies: + "@rushstack/node-core-library" "5.11.0" + supports-color "~8.1.1" + +"@rushstack/ts-command-line@4.23.4": + version "4.23.4" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.4.tgz#f04c04f039621c47e25793d551e67300cd0dfcba" + integrity sha512-pqmzDJCm0TS8VyeqnzcJ7ncwXgiLDQ6LVmXXfqv2nPL6VIz+UpyTpNVfZRJpyyJ+UDxqob1vIj2liaUfBjv8/A== + dependencies: + "@rushstack/terminal" "0.14.6" + "@types/argparse" "1.0.38" + argparse "~1.0.9" + string-argv "~0.3.1" "@sec-ant/readable-stream@^0.4.1": version "0.4.1" @@ -3252,51 +3335,51 @@ lodash-es "^4.17.21" read-pkg-up "^11.0.0" -"@sigstore/bundle@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-3.0.0.tgz#ffffc750436c6eb8330ead1ca65bc892f893a7c5" - integrity sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg== +"@sigstore/bundle@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-3.1.0.tgz#74f8f3787148400ddd364be8a9a9212174c66646" + integrity sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag== dependencies: - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" "@sigstore/core@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-2.0.0.tgz#f888a8e4c8fdaa27848514a281920b6fd8eca955" integrity sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg== -"@sigstore/protobuf-specs@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz#7dd46d68b76c322873a2ef7581ed955af6f4dcde" - integrity sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ== +"@sigstore/protobuf-specs@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz#7524509d93efcb14e77d0bc34c43a1ae85f851c5" + integrity sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A== -"@sigstore/sign@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-3.0.0.tgz#70752aaa54dfeafa0b0fbe1f58ebe9fe3d621f8f" - integrity sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw== +"@sigstore/sign@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-3.1.0.tgz#5d098d4d2b59a279e9ac9b51c794104cda0c649e" + integrity sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - make-fetch-happen "^14.0.1" + "@sigstore/protobuf-specs" "^0.4.0" + make-fetch-happen "^14.0.2" proc-log "^5.0.0" promise-retry "^2.0.1" -"@sigstore/tuf@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-3.0.0.tgz#5f657e3052e93cb09e1735ee7f52b7938351278d" - integrity sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw== +"@sigstore/tuf@^3.0.0", "@sigstore/tuf@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-3.1.0.tgz#f533ac8ac572c9f7e36f5e08f1effa6b2244f55a" + integrity sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA== dependencies: - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" tuf-js "^3.0.1" -"@sigstore/verify@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-2.0.0.tgz#4ad96e9234b71b57622c3c446b63bad805351030" - integrity sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg== +"@sigstore/verify@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-2.1.0.tgz#63e31dd69b678ed6d98cbfdc6d6c104b82d0905c" + integrity sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" "@sindresorhus/is@^4.6.0": version "4.6.0" @@ -3608,6 +3691,11 @@ "@tufjs/canonical-json" "2.0.0" minimatch "^9.0.5" +"@types/argparse@1.0.38": + version "1.0.38" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== + "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -3803,6 +3891,27 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.14.2" +"@volar/language-core@2.4.11", "@volar/language-core@~2.4.11": + version "2.4.11" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.11.tgz#d95a9ec4f14fbdb41a6a64f9f321d11d23a5291c" + integrity sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg== + dependencies: + "@volar/source-map" "2.4.11" + +"@volar/source-map@2.4.11": + version "2.4.11" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.11.tgz#5876d4531508129724c2755e295db1df98bd5895" + integrity sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ== + +"@volar/typescript@^2.4.11": + version "2.4.11" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.11.tgz#aafbfa413337654db211bf4d8fb6670c89f6fa57" + integrity sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw== + dependencies: + "@volar/language-core" "2.4.11" + path-browserify "^1.0.1" + vscode-uri "^3.0.8" + "@vue/compiler-core@3.3.4": version "3.3.4" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" @@ -3813,6 +3922,17 @@ estree-walker "^2.0.2" source-map-js "^1.0.2" +"@vue/compiler-core@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05" + integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== + dependencies: + "@babel/parser" "^7.25.3" + "@vue/shared" "3.5.13" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + "@vue/compiler-dom@3.3.4": version "3.3.4" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" @@ -3821,6 +3941,14 @@ "@vue/compiler-core" "3.3.4" "@vue/shared" "3.3.4" +"@vue/compiler-dom@^3.5.0": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" + integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== + dependencies: + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" + "@vue/compiler-sfc@3.3.4": version "3.3.4" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" @@ -3845,6 +3973,28 @@ "@vue/compiler-dom" "3.3.4" "@vue/shared" "3.3.4" +"@vue/compiler-vue2@^2.7.16": + version "2.7.16" + resolved "https://registry.yarnpkg.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249" + integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + +"@vue/language-core@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.2.0.tgz#e48c54584f889f78b120ce10a050dfb316c7fcdf" + integrity sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw== + dependencies: + "@volar/language-core" "~2.4.11" + "@vue/compiler-dom" "^3.5.0" + "@vue/compiler-vue2" "^2.7.16" + "@vue/shared" "^3.5.0" + alien-signals "^0.4.9" + minimatch "^9.0.3" + muggle-string "^0.4.1" + path-browserify "^1.0.1" + "@vue/reactivity-transform@3.3.4": version "3.3.4" resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" @@ -3893,6 +4043,11 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== +"@vue/shared@3.5.13", "@vue/shared@^3.5.0": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" + integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -3916,7 +4071,7 @@ abortcontroller-polyfill@^1.1.9: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz#fe8d4370403f02e2aa37e3d2b0b178bae9d83f49" integrity sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ== -acorn@^8.10.0, acorn@^8.9.0: +acorn@^8.10.0, acorn@^8.14.0, acorn@^8.9.0: version "8.14.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== @@ -3947,6 +4102,48 @@ aggregate-error@^5.0.0: clean-stack "^5.2.0" indent-string "^5.0.0" +ajv-draft-04@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + +ajv-formats@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv@^8.0.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ajv@~8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@~8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + dependencies: + fast-deep-equal "^3.1.3" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.4.1" + algo-msgpack-with-bigint@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" @@ -3968,6 +4165,11 @@ algosdk@^1.13.1: tweetnacl "^1.0.3" vlq "^2.0.4" +alien-signals@^0.4.9: + version "0.4.14" + resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-0.4.14.tgz#9ff8f72a272300a51692f54bd9bbbada78fbf539" + integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== + ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -4087,7 +4289,7 @@ arconnect@^0.4.2: dependencies: arweave "^1.10.13" -argparse@^1.0.7: +argparse@^1.0.7, argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -4370,6 +4572,14 @@ bottleneck@^2.15.3: resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" @@ -4611,9 +4821,9 @@ camelize@^1.0.0: integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-lite@^1.0.30001541, caniuse-lite@^1.0.30001688: - version "1.0.30001696" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz#00c30a2fc11e3c98c25e5125418752af3ae2f49f" - integrity sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ== + version "1.0.30001698" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001698.tgz#3e86d4bad6f87f493197fb2483a211fe8841abd3" + integrity sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw== cbor-sync@^1.0.4: version "1.0.4" @@ -4920,6 +5130,21 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compare-versions@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -5096,7 +5321,7 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -crypto-browserify@^3.11.0, crypto-browserify@^3.12.0: +crypto-browserify@^3.12.0, crypto-browserify@^3.12.1: version "3.12.1" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== @@ -5207,7 +5432,12 @@ dayjs@^1.11.6: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.4, debug@^4.3.6: +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.4, debug@^4.3.6, debug@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== @@ -5418,9 +5648,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.535, electron-to-chromium@^1.5.73: - version "1.5.91" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.91.tgz#cf5567f6853062493242133aefd4dc8dc8440abd" - integrity sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ== + version "1.5.96" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.96.tgz#afa3bf1608c897a7c7e33f22d4be1596dd5a4f3e" + integrity sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w== elliptic@6.5.4: version "6.5.4" @@ -5495,7 +5725,7 @@ entities@^3.0.1: resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== -entities@^4.4.0: +entities@^4.4.0, entities@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -5727,9 +5957,9 @@ expand-template@^2.0.3: integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== exponential-backoff@^3.1.0, exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== extendable-error@^0.1.5: version "0.1.7" @@ -5750,6 +5980,11 @@ fast-content-type-parse@^2.0.0: resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz#c236124534ee2cb427c8d8e5ba35a4856947847b" integrity sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q== +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" @@ -5777,6 +6012,11 @@ fast-glob@^3.2.9, fast-glob@^3.3.2: merge2 "^1.3.0" micromatch "^4.0.8" +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -5935,7 +6175,7 @@ fs-extra@11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.0.0: +fs-extra@^11.0.0, fs-extra@~11.3.0: version "11.3.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== @@ -6259,6 +6499,11 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hey-listen@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" @@ -6466,6 +6711,11 @@ import-from-esm@^1.0.3, import-from-esm@^1.3.1: debug "^4.3.4" import-meta-resolve "^4.0.0" +import-lazy@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-meta-resolve@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" @@ -6826,6 +7076,11 @@ java-properties@^1.0.2: resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== +jju@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== + joycon@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" @@ -6927,6 +7182,11 @@ json-schema-to-ts@2.9.2: "@types/json-schema" "^7.0.9" ts-algebra "^1.2.0" +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" @@ -6999,6 +7259,11 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + less@^4.1.1: version "4.2.2" resolved "https://registry.yarnpkg.com/less/-/less-4.2.2.tgz#4b59ede113933b58ab152190edf9180fc36846d8" @@ -7318,6 +7583,14 @@ load-tsconfig@^0.2.3: resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== +local-pkg@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" + integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== + dependencies: + mlly "^1.7.3" + pkg-types "^1.2.1" + locate-character@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" @@ -7385,7 +7658,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7434,7 +7707,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -magic-string@^0.30.0, magic-string@^0.30.3, magic-string@^0.30.4: +magic-string@^0.30.0, magic-string@^0.30.17, magic-string@^0.30.3, magic-string@^0.30.4: version "0.30.17" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== @@ -7449,7 +7722,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.3: +make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.2, make-fetch-happen@^14.0.3: version "14.0.3" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz#d74c3ecb0028f08ab604011e0bc6baed483fcdcd" integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== @@ -7612,13 +7885,20 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^9.0.0, minimatch@^9.0.4, minimatch@^9.0.5: +minimatch@^9.0.0, minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" +minimatch@~3.0.3: + version "3.0.8" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" + integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -7716,6 +7996,16 @@ mkdirp@^3.0.1: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== +mlly@^1.7.3, mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== + dependencies: + acorn "^8.14.0" + pathe "^2.0.1" + pkg-types "^1.3.0" + ufo "^1.5.4" + mnemonic-id@3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/mnemonic-id/-/mnemonic-id-3.2.7.tgz#f7d77d8b39e009ad068117cbafc458a6c6f8cddf" @@ -7771,6 +8061,11 @@ msgpackr@1.8.5, msgpackr@>=1.10.1, msgpackr@^1.5.4: optionalDependencies: msgpackr-extract "^3.0.2" +muggle-string@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" + integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== + multistream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" @@ -7951,9 +8246,9 @@ node-releases@^2.0.13, node-releases@^2.0.19: integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== node-stdlib-browser@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.3.0.tgz#6e04d149f9abfc345a2271b2820a75df0f9cd7de" - integrity sha512-g/koYzOr9Fb1Jc+tHUHlFd5gODjGn48tHexUK8q6iqOVriEgSnd3/1T7myBYc+0KBVze/7F7n65ec9rW6OD7xw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz#f41fa554f720a3df951e40339f4d92ac512222ac" + integrity sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw== dependencies: assert "^2.0.0" browser-resolve "^2.0.0" @@ -7962,7 +8257,7 @@ node-stdlib-browser@^1.3.0: console-browserify "^1.1.0" constants-browserify "^1.0.0" create-require "^1.1.1" - crypto-browserify "^3.11.0" + crypto-browserify "^3.12.1" domain-browser "4.22.0" events "^3.0.0" https-browserify "^1.0.0" @@ -8043,9 +8338,9 @@ npm-normalize-package-bin@^4.0.0: integrity sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== npm-package-arg@^12.0.0: - version "12.0.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.1.tgz#eb05e797b2fbdf8acf7f1d15344e1e05904202d5" - integrity sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ== + version "12.0.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.2.tgz#3b1e04ebe651cc45028e298664e8c15ce9c0ca40" + integrity sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA== dependencies: hosted-git-info "^8.0.0" proc-log "^5.0.0" @@ -8215,9 +8510,9 @@ object-assign@^4.0.1, object-assign@^4.1.1: integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-is@^1.1.5: version "1.1.6" @@ -8619,6 +8914,11 @@ path-type@^5.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== +pathe@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.2.tgz#5ed86644376915b3c7ee4d00ac8c348d671da3a5" + integrity sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w== + pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -8689,6 +8989,15 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" +pkg-types@^1.2.1, pkg-types@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + plasmo@0.86.3: version "0.86.3" resolved "https://registry.yarnpkg.com/plasmo/-/plasmo-0.86.3.tgz#f0605a3493539c484d97a9d8b15e2dfd2e0f6059" @@ -8733,9 +9042,9 @@ plimit-lit@^3.0.1: queue-lit "^3.0.0" possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss-load-config@^4.0.1: version "4.0.2" @@ -8758,7 +9067,7 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.10, postcss@^8.4.49: +postcss@^8.1.10, postcss@^8.5.1: version "8.5.1" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== @@ -9213,9 +9522,9 @@ readdirp@~3.6.0: picomatch "^2.2.1" redstone-api@^0.4.11: - version "0.4.12" - resolved "https://registry.yarnpkg.com/redstone-api/-/redstone-api-0.4.12.tgz#b634f710e13e95ba64d9cc8b3be7f004707a3e96" - integrity sha512-AR1zb7Pv4uXdfmJXj8rMl96x09krXUFgYDQaBXo5tn34e/VrE1VMja3DLR0W81izEjr8KcG9b9SHjIy5a1peWw== + version "0.4.13" + resolved "https://registry.yarnpkg.com/redstone-api/-/redstone-api-0.4.13.tgz#28819546f35de62eda61351d76f3dd86214d3840" + integrity sha512-PNPo9NZpTVEARAAtcbCs7B+ys9nLdcDDtw0fIl+5+RHGtvBEP99wR3W84f/Leazn0esn4ttRAL9SjMaLzS4zbA== dependencies: ar-gql "^0.0.6" arweave "^1.10.16" @@ -9264,6 +9573,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -9279,7 +9593,7 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.17.0: +resolve@^1.17.0, resolve@~1.22.1, resolve@~1.22.2: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -9335,32 +9649,32 @@ rollup@^3.2.5: optionalDependencies: fsevents "~2.3.2" -rollup@^4.23.0: - version "4.34.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.1.tgz#dcc318abee12e23dae4003af733c1987d7baca8e" - integrity sha512-iYZ/+PcdLYSGfH3S+dGahlW/RWmsqDhLgj1BT9DH/xXJ0ggZN7xkdP9wipPNjjNLczI+fmMLmTB9pye+d2r4GQ== +rollup@^4.30.1: + version "4.34.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.5.tgz#0c66e3a67cd35dc175ab01504d034a31ee4d0ad8" + integrity sha512-GyVCmpo9z/HYqFD8QWoBUnz1Q9xC22t8tPAZm/AvAcUg2U2/+DkboEvSioMwv042zE4I9N3FEhx7fiCT2YHzKQ== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.34.1" - "@rollup/rollup-android-arm64" "4.34.1" - "@rollup/rollup-darwin-arm64" "4.34.1" - "@rollup/rollup-darwin-x64" "4.34.1" - "@rollup/rollup-freebsd-arm64" "4.34.1" - "@rollup/rollup-freebsd-x64" "4.34.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.34.1" - "@rollup/rollup-linux-arm-musleabihf" "4.34.1" - "@rollup/rollup-linux-arm64-gnu" "4.34.1" - "@rollup/rollup-linux-arm64-musl" "4.34.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.34.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.34.1" - "@rollup/rollup-linux-riscv64-gnu" "4.34.1" - "@rollup/rollup-linux-s390x-gnu" "4.34.1" - "@rollup/rollup-linux-x64-gnu" "4.34.1" - "@rollup/rollup-linux-x64-musl" "4.34.1" - "@rollup/rollup-win32-arm64-msvc" "4.34.1" - "@rollup/rollup-win32-ia32-msvc" "4.34.1" - "@rollup/rollup-win32-x64-msvc" "4.34.1" + "@rollup/rollup-android-arm-eabi" "4.34.5" + "@rollup/rollup-android-arm64" "4.34.5" + "@rollup/rollup-darwin-arm64" "4.34.5" + "@rollup/rollup-darwin-x64" "4.34.5" + "@rollup/rollup-freebsd-arm64" "4.34.5" + "@rollup/rollup-freebsd-x64" "4.34.5" + "@rollup/rollup-linux-arm-gnueabihf" "4.34.5" + "@rollup/rollup-linux-arm-musleabihf" "4.34.5" + "@rollup/rollup-linux-arm64-gnu" "4.34.5" + "@rollup/rollup-linux-arm64-musl" "4.34.5" + "@rollup/rollup-linux-loongarch64-gnu" "4.34.5" + "@rollup/rollup-linux-powerpc64le-gnu" "4.34.5" + "@rollup/rollup-linux-riscv64-gnu" "4.34.5" + "@rollup/rollup-linux-s390x-gnu" "4.34.5" + "@rollup/rollup-linux-x64-gnu" "4.34.5" + "@rollup/rollup-linux-x64-musl" "4.34.5" + "@rollup/rollup-win32-arm64-msvc" "4.34.5" + "@rollup/rollup-win32-ia32-msvc" "4.34.5" + "@rollup/rollup-win32-x64-msvc" "4.34.5" fsevents "~2.3.2" rss-parser@^3.12.0: @@ -9429,9 +9743,9 @@ safe-regex-test@^1.1.0: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass@^1.38.0: - version "1.83.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.4.tgz#5ccf60f43eb61eeec300b780b8dcb85f16eec6d1" - integrity sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA== + version "1.84.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.84.0.tgz#da9154cbccb2d2eac7a9486091b6d9ba93ef5bad" + integrity sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -9517,7 +9831,7 @@ semver-regex@^4.0.5: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180" integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== -semver@7.5.4: +semver@7.5.4, semver@~7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -9674,16 +9988,16 @@ signale@^1.2.1: pkg-conf "^2.1.0" sigstore@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-3.0.0.tgz#d6eadcc6590185a7f1c16184078ce8a9ef6db937" - integrity sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-3.1.0.tgz#08dc6c0c425263e9fdab85ffdb6477550e2c511d" + integrity sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - "@sigstore/sign" "^3.0.0" - "@sigstore/tuf" "^3.0.0" - "@sigstore/verify" "^2.0.0" + "@sigstore/protobuf-specs" "^0.4.0" + "@sigstore/sign" "^3.1.0" + "@sigstore/tuf" "^3.1.0" + "@sigstore/verify" "^2.1.0" simple-concat@^1.0.0: version "1.0.1" @@ -9745,7 +10059,7 @@ socks@^2.8.3: ip-address "^9.0.5" smart-buffer "^4.2.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -9757,7 +10071,7 @@ source-map@0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" -source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -9884,6 +10198,11 @@ streamx@^2.15.0, streamx@^2.21.0: optionalDependencies: bare-events "^2.2.0" +string-argv@~0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -9955,6 +10274,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strip-json-comments@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + styled-components@^5.3.6: version "5.3.11" resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.11.tgz#9fda7bf1108e39bf3f3e612fcc18170dedcd57a8" @@ -10011,6 +10335,13 @@ supports-color@^9.4.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== +supports-color@~8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#b8e485b179681dea496a1e7abdf8985bd3145461" @@ -10383,11 +10714,21 @@ typescript@5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +typescript@5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + typescript@^4.6.2, typescript@^4.8.2: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +ufo@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== + uglify-js@^3.1.4: version "3.19.3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" @@ -10474,6 +10815,13 @@ update-browserslist-db@^1.0.13, update-browserslist-db@^1.1.1: escalade "^3.2.0" picocolors "^1.1.1" +uri-js@^4.2.2, uri-js@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + url-join@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" @@ -10536,6 +10884,21 @@ validate-npm-package-name@^6.0.0: resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz#3add966c853cfe36e0e8e6a762edd72ae6f1d6ac" integrity sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg== +vite-plugin-dts@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-4.5.0.tgz#a83899470dc3d423298755b615f1279abd49e0ac" + integrity sha512-M1lrPTdi7gilLYRZoLmGYnl4fbPryVYsehPN9JgaxjJKTs8/f7tuAlvCCvOLB5gRDQTTKnptBcB0ACsaw2wNLw== + dependencies: + "@microsoft/api-extractor" "^7.49.1" + "@rollup/pluginutils" "^5.1.4" + "@volar/typescript" "^2.4.11" + "@vue/language-core" "2.2.0" + compare-versions "^6.1.1" + debug "^4.4.0" + kolorist "^1.8.0" + local-pkg "^0.5.1" + magic-string "^0.30.17" + vite-plugin-node-stdlib-browser@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/vite-plugin-node-stdlib-browser/-/vite-plugin-node-stdlib-browser-0.2.1.tgz#6a598b3e1fecde6cdabe9c80a29adaeebc53463b" @@ -10544,13 +10907,13 @@ vite-plugin-node-stdlib-browser@^0.2.1: "@rollup/plugin-inject" "^5.0.3" vite@^6.0.3: - version "6.0.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.11.tgz#224497e93e940b34c3357c9ebf2ec20803091ed8" - integrity sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.1.0.tgz#00a4e99a23751af98a2e4701c65ba89ce23858a6" + integrity sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ== dependencies: esbuild "^0.24.2" - postcss "^8.4.49" - rollup "^4.23.0" + postcss "^8.5.1" + rollup "^4.30.1" optionalDependencies: fsevents "~2.3.3" @@ -10564,6 +10927,11 @@ vm-browserify@^1.0.1, vm-browserify@^1.1.2: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vscode-uri@^3.0.8: + version "3.1.0" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== + vue@3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6"