diff --git a/harper-wasm/src/lib.rs b/harper-wasm/src/lib.rs index 4ee3d901..a1102609 100644 --- a/harper-wasm/src/lib.rs +++ b/harper-wasm/src/lib.rs @@ -125,8 +125,8 @@ pub struct Suggestion { #[derive(Debug, Serialize, Deserialize)] #[wasm_bindgen] pub enum SuggestionKind { - Replace, - Remove, + Replace = 0, + Remove = 1, } #[wasm_bindgen] diff --git a/justfile b/justfile index 5f77d80f..45c84577 100644 --- a/justfile +++ b/justfile @@ -10,7 +10,7 @@ build-wasm target: build-harperjs: #! /bin/bash set -eo pipefail - just build-wasm bundler + just build-wasm web cd "{{justfile_directory()}}/packages/harper.js" yarn install -f diff --git a/packages/harper.js/package.json b/packages/harper.js/package.json index 667cf9eb..c15be8a8 100644 --- a/packages/harper.js/package.json +++ b/packages/harper.js/package.json @@ -1,26 +1,24 @@ { - "name": "harper.js", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "test": "vitest run" - }, - "dependencies": { - "wasm": "link:../../harper-wasm/pkg" - }, - "devDependencies": { - "@vitest/browser": "^2.1.8", - "playwright": "^1.49.1", - "typescript": "~5.6.2", - "vite": "^5.1.8", - "vite-plugin-dts": "^4.3.0", - "vite-plugin-top-level-await": "^1.4.4", - "vite-plugin-wasm": "^3.3.0", - "vitest": "^2.1.8" - }, - "main": "dist/harper.js", - "types": "dist/harper.d.ts" + "name": "harper.js", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "test": "vitest run" + }, + "dependencies": { + "wasm": "link:../../harper-wasm/pkg" + }, + "devDependencies": { + "@vitest/browser": "^2.1.8", + "playwright": "^1.49.1", + "typescript": "~5.6.2", + "vite": "^5.1.8", + "vite-plugin-dts": "^4.3.0", + "vitest": "^2.1.8" + }, + "main": "dist/harper.js", + "types": "dist/harper.d.ts" } diff --git a/packages/harper.js/src/Linter.ts b/packages/harper.js/src/Linter.ts index bcd12b63..a34300cc 100644 --- a/packages/harper.js/src/Linter.ts +++ b/packages/harper.js/src/Linter.ts @@ -2,7 +2,9 @@ import type { Lint, Span, Suggestion } from 'wasm'; /** A interface for an object that can perform linting actions. */ export default interface Linter { - /** Complete any setup that is necessary before linting. This may include downloading and compiling the WebAssembly binary. */ + /** Complete any setup that is necessary before linting. This may include downloading and compiling the WebAssembly binary. + * This setup will complete when needed regardless of whether you call this function. + * This function exists to allow you to do this work when it is of least impact to the user experiences (i.e. while you're loading something else). */ setup(): Promise; /** Lint the provided text. */ lint(text: string): Promise; diff --git a/packages/harper.js/src/LocalLinter.ts b/packages/harper.js/src/LocalLinter.ts index 71403363..7dc831a3 100644 --- a/packages/harper.js/src/LocalLinter.ts +++ b/packages/harper.js/src/LocalLinter.ts @@ -1,16 +1,17 @@ import type { Lint, Span, Suggestion } from 'wasm'; import Linter from './Linter'; +import loadWasm from './loadWasm'; /** A Linter that runs in the current JavaScript context (meaning it is allowed to block the event loop). */ export default class LocalLinter implements Linter { async setup(): Promise { - const wasm = await import('wasm'); + const wasm = await loadWasm(); wasm.setup(); wasm.lint(''); } async lint(text: string): Promise { - const wasm = await import('wasm'); + const wasm = await loadWasm(); let lints = wasm.lint(text); // We only want to show fixable errors. @@ -20,17 +21,17 @@ export default class LocalLinter implements Linter { } async applySuggestion(text: string, suggestion: Suggestion, span: Span): Promise { - const wasm = await import('wasm'); + const wasm = await loadWasm(); return wasm.apply_suggestion(text, span, suggestion); } async isLikelyEnglish(text: string): Promise { - const wasm = await import('wasm'); + const wasm = await loadWasm(); return wasm.is_likely_english(text); } async isolateEnglish(text: string): Promise { - const wasm = await import('wasm'); + const wasm = await loadWasm(); return wasm.isolate_english(text); } } diff --git a/packages/harper.js/src/WorkerLinter/communication.test.ts b/packages/harper.js/src/WorkerLinter/communication.test.ts index d569d56a..bc24900f 100644 --- a/packages/harper.js/src/WorkerLinter/communication.test.ts +++ b/packages/harper.js/src/WorkerLinter/communication.test.ts @@ -3,46 +3,46 @@ import { deserializeArg, serializeArg } from './communication'; import { Span } from 'wasm'; import LocalLinter from '../LocalLinter'; -test('works with strings', () => { +test('works with strings', async () => { const start = 'This is a string'; - const end = deserializeArg(structuredClone(serializeArg(start))); + const end = await deserializeArg(structuredClone(await serializeArg(start))); expect(end).toBe(start); expect(typeof end).toBe(typeof start); }); -test('works with false booleans', () => { +test('works with false booleans', async () => { const start = false; - const end = deserializeArg(structuredClone(serializeArg(start))); + const end = await deserializeArg(structuredClone(await serializeArg(start))); expect(end).toBe(start); expect(typeof end).toBe(typeof start); }); -test('works with true booleans', () => { +test('works with true booleans', async () => { const start = true; - const end = deserializeArg(structuredClone(serializeArg(start))); + const end = await deserializeArg(structuredClone(await serializeArg(start))); expect(end).toBe(start); expect(typeof end).toBe(typeof start); }); -test('works with numbers', () => { +test('works with numbers', async () => { const start = 123; - const end = deserializeArg(structuredClone(serializeArg(start))); + const end = await deserializeArg(structuredClone(await serializeArg(start))); expect(end).toBe(start); expect(typeof end).toBe(typeof start); }); -test('works with Spans', () => { +test('works with Spans', async () => { const start = Span.new(123, 321); - const end = deserializeArg(structuredClone(serializeArg(start))); + const end = await deserializeArg(structuredClone(await serializeArg(start))); expect(end.start).toBe(start.start); expect(end.len()).toBe(start.len()); @@ -56,7 +56,7 @@ test('works with Lints', async () => { expect(start).not.toBeNull(); - const end = deserializeArg(structuredClone(serializeArg(start))); + const end = await deserializeArg(structuredClone(await serializeArg(start))); expect(end.message()).toBe(start.message()); expect(end.lint_kind()).toBe(start.lint_kind()); diff --git a/packages/harper.js/src/WorkerLinter/communication.ts b/packages/harper.js/src/WorkerLinter/communication.ts index 9f2f32bc..a0bbdf63 100644 --- a/packages/harper.js/src/WorkerLinter/communication.ts +++ b/packages/harper.js/src/WorkerLinter/communication.ts @@ -1,7 +1,7 @@ /** This module aims to define the communication protocol between the main thread and the worker. * Note that most of the complication here comes from the fact that we can't serialize function calls or referenced WebAssembly memory.*/ -import { Lint, Span, Suggestion } from 'wasm'; +import loadWasm from '../loadWasm'; export type Type = | 'string' @@ -19,16 +19,18 @@ export type RequestArg = { type: Type; }; -export function serialize(req: DeserializedRequest): SerializedRequest { +export async function serialize(req: DeserializedRequest): Promise { return { procName: req.procName, - args: req.args.map(serializeArg) + args: await Promise.all(req.args.map(serializeArg)) }; } -export function serializeArg(arg: any): RequestArg { +export async function serializeArg(arg: any): Promise { + const { Lint, Span, Suggestion } = await loadWasm(); + if (Array.isArray(arg)) { - return { json: JSON.stringify(arg.map(serializeArg)), type: 'Array' }; + return { json: JSON.stringify(await Promise.all(arg.map(serializeArg))), type: 'Array' }; } switch (typeof arg) { @@ -62,7 +64,9 @@ export function serializeArg(arg: any): RequestArg { throw new Error('Unhandled case'); } -export function deserializeArg(requestArg: RequestArg): any { +export async function deserializeArg(requestArg: RequestArg): Promise { + const { Lint, Span, Suggestion } = await loadWasm(); + switch (requestArg.type) { case 'undefined': return undefined; @@ -77,7 +81,7 @@ export function deserializeArg(requestArg: RequestArg): any { case 'Span': return Span.from_json(requestArg.json); case 'Array': - return JSON.parse(requestArg.json).map(deserializeArg); + return await Promise.all(JSON.parse(requestArg.json).map(deserializeArg)); default: throw new Error(`Unhandled case: ${requestArg.type}`); } @@ -99,9 +103,9 @@ export type DeserializedRequest = { args: any[]; }; -export function deserialize(request: SerializedRequest): DeserializedRequest { +export async function deserialize(request: SerializedRequest): Promise { return { procName: request.procName, - args: request.args.map(deserializeArg) + args: await Promise.all(request.args.map(deserializeArg)) }; } diff --git a/packages/harper.js/src/WorkerLinter/index.ts b/packages/harper.js/src/WorkerLinter/index.ts index ac8741d7..cee04a2d 100644 --- a/packages/harper.js/src/WorkerLinter/index.ts +++ b/packages/harper.js/src/WorkerLinter/index.ts @@ -1,5 +1,5 @@ import { DeserializedRequest, deserializeArg, serialize } from './communication'; -import { Lint, Suggestion, Span } from 'wasm'; +import type { Lint, Suggestion, Span } from 'wasm'; import Linter from '../Linter'; import Worker from './worker.js?worker'; @@ -13,7 +13,8 @@ type RequestItem = { /** A Linter that spins up a dedicated web worker to do processing on a separate thread. * Main benefit: this Linter will not block the event loop for large documents. * - * NOTE: This class will not work properly in Node. In that case, just use `LocalLinter`. */ + * NOTE: This class will not work properly in Node. In that case, just use `LocalLinter`. + * Also requires top-level await to work. */ export default class WorkerLinter implements Linter { private worker; private requestQueue: RequestItem[]; @@ -33,10 +34,13 @@ export default class WorkerLinter implements Linter { private setupMainEventListeners() { this.worker.onmessage = (e: MessageEvent) => { const { resolve } = this.requestQueue.shift()!; - resolve(deserializeArg(e.data)); - this.working = false; + deserializeArg(e.data).then((v) => { + resolve(v); - this.submitRemainingRequests(); + this.working = false; + + this.submitRemainingRequests(); + }); }; this.worker.onmessageerror = (e: MessageEvent) => { @@ -81,7 +85,7 @@ export default class WorkerLinter implements Linter { return promise; } - private submitRemainingRequests() { + private async submitRemainingRequests() { if (this.working) { return; } @@ -91,7 +95,7 @@ export default class WorkerLinter implements Linter { if (this.requestQueue.length > 0) { const { request } = this.requestQueue[0]; - this.worker.postMessage(serialize(request)); + this.worker.postMessage(await serialize(request)); } else { this.working = false; } diff --git a/packages/harper.js/src/WorkerLinter/worker.js b/packages/harper.js/src/WorkerLinter/worker.js index 50c257f1..d6bf952b 100644 --- a/packages/harper.js/src/WorkerLinter/worker.js +++ b/packages/harper.js/src/WorkerLinter/worker.js @@ -3,10 +3,16 @@ import { deserialize, serializeArg } from './communication'; const linter = new LocalLinter(); -self.onmessage = function (e) { - const { procName, args } = deserialize(e.data); +/** @param {SerializedRequest} v */ +async function processRequest(v) { + const { procName, args } = await deserialize(v); + + let res = await linter[procName](...args); + postMessage(await serializeArg(res)); +} - linter[procName](...args).then((res) => postMessage(serializeArg(res))); +self.onmessage = function (e) { + processRequest(e.data); }; // Notify the main thread that we are ready diff --git a/packages/harper.js/src/loadWasm.ts b/packages/harper.js/src/loadWasm.ts new file mode 100644 index 00000000..26dba6f3 --- /dev/null +++ b/packages/harper.js/src/loadWasm.ts @@ -0,0 +1,9 @@ +import wasmUrl from 'wasm/harper_wasm_bg.wasm?url'; + +/** Load the WebAssembly manually and dynamically, making sure to setup infrastructure. */ +export default async function loadWasm() { + const wasm = await import('wasm'); + await wasm.default(wasmUrl); + + return wasm; +} diff --git a/packages/harper.js/src/main.test.ts b/packages/harper.js/src/main.test.ts new file mode 100644 index 00000000..f50e83a3 --- /dev/null +++ b/packages/harper.js/src/main.test.ts @@ -0,0 +1,8 @@ +import { expect, test } from 'vitest'; +import { SuggestionKind as WasmSuggestionKind } from 'wasm'; +import { SuggestionKind } from './main'; + +test('Wasm and JS SuggestionKinds agree', async () => { + expect(SuggestionKind.Remove).toBe(WasmSuggestionKind.Remove); + expect(SuggestionKind.Replace).toBe(WasmSuggestionKind.Replace); +}); diff --git a/packages/harper.js/src/main.ts b/packages/harper.js/src/main.ts index 8648c017..9f1ccd56 100644 --- a/packages/harper.js/src/main.ts +++ b/packages/harper.js/src/main.ts @@ -3,5 +3,10 @@ import Linter from './Linter'; import LocalLinter from './LocalLinter'; import WorkerLinter from './WorkerLinter'; -export { Lint, Span, Suggestion, LocalLinter, WorkerLinter }; -export type { Linter }; +export { LocalLinter, WorkerLinter }; +export type { Linter, Lint, Span, Suggestion }; + +export enum SuggestionKind { + Replace = 0, + Remove = 1 +} diff --git a/packages/harper.js/vite.config.js b/packages/harper.js/vite.config.js index 92ecb94e..0ed6aa79 100644 --- a/packages/harper.js/vite.config.js +++ b/packages/harper.js/vite.config.js @@ -1,24 +1,27 @@ import { resolve } from 'path'; import dts from 'vite-plugin-dts'; -import topLevelAwait from 'vite-plugin-top-level-await'; -import wasm from 'vite-plugin-wasm'; import { defineConfig } from 'vite'; export default defineConfig({ build: { lib: { entry: resolve(__dirname, 'src/main.ts'), - fileName: `harper.js`, + fileName: `harper`, name: 'harper', formats: ['es'] } }, base: './', - plugins: [wasm(), topLevelAwait(), dts({ rollupTypes: true, tsconfigPath: './tsconfig.json' })], + plugins: [dts({ rollupTypes: true, tsconfigPath: './tsconfig.json' })], worker: { - plugins: [wasm(), topLevelAwait()], + plugins: [], format: 'es' }, + server: { + fs: { + allow: ['../../harper-wasm/pkg'] + } + }, test: { browser: { provider: 'playwright', diff --git a/packages/web/src/lib/Editor.svelte b/packages/web/src/lib/Editor.svelte index a9bd94d9..db9059a3 100644 --- a/packages/web/src/lib/Editor.svelte +++ b/packages/web/src/lib/Editor.svelte @@ -3,8 +3,8 @@ import demo from '../../../../demo.md?raw'; import Underlines from '$lib/Underlines.svelte'; import { Button } from 'flowbite-svelte'; - import { WorkerLinter } from 'harper.js'; - import { Lint, SuggestionKind } from 'wasm'; + import { WorkerLinter, SuggestionKind } from 'harper.js'; + import type { Lint } from 'harper.js'; import CheckMark from '$lib/CheckMark.svelte'; import { fly } from 'svelte/transition'; diff --git a/packages/web/src/lib/Underlines.svelte b/packages/web/src/lib/Underlines.svelte index 4b32e90b..686858b2 100644 --- a/packages/web/src/lib/Underlines.svelte +++ b/packages/web/src/lib/Underlines.svelte @@ -4,8 +4,8 @@ // Someday, I'll return to it and spruce it up. // For now, it works. + import type { Lint } from 'harper.js'; import { WorkerLinter } from 'harper.js'; - import type { Lint } from 'wasm'; export let content: string; export let focusLintIndex: number | undefined; diff --git a/packages/yarn.lock b/packages/yarn.lock index 38f58fb1..cf25f97c 100644 --- a/packages/yarn.lock +++ b/packages/yarn.lock @@ -1150,101 +1150,51 @@ svelte-hmr "^0.15.3" vitefu "^0.2.4" -"@swc/core-darwin-arm64@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.1.tgz#faaaab19b4a039ae67ef661c0144a6f20fe8a78e" - integrity sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q== - "@swc/core-darwin-arm64@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz#2b5cdbd34e4162e50de6147dd1a5cb12d23b08e8" integrity sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ== -"@swc/core-darwin-x64@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.10.1.tgz#754600f453abd24471c202d48836f1161d798f49" - integrity sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA== - "@swc/core-darwin-x64@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz#6aa7e3c01ab8e5e41597f8a24ff24c4e50936a46" integrity sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw== -"@swc/core-linux-arm-gnueabihf@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.1.tgz#b0f43c482d0d1819b382a4eb4a0733ce2e386257" - integrity sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw== - "@swc/core-linux-arm-gnueabihf@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz#160108633b9e1d1ad05f815bedc7e9eb5d59fc2a" integrity sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ== -"@swc/core-linux-arm64-gnu@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.1.tgz#e02a9e22c25ba85ef00335742e549e06284cf33a" - integrity sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ== - "@swc/core-linux-arm64-gnu@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz#cbfa512683c73227ad25552f3b3e722b0e7fbd1d" integrity sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g== -"@swc/core-linux-arm64-musl@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.1.tgz#3a0530af8f8bd3717f2f1bd8a2f5183fc58d4cf1" - integrity sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ== - "@swc/core-linux-arm64-musl@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz#80239cb58fe57f3c86b44617fe784530ec55ee2b" integrity sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ== -"@swc/core-linux-x64-gnu@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.1.tgz#5eb4d282b047a22896ab1d4627403be4c3e4fa6a" - integrity sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA== - "@swc/core-linux-x64-gnu@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz#a699c1632de60b6a63b7fdb7abcb4fef317e57ca" integrity sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg== -"@swc/core-linux-x64-musl@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.1.tgz#890f2eda3e67ccc6817cdd04eff91e6ad9e761c4" - integrity sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA== - "@swc/core-linux-x64-musl@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz#8e4c203d6bc41e7f85d7d34d0fdf4ef751fa626c" integrity sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg== -"@swc/core-win32-arm64-msvc@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.1.tgz#4ea7b2a2fab47f801d31ea8b001a141efaa5e6bf" - integrity sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ== - "@swc/core-win32-arm64-msvc@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz#31e3d42b8c0aa79f0ea1a980c0dd1a999d378ed7" integrity sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA== -"@swc/core-win32-ia32-msvc@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.1.tgz#729102669ccdb72e69884cce58e3686ac63d6f36" - integrity sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA== - "@swc/core-win32-ia32-msvc@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz#a235285f9f62850aefcf9abb03420f2c54f63638" integrity sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ== -"@swc/core-win32-x64-msvc@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.1.tgz#7d665a7c69642861aed850ecb0cdf5d87197edda" - integrity sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA== - "@swc/core-win32-x64-msvc@1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz#f84641393b5223450d00d97bfff877b8b69d7c9b" @@ -1269,25 +1219,6 @@ "@swc/core-win32-ia32-msvc" "1.5.7" "@swc/core-win32-x64-msvc" "1.5.7" -"@swc/core@^1.7.0": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.10.1.tgz#16b3b8284bafb0ecabb253925796883971e5a761" - integrity sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w== - dependencies: - "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.17" - optionalDependencies: - "@swc/core-darwin-arm64" "1.10.1" - "@swc/core-darwin-x64" "1.10.1" - "@swc/core-linux-arm-gnueabihf" "1.10.1" - "@swc/core-linux-arm64-gnu" "1.10.1" - "@swc/core-linux-arm64-musl" "1.10.1" - "@swc/core-linux-x64-gnu" "1.10.1" - "@swc/core-linux-x64-musl" "1.10.1" - "@swc/core-win32-arm64-msvc" "1.10.1" - "@swc/core-win32-ia32-msvc" "1.10.1" - "@swc/core-win32-x64-msvc" "1.10.1" - "@swc/counter@^0.1.2", "@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" @@ -1300,13 +1231,6 @@ dependencies: "@swc/counter" "^0.1.3" -"@swc/types@^0.1.17": - version "0.1.17" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.17.tgz#bd1d94e73497f27341bf141abdf4c85230d41e7c" - integrity sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ== - dependencies: - "@swc/counter" "^0.1.3" - "@testing-library/dom@^10.4.0": version "10.4.0" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" @@ -5531,11 +5455,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== - uuid@^8.3.0: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -5581,15 +5500,6 @@ vite-plugin-top-level-await@^1.4.1: "@swc/core" "^1.3.100" uuid "^9.0.1" -vite-plugin-top-level-await@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.4.tgz#4900e06bfb7179de20aaa9b4730d04022a9e259e" - integrity sha512-QyxQbvcMkgt+kDb12m2P8Ed35Sp6nXP+l8ptGrnHV9zgYDUpraO0CPdlqLSeBqvY2DToR52nutDG7mIHuysdiw== - dependencies: - "@rollup/plugin-virtual" "^3.0.2" - "@swc/core" "^1.7.0" - uuid "^10.0.0" - vite-plugin-wasm@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/vite-plugin-wasm/-/vite-plugin-wasm-3.3.0.tgz#2908ef2529bf8f33f4e549c8c6fda26ad273ca15"