diff --git a/.gitignore b/.gitignore index f0ccc1c..86df0ee 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ dist package.zip index.css index.js +kernel.js /i18n diff --git a/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md new file mode 100644 index 0000000..a067677 --- /dev/null +++ b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md @@ -0,0 +1,708 @@ +# Kernel Plugin Demo Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Implement the TypeScript kernel plugin demo in `plugin-sample/src/kernel.ts` and extend `petal/kernel.d.ts` with the server-side port types needed to fully type WS and SSE server handlers. + +**Architecture:** Single `KernelPlugin` class covering all 8 API namespaces (`siyuan.plugin`, `siyuan.logger`, `console`, `siyuan.storage`, `siyuan.rpc`, `siyuan.client`, `siyuan.event`, `siyuan.server`). Type additions to `petal/kernel.d.ts` are additive and backward-compatible. The installed `siyuan` npm package in `plugin-sample/node_modules` is kept in sync manually until the package is republished. + +**Tech Stack:** TypeScript 6, goja JS runtime (kernel-side), webpack (esbuild-loader), TSDoc. + +**Spec:** `plugin-sample/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md` + +--- + +## File Map + +| File | Action | Responsibility | +|---|---|---| +| `petal/kernel.d.ts` | Modify lines 880–927 | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope.ws`/`.es` | +| `plugin-sample/node_modules/.pnpm/siyuan@1.2.2-alpha.0/node_modules/siyuan/kernel.d.ts` | Overwrite | Keep installed package in sync with `petal/kernel.d.ts` so TypeScript picks up new types locally | +| `plugin-sample/src/kernel.ts` | Rewrite | Full `KernelPlugin` class with TSDoc | + +--- + +## Task 1: Extend `petal/kernel.d.ts` with server-side port types + +**Files:** +- Modify: `petal/kernel.d.ts:880–927` + +### Background + +`IServerRequestHandler` currently hard-codes `IServerRequest` as the handler argument. WS and SSE server handlers receive an augmented request with a `port` property — so we need: + +- `IEsServerPort` — SSE server-side port (onopen/onclose/send/close) +- `IServerWsRequest extends IServerRequest` — adds `port: IWebSocket` +- `IServerEsRequest extends IServerRequest` — adds `port: IEsServerPort` +- `IServerRequestHandler` — second generic (default preserves backward compat); `handler` field uses `TReq` +- `IServerScope.ws` → `IServerRequestHandler`, `.es` → `IServerRequestHandler` + +- [ ] **Step 1: Insert new interfaces before `IServerRequestHandler`** + + Open `petal/kernel.d.ts`. Find the comment `// ── Server handler interfaces ─────────────────────────────────────────────────` (line ~879). Insert the following block immediately before the `IServerRequestHandler` interface (i.e. before line 882): + + ```typescript + // ── Server-side connection ports ────────────────────────────────────────────── + + /** + * Server-side SSE (Server-Sent Events) port provided to + * {@link IServerEsRequest.port}. + * + * @remarks + * The kernel opens the SSE response stream before invoking the handler. + * After the handler returns, the kernel fires {@link IEsServerPort.onopen} + * to signal that the stream is ready. Call {@link IEsServerPort.send} to + * push SSE events to the client and {@link IEsServerPort.close} to + * terminate the stream. The connection stays open until `close()` is called + * or the client disconnects. + */ + export interface IEsServerPort { + /** Called once when the SSE stream is ready to accept events. */ + onopen: ((event: IEventSourceOpenEvent) => void | Promise) | null; + /** Called when the client disconnects or after {@link IEsServerPort.close}. */ + onclose: ((event: IEventSourceCloseEvent) => void | Promise) | null; + /** + * Pushes one SSE event to the connected client. + * + * @remarks + * `send` is synchronous — no `await` required. It enqueues the event in + * the kernel's SSE write buffer; the actual flush is asynchronous. + * + * @param eventType - Value for the SSE `event:` field (e.g. `"message"`, `"update"`). + * @param data - Value for the SSE `data:` field (UTF-8 string). + */ + send(eventType: string, data: string): void; + /** Terminates the SSE stream and closes the response. */ + close(): void; + } + + /** + * The request object received by {@link IServerScope.ws | WebSocket server handlers}. + * + * @remarks + * Extends {@link IServerRequest} with a `port` property that mirrors the + * {@link IWebSocket} client interface. The kernel upgrades the HTTP connection + * to WebSocket before invoking the handler. After the handler returns, the + * kernel auto-opens the port's read loop if `port.open()` was not called + * explicitly. + */ + export interface IServerWsRequest extends IServerRequest { + /** + * Bidirectional WebSocket port connected to the client. + * + * @remarks + * Assign event callbacks (`onopen`, `onmessage`, `onping`, `onpong`, + * `onclose`, `onerror`) before the handler returns. Calling `port.open()` + * is optional — the kernel opens the read loop automatically. + */ + readonly port: IWebSocket; + } + + /** + * The request object received by {@link IServerScope.es | SSE server handlers}. + * + * @remarks + * Extends {@link IServerRequest} with a `port` property for pushing + * Server-Sent Events to the client. The kernel opens the SSE response before + * the handler is invoked; {@link IEsServerPort.onopen} fires once streaming + * begins. + */ + export interface IServerEsRequest extends IServerRequest { + /** + * Server-side SSE port for pushing events to the connected client. + * + * @remarks + * Assign `onopen` and `onclose` callbacks in the handler body. Call + * `port.send(eventType, data)` inside `onopen` to emit SSE events. + */ + readonly port: IEsServerPort; + } + + ``` + +- [ ] **Step 2: Replace `IServerRequestHandler` with the generic version** + + Replace the existing `IServerRequestHandler` interface (lines 882–899 approx): + + ```typescript + // BEFORE: + export interface IServerRequestHandler { + /** + * The function invoked for each incoming request of this type. + * + * @remarks The kernel passes the parsed {@link IServerRequest} as the + * sole argument and awaits any returned `Promise` before writing the + * response. + */ + handler: ((request: IServerRequest) => TRes | Promise) | null; + } + ``` + + With: + + ```typescript + // AFTER: + /** + * Handler slot for one request type within a server scope. + * + * @remarks + * The object is sealed by the kernel; only the `handler` property may be + * reassigned. Set `handler` to `null` to leave the slot empty — the kernel + * will return `500 Internal Server Error` for any unhandled request. + * + * @typeParam TRes - Expected return type of the handler function. + * @typeParam TReq - Request object type passed to the handler. Defaults to + * {@link IServerRequest} for the HTTP slot; specialised to + * {@link IServerWsRequest} and {@link IServerEsRequest} for the WS and SSE + * slots respectively. + */ + export interface IServerRequestHandler { + /** + * The function invoked for each incoming request of this type. + * + * @remarks + * The kernel passes the parsed request as the sole argument and awaits + * any returned `Promise` before writing the response. + */ + handler: ((request: TReq) => TRes | Promise) | null; + } + ``` + +- [ ] **Step 3: Update `IServerScope.ws` and `.es`** + + Replace the `IServerScope` interface body (the `ws` and `es` readonly properties and their doc blocks). The `http` property is unchanged. + + ```typescript + // BEFORE (ws block): + /** + * WebSocket upgrade handler. + * + * @remarks Reserved — not yet implemented by the kernel. + */ + readonly ws: IServerRequestHandler; + /** + * Server-Sent Events handler. + * + * @remarks Reserved — not yet implemented by the kernel. + */ + readonly es: IServerRequestHandler; + ``` + + ```typescript + // AFTER (ws + es blocks): + /** + * WebSocket upgrade handler. + * + * @remarks + * The handler receives an {@link IServerWsRequest} that includes + * `request.port`, a bidirectional {@link IWebSocket} connected to the + * client. Assign event callbacks before the handler returns; the kernel + * auto-opens the port's read loop afterwards. + */ + readonly ws: IServerRequestHandler; + /** + * Server-Sent Events handler. + * + * @remarks + * The handler receives an {@link IServerEsRequest} that includes + * `request.port`, an {@link IEsServerPort} for pushing SSE events. + * Assign `onopen` / `onclose` callbacks and call `port.send` inside + * `onopen`. + */ + readonly es: IServerRequestHandler; + ``` + +- [ ] **Step 4: Sync installed package** + + Copy the updated file so TypeScript in `plugin-sample` picks up the changes. + Run from the `plugin-sample` root (both repos are siblings): + + ```bash + cp ../petal/kernel.d.ts \ + node_modules/.pnpm/siyuan@1.2.2-alpha.0/node_modules/siyuan/kernel.d.ts + ``` + +- [ ] **Step 5: Commit `petal/kernel.d.ts`** + + ```bash + cd ../petal + git add kernel.d.ts + git commit -m "feat(kernel): add IEsServerPort, IServerWsRequest, IServerEsRequest; extend IServerRequestHandler generic" + ``` + +--- + +## Task 2: Implement `plugin-sample/src/kernel.ts` + +**Files:** +- Modify: `plugin-sample/src/kernel.ts` (currently a one-line stub) + +The full file content is specified below. Each method covers one or more API namespaces as documented in the spec. All type annotations reference interfaces from `petal/kernel.d.ts` via `/// `. + +- [ ] **Step 1: Write the full file** + + Replace the entire contents of `plugin-sample/src/kernel.ts` with: + + ```typescript + /// + + /** + * Reference implementation of the kernel plugin API for SiYuan. + * + * @remarks + * This class exercises every public surface on `globalThis.siyuan`. It is the + * living reference for community developers and is updated in lock-step with + * `petal/kernel.d.ts` whenever new kernel APIs are added. + * + * ## Lifecycle state machine + * + * ``` + * ready → loading → loaded → running → stopping → stopped + * ↓onload ↓onloaded ↓onrunning ↓onunload + * ``` + * + * Each hook is `async`-safe: the kernel awaits the returned `Promise` before + * advancing to the next state, so slow hooks stall the plugin's own startup. + * Keep hooks non-blocking; defer long-running work to fire-and-forget tasks. + * + * ## Adding a new API + * + * 1. Add the type declaration to `petal/kernel.d.ts`. + * 2. Add a demonstration call in the appropriate lifecycle method below. + * 3. Add a TSDoc block linking to the new interface and explaining any + * non-obvious constraints. + */ + class KernelPlugin { + private readonly siyuan: ISiyuan = globalThis.siyuan; + + /** Client-side WebSocket connection to the plugin's own RPC endpoint. */ + private ws: IWebSocket | null = null; + + /** Client-side SSE connection to the kernel broadcast endpoint. */ + private es: IEventSource | null = null; + + constructor() { + // Wire lifecycle hooks + this.siyuan.plugin.lifecycle.onload = this.onload.bind(this); + this.siyuan.plugin.lifecycle.onloaded = this.onloaded.bind(this); + this.siyuan.plugin.lifecycle.onrunning = this.onrunning.bind(this); + this.siyuan.plugin.lifecycle.onunload = this.onunload.bind(this); + + // Wire the inbound kernel event handler + this.siyuan.event.handler = this.eventHandler.bind(this); + + // Wire server-side request handlers (private scope: /plugin/private//*) + this.siyuan.server.private.http.handler = this.httpHandler.bind(this); + this.siyuan.server.private.ws.handler = this.wsHandler.bind(this); + this.siyuan.server.private.es.handler = this.esHandler.bind(this); + } + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link IRpc} and {@link IStorage}. + * + * @remarks + * Called when the plugin script is first evaluated. Register RPC methods + * here so they are ready once the plugin reaches the `running` state. + * RPC calls are rejected with `-32002` before `running` is reached. + * + * `siyuan.storage` paths are relative to + * `data/storage/petal//`. Path traversal is blocked by the + * kernel. + * + * @example + * ```ts + * await siyuan.rpc.bind("echo", async (...args) => args, "description"); + * ``` + */ + private async onload(): Promise { + const { rpc, storage, logger, plugin } = this.siyuan; + + // ── siyuan.logger (all five levels) ─────────────────────────────────── + // Unlike console.*, each call returns a Promise and serialises args as JSON. + await logger.trace("onload: plugin name =", plugin.name); + await logger.debug("onload: version =", plugin.version); + await logger.info( "onload: platform =", plugin.platform); + await logger.warn( "onload: i18n keys =", Object.keys(plugin.i18n)); + await logger.error("onload: (error-level demo — not a real error)"); + + // ── console.* (synchronous, Node.js util.format, 3 levels) ──────────── + // Routed to the kernel log at INFO/WARN/ERROR. No await needed. + console.log( "onload: console.log (sync, util.format)"); + console.warn( "onload: console.warn"); + console.error("onload: console.error"); + + // ── siyuan.rpc ──────────────────────────────────────────────────────── + // bind(name, fn, ...descriptions): registers a JSON-RPC method. + // The third argument and beyond are optional human-readable descriptions. + await rpc.bind( + "echo", + async (...args: any[]) => { + await logger.debug("echo called with:", args); + return args; + }, + "Returns all received arguments unchanged.", + ); + + // ── siyuan.storage ──────────────────────────────────────────────────── + // put: write a UTF-8 string to a path relative to the plugin data dir + await storage.put("demo.txt", new Date().toISOString()); + + // get: returns IDataObject — a lazy accessor; call each decoder at most once + const obj = await storage.get("demo.txt"); + await logger.debug("storage.get → text():", await obj.text()); + + const obj2 = await storage.get("demo.txt"); + await logger.debug("storage.get → json():", await obj2.json()); + + const obj3 = await storage.get("demo.txt"); + await logger.debug("storage.get → arrayBuffer():", await obj3.arrayBuffer()); + + // list: returns IStorageEntry[] for the given relative directory + const entries = await storage.list("."); + await logger.debug("storage.list:", entries); + + // remove: deletes a file or directory tree + await storage.remove("demo.txt"); + } + + /** + * Demonstrates {@link IClient.fetch} against the kernel's own REST API. + * + * @remarks + * Called after all plugins have completed `onload`. At this point every + * enabled kernel plugin is visible in the plugin registry. + * + * `siyuan.client.fetch` tunnels the request through the kernel and injects + * the plugin's JWT token automatically — no manual auth header needed. + * + * @example + * ```ts + * const resp = await siyuan.client.fetch("/api/system/version", { method: "POST", body: "{}" }); + * const data = await resp.json(); + * ``` + */ + private async onloaded(): Promise { + const { client, logger } = this.siyuan; + + // List all loaded plugins via the kernel REST API. + // fetch() returns IFetchResponse; the body is a lazy IDataObject. + const resp = await client.fetch("/api/plugin/listLoadedPlugins", { + method: "POST", + // body must be a string or ArrayBuffer + body: "{}", + }); + + await logger.debug("onloaded: resp.ok =", resp.ok); + await logger.debug("onloaded: resp.status =", resp.status); + await logger.debug("onloaded: resp.statusText =", resp.statusText); + await logger.debug("onloaded: resp.headers =", resp.headers); + await logger.debug("onloaded: listLoadedPlugins =", await resp.json()); + } + + /** + * Demonstrates {@link IClient.socket} (WebSocket client) and + * {@link IClient.event} (SSE client), plus an HTTP JSON-RPC loopback call. + * + * @remarks + * Called after `onloaded` resolves. The kernel is fully running and all + * RPC methods registered in `onload` are now reachable. + * + * ### WebSocket client + * `siyuan.client.socket` returns a sealed {@link IWebSocket} in + * `CONNECTING` state immediately. **`ws.open()` must be called explicitly** + * to initiate the TCP/WebSocket handshake; `onopen` fires only after + * `open()` resolves. Assign all callbacks before calling `open()`. + * + * ### SSE client + * `siyuan.client.event` returns immediately; the kernel starts the SSE + * subscription in the background and fires `onopen` once connected. + * + * @example + * ```ts + * // Assign all callbacks BEFORE calling open(). + * const ws = await siyuan.client.socket("/ws/plugin/rpc/my-plugin"); + * ws.onopen = async () => { await ws.send("hello"); }; + * await ws.open(); + * ``` + */ + private async onrunning(): Promise { + const { client, logger, plugin } = this.siyuan; + + // ── HTTP RPC loopback (JS → HTTP → Go → JS → Go → HTTP → JS) ────────── + const echoResp = await client.fetch( + `/api/plugin/rpc/${plugin.name}`, + { + method: "POST", + // body must be a string — stringify the JSON-RPC payload + body: JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: ["hello from onrunning", 42, { key: true }], + id: 1, + }), + }, + ); + await logger.debug("onrunning: HTTP RPC echo =", await echoResp.json()); + + // ── WebSocket client ────────────────────────────────────────────────── + this.ws = await client.socket(`/ws/plugin/rpc/${plugin.name}`); + + // Assign all callbacks before calling open() — onopen fires only after + // the TCP/WebSocket handshake completes. + this.ws.onopen = async (event) => { + await logger.debug("ws client: open", event); + // Send a JSON-RPC request over the WebSocket connection + await this.ws!.send(JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: { message: "hello via WebSocket", ts: Date.now() }, + id: 2, + })); + // Demonstrate ping/pong control frames + await this.ws!.ping("ping from plugin"); + }; + this.ws.onmessage = async (event) => { await logger.debug("ws client: message", event); }; + this.ws.onping = async (event) => { await logger.debug("ws client: ping", event); }; + this.ws.onpong = async (event) => { await logger.debug("ws client: pong", event); }; + this.ws.onerror = async (event) => { await logger.debug("ws client: error", event); }; + this.ws.onclose = async (event) => { await logger.debug("ws client: close", event); }; + + // Initiate the connection after wiring all callbacks + await this.ws.open(); + + // ── SSE / EventSource client ────────────────────────────────────────── + this.es = await client.event("/es/broadcast/subscribe"); + this.es.onopen = async (e) => { await logger.debug("es client: open", e); }; + this.es.onmessage = async (e) => { await logger.debug("es client: message", e); }; + this.es.onclose = async (e) => { await logger.debug("es client: close", e); }; + this.es.onerror = async (e) => { await logger.debug("es client: error", e); }; + } + + /** + * Demonstrates {@link IRpc.broadcast} and connection cleanup. + * + * @remarks + * Called when the plugin is stopping. `rpc.broadcast` pushes a JSON-RPC + * 2.0 notification (no `id`) to all connected RPC WebSocket clients. It + * is a no-op if the plugin is not in the `running` state, so it is safe + * to call here even during a fast shutdown. + * + * After broadcasting, close any open client-side connections to avoid + * resource leaks in the kernel process. + */ + private async onunload(): Promise { + const { rpc, logger } = this.siyuan; + + // Unbind the RPC method registered in onload + await rpc.unbind("echo"); + + // Push a notification to all connected RPC WebSocket clients + await rpc.broadcast("unload", ["Plugin is unloading"]); + + // Close client-side connections — optional chaining guards against the + // case where onrunning was never reached (e.g. error during startup) + this.ws?.close(); + this.es?.close(); + + await logger.debug("onunload: cleanup complete"); + } + + // ── Event bridge ────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link IEvent.handler} (receive) and {@link IEvent.emit} (publish). + * + * @remarks + * `siyuan.event.handler` receives every kernel broadcast event. + * `event` has shape `{ id: UUID, type: string, detail: any }`. + * + * `siyuan.event.emit` publishes an event to the in-process bus. + * The first argument is the topic string used for routing; + * the second is the payload. + * + * @param event - The incoming kernel event message. + */ + private async eventHandler(event: IEventMessage): Promise { + const { event: eventApi, logger } = this.siyuan; + + await logger.debug("event received:", event); + + // Re-publish the event under the "plugin" topic + await eventApi.emit("plugin", { + id: event.id, + type: "echo", + detail: event, + }); + } + + // ── Server-side handlers ────────────────────────────────────────────────── + + /** + * Demonstrates the HTTP server handler at + * `ANY /plugin/private//*path`. + * + * @remarks + * Must return an {@link IHttpResponse}. The `body` field supports: + * `data` (JSON / XML / YAML / …), `file` (local filesystem path), + * `string` (Go `fmt.Sprintf`), `raw` (bytes + Content-Type), `redirect`. + * Set exactly one; the kernel uses the first non-null value. + * + * The route requires kernel authentication and admin role — unauthenticated + * requests are rejected before reaching the handler. + * + * @param request - Parsed URL, headers, body, and Gin routing context. + * @returns An {@link IHttpResponse} that the kernel writes to the client. + */ + private async httpHandler(request: IServerRequest): Promise { + await this.siyuan.logger.debug("http handler: path =", request.url.path); + + return { + statusCode: 200, + headers: { + // Multi-value headers are arrays of strings + "X-Plugin": [this.siyuan.plugin.name], + }, + body: { + // type: "JSON" delegates to c.JSON in Gin + data: { + type: "JSON", + data: { + path: request.url.path, + method: request.request.method, + contentType: request.request.contentType, + query: request.url.query, + params: request.context.params, + }, + }, + }, + }; + } + + /** + * Demonstrates the WebSocket server handler at + * `GET /plugin/private//*path` (WebSocket upgrade). + * + * @remarks + * `request.port` mirrors the {@link IWebSocket} interface — same event + * callbacks, same `send` / `ping` / `pong` / `close` methods. + * + * Assign all callbacks in this handler body. The kernel auto-opens the + * port's read loop after the handler returns; calling `port.open()` + * explicitly is optional. + * + * `onmessage` events carry + * `{ type: "text" | "binary", data: string | ArrayBuffer }`. + * + * @param request - Server request augmented with `port` (a bidirectional + * WebSocket back-channel to the connected client). + */ + private async wsHandler(request: IServerWsRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("ws server: port open", event); + // Greet the client on connection + await request.port.send("Hello from plugin WebSocket server!"); + }; + request.port.onmessage = async (event) => { + await logger.debug("ws server: message", event); + // Echo the message back to the client + await request.port.send(event.data as string); + }; + request.port.onping = async (event) => { + await logger.debug("ws server: ping", event); + // Reply with a pong carrying the same application data + await request.port.pong(event.data); + }; + request.port.onpong = async (event) => { await logger.debug("ws server: pong", event); }; + request.port.onclose = async (event) => { await logger.debug("ws server: close", event); }; + request.port.onerror = async (event) => { await logger.debug("ws server: error", event); }; + // port.open() is optional — the kernel auto-opens after this handler returns. + } + + /** + * Demonstrates the SSE server handler at + * `GET /plugin/private//*path` (Server-Sent Events). + * + * @remarks + * `request.port.onopen` fires once the SSE stream is ready. Call + * `port.send(eventType, data)` inside `onopen` or later to push events. + * `eventType` maps to the SSE `event:` field; `data` maps to `data:`. + * `send` is **synchronous** — no `await` needed. + * + * The connection stays open until `port.close()` is called or the + * client disconnects, which fires `onclose`. + * + * @param request - Server request augmented with `port` (an SSE + * back-channel to the connected client). + */ + private async esHandler(request: IServerEsRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("sse server: port open", event); + // send is synchronous; eventType becomes the SSE `event:` field + request.port.send("message", "Connected to plugin SSE!"); + request.port.send("update", JSON.stringify({ ts: Date.now() })); + }; + request.port.onclose = async (event) => { + await logger.debug("sse server: port close", event); + }; + } + } + + new KernelPlugin(); + ``` + +- [ ] **Step 2: Verify TypeScript types** + + The project uses `esbuild-loader` which strips types without checking them — `npm run build` will succeed even if types are wrong. Use `tsc --noEmit` to actually type-check. + Run from the `plugin-sample` root: + + ```bash + npx tsc --noEmit 2>&1 + ``` + + Expected: no output (zero errors). Fix any reported errors before proceeding. + +- [ ] **Step 3: Build the production bundle** + + ```bash + npm run build 2>&1 | tail -20 + ``` + + Expected: webpack exits with code 0. The build produces `dist/kernel.js`. + +- [ ] **Step 4: Commit `plugin-sample/src/kernel.ts`** + + ```bash + git add src/kernel.ts + git commit -m "feat: implement kernel plugin demo with full API coverage and TSDoc" + ``` + +--- + +## Task 3: Verify the built output is valid for the goja runtime + +The webpack build outputs `kernel.js` in CommonJS2 format. The goja runtime in the kernel loads it as a CommonJS module. + +- [ ] **Step 1: Confirm `siyuan` is the only external `require` call** + + `webpack.config.js` declares `siyuan` as an external, so `require("siyuan")` will appear in the bundle — that is expected and intentional. Any other `require("")` would indicate an accidental import of a module the goja runtime cannot resolve. + Run from the `plugin-sample` root: + + ```bash + grep -o 'require("[^"]*")' dist/kernel.js | sort -u + ``` + + Expected output: exactly `require("siyuan")` (the external stub). Any additional package name is a bug — investigate and remove the offending import. + +- [ ] **Step 2: Confirm file size is reasonable** + + ```bash + wc -c dist/kernel.js + ``` + + Expected: a few kilobytes (minified). A multi-megabyte file would indicate an accidental bundling of large dependencies. diff --git a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md new file mode 100644 index 0000000..654a16a --- /dev/null +++ b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md @@ -0,0 +1,146 @@ +# Kernel Plugin Demo — Design Spec + +**Date:** 2026-05-09 +**Status:** Approved +**Scope:** `plugin-sample/src/kernel.ts` + `petal/kernel.d.ts` + +--- + +## Goal + +Implement a TypeScript reference demo of the kernel plugin API in `src/kernel.ts`. This file is the living, authoritative example for community developers. It will be updated alongside `petal/kernel.d.ts` whenever new kernel APIs are added. + +--- + +## Architecture + +### `src/kernel.ts` + +Single file, single class `KernelPlugin`. Webpack compiles it to `kernel.js` (CommonJS2, executed inside the kernel's goja runtime). + +``` +/// + +class KernelPlugin { + private readonly siyuan: ISiyuan + private ws: IWebSocket | null + private es: IEventSource | null + + constructor() — wire lifecycle hooks + server/event handlers + onload() — siyuan.rpc.bind + siyuan.storage CRUD + onloaded() — siyuan.client.fetch (kernel REST API) + onrunning() — HTTP RPC loopback + WebSocket client + SSE client + onunload() — rpc.broadcast + ws/es cleanup + eventHandler() — siyuan.event.handler + siyuan.event.emit + httpHandler() — siyuan.server.private.http.handler → IHttpResponse + wsHandler() — siyuan.server.private.ws.handler (IServerWsRequest) + esHandler() — siyuan.server.private.es.handler (IServerEsRequest) +} + +new KernelPlugin(); +``` + +### `petal/kernel.d.ts` additions + +The current `IServerRequestHandler` hard-codes `IServerRequest` as the handler argument. WS and SSE server handlers receive an augmented request that also carries a `port` back-channel to the connected client. The following additions are required (all backward-compatible): + +| Addition | Purpose | +|---|---| +| `IEsServerPort` | Server-side SSE port: `onopen`, `onclose`, `send(eventType: string, data: string): void` (synchronous — no `await` needed), `close(): void` | +| `IServerWsRequest extends IServerRequest` | Adds `port: IWebSocket` for WS server handlers | +| `IServerEsRequest extends IServerRequest` | Adds `port: IEsServerPort` for SSE server handlers | +| `IServerRequestHandler` | Second type param (default = `IServerRequest`) — backward-compatible. The `handler` field body is updated to `((request: TReq) => TRes \| Promise) \| null` so the type parameter is actually applied to the handler argument | +| `IServerScope.ws` / `.es` updated | `IServerRequestHandler` / `IServerRequestHandler` | + +--- + +## API Coverage + +Every public API on `globalThis.siyuan` is exercised: + +| Namespace | Demonstrated | +|---|---| +| `siyuan.plugin` | `name`, `version`, `platform`, `i18n`; all four lifecycle hooks | +| `siyuan.logger` | All five levels: `trace`, `debug`, `info`, `warn`, `error` | +| `console` | Sync logging; note difference vs `siyuan.logger` (sync, 3 levels, `util.format`) | +| `siyuan.storage` | `put`, `get` → `.text()` / `.json()` / `.arrayBuffer()`, `list`, `remove` | +| `siyuan.rpc` | `bind` (with description), `unbind`, `broadcast` | +| `siyuan.client` | `fetch` (HTTP RPC loopback), `socket` (WS client), `event` (SSE client) | +| `siyuan.event` | `handler` (receive), `emit` (publish) | +| `siyuan.server` | `private.http.handler`, `private.ws.handler`, `private.es.handler` | + +--- + +## Comment Strategy (TSDoc) + +### Method-level TSDoc blocks + +Every method gets a TSDoc block with: +- Summary line describing which API/feature it demonstrates +- `@remarks` for behavioral constraints (e.g. lifecycle state semantics, when RPC calls are accepted) +- `@example` snippet for non-obvious usage patterns (e.g. `ws.open()` must be called explicitly) + +Example: + +```typescript +/** + * Demonstrates {@link IRpc}: registering, calling, and broadcasting RPC methods. + * + * @remarks + * `siyuan.rpc.bind` should be called in `onload` so methods are ready when the + * plugin reaches the `running` state. RPC calls are rejected with `-32002` if + * the plugin has not yet reached `running`. + */ +private async onload(): Promise { ... } +``` + +### Inline comments + +Key constraints or non-obvious behavior are annotated at the call site: + +```typescript +// Assign all callbacks before calling open() — onopen fires only after +// the TCP/WebSocket handshake completes. +await this.ws.open(); +``` + +### Class-level TSDoc + +`KernelPlugin` gets a full class-level doc block explaining: +- purpose (living reference for the kernel plugin API) +- lifecycle state diagram reference +- how to update the file when new APIs are added + +--- + +## Type Usage + +| Location | Type | +|---|---| +| `this.siyuan` field | `ISiyuan` | +| `this.ws` field | `IWebSocket \| null` | +| `this.es` field | `IEventSource \| null` | +| `onload` / `onloaded` / `onrunning` / `onunload` | `() => Promise` | +| `eventHandler` param | `IEventMessage` | +| `httpHandler` param | `IServerRequest` | +| `httpHandler` return | `IHttpResponse` | +| `wsHandler` param | `IServerWsRequest` | +| `esHandler` param | `IServerEsRequest` | +| `any` | Only where the underlying API type is already `any` (e.g. `IEventMessage.detail`, `IRpc.bind` fn args) | + +--- + +## Files Changed + +| File | Change | +|---|---| +| `plugin-sample/src/kernel.ts` | Full implementation (was a one-line stub) | +| `petal/kernel.d.ts` | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope` | + +--- + +## Out of Scope + +- No changes to `src/index.ts`, `plugin.json`, `webpack.config.js`, or any other file +- No new dependencies +- No unit tests (kernel plugin runs inside goja; tested by loading in a live SiYuan instance) diff --git a/package.json b/package.json index a029cb7..4666ff4 100644 --- a/package.json +++ b/package.json @@ -5,30 +5,34 @@ "main": ".src/index.js", "scripts": { "lint": "eslint . --fix --cache", - "dev": "webpack --mode development", - "build": "webpack --mode production" + "dev": "pnpm run dev:kernel & pnpm run dev:app", + "dev:app": "webpack --config webpack.config.js --mode development", + "dev:kernel": "webpack --config webpack.kernel.config.js --mode development", + "build": "pnpm run build:kernel && pnpm run build:app", + "build:app": "webpack --config webpack.config.js --mode production", + "build:kernel": "webpack --config webpack.kernel.config.js --mode production" }, "keywords": [], "author": "Vanessa", "license": "MIT", "devDependencies": { - "@eslint/eslintrc": "^3.3.3", - "@eslint/js": "^9.39.1", - "@typescript-eslint/eslint-plugin": "8.40.0", - "@typescript-eslint/parser": "8.40.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.1", - "esbuild-loader": "^3.0.1", - "eslint": "^9.33.0", - "mini-css-extract-plugin": "2.3.0", - "sass": "^1.62.1", - "sass-loader": "^12.6.0", - "siyuan": "1.2.0", - "tslib": "2.4.0", - "typescript": "4.8.4", - "webpack": "^5.76.0", - "webpack-cli": "^5.0.2", - "zip-webpack-plugin": "^4.0.1", - "globals": "^16.3.0" + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "^10.0.1", + "@typescript-eslint/eslint-plugin": "^8.59.2", + "@typescript-eslint/parser": "^8.59.2", + "copy-webpack-plugin": "^14.0.0", + "css-loader": "^7.1.4", + "esbuild-loader": "^4.4.3", + "eslint": "^10.3.0", + "globals": "^17.6.0", + "mini-css-extract-plugin": "^2.10.2", + "sass": "^1.99.0", + "sass-loader": "^16.0.8", + "siyuan": "1.2.2-alpha.0", + "tslib": "^2.8.1", + "typescript": "^6.0.3", + "webpack": "^5.106.2", + "webpack-cli": "^7.0.2", + "zip-webpack-plugin": "^4.0.3" } } diff --git a/plugin.json b/plugin.json index 6b20c59..c94b557 100644 --- a/plugin.json +++ b/plugin.json @@ -4,6 +4,16 @@ "url": "https://github.com/siyuan-note/plugin-sample", "version": "0.4.7", "minAppVersion": "3.6.4", + "kernels": [ + "windows", + "linux", + "darwin", + "ios", + "android", + "harmony", + "docker", + "all" + ], "backends": [ "windows", "linux", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0977ce3..39f3795 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,206 +9,233 @@ importers: .: devDependencies: '@eslint/eslintrc': - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.3.5 + version: 3.3.5 '@eslint/js': - specifier: ^9.39.1 - version: 9.39.1 + specifier: ^10.0.1 + version: 10.0.1(eslint@10.3.0) '@typescript-eslint/eslint-plugin': - specifier: 8.40.0 - version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.39.1)(typescript@4.8.4))(eslint@9.39.1)(typescript@4.8.4) + specifier: ^8.59.2 + version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: 8.40.0 - version: 8.40.0(eslint@9.39.1)(typescript@4.8.4) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) copy-webpack-plugin: - specifier: ^11.0.0 - version: 11.0.0(webpack@5.104.1) + specifier: ^14.0.0 + version: 14.0.0(webpack@5.106.2) css-loader: - specifier: ^6.7.1 - version: 6.11.0(webpack@5.104.1) + specifier: ^7.1.4 + version: 7.1.4(webpack@5.106.2) esbuild-loader: - specifier: ^3.0.1 - version: 3.2.0(webpack@5.104.1) + specifier: ^4.4.3 + version: 4.4.3(webpack@5.106.2) eslint: - specifier: ^9.33.0 - version: 9.39.1 + specifier: ^10.3.0 + version: 10.3.0 globals: - specifier: ^16.3.0 - version: 16.5.0 + specifier: ^17.6.0 + version: 17.6.0 mini-css-extract-plugin: - specifier: 2.3.0 - version: 2.3.0(webpack@5.104.1) + specifier: ^2.10.2 + version: 2.10.2(webpack@5.106.2) sass: - specifier: ^1.62.1 - version: 1.94.2 + specifier: ^1.99.0 + version: 1.99.0 sass-loader: - specifier: ^12.6.0 - version: 12.6.0(sass@1.94.2)(webpack@5.104.1) + specifier: ^16.0.8 + version: 16.0.8(sass@1.99.0)(webpack@5.106.2) siyuan: - specifier: 1.2.0 - version: 1.2.0 + specifier: 1.2.2-alpha.0 + version: 1.2.2-alpha.0 tslib: - specifier: 2.4.0 - version: 2.4.0 + specifier: ^2.8.1 + version: 2.8.1 typescript: - specifier: 4.8.4 - version: 4.8.4 + specifier: ^6.0.3 + version: 6.0.3 webpack: - specifier: ^5.76.0 - version: 5.104.1(webpack-cli@5.1.4) + specifier: ^5.106.2 + version: 5.106.2(webpack-cli@7.0.2) webpack-cli: - specifier: ^5.0.2 - version: 5.1.4(webpack@5.104.1) + specifier: ^7.0.2 + version: 7.0.2(webpack@5.106.2) zip-webpack-plugin: - specifier: ^4.0.1 - version: 4.0.3(webpack-sources@3.3.3)(webpack@5.104.1) + specifier: ^4.0.3 + version: 4.0.3(webpack-sources@3.4.1)(webpack@5.106.2) packages: - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + '@discoveryjs/json-ext@1.1.0': + resolution: {integrity: sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==} + engines: {node: '>=14.17.0'} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + '@dop251/types-goja_nodejs-buffer@0.0.0-20260212111938-1f56ff5bcf14': + resolution: {integrity: sha512-+ZEK3z3RVSE9O7Ml8HoeLtYSI/yR2ifa7Ppabfjq5fW06Kf00PcUz6hjz2we1h9CxlhiI7pLglEy4+hTUYGsQA==} + + '@dop251/types-goja_nodejs-global@0.0.0-20260212111938-1f56ff5bcf14': + resolution: {integrity: sha512-NYnSveyts20w79Qp+Cs6a8vyrP3+8QVisseCU/2F0rMXK/WmLvbQYmyjNFMlDbY8g3HcooTIB/2AwcwonabQEg==} + + '@dop251/types-goja_nodejs-url@0.0.0-20260212111938-1f56ff5bcf14': + resolution: {integrity: sha512-RyxfUr5u0WOO0dV2/BxV+zJ2QwUqnIoSwIoPQcGHakWp8elJ/nSU86pUB9gSO77e2XHWZYAZvNN5tXa9yOXJaA==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -217,40 +244,49 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -277,98 +313,92 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} '@types/eslint-scope@3.7.7': @@ -377,72 +407,75 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.2.1': - resolution: {integrity: sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==} + '@types/node@25.6.2': + resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} - '@typescript-eslint/eslint-plugin@8.40.0': - resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} + '@typescript-eslint/eslint-plugin@8.59.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.40.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.59.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.40.0': - resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.40.0': - resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.40.0': - resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} + '@typescript-eslint/scope-manager@8.59.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.40.0': - resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.40.0': - resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} + '@typescript-eslint/type-utils@8.59.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.40.0': - resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.40.0': - resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.40.0': - resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.40.0': - resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@webassemblyjs/ast@1.14.1': @@ -490,31 +523,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webpack-cli/configtest@2.1.1': - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - - '@webpack-cli/info@2.0.2': - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - - '@webpack-cli/serve@2.0.5': - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -532,8 +540,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -545,25 +553,16 @@ packages: ajv: optional: true - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -571,25 +570,27 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.27: + resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + engines: {node: '>=6.0.0'} hasBin: true big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -603,12 +604,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} @@ -622,19 +619,9 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -642,9 +629,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - copy-webpack-plugin@11.0.0: - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} + copy-webpack-plugin@14.0.0: + resolution: {integrity: sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==} + engines: {node: '>= 20.9.0'} peerDependencies: webpack: ^5.1.0 @@ -652,12 +639,12 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} + css-loader@7.1.4: + resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==} + engines: {node: '>= 18.12.0'} peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + webpack: ^5.27.0 peerDependenciesMeta: '@rspack/core': optional: true @@ -681,24 +668,19 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - electron-to-chromium@1.5.286: - resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + electron-to-chromium@1.5.352: + resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} engines: {node: '>=10.13.0'} envinfo@7.21.0: @@ -706,17 +688,21 @@ packages: engines: {node: '>=4'} hasBin: true - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} - esbuild-loader@3.2.0: - resolution: {integrity: sha512-lnIdRMQpk50alCa0QoW0ozc0D3rjJXl02mtMsk9INIcW25RPZhDja332bu85ixwVNbhQ7VfBRcQyZ/qza8mWiA==} + esbuild-loader@4.4.3: + resolution: {integrity: sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -731,9 +717,9 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -743,9 +729,13 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -757,8 +747,12 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -784,34 +778,32 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -828,18 +820,14 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} @@ -852,26 +840,19 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} icss-utils@5.1.0: @@ -888,8 +869,8 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -908,8 +889,8 @@ packages: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -920,10 +901,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -946,9 +923,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -970,16 +944,12 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -994,46 +964,31 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} - mini-css-extract-plugin@2.3.0: - resolution: {integrity: sha512-uzWaOwC+gJrnKbr23J1ZRWx/Wd9W9Ce1mKPlsBGBV/r8zG7/G7oKMxGmxbI65pVGbae2cR7CUx9Ulk0HQt8BfQ==} + mini-css-extract-plugin@2.10.2: + resolution: {integrity: sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1046,8 +1001,8 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -1092,16 +1047,12 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -1138,8 +1089,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1150,12 +1101,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1183,32 +1128,22 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - sass-loader@12.6.0: - resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} - engines: {node: '>= 12.13.0'} + sass-loader@16.0.8: + resolution: {integrity: sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA==} + engines: {node: '>= 18.12.0'} peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 sass: ^1.3.0 sass-embedded: '*' webpack: ^5.0.0 peerDependenciesMeta: - fibers: + '@rspack/core': optional: true node-sass: optional: true @@ -1216,27 +1151,26 @@ packages: optional: true sass-embedded: optional: true + webpack: + optional: true - sass@1.94.2: - resolution: {integrity: sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==} + sass@1.99.0: + resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==} engines: {node: '>=14.0.0'} hasBin: true - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - schema-utils@4.3.3: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.0.5: + resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} + engines: {node: '>=20.0.0'} shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -1250,15 +1184,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - siyuan@1.2.0: - resolution: {integrity: sha512-5jcyggBDIkFVkAYi4URGWcizbJ2dNkeW8r/67xmnEtm4Cd2ao2BzV7GkaQ7iVJO6RuZyElLmZgDX4NEkRnmcdA==} - - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + siyuan@1.2.2-alpha.0: + resolution: {integrity: sha512-zVBkvhOhjn98MFNga9qlbfVsT9OYEKF2jegHYpEtypoa1jQsxKULKzHUOUqK0pw26nwaSrv+fzh7viLTj4wkjQ==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -1275,10 +1202,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -1287,12 +1210,12 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + terser-webpack-plugin@5.5.0: + resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -1307,35 +1230,35 @@ packages: uglify-js: optional: true - terser@5.46.0: - resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + terser@5.47.1: + resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} engines: {node: '>=10'} hasBin: true - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' - tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript@4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} - engines: {node: '>=4.2.0'} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} hasBin: true - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} @@ -1353,36 +1276,30 @@ packages: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} - webpack-cli@5.1.4: - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} + webpack-cli@7.0.2: + resolution: {integrity: sha512-dB0R4T+C/8YuvM+fabdvil6QE44/ChDXikV5lOOkrUeCkW5hTJv2pGLE3keh+D5hjYw8icBaJkZzpFoaHV4T+g==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' + webpack: ^5.101.0 + webpack-bundle-analyzer: ^4.0.0 || ^5.0.0 + webpack-dev-server: ^5.0.0 peerDependenciesMeta: - '@webpack-cli/generators': - optional: true webpack-bundle-analyzer: optional: true webpack-dev-server: optional: true - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} - - webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + webpack-sources@3.4.1: + resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} engines: {node: '>=10.13.0'} - webpack@5.104.1: - resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} + webpack@5.106.2: + resolution: {integrity: sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -1418,130 +1335,156 @@ packages: snapshots: - '@discoveryjs/json-ext@0.5.7': {} + '@discoveryjs/json-ext@1.1.0': {} + + '@dop251/types-goja_nodejs-buffer@0.0.0-20260212111938-1f56ff5bcf14': + dependencies: + '@dop251/types-goja_nodejs-global': 0.0.0-20260212111938-1f56ff5bcf14 + + '@dop251/types-goja_nodejs-global@0.0.0-20260212111938-1f56ff5bcf14': {} + + '@dop251/types-goja_nodejs-url@0.0.0-20260212111938-1f56ff5bcf14': + dependencies: + '@dop251/types-goja_nodejs-global': 0.0.0-20260212111938-1f56ff5bcf14 + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true - '@esbuild/aix-ppc64@0.19.12': + '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-arm64@0.19.12': + '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/android-arm@0.19.12': + '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/android-x64@0.19.12': + '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.19.12': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/darwin-x64@0.19.12': + '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.19.12': + '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.19.12': + '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-arm64@0.19.12': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-arm@0.19.12': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-ia32@0.19.12': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-loong64@0.19.12': + '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/win32-ia32@0.27.7': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@esbuild/win32-x64@0.27.7': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 9.39.1 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.12.6 + ajv: 6.15.0 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 - minimatch: 3.1.2 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.1': {} + '@eslint/js@10.0.1(eslint@10.3.0)': + optionalDependencies: + eslint: 10.3.0 - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.7.1': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -1565,189 +1508,177 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@parcel/watcher-android-arm64@2.5.1': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.5.6': dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 is-glob: 4.0.3 - micromatch: 4.0.8 node-addon-api: 7.1.1 + picomatch: 4.0.4 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 optional: true '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 - '@types/estree@1.0.8': {} + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} - '@types/node@25.2.1': + '@types/node@25.6.2': dependencies: - undici-types: 7.16.0 + undici-types: 7.19.2 - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.39.1)(typescript@4.8.4))(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.40.0(eslint@9.39.1)(typescript@4.8.4) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@9.39.1)(typescript@4.8.4) - '@typescript-eslint/utils': 8.40.0(eslint@9.39.1)(typescript@4.8.4) - '@typescript-eslint/visitor-keys': 8.40.0 - eslint: 9.39.1 - graphemer: 1.4.0 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@4.8.4) - typescript: 4.8.4 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.40.0(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@4.8.4) - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 - eslint: 9.39.1 - typescript: 4.8.4 + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.40.0(typescript@4.8.4)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@4.8.4) - '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3 - typescript: 4.8.4 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.40.0': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.40.0(typescript@4.8.4)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: - typescript: 4.8.4 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.40.0(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@4.8.4) - '@typescript-eslint/utils': 8.40.0(eslint@9.39.1)(typescript@4.8.4) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) debug: 4.4.3 - eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@4.8.4) - typescript: 4.8.4 + eslint: 10.3.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.40.0': {} + '@typescript-eslint/types@8.59.2': {} - '@typescript-eslint/typescript-estree@8.40.0(typescript@4.8.4)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.40.0(typescript@4.8.4) - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@4.8.4) - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@4.8.4) - typescript: 4.8.4 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.40.0(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@4.8.4) - eslint: 9.39.1 - typescript: 4.8.4 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.40.0': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.40.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.59.2 + eslint-visitor-keys: 5.0.1 '@webassemblyjs/ast@1.14.1': dependencies: @@ -1825,94 +1756,69 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': - dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) - - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': - dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) - - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.104.1)': - dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} - acorn-import-phases@1.0.4(acorn@8.15.0): + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn@8.15.0: {} + acorn@8.16.0: {} - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.20.0 - ajv-keywords@3.5.2(ajv@6.12.6): + ajv-keywords@5.1.0(ajv@8.20.0): dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 + ajv: 8.20.0 fast-deep-equal: 3.1.3 - ajv@6.12.6: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - argparse@2.0.1: {} balanced-match@1.0.2: {} - baseline-browser-mapping@2.9.19: {} + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.27: {} big.js@5.2.2: {} - brace-expansion@1.1.12: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: + brace-expansion@5.0.6: dependencies: - fill-range: 7.1.1 + balanced-match: 4.0.4 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001769 - electron-to-chromium: 1.5.286 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.27 + caniuse-lite: 1.0.30001792 + electron-to-chromium: 1.5.352 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-crc32@0.2.13: {} @@ -1920,12 +1826,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001769: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + caniuse-lite@1.0.30001792: {} chokidar@4.0.3: dependencies: @@ -1939,29 +1840,20 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - colorette@2.0.20: {} - - commander@10.0.1: {} + commander@14.0.3: {} commander@2.20.3: {} concat-map@0.0.1: {} - copy-webpack-plugin@11.0.0(webpack@5.104.1): + copy-webpack-plugin@14.0.0(webpack@5.106.2): dependencies: - fast-glob: 3.3.3 glob-parent: 6.0.2 - globby: 13.2.2 normalize-path: 3.0.0 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + serialize-javascript: 7.0.5 + tinyglobby: 0.2.16 + webpack: 5.106.2(webpack-cli@7.0.2) cross-spawn@7.0.6: dependencies: @@ -1969,18 +1861,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-loader@6.11.0(webpack@5.104.1): + css-loader@7.1.4(webpack@5.106.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.14) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.14) + postcss-modules-scope: 3.2.1(postcss@8.5.14) + postcss-modules-values: 4.0.0(postcss@8.5.14) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.106.2(webpack-cli@7.0.2) cssesc@3.0.0: {} @@ -1990,59 +1882,60 @@ snapshots: deep-is@0.1.4: {} - detect-libc@1.0.3: + detect-libc@2.1.2: optional: true - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - electron-to-chromium@1.5.286: {} + electron-to-chromium@1.5.352: {} emojis-list@3.0.0: {} - enhanced-resolve@5.19.0: + enhanced-resolve@5.21.2: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 envinfo@7.21.0: {} - es-module-lexer@2.0.0: {} + es-errors@1.3.0: {} - esbuild-loader@3.2.0(webpack@5.104.1): + es-module-lexer@2.1.0: {} + + esbuild-loader@4.4.3(webpack@5.106.2): dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.13.0 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 loader-utils: 2.0.4 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-sources: 1.4.3 + webpack: 5.106.2(webpack-cli@7.0.2) + webpack-sources: 3.4.1 - esbuild@0.19.12: + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 escalade@3.2.0: {} @@ -2053,8 +1946,10 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2062,29 +1957,28 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1: + eslint-visitor-keys@5.0.1: {} + + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.12.6 - chalk: 4.1.2 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -2094,8 +1988,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -2103,11 +1996,17 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 - esquery@1.6.0: + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -2125,34 +2024,22 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} fastest-levenshtein@1.0.16: {} - fastq@1.19.1: - dependencies: - reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -2165,23 +2052,19 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.3.3: {} + flatted@3.4.2: {} function-bind@1.1.2: {} - get-tsconfig@4.13.0: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -2190,35 +2073,25 @@ snapshots: globals@14.0.0: {} - globals@16.5.0: {} - - globby@13.2.2: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 + globals@17.6.0: {} graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - has-flag@4.0.0: {} - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 - icss-utils@5.1.0(postcss@8.5.6): + icss-utils@5.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.6 + postcss: 8.5.14 ignore@5.3.2: {} ignore@7.0.5: {} - immutable@5.1.4: {} + immutable@5.1.5: {} import-fresh@3.3.1: dependencies: @@ -2234,9 +2107,9 @@ snapshots: interpret@3.1.1: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-extglob@2.1.1: {} @@ -2244,8 +2117,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-number@7.0.0: {} - is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -2256,7 +2127,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.2.1 + '@types/node': 25.6.2 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -2266,8 +2137,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -2282,14 +2151,12 @@ snapshots: kind-of@6.0.3: {} - klona@2.0.6: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - loader-runner@4.3.1: {} + loader-runner@4.3.2: {} loader-utils@2.0.4: dependencies: @@ -2305,39 +2172,27 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 + mime-db@1.54.0: {} - mini-css-extract-plugin@2.3.0(webpack@5.104.1): + mini-css-extract-plugin@2.10.2(webpack@5.106.2): dependencies: - schema-utils: 3.3.0 - webpack: 5.104.1(webpack-cli@5.1.4) + schema-utils: 4.3.3 + tapable: 2.3.3 + webpack: 5.106.2(webpack-cli@7.0.2) - minimatch@3.1.2: + minimatch@10.2.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.6 - minimatch@9.0.5: + minimatch@3.1.5: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 1.1.14 ms@2.1.3: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -2346,7 +2201,7 @@ snapshots: node-addon-api@7.1.1: optional: true - node-releases@2.0.27: {} + node-releases@2.0.38: {} normalize-path@3.0.0: {} @@ -2387,36 +2242,34 @@ snapshots: path-parse@1.0.7: {} - path-type@4.0.0: {} - picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@4.0.4: {} pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + postcss-modules-extract-imports@3.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.6 + postcss: 8.5.14 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.5.14): dependencies: - postcss: 8.5.6 + postcss: 8.5.14 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.6): + postcss-modules-values@4.0.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 postcss-selector-parser@7.1.1: dependencies: @@ -2425,9 +2278,9 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.14: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -2435,17 +2288,11 @@ snapshots: punycode@2.3.1: {} - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - readdirp@4.1.2: {} rechoir@0.8.0: dependencies: - resolve: 1.22.11 + resolve: 1.22.12 require-from-string@2.0.2: {} @@ -2459,54 +2306,38 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} - - run-parallel@1.2.0: + sass-loader@16.0.8(sass@1.99.0)(webpack@5.106.2): dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - sass-loader@12.6.0(sass@1.94.2)(webpack@5.104.1): - dependencies: - klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - sass: 1.94.2 + sass: 1.99.0 + webpack: 5.106.2(webpack-cli@7.0.2) - sass@1.94.2: + sass@1.99.0: dependencies: chokidar: 4.0.3 - immutable: 5.1.4 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + '@parcel/watcher': 2.5.6 schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) - semver@7.7.3: {} + semver@7.7.4: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + serialize-javascript@7.0.5: {} shallow-clone@3.0.1: dependencies: @@ -2518,11 +2349,11 @@ snapshots: shebang-regex@3.0.0: {} - siyuan@1.2.0: {} - - slash@4.0.0: {} - - source-list-map@2.0.1: {} + siyuan@1.2.2-alpha.0: + dependencies: + '@dop251/types-goja_nodejs-buffer': 0.0.0-20260212111938-1f56ff5bcf14 + '@dop251/types-goja_nodejs-global': 0.0.0-20260212111938-1f56ff5bcf14 + '@dop251/types-goja_nodejs-url': 0.0.0-20260212111938-1f56ff5bcf14 source-map-js@1.2.1: {} @@ -2535,55 +2366,51 @@ snapshots: strip-json-comments@3.1.1: {} - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - supports-color@8.1.1: dependencies: has-flag: 4.0.0 supports-preserve-symlinks-flag@1.0.0: {} - tapable@2.3.0: {} + tapable@2.3.3: {} - terser-webpack-plugin@5.3.16(webpack@5.104.1): + terser-webpack-plugin@5.5.0(webpack@5.106.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.46.0 - webpack: 5.104.1(webpack-cli@5.1.4) + terser: 5.47.1 + webpack: 5.106.2(webpack-cli@7.0.2) - terser@5.46.0: + terser@5.47.1: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 - to-regex-range@5.0.1: + tinyglobby@0.2.16: dependencies: - is-number: 7.0.0 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - ts-api-utils@2.1.0(typescript@4.8.4): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 4.8.4 + typescript: 6.0.3 - tslib@2.4.0: {} + tslib@2.8.1: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typescript@4.8.4: {} + typescript@6.0.3: {} - undici-types@7.16.0: {} + undici-types@7.19.2: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -2598,65 +2425,55 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - webpack-cli@5.1.4(webpack@5.104.1): + webpack-cli@7.0.2(webpack@5.106.2): dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.104.1) - colorette: 2.0.20 - commander: 10.0.1 + '@discoveryjs/json-ext': 1.1.0 + commander: 14.0.3 cross-spawn: 7.0.6 envinfo: 7.21.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-merge: 5.10.0 + webpack: 5.106.2(webpack-cli@7.0.2) + webpack-merge: 6.0.1 - webpack-merge@5.10.0: + webpack-merge@6.0.1: dependencies: clone-deep: 4.0.1 flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@1.4.3: - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - - webpack-sources@3.3.3: {} + webpack-sources@3.4.1: {} - webpack@5.104.1(webpack-cli@5.1.4): + webpack@5.106.2(webpack-cli@7.0.2): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 - es-module-lexer: 2.0.0 + enhanced-resolve: 5.21.2 + es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 + loader-runner: 4.3.2 + mime-db: 1.54.0 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(webpack@5.104.1) + tapable: 2.3.3 + terser-webpack-plugin: 5.5.0(webpack@5.106.2) watchpack: 2.5.1 - webpack-sources: 3.3.3 + webpack-sources: 3.4.1 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.104.1) + webpack-cli: 7.0.2(webpack@5.106.2) transitivePeerDependencies: - '@swc/core' - esbuild @@ -2676,8 +2493,8 @@ snapshots: yocto-queue@0.1.0: {} - zip-webpack-plugin@4.0.3(webpack-sources@3.3.3)(webpack@5.104.1): + zip-webpack-plugin@4.0.3(webpack-sources@3.4.1)(webpack@5.106.2): dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-sources: 3.3.3 + webpack: 5.106.2(webpack-cli@7.0.2) + webpack-sources: 3.4.1 yazl: 2.5.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..f588aaa --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + '@parcel/watcher': false + esbuild: false diff --git a/src/index.ts b/src/index.ts index e03f18e..bbe0ada 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,10 +26,10 @@ import { platformUtils, openSetting, openAttributePanel, - saveLayout + saveLayout, + IMenuItem } from "siyuan"; import "./index.scss"; -import {IMenuItem} from "siyuan/types"; const STORAGE_NAME = "menu-config"; const TAB_TYPE = "custom_tab"; @@ -57,7 +57,7 @@ export default class PluginSample extends Plugin { } onload() { - this.data[STORAGE_NAME] = {readonlyText: "Readonly"}; + this.data[STORAGE_NAME] = { readonlyText: "Readonly" }; const frontEnd = getFrontend(); this.isMobile = frontEnd === "mobile" || frontEnd === "browser-mobile"; @@ -100,7 +100,7 @@ export default class PluginSample extends Plugin { this.addDock({ config: { position: "LeftBottom", - size: {width: 200, height: 0}, + size: { width: 200, height: 0 }, icon: "iconSaving", title: "Custom Dock", hotkey: "⌥⌘W", @@ -148,7 +148,7 @@ export default class PluginSample extends Plugin { const textareaElement = document.createElement("textarea"); this.setting = new Setting({ confirmCallback: () => { - this.saveData(STORAGE_NAME, {readonlyText: textareaElement.value}).catch(e => { + this.saveData(STORAGE_NAME, { readonlyText: textareaElement.value }).catch(e => { showMessage(`[${this.name}] save data [${STORAGE_NAME}] fail: `, e); }); } @@ -240,7 +240,7 @@ export default class PluginSample extends Plugin { statusIconTemp.content.firstElementChild.addEventListener("click", () => { confirm("⚠️", this.i18n.confirmRemove.replace("${name}", this.name), () => { this.removeData(STORAGE_NAME).then(() => { - this.data[STORAGE_NAME] = {readonlyText: "Readonly"}; + this.data[STORAGE_NAME] = { readonlyText: "Readonly" }; showMessage(`[${this.name}]: ${this.i18n.removedData}`); }).catch(e => { showMessage(`[${this.name}] remove data [${STORAGE_NAME}] fail: `, e); @@ -324,11 +324,11 @@ export default class PluginSample extends Plugin { }); } - private eventBusLog({detail}: any) { + private eventBusLog({ detail }: any) { console.log(detail); } - private blockIconEvent({detail}: any) { + private blockIconEvent({ detail }: any) { detail.menu.addItem({ id: "pluginSample_removeSpace", iconHTML: "", @@ -493,7 +493,7 @@ export default class PluginSample extends Plugin { label: "Open Float Layer(open doc first)", click: () => { this.addFloatLayer({ - refDefs: [{refID: this.getEditor().protyle.block.rootID}], + refDefs: [{ refID: this.getEditor().protyle.block.rootID }], x: window.innerWidth - 768 - 120, y: 32, isBacklink: false @@ -505,7 +505,7 @@ export default class PluginSample extends Plugin { label: "Open Doc Window(open doc first)", click: () => { openWindow({ - doc: {id: this.getEditor().protyle.block.rootID} + doc: { id: this.getEditor().protyle.block.rootID } }); } }); diff --git a/src/kernel.ts b/src/kernel.ts new file mode 100644 index 0000000..b58924a --- /dev/null +++ b/src/kernel.ts @@ -0,0 +1,427 @@ +/// + +import type * as kernel from 'siyuan/kernel'; + +/** + * Reference implementation of the kernel plugin API for SiYuan. + * + * @remarks + * This class exercises every public surface on `globalThis.siyuan`. It is the + * living reference for community developers and is updated in lock-step with + * `petal/kernel.d.ts` whenever new kernel APIs are added. + * + * ## Lifecycle state machine + * + * ``` + * ready → loading → loaded → running → stopping → stopped + * ↓onload ↓onloaded ↓onrunning ↓onunload + * ``` + * + * Each hook is `async`-safe: the kernel awaits the returned `Promise` before + * advancing to the next state, so slow hooks stall the plugin's own startup. + * Keep hooks non-blocking; defer long-running work to fire-and-forget tasks. + * + * ## Adding a new API + * + * 1. Add the type declaration to `petal/kernel.d.ts`. + * 2. Add a demonstration call in the appropriate lifecycle method below. + * 3. Add a TSDoc block linking to the new interface and explaining any + * non-obvious constraints. + */ +class KernelPlugin { + private readonly siyuan: kernel.ISiyuan = siyuan; + + /** Client-side WebSocket connection to the plugin's own RPC endpoint. */ + private ws: kernel.IWebSocket | null = null; + + /** Client-side SSE connection to the kernel broadcast endpoint. */ + private es: kernel.IEventSource | null = null; + + constructor() { + // Wire lifecycle hooks + this.siyuan.plugin.lifecycle.onload = this.onload.bind(this); + this.siyuan.plugin.lifecycle.onloaded = this.onloaded.bind(this); + this.siyuan.plugin.lifecycle.onrunning = this.onrunning.bind(this); + this.siyuan.plugin.lifecycle.onunload = this.onunload.bind(this); + + // Wire the inbound kernel event handler + this.siyuan.event.handler = this.eventHandler.bind(this); + + // Wire server-side request handlers (private scope: /plugin/private//*) + this.siyuan.server.private.http.handler = this.httpHandler.bind(this); + this.siyuan.server.private.ws.handler = this.wsHandler.bind(this); + this.siyuan.server.private.es.handler = this.esHandler.bind(this); + } + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link kernel.IRpc} and {@link kernel.IStorage}. + * + * @remarks + * Called when the plugin script is first evaluated. Register RPC methods + * here so they are ready once the plugin reaches the `running` state. + * RPC calls are rejected with `-32002` before `running` is reached. + * + * {@link kernel.IStorage} paths are relative to + * `data/storage/petal//`. Path traversal is blocked by the + * kernel. Each {@link kernel.IDataObject} returned by `storage.get` is + * single-use — call at most one decoder per instance. + * + * @example + * ```ts + * await siyuan.rpc.bind("echo", async (...args) => args, "description"); + * ``` + */ + private async onload(): Promise { + const { rpc, storage, logger, plugin } = this.siyuan; + + // ── siyuan.logger (all five levels) ─────────────────────────────────── + // Unlike console.*, each call returns a Promise and serialises args as JSON. + await logger.trace("onload: plugin name =", plugin.name); + await logger.debug("onload: version =", plugin.version); + await logger.info("onload: platform =", plugin.platform); + await logger.warn("onload: i18n keys =", Object.keys(plugin.i18n)); + await logger.error("onload: (error-level demo — not a real error)"); + + // ── console.* (synchronous, Node.js util.format, 3 levels) ──────────── + // Routed to the kernel log at INFO/WARN/ERROR. No await needed. + console.log("onload: console.log (sync, util.format)"); + console.warn("onload: console.warn"); + console.error("onload: console.error"); + + // ── siyuan.rpc ──────────────────────────────────────────────────────── + // bind(name, fn, ...descriptions): registers a JSON-RPC method. + // The third argument and beyond are optional human-readable descriptions. + await rpc.bind( + "echo", + async (...args: any[]) => { + await logger.debug("echo called with:", args); + return args; + }, + "Returns all received arguments unchanged.", + ); + + // ── siyuan.storage ──────────────────────────────────────────────────── + // put: write a UTF-8 string to a path relative to the plugin data dir + await storage.put("demo.txt", JSON.stringify(new Date().toISOString())); + + // get: returns IDataObject — a lazy accessor. Each IDataObject is single-use: + // call at most one decoder (.text(), .json(), or .arrayBuffer()) per instance. + // A separate get() call is required for each decoder demonstration here. + const obj = await storage.get("demo.txt"); + await logger.debug("storage.get → text():", await obj.text()); + + await logger.debug("storage.get → json():", await obj.json()); + + await logger.debug("storage.get → arrayBuffer():", await obj.arrayBuffer()); + + await logger.debug("storage.get → buffer():", await obj.buffer()); + + // list: returns IStorageEntry[] for the given relative directory + const entries = await storage.list("."); + await logger.debug("storage.list:", entries); + + // remove: deletes a file or directory tree + await storage.remove("demo.txt"); + + try { + throw new Error("This is a test error to demonstrate logger.error with stack trace"); + } catch (error) { + console.error((error as Error).stack?.trim()); + } + } + + /** + * Demonstrates {@link IClient.fetch} against the kernel's own REST API. + * + * @remarks + * Called after all plugins have completed `onload`. At this point every + * enabled kernel plugin is visible in the plugin registry. + * + * `siyuan.client.fetch` tunnels the request through the kernel and injects + * the plugin's JWT token automatically — no manual auth header needed. + * + * @example + * ```ts + * const resp = await siyuan.client.fetch("/api/system/version", { method: "POST", body: "{}" }); + * const data = await resp.json(); + * ``` + */ + private async onloaded(): Promise { + const { client, logger } = this.siyuan; + + // List all loaded plugins via the kernel REST API. + // fetch() returns IFetchResponse; the body is a lazy IDataObject. + const resp = await client.fetch("/api/plugin/listLoadedPlugins", { + method: "POST", + // body must be a string or ArrayBuffer + body: "{}", + }); + + await logger.debug("onloaded: resp.ok =", resp.ok); + await logger.debug("onloaded: resp.status =", resp.status); + await logger.debug("onloaded: resp.statusText =", resp.statusText); + await logger.debug("onloaded: resp.headers =", resp.headers); + await logger.debug("onloaded: listLoadedPlugins =", await resp.json()); + } + + /** + * Demonstrates {@link IClient.socket} (WebSocket client) and + * {@link IClient.event} (SSE client), plus an HTTP JSON-RPC loopback call. + * + * @remarks + * Called after `onloaded` resolves. The kernel is fully running and all + * RPC methods registered in `onload` are now reachable. + * + * ### WebSocket client + * `siyuan.client.socket` returns a sealed {@link IWebSocket} in + * `CONNECTING` state immediately. **`ws.open()` must be called explicitly** + * to initiate the TCP/WebSocket handshake; `onopen` fires only after + * `open()` resolves. Assign all callbacks before calling `open()`. + * + * ### SSE client + * `siyuan.client.event` returns immediately; the kernel starts the SSE + * subscription in the background and fires `onopen` once connected. + * + * @example + * ```ts + * // Assign all callbacks BEFORE calling open(). + * const ws = await siyuan.client.socket("/ws/plugin/rpc/my-plugin"); + * ws.onopen = async () => { await ws.send("hello"); }; + * await ws.open(); + * ``` + */ + private async onrunning(): Promise { + const { client, logger, plugin } = this.siyuan; + + // ── HTTP RPC loopback (JS → HTTP → Go → JS → Go → HTTP → JS) ────────── + const echoResp = await client.fetch( + `/api/plugin/rpc/${plugin.name}`, + { + method: "POST", + // body must be a string — stringify the JSON-RPC payload + body: JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: ["hello from onrunning", 42, { key: true }], + id: 1, + }), + }, + ); + await logger.debug("onrunning: HTTP RPC echo =", await echoResp.json()); + + // ── WebSocket client ────────────────────────────────────────────────── + this.ws = await client.socket(`/ws/plugin/rpc/${plugin.name}`); + + // Assign all callbacks before calling open() — onopen fires only after + // the TCP/WebSocket handshake completes. + this.ws.onopen = async (event) => { + await logger.debug("ws client: open", event); + // Send a JSON-RPC request over the WebSocket connection + await this.ws!.send(JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: { message: "hello via WebSocket", ts: Date.now() }, + id: 2, + })); + // Demonstrate ping/pong control frames + await this.ws!.ping("ping from plugin"); + }; + this.ws.onmessage = async (event) => { await logger.debug("ws client: message", event); }; + this.ws.onping = async (event) => { await logger.debug("ws client: ping", event); }; + this.ws.onpong = async (event) => { await logger.debug("ws client: pong", event); }; + this.ws.onerror = async (event) => { await logger.debug("ws client: error", event); }; + this.ws.onclose = async (event) => { await logger.debug("ws client: close", event); }; + + // Initiate the connection after wiring all callbacks + await this.ws.open(); + + // ── SSE / EventSource client ────────────────────────────────────────── + this.es = await client.event("/es/broadcast/subscribe"); + this.es.onopen = async (e) => { await logger.debug("es client: open", e); }; + this.es.onmessage = async (e) => { await logger.debug("es client: message", e); }; + this.es.onclose = async (e) => { await logger.debug("es client: close", e); }; + this.es.onerror = async (e) => { await logger.debug("es client: error", e); }; + } + + /** + * Demonstrates {@link IRpc.broadcast} and connection cleanup. + * + * @remarks + * Called when the plugin is stopping. `rpc.broadcast` pushes a JSON-RPC + * 2.0 notification (no `id`) to all connected RPC WebSocket clients. It + * is a no-op if the plugin is not in the `running` state, so it is safe + * to call here even during a fast shutdown. + * + * After broadcasting, close any open client-side connections to avoid + * resource leaks in the kernel process. + */ + private async onunload(): Promise { + const { rpc, logger } = this.siyuan; + + // Unbind the RPC method registered in onload + await rpc.unbind("echo"); + + // Push a notification to all connected RPC WebSocket clients + await rpc.broadcast("unload", ["Plugin is unloading"]); + + // Close client-side connections — optional chaining guards against the + // case where onrunning was never reached (e.g. error during startup) + this.ws?.close(); + this.es?.close(); + + await logger.debug("onunload: cleanup complete"); + } + + // ── Event bridge ────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link IEvent.handler} (receive) and {@link IEvent.emit} (publish). + * + * @remarks + * `siyuan.event.handler` receives every kernel broadcast event. + * `event` has shape `{ id: UUID, type: string, detail: any }`. + * + * `siyuan.event.emit` publishes an event to the in-process bus. + * The first argument is the topic string used for routing; + * the second is the payload. + * + * @param event - The incoming kernel event message. + */ + private async eventHandler(event: kernel.IEventMessage): Promise { + const { event: eventApi, logger } = this.siyuan; + + await logger.debug("event received:", event); + + // Re-publish the event under the "plugin" topic + await eventApi.emit("plugin", { + id: event.id, + type: "echo", + detail: event, + }); + } + + // ── Server-side handlers ────────────────────────────────────────────────── + + /** + * Demonstrates the HTTP server handler at + * `ANY /plugin/private//*path`. + * + * @remarks + * Must return an {@link IHttpResponse}. The `body` field supports: + * `data` (JSON / XML / YAML / …), `file` (local filesystem path), + * `string` (Go `fmt.Sprintf`), `raw` (bytes + Content-Type), `redirect`. + * Set exactly one; the kernel uses the first non-null value. + * + * The route requires kernel authentication and admin role — unauthenticated + * requests are rejected before reaching the handler. + * + * @param request - Parsed URL, headers, body, and Gin routing context. + * @returns An {@link IHttpResponse} that the kernel writes to the client. + */ + private async httpHandler(request: kernel.IServerRequest): Promise { + await this.siyuan.logger.debug("http handler: path =", request.url.path); + + return { + statusCode: 200, + headers: { + // Multi-value headers are arrays of strings + "X-Plugin": [this.siyuan.plugin.name], + }, + body: { + // type: "JSON" delegates to c.JSON in Gin + data: { + type: "JSON", + data: { + path: request.url.path, + method: request.request.method, + contentType: request.request.contentType, + query: request.url.query, + params: request.context.params, + }, + }, + }, + }; + } + + /** + * Demonstrates the WebSocket server handler at + * `GET /plugin/private//*path` (WebSocket upgrade). + * + * @remarks + * `request.port` mirrors the {@link IWebSocket} interface — same event + * callbacks, same `send` / `ping` / `pong` / `close` methods. + * + * Assign all callbacks in this handler body. The kernel auto-opens the + * port's read loop after the handler returns; calling `port.open()` + * explicitly is optional. + * + * `onmessage` events carry + * `{ type: "text" | "binary", data: string | ArrayBuffer }`. + * + * @param request - Server request augmented with `port` (a bidirectional + * WebSocket back-channel to the connected client). + */ + private async wsHandler(request: kernel.IServerWebSocketRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("ws server: port open", event); + // Greet the client on connection + await request.port.send("Hello from plugin WebSocket server!"); + }; + request.port.onmessage = async (event) => { + await logger.debug("ws server: message", event); + // send text frames back as-is; convert binary frames to a string representation + if (typeof event.data === "string") { + await request.port.send(event.data); + } else { + // Binary frame — event.data is always ArrayBuffer in the else branch + await request.port.send(new TextDecoder().decode(event.data as ArrayBuffer)); + } + }; + request.port.onping = async (event) => { + await logger.debug("ws server: ping", event); + // Reply with a pong carrying the same application data + await request.port.pong(event.data); + }; + request.port.onpong = async (event) => { await logger.debug("ws server: pong", event); }; + request.port.onclose = async (event) => { await logger.debug("ws server: close", event); }; + request.port.onerror = async (event) => { await logger.debug("ws server: error", event); }; + // port.open() is optional — the kernel auto-opens after this handler returns. + } + + /** + * Demonstrates the SSE server handler at + * `GET /plugin/private//*path` (Server-Sent Events). + * + * @remarks + * `request.port.onopen` fires once the SSE stream is ready. Call + * `port.send(eventType, data)` inside `onopen` or later to push events. + * `eventType` maps to the SSE `event:` field; `data` maps to `data:`. + * `send` is **synchronous** — no `await` needed. + * + * The connection stays open until `port.close()` is called or the + * client disconnects, which fires `onclose`. + * + * @param request - Server request augmented with `port` (an SSE + * back-channel to the connected client). + */ + private async esHandler(request: kernel.IServerEventSourceRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("sse server: port open", event); + // send is synchronous; eventType becomes the SSE `event:` field + request.port.send("message", "Connected to plugin SSE!"); + request.port.send("update", JSON.stringify({ ts: Date.now() })); + }; + request.port.onclose = async (event) => { + await logger.debug("sse server: port close", event); + }; + // Note: IEsServerPort has no onerror callback — SSE errors surface as onclose. + } +} + +new KernelPlugin(); diff --git a/webpack.config.js b/webpack.config.js index 9ee4986..0dcb2c7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,25 +1,19 @@ const path = require("path"); const fs = require("fs"); const webpack = require("webpack"); -const {EsbuildPlugin} = require("esbuild-loader"); +const { EsbuildPlugin } = require("esbuild-loader"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CopyPlugin = require("copy-webpack-plugin"); const ZipPlugin = require("zip-webpack-plugin"); module.exports = (env, argv) => { - const isPro = argv.mode === "production"; + const production = argv.mode === "production"; const plugins = [ new MiniCssExtractPlugin({ - filename: isPro ? "dist/index.css" : "index.css", + filename: production ? "dist/index.css" : "index.css", }) ]; - let entry = { - "index": "./src/index.ts", - }; - if (isPro) { - entry = { - "dist/index": "./src/index.ts", - }; + if (production) { plugins.push(new webpack.BannerPlugin({ banner: () => { return fs.readFileSync("LICENSE").toString(); @@ -27,11 +21,11 @@ module.exports = (env, argv) => { })); plugins.push(new CopyPlugin({ patterns: [ - {from: "preview.png", to: "./dist/"}, - {from: "icon.png", to: "./dist/"}, - {from: "README*.md", to: "./dist/"}, - {from: "plugin.json", to: "./dist/"}, - {from: "src/i18n/", to: "./dist/i18n/"}, + { from: "preview.png", to: "./dist/" }, + { from: "icon.png", to: "./dist/" }, + { from: "README*.md", to: "./dist/" }, + { from: "plugin.json", to: "./dist/" }, + { from: "src/i18n/", to: "./dist/i18n/" }, ], })); plugins.push(new ZipPlugin({ @@ -45,14 +39,14 @@ module.exports = (env, argv) => { } else { plugins.push(new CopyPlugin({ patterns: [ - {from: "src/i18n/", to: "./i18n/"}, + { from: "src/i18n/", to: "./i18n/" }, ], })); } return { mode: argv.mode || "development", - watch: !isPro, - devtool: isPro ? false : "eval", + watch: !production, + devtool: production ? false : "eval-source-map", output: { filename: "[name].js", path: path.resolve(__dirname), @@ -64,9 +58,11 @@ module.exports = (env, argv) => { externals: { siyuan: "siyuan", }, - entry, + entry: { + [production ? "dist/index" : "index"]: "./src/index.ts", + }, optimization: { - minimize: true, + minimize: production, minimizer: [ new EsbuildPlugin(), ], diff --git a/webpack.kernel.config.js b/webpack.kernel.config.js new file mode 100644 index 0000000..55d0e47 --- /dev/null +++ b/webpack.kernel.config.js @@ -0,0 +1,53 @@ +const path = require("path"); +const { EsbuildPlugin } = require("esbuild-loader"); + +module.exports = (env, argv) => { + const production = argv.mode === "production"; + return { + mode: argv.mode || "development", + watch: !production, + devtool: production ? false : "inline-source-map", + entry: { + [production ? "dist/kernel" : "kernel"]: "./src/kernel.ts", + }, + experiments: { + outputModule: true, + }, + output: { + filename: "[name].js", + path: path.resolve(__dirname), + library: { + type: "module", + }, + }, + externals: { + siyuan: "siyuan", + }, + optimization: { + minimize: production, + minimizer: [ + new EsbuildPlugin(), + ], + }, + resolve: { + extensions: [".ts", ".js", ".json"], + }, + module: { + rules: [ + { + test: /\.ts(x?)$/, + include: [path.resolve(__dirname, "src")], + use: [ + { + loader: "esbuild-loader", + options: { + target: "esnext", + } + }, + ], + }, + ], + }, + plugins: [], + }; +};