From f0299167e8947c23481223dc141f471b97fff213 Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Mon, 7 Sep 2026 15:07:56 +0200 Subject: [PATCH 01/11] Fix browser entry in bundlers without wasm ESM support (npm 1.0.16) The /browser entry (wasm-pack --target bundler output) does 'import * as wasm from ./superscript_bg.wasm', which bundlers like Bun and esbuild resolve as a file asset instead of a wasm module, so wasm.__wbindgen_start() throws at import time and evaluation never runs (Superwall-Web then falls back to fail-open matching). browser.ts now tries the bundler-target import first and falls back to a new --target web build initialised from base64-inlined wasm bytes, which needs no bundler wasm/asset support. The fallback is behind a dynamic import so wasm-capable bundlers (webpack asyncWebAssembly, vite-plugin-wasm) code-split it and never fetch it. Also removes noisy console.log calls from the browser host-context callbacks, and aligns the npm package version (previously lagging at 1.0.3) and the wasm wrapper crate with the repo versioning at 1.0.16. Co-authored-by: Cursor --- CHANGELOG.md | 9 ++++++ wasm/Cargo.toml | 2 +- wasm/package.json | 8 +++-- wasm/scripts/inline-wasm.ts | 30 ++++++++++++++++++ wasm/src/browser.ts | 63 +++++++++++++++++++++++++++---------- 5 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 wasm/scripts/inline-wasm.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c7998b0..3ff5f06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +## 1.0.16 + +npm-only release (`@superwall/superscript`). Also aligns the npm package version — previously lagging at 1.0.3 — with the repo versioning. + +### Fixes + +- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers without WebAssembly ESM integration (Bun, esbuild, default Next.js). The entry now tries the existing wasm-pack `--target bundler` output first and, if that import fails, falls back to a new `--target web` build initialised from base64-inlined wasm bytes — no bundler wasm/asset support required. The fallback lives in a separate lazily-loaded chunk, so webpack (`asyncWebAssembly`) and vite-plugin-wasm consumers are unaffected. +- Removes noisy `console.log` calls from the browser host-context property callbacks. + ## 1.0.15 ### Fixes diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index f2cce0a..842eba7 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "superscript" -version = "1.0.12" +version = "1.0.16" edition = "2021" publish = false diff --git a/wasm/package.json b/wasm/package.json index ef006dd..fb71299 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -1,6 +1,6 @@ { "name": "@superwall/superscript", - "version": "1.0.2", + "version": "1.0.16", "type": "module", "main": "./dist/cjs/node.js", "module": "./dist/esm/node.js", @@ -25,11 +25,13 @@ "clean": "rm -rf target dist", "build:wasm:node": "wasm-pack build --target nodejs --out-dir ./target/node", "build:wasm:browser": "wasm-pack build --target bundler --out-dir ./target/browser", + "build:wasm:web": "wasm-pack build --target web --out-dir ./target/web && bun run generate:inline", + "generate:inline": "bun scripts/inline-wasm.ts", "build:ts:esm": "tsc --outDir ./dist/esm --module ES2020", "build:ts:cjs": "tsc --outDir ./dist/cjs --module CommonJS", "build:ts": "npm run build:ts:esm && npm run build:ts:cjs", - "copy:wasm": "mkdir -p dist/target/node dist/target/browser && cp -r target/node/* dist/target/node/ && cp -r target/browser/* dist/target/browser/", - "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:ts && npm run copy:wasm", + "copy:wasm": "mkdir -p dist/target/node dist/target/browser dist/target/web && cp -r target/node/* dist/target/node/ && cp -r target/browser/* dist/target/browser/ && cp -r target/web/* dist/target/web/", + "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:wasm:web && npm run build:ts && npm run copy:wasm", "prepublishOnly": "npm run build" }, "devDependencies": { diff --git a/wasm/scripts/inline-wasm.ts b/wasm/scripts/inline-wasm.ts new file mode 100644 index 0000000..389326b --- /dev/null +++ b/wasm/scripts/inline-wasm.ts @@ -0,0 +1,30 @@ +// Generates `target/web/superscript_bg_inline.js` (+ .d.ts): the web-target +// wasm binary as a base64 string. Imported lazily by `src/browser.ts` as a +// fallback for bundlers without WebAssembly ESM integration (Bun, esbuild), +// where the `--target bundler` glue fails at import time. Run after +// `build:wasm:web`, before `build:ts`. + +import { join } from 'node:path'; + +const webDir = join(import.meta.dir, '..', 'target', 'web'); +const wasmPath = join(webDir, 'superscript_bg.wasm'); + +const bytes = await Bun.file(wasmPath).arrayBuffer(); +const base64 = Buffer.from(bytes).toString('base64'); + +const js = `// Auto-generated by scripts/inline-wasm.ts — do not edit. +// Base64 of superscript_bg.wasm (web target) for bundler-agnostic loading. +export const wasmBase64 = + "${base64}"; +`; + +const dts = `// Auto-generated by scripts/inline-wasm.ts — do not edit. +export declare const wasmBase64: string; +`; + +await Bun.write(join(webDir, 'superscript_bg_inline.js'), js); +await Bun.write(join(webDir, 'superscript_bg_inline.d.ts'), dts); + +console.log( + `inline-wasm: wrote superscript_bg_inline.js (${(base64.length / 1024 / 1024).toFixed(2)} MB base64 from ${(bytes.byteLength / 1024 / 1024).toFixed(2)} MB wasm)` +); diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index 03574b0..2e88a27 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -1,33 +1,64 @@ import type { SuperscriptHostContext, ExecutionContext } from './types'; -// Dynamic import for the browser WASM module -async function loadWasmModule() { - const wasm = await import('../target/browser/superscript.js'); - return wasm; +/** Minimal shape of the wasm-bindgen glue module we call into. */ +interface WasmExports { + evaluate_with_context(input: string, context: unknown): Promise; } -let wasmModule: any = null; +let wasmModulePromise: Promise | null = null; + +/** + * Primary path: wasm-pack `--target bundler` output. It does + * `import * as wasm from './superscript_bg.wasm'`, which only works in + * bundlers with WebAssembly ESM integration (webpack `asyncWebAssembly`, + * vite-plugin-wasm, Rollup wasm plugin, …). + */ +async function loadBundlerModule(): Promise { + return await import('../target/browser/superscript.js'); +} + +/** + * Fallback path: wasm-pack `--target web` output initialised from + * base64-inlined wasm bytes. Needs no bundler wasm/asset support at all, so + * it works under Bun, esbuild, and any bundler that treats `.wasm` imports + * as plain file assets (where the bundler path throws + * "wasm.__wbindgen_start is not a function" at import time). + * + * Both modules are behind dynamic imports, so wasm-capable bundlers put the + * inline chunk in a separate lazily-loaded chunk that is never fetched on + * the happy path. + */ +async function loadInlineModule(): Promise { + const [glue, inline] = await Promise.all([ + import('../target/web/superscript.js'), + import('../target/web/superscript_bg_inline.js'), + ]); + const binary = Uint8Array.from(atob(inline.wasmBase64), (c) => + c.charCodeAt(0) + ); + await glue.default({ module_or_path: binary }); + return glue as unknown as WasmExports; +} + +function loadWasmModule(): Promise { + wasmModulePromise ??= loadBundlerModule().catch(() => loadInlineModule()); + return wasmModulePromise; +} export async function evaluateWithContext( input: ExecutionContext, context: SuperscriptHostContext ): Promise { - if (!wasmModule) { - wasmModule = await loadWasmModule(); - } - + const wasmModule = await loadWasmModule(); + const hostContext = { computed_property: (name: string, args: string) => { const parsedArgs = JSON.parse(args); - let res = JSON.stringify(context.computed_property(name, parsedArgs)) - console.log("Computed property result in browser", res); - return res; + return JSON.stringify(context.computed_property(name, parsedArgs)); }, device_property: (name: string, args: string) => { const parsedArgs = JSON.parse(args); - let res = JSON.stringify(context.device_property(name, parsedArgs)) - console.log("Device property result in browser", res); - return res; + return JSON.stringify(context.device_property(name, parsedArgs)); } } const inputJson = JSON.stringify(input); @@ -38,4 +69,4 @@ export type { SuperscriptHostContext as WasmHostContext, ExecutionContext, ValueType, -} from './types'; \ No newline at end of file +} from './types'; From 3093af6ff6cd46bfb686629e0f37291394e4b5bd Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 15:32:56 +0200 Subject: [PATCH 02/11] Address review: accurate toolchain claims, error context, fix example CI - CHANGELOG + browser.ts docs: only claim toolchains the runtime fallback demonstrably reaches. Bun works out of the box; esbuild needs --loader:.wasm=file (verified: build fails without it, fallback works with it); default Next.js webpack config fails at build time as before and needs experiments.asyncWebAssembly. - browser.ts: preserve both load-path errors when bundler and inline paths fail, instead of memoizing only the inline rejection. - examples/browser: regenerate bun.lock (old one only recorded @rollup/rollup-darwin-arm64, breaking Linux CI with 'Cannot find module @rollup/rollup-linux-x64-gnu'); drop stale bun.lockb and package-lock.json; replace vite-plugin-top-level-await (incompatible with current @swc/core: 'missing field type') with build.target esnext. Co-authored-by: Cursor --- CHANGELOG.md | 2 +- examples/browser/bun.lock | 346 +++++++++----- examples/browser/bun.lockb | Bin 97193 -> 0 bytes examples/browser/package-lock.json | 738 ----------------------------- examples/browser/package.json | 2 +- examples/browser/vite.config.ts | 10 +- wasm/src/browser.ts | 33 +- 7 files changed, 255 insertions(+), 876 deletions(-) delete mode 100755 examples/browser/bun.lockb delete mode 100644 examples/browser/package-lock.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ff5f06..b054980 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ npm-only release (`@superwall/superscript`). Also aligns the npm package version ### Fixes -- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers without WebAssembly ESM integration (Bun, esbuild, default Next.js). The entry now tries the existing wasm-pack `--target bundler` output first and, if that import fails, falls back to a new `--target web` build initialised from base64-inlined wasm bytes — no bundler wasm/asset support required. The fallback lives in a separate lazily-loaded chunk, so webpack (`asyncWebAssembly`) and vite-plugin-wasm consumers are unaffected. +- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules — Bun out of the box, esbuild when configured with `--loader:.wasm=file`. The entry now tries the existing wasm-pack `--target bundler` output first and, if that import fails, falls back to a new `--target web` build initialised from base64-inlined wasm bytes. The fallback lives in a separate lazily-loaded chunk, so webpack (`asyncWebAssembly`) and vite-plugin-wasm consumers are unaffected. Note: bundlers with no `.wasm` handling at all (esbuild without the loader flag, Next.js' default webpack config) fail at build time before either path can run — unchanged from previous releases; they require `--loader:.wasm=file` resp. `experiments.asyncWebAssembly: true`. - Removes noisy `console.log` calls from the browser host-context property callbacks. ## 1.0.15 diff --git a/examples/browser/bun.lock b/examples/browser/bun.lock index 3c1bb46..1017369 100644 --- a/examples/browser/bun.lock +++ b/examples/browser/bun.lock @@ -1,6 +1,6 @@ { "lockfileVersion": 1, - "configVersion": 0, + "configVersion": 1, "workspaces": { "": { "name": "browser-2", @@ -12,6 +12,7 @@ "react-dom": "^19.0.0", "react-split": "^2.0.14", "superscript": "../../wasm/target/browser", + "superscript": "../../wasm/target/browser", }, "devDependencies": { "@types/react": "^19.0.10", @@ -20,7 +21,6 @@ "globals": "^15.15.0", "typescript": "~5.8.2", "vite": "^6.2.1", - "vite-plugin-top-level-await": "^1.5.0", "vite-plugin-wasm": "^3.4.1", }, }, @@ -30,39 +30,159 @@ "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.5.7", "", {}, "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.1", "", { "os": "darwin", "cpu": "arm64" }, ""], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@monaco-editor/loader": ["@monaco-editor/loader@1.7.0", "", { "dependencies": { "state-local": "^1.0.6" } }, "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA=="], + + "@monaco-editor/react": ["@monaco-editor/react@4.7.0", "", { "dependencies": { "@monaco-editor/loader": "^1.5.0" }, "peerDependencies": { "monaco-editor": ">= 0.25.0 < 1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA=="], + + "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.1", "", { "os": "android", "cpu": "arm" }, "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.1", "", { "os": "android", "cpu": "arm64" }, "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw=="], - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, ""], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ=="], - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, ""], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA=="], - "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, ""], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA=="], - "@jridgewell/source-map": ["@jridgewell/source-map@0.3.6", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, ""], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, ""], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, ""], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ=="], - "@monaco-editor/loader": ["@monaco-editor/loader@1.5.0", "", { "dependencies": { "state-local": "^1.0.6" } }, ""], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A=="], - "@monaco-editor/react": ["@monaco-editor/react@4.7.0", "", { "dependencies": { "@monaco-editor/loader": "^1.5.0" }, "peerDependencies": { "monaco-editor": ">= 0.25.0 < 1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, ""], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w=="], - "@rollup/plugin-virtual": ["@rollup/plugin-virtual@3.0.2", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, ""], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.35.0", "", { "os": "darwin", "cpu": "arm64" }, ""], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA=="], - "@superwall/superscript": ["@superwall/superscript@file:../../wasm", { "devDependencies": { "@types/node": "^20.0.0", "@types/webpack": "^5.0.0", "@wasm-tool/wasm-pack-plugin": "1.5.0", "ts-loader": "^9.0.0", "ts-node": "^10.0.0", "typescript": "^5.0.0", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" } }], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.1", "", { "os": "none", "cpu": "arm64" }, "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw=="], - "@swc/core": ["@swc/core@1.11.8", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.19" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.11.8" }, "peerDependencies": { "@swc/helpers": "*" }, "optionalPeers": ["@swc/helpers"] }, ""], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg=="], - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.11.8", "", { "os": "darwin", "cpu": "arm64" }, ""], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg=="], - "@swc/counter": ["@swc/counter@0.1.3", "", {}, ""], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg=="], - "@swc/types": ["@swc/types@0.1.19", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, ""], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w=="], - "@tsconfig/node10": ["@tsconfig/node10@1.0.11", "", {}, "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="], + "@superwall/superscript": ["@superwall/superscript@file:../../wasm", { "devDependencies": { "@types/node": "^20.0.0", "@types/webpack": "^5.0.0", "@wasm-tool/wasm-pack-plugin": "1.5.0", "ts-loader": "^9.0.0", "ts-node": "^10.0.0", "typescript": "~5.8.0", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" } }], + + "@swc/core": ["@swc/core@1.16.2", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.28" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.16.2", "@swc/core-darwin-x64": "1.16.2", "@swc/core-linux-arm-gnueabihf": "1.16.2", "@swc/core-linux-arm64-gnu": "1.16.2", "@swc/core-linux-arm64-musl": "1.16.2", "@swc/core-linux-ppc64-gnu": "1.16.2", "@swc/core-linux-s390x-gnu": "1.16.2", "@swc/core-linux-x64-gnu": "1.16.2", "@swc/core-linux-x64-musl": "1.16.2", "@swc/core-win32-arm64-msvc": "1.16.2", "@swc/core-win32-ia32-msvc": "1.16.2", "@swc/core-win32-x64-msvc": "1.16.2" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-95I4kiSMeveI/Mhi+tE4fiWcWLUMfzfKrk0jtr8LRMqHgOgq+xHS+zExkDqoO4b5OeeuXHMWVdD5MeP3X6sULw=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.16.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-i/j0HNbnn79qnTVPicvay92Nark8fW8NQqn1e2mGERjUXNpBV0+SwQxlRpk2zBhn6laJ8PDI6Kn1nHZhnz3LCA=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.16.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-HrwqHyEyHVXO3qTk8EkNK7/b6sOZSEoNh+pot6RdE5x0LbNqfo8LtJUvi3UTXr+5ja/o5HbJdW80eCXo+NjbiA=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.16.2", "", { "os": "linux", "cpu": "arm" }, "sha512-MdXi83Z/gGp1LIrg+h7HKxiul/z/Bty/ZJSvYAFqDl9zteC1XLSAZdScquKtXPp50rdyXqritTDCqQBhwVfZKA=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.16.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-/jcTmK6Ktz3owM3YtiKvjofV6p3VpHnYzTIrOGwDIOsDigRAAVuZ8east33wYO/7UTdKYFlyHNnJNT0WJqOA3Q=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.16.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-4gFarKaFnlJTSlJYKmMhV4u+3YE4uYfiydpBoYjmgQhCf9lAieOq+WilZaK9vVSHeqLuQpTEiGULZqAdsRX5Dw=="], + + "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.16.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-syqSLGd6KlZ1PciNzs6bIUlhOuFztZufebOHaERjc4N4SqNZxyqYd4I+jj/EfOYnpe0kNjccn9HJLN1p5dz3+w=="], + + "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.16.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-ZBBLK+ewGyXLzWeMS7wbKtWBdnif6etn7xvPY/iOfbdsjX/+bgkp1pQt2lWF2wlu2hXYZuhJ/tHZE/QR8/apzg=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.16.2", "", { "os": "linux", "cpu": "x64" }, "sha512-LyHJgxCA4Tje0ysBMbEb0tt/ie8kgUKoFE3JAKFhpevmTmhYEoC0H9s47WuDsqiFckF1ITUguZIXJG6K5e0dvg=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.16.2", "", { "os": "linux", "cpu": "x64" }, "sha512-PghXJlVM1cgtLfNUR1vxFo1z+PDRAe8cWAJlZZ7spmeiN7BospGXg/MHUg7oNSgwSX7Zo//YKv9P5yD9apsFJQ=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.16.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-StTOSefYBxemvNYYUI3UmO1a8y+hSPjjfHogC2TEHL+Z1PlEBim/XtLas5rS04jAzT9RrNmbtX911SZ42H9jSQ=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.16.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-fycER209DYIzsibpTMC+chND05OfOjgztWL9U8OE6/uUlsOUZH3eh98isBLEnOymYUhlJLEt5++W1+KL/FOh5Q=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.16.2", "", { "os": "win32", "cpu": "x64" }, "sha512-cSd1z6ivSrJPVr+moVwOHWjeKy6TpO4/Shwcv5KCrKYXCccxwh4pRy1C3fDioNx2PF1jPZWHKZjtXt+Be9VbaQ=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/types": ["@swc/types@0.1.28", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw=="], + + "@tsconfig/node10": ["@tsconfig/node10@1.0.13", "", {}, "sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg=="], "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], @@ -70,23 +190,21 @@ "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], - "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], - - "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], - - "@types/estree": ["@types/estree@1.0.6", "", {}, ""], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/node": ["@types/node@20.17.24", "", { "dependencies": { "undici-types": "~6.19.2" } }, ""], + "@types/node": ["@types/node@20.19.43", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA=="], + + "@types/react": ["@types/react@19.2.18", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w=="], - "@types/react": ["@types/react@19.0.10", "", { "dependencies": { "csstype": "^3.0.2" } }, ""], + "@types/react-dom": ["@types/react-dom@19.2.7", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ=="], - "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, ""], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/webpack": ["@types/webpack@5.28.5", "", { "dependencies": { "@types/node": "*", "tapable": "^2.2.0", "webpack": "^5" } }, "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw=="], - "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.8.0", "", { "dependencies": { "@swc/core": "^1.10.15" }, "peerDependencies": { "vite": "^4 || ^5 || ^6" } }, ""], + "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.11.0", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-beta.27", "@swc/core": "^1.12.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7" } }, "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w=="], "@wasm-tool/wasm-pack-plugin": ["@wasm-tool/wasm-pack-plugin@1.5.0", "", { "dependencies": { "chalk": "^2.4.1", "command-exists": "^1.2.7", "watchpack": "^2.1.1", "which": "^2.0.2" } }, "sha512-qsGJ953zrXZdXW58cfYOh2nBXp0SYBsFhkxqh9p4JK8cXllEzHeRXoVO+qtgEB31+s1tsL8eda3Uy97W/7yOAg=="], @@ -130,11 +248,11 @@ "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], - "acorn": ["acorn@8.14.1", "", { "bin": "bin/acorn" }, ""], + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], - "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + "acorn-walk": ["acorn-walk@8.3.5", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw=="], - "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], @@ -144,13 +262,13 @@ "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.21", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ=="], - "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], + "browserslist": ["browserslist@4.28.9", "", { "dependencies": { "baseline-browser-mapping": "^2.11.20", "caniuse-lite": "^1.0.30001810", "electron-to-chromium": "^1.5.420", "node-releases": "^2.0.54", "update-browserslist-db": "^1.3.2" }, "bin": { "browserslist": "cli.js" } }, "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg=="], - "buffer-from": ["buffer-from@1.1.2", "", {}, ""], + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001703", "", {}, "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], @@ -166,71 +284,65 @@ "command-exists": ["command-exists@1.2.9", "", {}, "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="], - "commander": ["commander@2.20.3", "", {}, ""], + "commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "csstype": ["csstype@3.1.3", "", {}, ""], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], + "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], - "electron-to-chromium": ["electron-to-chromium@1.5.114", "", {}, "sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA=="], + "dompurify": ["dompurify@3.4.8", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ=="], - "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.423", "", {}, "sha512-rRZfTSY8ptHYMQxa+uIycJMFKmY1T0GIApNMXJYGehguTZa56TEEl19pKPCoBqk5Gpf7QizZn/jt7xur+DYxag=="], - "envinfo": ["envinfo@7.14.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg=="], + "enhanced-resolve": ["enhanced-resolve@5.24.5", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="], - "es-module-lexer": ["es-module-lexer@1.6.0", "", {}, "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="], + "envinfo": ["envinfo@7.21.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow=="], - "esbuild": ["esbuild@0.25.1", "", { "optionalDependencies": { "@esbuild/darwin-arm64": "0.25.1" }, "bin": "bin/esbuild" }, ""], + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - - "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "es-module-lexer": ["es-module-lexer@2.3.2", "", {}, "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw=="], - "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + "fast-uri": ["fast-uri@3.1.7", "", {}, "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg=="], "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, ""], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - - "globals": ["globals@15.15.0", "", {}, ""], + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], "interpret": ["interpret@3.1.1", "", {}, "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], @@ -240,45 +352,37 @@ "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], - "js-tokens": ["js-tokens@4.0.0", "", {}, ""], - - "json-edit-react": ["json-edit-react@1.23.1", "", { "dependencies": { "object-property-assigner": "^1.3.5", "object-property-extractor": "^1.0.13" }, "peerDependencies": { "react": ">=16.0.0" } }, ""], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "json-edit-react": ["json-edit-react@1.30.2", "", { "peerDependencies": { "react": ">=16.0.0" } }, "sha512-uUIDqCxTvOXoIgxJXLscInTL09M+W7RPl/vJQIXlrgImcK8umQ8MdGFCCExCyPRNoRhAAXQJ0//QnDftM8UdSQ=="], "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], - "loader-runner": ["loader-runner@4.3.0", "", {}, "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="], - "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, ""], + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + "marked": ["marked@14.0.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ=="], - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "minimizer-webpack-plugin": ["minimizer-webpack-plugin@5.10.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "jest-worker": "^27.4.5", "schema-utils": "^4.3.3", "terser": "^5.51.0" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-2//60T4S0X1Ug/dqLDOgDaGlZsN1Lv8hf8oB0NOV/KIHSaXlPwXBBIbim79dE2Z7NEs52ES8YHoSv6Lmsk+XNg=="], - "monaco-editor": ["monaco-editor@0.52.2", "", {}, ""], + "monaco-editor": ["monaco-editor@0.56.0", "", { "dependencies": { "dompurify": "3.4.8", "marked": "14.0.0" } }, "sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg=="], - "nanoid": ["nanoid@3.3.9", "", { "bin": "bin/nanoid.cjs" }, ""], + "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], - "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], - - "object-assign": ["object-assign@4.1.1", "", {}, ""], + "node-releases": ["node-releases@2.0.54", "", {}, "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ=="], - "object-property-assigner": ["object-property-assigner@1.3.5", "", {}, ""], - - "object-property-extractor": ["object-property-extractor@1.0.13", "", {}, ""], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], @@ -292,47 +396,39 @@ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "picocolors": ["picocolors@1.1.1", "", {}, ""], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], - "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, ""], - - "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, ""], + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], - "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], - "react": ["react@19.0.0", "", {}, ""], + "react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], - "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, ""], + "react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], - "react-is": ["react-is@16.13.1", "", {}, ""], + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - "react-split": ["react-split@2.0.14", "", { "dependencies": { "prop-types": "^15.5.7", "split.js": "^1.6.0" }, "peerDependencies": { "react": "*" } }, ""], + "react-split": ["react-split@2.0.14", "", { "dependencies": { "prop-types": "^15.5.7", "split.js": "^1.6.0" }, "peerDependencies": { "react": "*" } }, "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA=="], "rechoir": ["rechoir@0.8.0", "", { "dependencies": { "resolve": "^1.20.0" } }, "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "rollup": ["rollup@4.35.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-darwin-arm64": "4.35.0", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, ""], + "rollup": ["rollup@4.63.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.1", "@rollup/rollup-android-arm64": "4.63.1", "@rollup/rollup-darwin-arm64": "4.63.1", "@rollup/rollup-darwin-x64": "4.63.1", "@rollup/rollup-freebsd-arm64": "4.63.1", "@rollup/rollup-freebsd-x64": "4.63.1", "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", "@rollup/rollup-linux-arm-musleabihf": "4.63.1", "@rollup/rollup-linux-arm64-gnu": "4.63.1", "@rollup/rollup-linux-arm64-musl": "4.63.1", "@rollup/rollup-linux-loong64-gnu": "4.63.1", "@rollup/rollup-linux-loong64-musl": "4.63.1", "@rollup/rollup-linux-ppc64-gnu": "4.63.1", "@rollup/rollup-linux-ppc64-musl": "4.63.1", "@rollup/rollup-linux-riscv64-gnu": "4.63.1", "@rollup/rollup-linux-riscv64-musl": "4.63.1", "@rollup/rollup-linux-s390x-gnu": "4.63.1", "@rollup/rollup-linux-x64-gnu": "4.63.1", "@rollup/rollup-linux-x64-musl": "4.63.1", "@rollup/rollup-openbsd-x64": "4.63.1", "@rollup/rollup-openharmony-arm64": "4.63.1", "@rollup/rollup-win32-arm64-msvc": "4.63.1", "@rollup/rollup-win32-ia32-msvc": "4.63.1", "@rollup/rollup-win32-x64-gnu": "4.63.1", "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "scheduler": ["scheduler@0.25.0", "", {}, ""], - - "schema-utils": ["schema-utils@4.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g=="], - - "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], - - "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], "shallow-clone": ["shallow-clone@3.0.1", "", { "dependencies": { "kind-of": "^6.0.2" } }, "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="], @@ -340,15 +436,17 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "source-map-js": ["source-map-js@1.2.1", "", {}, ""], + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, ""], + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - "split.js": ["split.js@1.6.5", "", {}, ""], + "split.js": ["split.js@1.6.5", "", {}, "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw=="], - "state-local": ["state-local@1.0.7", "", {}, ""], + "state-local": ["state-local@1.0.7", "", {}, "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w=="], + + "superscript": ["superscript@file:../../wasm/target/browser", {}], "superscript": ["superscript@file:../../wasm/target/browser", {}], @@ -356,43 +454,37 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], - - "terser": ["terser@5.39.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": "bin/terser" }, ""], + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], - "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], + "terser": ["terser@5.51.2", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q=="], - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], - "ts-loader": ["ts-loader@9.5.2", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4", "source-map": "^0.7.4" }, "peerDependencies": { "typescript": "*", "webpack": "^5.0.0" } }, "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw=="], + "ts-loader": ["ts-loader@9.6.2", "", { "dependencies": { "chalk": "^4.1.0", "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "peerDependencies": { "loader-utils": "*", "typescript": "*", "webpack": "^4.0.0 || ^5.0.0" }, "optionalPeers": ["loader-utils"] }, "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA=="], "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], - "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, ""], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - "undici-types": ["undici-types@6.19.8", "", {}, ""], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], - "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], - - "uuid": ["uuid@10.0.0", "", { "bin": "dist/bin/uuid" }, ""], + "update-browserslist-db": ["update-browserslist-db@1.3.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw=="], "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], - "vite": ["vite@6.2.1", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "tsx", "yaml"], "bin": "bin/vite.js" }, ""], - - "vite-plugin-top-level-await": ["vite-plugin-top-level-await@1.5.0", "", { "dependencies": { "@rollup/plugin-virtual": "^3.0.2", "@swc/core": "^1.10.16", "uuid": "^10.0.0" }, "peerDependencies": { "vite": ">=2.8" } }, ""], + "vite": ["vite@6.4.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="], - "vite-plugin-wasm": ["vite-plugin-wasm@3.4.1", "", { "peerDependencies": { "vite": "^2 || ^3 || ^4 || ^5 || ^6" } }, ""], + "vite-plugin-wasm": ["vite-plugin-wasm@3.6.0", "", { "peerDependencies": { "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "sha512-mL/QPziiIA4RAA6DkaZZzOstdwbW5jO4Vz7Zenj0wieKWBlNvIvX5L5ljum9lcUX0ShNfBgCNLKTjNkRVVqcsw=="], - "watchpack": ["watchpack@2.4.2", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw=="], + "watchpack": ["watchpack@2.5.2", "", { "dependencies": { "graceful-fs": "^4.1.2" } }, "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg=="], - "webpack": ["webpack@5.98.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA=="], + "webpack": ["webpack@5.110.3", "", { "dependencies": { "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.16.0", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.24.4", "es-module-lexer": "^2.1.0", "events": "^3.2.0", "graceful-fs": "^4.2.11", "mime-db": "^1.54.0", "minimizer-webpack-plugin": "^5.7.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "watchpack": "^2.5.2", "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-GuizBzRvo9YPpyoNMf3ag7AzxbaW85qrRSqTha345KyJbAFPt3/cMzBM0h+RWg7SK/7DdzRLINP3LvQ0hvr4hg=="], "webpack-cli": ["webpack-cli@5.1.4", "", { "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", "@webpack-cli/info": "^2.0.2", "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", "commander": "^10.0.1", "cross-spawn": "^7.0.3", "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^3.1.1", "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "peerDependencies": { "webpack": "5.x.x" }, "bin": { "webpack-cli": "bin/cli.js" } }, "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg=="], "webpack-merge": ["webpack-merge@5.10.0", "", { "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", "wildcard": "^2.0.0" } }, "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA=="], - "webpack-sources": ["webpack-sources@3.2.3", "", {}, "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="], + "webpack-sources": ["webpack-sources@3.5.1", "", {}, "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -400,17 +492,19 @@ "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], - "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "@jridgewell/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "source-map-support/source-map": ["source-map@0.6.1", "", {}, ""], + "minimizer-webpack-plugin/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "ts-loader/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "webpack-cli/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "ts-loader/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], diff --git a/examples/browser/bun.lockb b/examples/browser/bun.lockb deleted file mode 100755 index d34f6966bf6104036164a44150401a7cbd4c828e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97193 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 YK;-=QL!rf=Ap!hDY4#P%|AGJfAE~9lx&QzG diff --git a/examples/browser/package-lock.json b/examples/browser/package-lock.json deleted file mode 100644 index a1ad49b..0000000 --- a/examples/browser/package-lock.json +++ /dev/null @@ -1,738 +0,0 @@ -{ - "name": "browser-2", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "browser-2", - "version": "0.0.0", - "dependencies": { - "@monaco-editor/react": "^4.7.0", - "@superwall/superscript": "file:../../", - "json-edit-react": "^1.23.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-split": "^2.0.14", - "superscript": "file:../../target/browser" - }, - "devDependencies": { - "@types/react": "^19.0.10", - "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react-swc": "^3.8.0", - "globals": "^15.15.0", - "typescript": "~5.8.2", - "vite": "^6.2.1", - "vite-plugin-top-level-await": "^1.5.0", - "vite-plugin-wasm": "^3.4.1" - } - }, - "../..": { - "name": "@superwall/superscript", - "version": "0.2.1", - "devDependencies": { - "@types/node": "^20.0.0", - "@types/webpack": "^5.0.0", - "@wasm-tool/wasm-pack-plugin": "1.5.0", - "ts-loader": "^9.0.0", - "ts-node": "^10.0.0", - "typescript": "^5.0.0", - "webpack": "^5.93.0", - "webpack-cli": "^5.1.4" - } - }, - "../../target/browser": { - "name": "superscript", - "version": "0.2.0" - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@monaco-editor/loader": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "state-local": "^1.0.6" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.7.0", - "license": "MIT", - "dependencies": { - "@monaco-editor/loader": "^1.5.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@rollup/plugin-virtual": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@superwall/superscript": { - "resolved": "../..", - "link": true - }, - "node_modules/@swc/core": { - "version": "1.11.8", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.19" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.8", - "@swc/core-darwin-x64": "1.11.8", - "@swc/core-linux-arm-gnueabihf": "1.11.8", - "@swc/core-linux-arm64-gnu": "1.11.8", - "@swc/core-linux-arm64-musl": "1.11.8", - "@swc/core-linux-x64-gnu": "1.11.8", - "@swc/core-linux-x64-musl": "1.11.8", - "@swc/core-win32-arm64-msvc": "1.11.8", - "@swc/core-win32-ia32-msvc": "1.11.8", - "@swc/core-win32-x64-msvc": "1.11.8" - }, - "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.11.8", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.19", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.17.24", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/react": { - "version": "19.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.0.4", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@swc/core": "^1.10.15" - }, - "peerDependencies": { - "vite": "^4 || ^5 || ^6" - } - }, - "node_modules/acorn": { - "version": "8.14.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/csstype": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/globals": { - "version": "15.15.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/json-edit-react": { - "version": "1.23.1", - "license": "MIT", - "dependencies": { - "object-property-assigner": "^1.3.5", - "object-property-extractor": "^1.0.13" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/monaco-editor": { - "version": "0.52.2", - "license": "MIT", - "peer": true - }, - "node_modules/nanoid": { - "version": "3.3.9", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-property-assigner": { - "version": "1.3.5", - "license": "MIT" - }, - "node_modules/object-property-extractor": { - "version": "1.0.13", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.5.3", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/react": { - "version": "19.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.0.0", - "license": "MIT", - "dependencies": { - "scheduler": "^0.25.0" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/react-split": { - "version": "2.0.14", - "license": "MIT", - "dependencies": { - "prop-types": "^15.5.7", - "split.js": "^1.6.0" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/rollup": { - "version": "4.35.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.35.0", - "@rollup/rollup-android-arm64": "4.35.0", - "@rollup/rollup-darwin-arm64": "4.35.0", - "@rollup/rollup-darwin-x64": "4.35.0", - "@rollup/rollup-freebsd-arm64": "4.35.0", - "@rollup/rollup-freebsd-x64": "4.35.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", - "@rollup/rollup-linux-arm-musleabihf": "4.35.0", - "@rollup/rollup-linux-arm64-gnu": "4.35.0", - "@rollup/rollup-linux-arm64-musl": "4.35.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", - "@rollup/rollup-linux-riscv64-gnu": "4.35.0", - "@rollup/rollup-linux-s390x-gnu": "4.35.0", - "@rollup/rollup-linux-x64-gnu": "4.35.0", - "@rollup/rollup-linux-x64-musl": "4.35.0", - "@rollup/rollup-win32-arm64-msvc": "4.35.0", - "@rollup/rollup-win32-ia32-msvc": "4.35.0", - "@rollup/rollup-win32-x64-msvc": "4.35.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.25.0", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split.js": { - "version": "1.6.5", - "license": "MIT" - }, - "node_modules/state-local": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/superscript": { - "resolved": "../../target/browser", - "link": true - }, - "node_modules/terser": { - "version": "5.39.0", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typescript": { - "version": "5.8.2", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/uuid": { - "version": "10.0.0", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vite": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-top-level-await": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/plugin-virtual": "^3.0.2", - "@swc/core": "^1.10.16", - "uuid": "^10.0.0" - }, - "peerDependencies": { - "vite": ">=2.8" - } - }, - "node_modules/vite-plugin-wasm": { - "version": "3.4.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "vite": "^2 || ^3 || ^4 || ^5 || ^6" - } - } - } -} diff --git a/examples/browser/package.json b/examples/browser/package.json index a35fe97..734ccc0 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -16,6 +16,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-split": "^2.0.14", + "superscript": "../../wasm/target/browser", "superscript": "../../wasm/target/browser" }, "devDependencies": { @@ -25,7 +26,6 @@ "globals": "^15.15.0", "typescript": "~5.8.2", "vite": "^6.2.1", - "vite-plugin-top-level-await": "^1.5.0", "vite-plugin-wasm": "^3.4.1" } } diff --git a/examples/browser/vite.config.ts b/examples/browser/vite.config.ts index 03ddaca..8079938 100644 --- a/examples/browser/vite.config.ts +++ b/examples/browser/vite.config.ts @@ -3,11 +3,11 @@ import react from '@vitejs/plugin-react-swc' import wasmPlugin from "vite-plugin-wasm" -import topLevelAwait from "vite-plugin-top-level-await"; - - export default defineConfig({ - plugins: [react(), topLevelAwait(), wasmPlugin()], + plugins: [react(), wasmPlugin()], base: '/superscript/', + // vite-plugin-wasm emits top-level await; targeting esnext lets Vite keep + // it natively instead of needing vite-plugin-top-level-await (whose SWC + // transform breaks against current @swc/core versions). + build: { target: 'esnext' }, }) - diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index 2e88a27..b4684e7 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -19,10 +19,13 @@ async function loadBundlerModule(): Promise { /** * Fallback path: wasm-pack `--target web` output initialised from - * base64-inlined wasm bytes. Needs no bundler wasm/asset support at all, so - * it works under Bun, esbuild, and any bundler that treats `.wasm` imports - * as plain file assets (where the bundler path throws - * "wasm.__wbindgen_start is not a function" at import time). + * base64-inlined wasm bytes. Covers bundlers that resolve `.wasm` imports as + * plain file assets — Bun out of the box, esbuild with `--loader:.wasm=file` + * — where the bundler path throws "wasm.__wbindgen_start is not a function" + * at import time. Bundlers with no `.wasm` handling at all (default esbuild, + * Next.js' default webpack config) still fail at *build* time before either + * path can run; those need `--loader:.wasm=file` resp. + * `experiments.asyncWebAssembly: true` in the consumer config. * * Both modules are behind dynamic imports, so wasm-capable bundlers put the * inline chunk in a separate lazily-loaded chunk that is never fetched on @@ -41,7 +44,27 @@ async function loadInlineModule(): Promise { } function loadWasmModule(): Promise { - wasmModulePromise ??= loadBundlerModule().catch(() => loadInlineModule()); + // Keep both failure causes: the memoized rejection is all future callers + // ever see, and bundler wasm handling fails in enough surprising ways + // that losing the primary error would make field reports undiagnosable. + wasmModulePromise ??= loadBundlerModule().catch((bundlerError) => + loadInlineModule().catch((inlineError) => { + const error = new Error( + `superscript: both wasm load paths failed — bundler target: ${String( + bundlerError + )}; inline web target: ${String(inlineError)}` + ); + (error as Error & { + bundlerError: unknown; + inlineError: unknown; + }).bundlerError = bundlerError; + (error as Error & { + bundlerError: unknown; + inlineError: unknown; + }).inlineError = inlineError; + throw error; + }) + ); return wasmModulePromise; } From ab1d739936d42de0d92d9a0b0ed9145e29c67d1d Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 15:53:44 +0200 Subject: [PATCH 03/11] Add jsDelivr last-resort fallback when bundled wasm cannot load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the bundler-target import and the base64-inline web target both fail, fetch the exact-version superscript_bg.wasm from jsDelivr and initialise the local --target web glue with it. Pin the URL to package.json's version (generated into src/version.ts) so the binary matches the glue. Override with globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL to self-host. Verified: web-target init from a hosted URL evaluates (size(device.activeEntitlements) == 0) && (params.event_name == ...) to {Ok: {type: bool, value: true}}. This is runtime-only — bundlers that fail at build time on .wasm still need a loader. Co-authored-by: Cursor --- CHANGELOG.md | 1 + wasm/package.json | 3 +- wasm/scripts/generate-version.ts | 17 +++++++ wasm/src/browser.ts | 81 +++++++++++++++++++++++--------- wasm/src/version.ts | 3 ++ 5 files changed, 83 insertions(+), 22 deletions(-) create mode 100644 wasm/scripts/generate-version.ts create mode 100644 wasm/src/version.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index b054980..822e5fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ npm-only release (`@superwall/superscript`). Also aligns the npm package version ### Fixes - Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules — Bun out of the box, esbuild when configured with `--loader:.wasm=file`. The entry now tries the existing wasm-pack `--target bundler` output first and, if that import fails, falls back to a new `--target web` build initialised from base64-inlined wasm bytes. The fallback lives in a separate lazily-loaded chunk, so webpack (`asyncWebAssembly`) and vite-plugin-wasm consumers are unaffected. Note: bundlers with no `.wasm` handling at all (esbuild without the loader flag, Next.js' default webpack config) fail at build time before either path can run — unchanged from previous releases; they require `--loader:.wasm=file` resp. `experiments.asyncWebAssembly: true`. +- Adds a last-resort CDN fallback to the `/browser` entry: if both the bundler-target wasm and the base64-inlined bytes fail to load, the exact-version `superscript_bg.wasm` is fetched from jsDelivr (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`) and fed to the local web-target glue. Override the URL via `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` to self-host. Load failures are no longer memoized, so a transient network error doesn't permanently disable evaluation; when every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — bundlers that fail at *build* time on `.wasm` (default esbuild, Next.js default webpack) still need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. - Removes noisy `console.log` calls from the browser host-context property callbacks. ## 1.0.15 diff --git a/wasm/package.json b/wasm/package.json index fb71299..e3b1376 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -27,11 +27,12 @@ "build:wasm:browser": "wasm-pack build --target bundler --out-dir ./target/browser", "build:wasm:web": "wasm-pack build --target web --out-dir ./target/web && bun run generate:inline", "generate:inline": "bun scripts/inline-wasm.ts", + "generate:version": "bun scripts/generate-version.ts", "build:ts:esm": "tsc --outDir ./dist/esm --module ES2020", "build:ts:cjs": "tsc --outDir ./dist/cjs --module CommonJS", "build:ts": "npm run build:ts:esm && npm run build:ts:cjs", "copy:wasm": "mkdir -p dist/target/node dist/target/browser dist/target/web && cp -r target/node/* dist/target/node/ && cp -r target/browser/* dist/target/browser/ && cp -r target/web/* dist/target/web/", - "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:wasm:web && npm run build:ts && npm run copy:wasm", + "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:wasm:web && npm run generate:version && npm run build:ts && npm run copy:wasm", "prepublishOnly": "npm run build" }, "devDependencies": { diff --git a/wasm/scripts/generate-version.ts b/wasm/scripts/generate-version.ts new file mode 100644 index 0000000..89aac55 --- /dev/null +++ b/wasm/scripts/generate-version.ts @@ -0,0 +1,17 @@ +// Regenerates `src/version.ts` from package.json so the CDN fallback in +// browser.ts pins the exact published version. Runs as part of `build` +// (before `build:ts`); the generated file is committed so editors and +// standalone `tsc` runs work without a build step. + +import { join } from 'node:path'; + +const pkgPath = join(import.meta.dir, '..', 'package.json'); +const { version } = await Bun.file(pkgPath).json(); + +const contents = `// Auto-generated by scripts/generate-version.ts from package.json — do not +// edit; regenerated on every build. +export const VERSION = "${version}"; +`; + +await Bun.write(join(import.meta.dir, '..', 'src', 'version.ts'), contents); +console.log(`generate-version: src/version.ts -> ${version}`); diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index b4684e7..7bfcebd 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -1,10 +1,22 @@ import type { SuperscriptHostContext, ExecutionContext } from './types'; +import { VERSION } from './version'; /** Minimal shape of the wasm-bindgen glue module we call into. */ interface WasmExports { evaluate_with_context(input: string, context: unknown): Promise; } +/** Exact-version wasm binary on jsDelivr (mirrors the published npm dist/). + * Must match the local glue module, hence the pinned VERSION rather than a + * range. Override with `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` to point + * at a self-hosted copy (CSP, air-gapped, tests). */ +function cdnWasmUrl(): string { + const override = (globalThis as { SUPERWALL_SUPERSCRIPT_WASM_URL?: unknown }) + .SUPERWALL_SUPERSCRIPT_WASM_URL; + if (typeof override === 'string' && override.length > 0) return override; + return `https://cdn.jsdelivr.net/npm/@superwall/superscript@${VERSION}/dist/target/web/superscript_bg.wasm`; +} + let wasmModulePromise: Promise | null = null; /** @@ -43,28 +55,55 @@ async function loadInlineModule(): Promise { return glue as unknown as WasmExports; } -function loadWasmModule(): Promise { - // Keep both failure causes: the memoized rejection is all future callers - // ever see, and bundler wasm handling fails in enough surprising ways - // that losing the primary error would make field reports undiagnosable. - wasmModulePromise ??= loadBundlerModule().catch((bundlerError) => - loadInlineModule().catch((inlineError) => { - const error = new Error( - `superscript: both wasm load paths failed — bundler target: ${String( - bundlerError - )}; inline web target: ${String(inlineError)}` - ); - (error as Error & { - bundlerError: unknown; - inlineError: unknown; - }).bundlerError = bundlerError; - (error as Error & { - bundlerError: unknown; - inlineError: unknown; - }).inlineError = inlineError; - throw error; - }) +/** + * Last-resort path: fetch the exact-version wasm binary from jsDelivr and + * initialise the local `--target web` glue with it. Independent of any + * bundler `.wasm`/asset handling (only the small plain-JS glue module has to + * survive bundling), but requires network access and a CSP allowing + * jsDelivr in `connect-src`. + */ +async function loadCdnModule(): Promise { + const glue = await import('../target/web/superscript.js'); + // Pass the URL string — wasm-bindgen's web-target init fetches it. + // (`fetch()` here would skip MIME/streaming checks the glue already does.) + await glue.default({ module_or_path: cdnWasmUrl() }); + return glue as unknown as WasmExports; +} + +/** + * Try each load path in order. Keeps every failure cause — bundler wasm + * handling fails in enough surprising ways that losing the earlier errors + * would make field reports undiagnosable. + */ +async function tryLoadPaths(): Promise { + const failures: { path: string; error: unknown }[] = []; + for (const [path, load] of [ + ['bundler target', loadBundlerModule], + ['inline web target', loadInlineModule], + ['cdn web target', loadCdnModule], + ] as const) { + try { + return await load(); + } catch (error) { + failures.push({ path, error }); + } + } + const error = new Error( + `superscript: all wasm load paths failed — ${failures + .map((f) => `${f.path}: ${String(f.error)}`) + .join('; ')}` ); + (error as Error & { failures: unknown }).failures = failures; + throw error; +} + +function loadWasmModule(): Promise { + // Memoize success only: a transient failure (e.g. offline during the CDN + // fetch) must not permanently poison every future evaluation. + wasmModulePromise ??= tryLoadPaths().catch((error) => { + wasmModulePromise = null; + throw error; + }); return wasmModulePromise; } diff --git a/wasm/src/version.ts b/wasm/src/version.ts new file mode 100644 index 0000000..33fb998 --- /dev/null +++ b/wasm/src/version.ts @@ -0,0 +1,3 @@ +// Auto-generated by scripts/generate-version.ts from package.json — do not +// edit; regenerated on every build. +export const VERSION = "1.0.16"; From 273140203197a84e5488bda7ae3e0a865bf593d2 Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 16:03:47 +0200 Subject: [PATCH 04/11] Dedupe superscript dependency in the browser example manifest package.json listed the same superscript file: path twice. Duplicate JSON keys are last-value-wins so install still worked, but bun.lock copied the duplication into the workspace deps and packages table. Co-authored-by: Cursor --- examples/browser/bun.lock | 3 --- examples/browser/package.json | 1 - 2 files changed, 4 deletions(-) diff --git a/examples/browser/bun.lock b/examples/browser/bun.lock index 1017369..c5cad7d 100644 --- a/examples/browser/bun.lock +++ b/examples/browser/bun.lock @@ -12,7 +12,6 @@ "react-dom": "^19.0.0", "react-split": "^2.0.14", "superscript": "../../wasm/target/browser", - "superscript": "../../wasm/target/browser", }, "devDependencies": { "@types/react": "^19.0.10", @@ -448,8 +447,6 @@ "superscript": ["superscript@file:../../wasm/target/browser", {}], - "superscript": ["superscript@file:../../wasm/target/browser", {}], - "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], diff --git a/examples/browser/package.json b/examples/browser/package.json index 734ccc0..1c05232 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -16,7 +16,6 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-split": "^2.0.14", - "superscript": "../../wasm/target/browser", "superscript": "../../wasm/target/browser" }, "devDependencies": { From a2634294d4bbc5efec5fc89f2a6d241b5ca60207 Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 16:33:51 +0200 Subject: [PATCH 05/11] Bound wasm load retries with a cooldown and cache inline decode Clearing the memo on every failure re-ran all three paths per evaluateWithContext: a fresh jsDelivr fetch plus atob of the ~1.5 M-char blob. Fail-fast for 10s after a total miss so a CSP/offline page does not issue N network requests for N audience evals; after the cooldown a single retry is allowed so a blip can recover. Successful inline base64 decode is cached independently of glue init, so a retry does not redo atob. Co-authored-by: Cursor --- CHANGELOG.md | 2 +- wasm/src/browser.ts | 63 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 822e5fa..7805757 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ npm-only release (`@superwall/superscript`). Also aligns the npm package version ### Fixes - Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules — Bun out of the box, esbuild when configured with `--loader:.wasm=file`. The entry now tries the existing wasm-pack `--target bundler` output first and, if that import fails, falls back to a new `--target web` build initialised from base64-inlined wasm bytes. The fallback lives in a separate lazily-loaded chunk, so webpack (`asyncWebAssembly`) and vite-plugin-wasm consumers are unaffected. Note: bundlers with no `.wasm` handling at all (esbuild without the loader flag, Next.js' default webpack config) fail at build time before either path can run — unchanged from previous releases; they require `--loader:.wasm=file` resp. `experiments.asyncWebAssembly: true`. -- Adds a last-resort CDN fallback to the `/browser` entry: if both the bundler-target wasm and the base64-inlined bytes fail to load, the exact-version `superscript_bg.wasm` is fetched from jsDelivr (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`) and fed to the local web-target glue. Override the URL via `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` to self-host. Load failures are no longer memoized, so a transient network error doesn't permanently disable evaluation; when every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — bundlers that fail at *build* time on `.wasm` (default esbuild, Next.js default webpack) still need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. +- Adds a last-resort CDN fallback to the `/browser` entry: if both the bundler-target wasm and the base64-inlined bytes fail to load, the exact-version `superscript_bg.wasm` is fetched from jsDelivr (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`) and fed to the local web-target glue. Override the URL via `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` to self-host. A total load failure is memoized for a 10s cooldown so N audience evaluations don't issue N CDN fetches; after the cooldown a single retry is allowed so a transient network blip can recover. Successful decode of the inline base64 blob is cached independently of init, so a retry does not redo `atob` over ~1.5 MB. When every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — bundlers that fail at *build* time on `.wasm` (default esbuild, Next.js default webpack) still need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. - Removes noisy `console.log` calls from the browser host-context property callbacks. ## 1.0.15 diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index 7bfcebd..ee8ca3a 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -18,6 +18,16 @@ function cdnWasmUrl(): string { } let wasmModulePromise: Promise | null = null; +/** Last total-failure, used to fail-fast during the cooldown instead of + * re-running every path (and the CDN fetch) on each `evaluateWithContext`. */ +let lastFailure: { error: unknown; at: number } | null = null; +const RETRY_COOLDOWN_MS = 10_000; + +/** Decoded inline wasm bytes, cached independently of whether + * `glue.default(...)` then succeeds — a retry must not redo `atob` over + * the ~1.5 M-char blob. */ +let inlineWasmBytes: Uint8Array | null = null; +let inlineWasmBytesPromise: Promise | null = null; /** * Primary path: wasm-pack `--target bundler` output. It does @@ -43,14 +53,29 @@ async function loadBundlerModule(): Promise { * inline chunk in a separate lazily-loaded chunk that is never fetched on * the happy path. */ +function loadInlineWasmBytes(): Promise { + if (inlineWasmBytes) return Promise.resolve(inlineWasmBytes); + inlineWasmBytesPromise ??= import('../target/web/superscript_bg_inline.js') + .then((inline) => { + inlineWasmBytes = Uint8Array.from(atob(inline.wasmBase64), (c) => + c.charCodeAt(0) + ); + return inlineWasmBytes; + }) + .catch((error) => { + // Don't cache a failed import (missing/mangled chunk) as + // bytes — a later retry after cooldown should try again. + inlineWasmBytesPromise = null; + throw error; + }); + return inlineWasmBytesPromise; +} + async function loadInlineModule(): Promise { - const [glue, inline] = await Promise.all([ + const [glue, binary] = await Promise.all([ import('../target/web/superscript.js'), - import('../target/web/superscript_bg_inline.js'), + loadInlineWasmBytes(), ]); - const binary = Uint8Array.from(atob(inline.wasmBase64), (c) => - c.charCodeAt(0) - ); await glue.default({ module_or_path: binary }); return glue as unknown as WasmExports; } @@ -98,12 +123,28 @@ async function tryLoadPaths(): Promise { } function loadWasmModule(): Promise { - // Memoize success only: a transient failure (e.g. offline during the CDN - // fetch) must not permanently poison every future evaluation. - wasmModulePromise ??= tryLoadPaths().catch((error) => { - wasmModulePromise = null; - throw error; - }); + if (wasmModulePromise) return wasmModulePromise; + + // A transient failure (offline during the CDN fetch) should be + // retryable, but a persistently failing environment (CSP blocking + // connect-src, mangled inline chunk, still-offline) must not issue a + // fresh ~1.15 MB fetch + full base64 decode on every evaluation. + // Fail fast for RETRY_COOLDOWN_MS, then allow a single new attempt. + if (lastFailure && Date.now() - lastFailure.at < RETRY_COOLDOWN_MS) { + return Promise.reject(lastFailure.error); + } + + wasmModulePromise = tryLoadPaths().then( + (mod) => { + lastFailure = null; + return mod; + }, + (error) => { + lastFailure = { error, at: Date.now() }; + wasmModulePromise = null; + throw error; + }, + ); return wasmModulePromise; } From c5543192775094a2a75286c2bb56743ea4f2c30a Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 16:44:53 +0200 Subject: [PATCH 06/11] Fold 1.0.16 loader notes, test the web fallback, stop tracking version.ts Release notes described one three-path loader as two bullets; fold them. Add a post-build script that checks generated VERSION against package.json, asserts the jsDelivr URL shape, byte-compares the inline module to superscript_bg.wasm, then inits the web glue and evaluates a known expression. gitignore src/version.ts so npm run build does not dirty the tree when package.json's version differs from a committed copy. Co-authored-by: Cursor --- .gitignore | 6 +- CHANGELOG.md | 4 +- wasm/package.json | 3 +- wasm/scripts/generate-version.ts | 4 +- wasm/scripts/test-browser-loader.ts | 98 +++++++++++++++++++++++++++++ wasm/src/version.ts | 3 - 6 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 wasm/scripts/test-browser-loader.ts delete mode 100644 wasm/src/version.ts diff --git a/.gitignore b/.gitignore index 046018c..d35f6d6 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,10 @@ **/.DS_Store **/.so **/.kt -/target -/wasm/dist +# Generated by `bun run generate:version` from wasm/package.json during +# `npm run build`. Not committed — a tracked copy would go dirty whenever +# a build ran against a different package version. +wasm/src/version.ts # Created by https://www.toptal.com/developers/gitignore/api/intellij,rust # Edit at https://www.toptal.com/developers/gitignore?templates=intellij,rust diff --git a/CHANGELOG.md b/CHANGELOG.md index 7805757..6a243ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,7 @@ npm-only release (`@superwall/superscript`). Also aligns the npm package version ### Fixes -- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules — Bun out of the box, esbuild when configured with `--loader:.wasm=file`. The entry now tries the existing wasm-pack `--target bundler` output first and, if that import fails, falls back to a new `--target web` build initialised from base64-inlined wasm bytes. The fallback lives in a separate lazily-loaded chunk, so webpack (`asyncWebAssembly`) and vite-plugin-wasm consumers are unaffected. Note: bundlers with no `.wasm` handling at all (esbuild without the loader flag, Next.js' default webpack config) fail at build time before either path can run — unchanged from previous releases; they require `--loader:.wasm=file` resp. `experiments.asyncWebAssembly: true`. -- Adds a last-resort CDN fallback to the `/browser` entry: if both the bundler-target wasm and the base64-inlined bytes fail to load, the exact-version `superscript_bg.wasm` is fetched from jsDelivr (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`) and fed to the local web-target glue. Override the URL via `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` to self-host. A total load failure is memoized for a 10s cooldown so N audience evaluations don't issue N CDN fetches; after the cooldown a single retry is allowed so a transient network blip can recover. Successful decode of the inline base64 blob is cached independently of init, so a retry does not redo `atob` over ~1.5 MB. When every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — bundlers that fail at *build* time on `.wasm` (default esbuild, Next.js default webpack) still need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. -- Removes noisy `console.log` calls from the browser host-context property callbacks. +- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules (Bun out of the box, esbuild with `--loader:.wasm=file`). The loader tries three paths in order: (1) the existing wasm-pack `--target bundler` output, (2) a new `--target web` build initialised from base64-inlined wasm bytes (code-split, so webpack `asyncWebAssembly` / vite-plugin-wasm consumers never fetch it), (3) a last-resort fetch of the exact-version `superscript_bg.wasm` from jsDelivr (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`; override via `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL`). A total miss is memoized for 10s so N audience evaluations don't issue N CDN fetches; after the cooldown one retry is allowed. Successful inline `atob` is cached independently of init. When every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — default esbuild and Next.js' default webpack config still fail at *build* time and need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. Also removes noisy `console.log` calls from the browser host-context callbacks. ## 1.0.15 diff --git a/wasm/package.json b/wasm/package.json index e3b1376..ebecdd0 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -28,11 +28,12 @@ "build:wasm:web": "wasm-pack build --target web --out-dir ./target/web && bun run generate:inline", "generate:inline": "bun scripts/inline-wasm.ts", "generate:version": "bun scripts/generate-version.ts", + "test:browser-loader": "bun scripts/test-browser-loader.ts", "build:ts:esm": "tsc --outDir ./dist/esm --module ES2020", "build:ts:cjs": "tsc --outDir ./dist/cjs --module CommonJS", "build:ts": "npm run build:ts:esm && npm run build:ts:cjs", "copy:wasm": "mkdir -p dist/target/node dist/target/browser dist/target/web && cp -r target/node/* dist/target/node/ && cp -r target/browser/* dist/target/browser/ && cp -r target/web/* dist/target/web/", - "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:wasm:web && npm run generate:version && npm run build:ts && npm run copy:wasm", + "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:wasm:web && npm run generate:version && npm run build:ts && npm run copy:wasm && npm run test:browser-loader", "prepublishOnly": "npm run build" }, "devDependencies": { diff --git a/wasm/scripts/generate-version.ts b/wasm/scripts/generate-version.ts index 89aac55..8abb2f1 100644 --- a/wasm/scripts/generate-version.ts +++ b/wasm/scripts/generate-version.ts @@ -1,7 +1,7 @@ // Regenerates `src/version.ts` from package.json so the CDN fallback in // browser.ts pins the exact published version. Runs as part of `build` -// (before `build:ts`); the generated file is committed so editors and -// standalone `tsc` runs work without a build step. +// (before `build:ts`). The file is gitignored — committing it made every +// `npm run build` on a version-bumped branch leave a dirty working tree. import { join } from 'node:path'; diff --git a/wasm/scripts/test-browser-loader.ts b/wasm/scripts/test-browser-loader.ts new file mode 100644 index 0000000..4b997f5 --- /dev/null +++ b/wasm/scripts/test-browser-loader.ts @@ -0,0 +1,98 @@ +// Post-build check for the /browser fallback surface. No bundler involved: +// atob-decode the inline module, init the web-target glue, evaluate one +// known expression. Also asserts the generated VERSION matches package.json +// and that the jsDelivr URL shape is what browser.ts will request. + +import { join } from 'node:path'; +import { pathToFileURL } from 'node:url'; + +const root = join(import.meta.dir, '..'); +const fileUrl = (rel: string) => pathToFileURL(join(root, rel)).href; + +const pkg = (await Bun.file(join(root, 'package.json')).json()) as { + name: string; + version: string; +}; + +const { VERSION } = (await import(fileUrl('dist/esm/version.js'))) as { + VERSION: string; +}; + +if (VERSION !== pkg.version) { + throw new Error( + `generated VERSION ${JSON.stringify(VERSION)} != package.json ${JSON.stringify(pkg.version)}` + ); +} + +const cdnUrl = `https://cdn.jsdelivr.net/npm/${pkg.name}@${VERSION}/dist/target/web/superscript_bg.wasm`; +const expected = `https://cdn.jsdelivr.net/npm/@superwall/superscript@${pkg.version}/dist/target/web/superscript_bg.wasm`; +if (cdnUrl !== expected) { + throw new Error(`CDN URL shape mismatch: ${cdnUrl} != ${expected}`); +} + +const glue = (await import(fileUrl('dist/target/web/superscript.js'))) as { + default: (init: { module_or_path: BufferSource }) => Promise; + evaluate_with_context: ( + input: string, + host: { + computed_property: (name: string, args: string) => string; + device_property: (name: string, args: string) => string; + }, + ) => Promise; +}; +const inline = (await import(fileUrl('dist/target/web/superscript_bg_inline.js'))) as { + wasmBase64: string; +}; + +const binary = Uint8Array.from(atob(inline.wasmBase64), (c) => c.charCodeAt(0)); +const wasmFile = new Uint8Array( + await Bun.file(join(root, 'dist/target/web/superscript_bg.wasm')).arrayBuffer(), +); +if (binary.byteLength !== wasmFile.byteLength) { + throw new Error( + `inline wasm length ${binary.byteLength} != superscript_bg.wasm ${wasmFile.byteLength}` + ); +} +for (let i = 0; i < binary.byteLength; i++) { + if (binary[i] !== wasmFile[i]) { + throw new Error(`inline wasm bytes diverge from superscript_bg.wasm at offset ${i}`); + } +} + +await glue.default({ module_or_path: binary }); + +const input = { + variables: { + map: { + device: { + type: 'map', + value: { activeEntitlements: { type: 'list', value: [] } }, + }, + params: { + type: 'map', + value: { + event_name: { type: 'string', value: 'test_embed_redirect' }, + }, + }, + user: { type: 'map', value: {} }, + }, + }, + expression: + '(size(device.activeEntitlements) == 0) && (params.event_name == "test_embed_redirect")', + computed: {}, + device: { activeEntitlements: [] }, +}; +const host = { + computed_property: () => JSON.stringify({ type: 'null', value: null }), + device_property: () => JSON.stringify({ type: 'null', value: null }), +}; + +const result = await glue.evaluate_with_context(JSON.stringify(input), host); +const parsed = JSON.parse(result) as { + Ok?: { type?: string; value?: unknown }; +}; +if (parsed.Ok?.type !== 'bool' || parsed.Ok.value !== true) { + throw new Error(`unexpected eval result: ${result}`); +} + +console.log(`test-browser-loader: ok (VERSION=${VERSION}, inline ${binary.byteLength} bytes)`); diff --git a/wasm/src/version.ts b/wasm/src/version.ts deleted file mode 100644 index 33fb998..0000000 --- a/wasm/src/version.ts +++ /dev/null @@ -1,3 +0,0 @@ -// Auto-generated by scripts/generate-version.ts from package.json — do not -// edit; regenerated on every build. -export const VERSION = "1.0.16"; From 731d09f17209aaeede27083ea3d34b47dd4a942c Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 16:49:35 +0200 Subject: [PATCH 07/11] Drop inline wasm decode cache after successful init Move the web-target docblock back onto loadInlineModule and give the decode helper its own note. After glue.default resolves the overall load is memoized, so keeping the ~1.15 MB Uint8Array for the page lifetime was wasted; null the promise so it can be collected. Failures still keep the decode for a cooldown retry. Co-authored-by: Cursor --- wasm/src/browser.ts | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index ee8ca3a..3657adf 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -25,8 +25,9 @@ const RETRY_COOLDOWN_MS = 10_000; /** Decoded inline wasm bytes, cached independently of whether * `glue.default(...)` then succeeds — a retry must not redo `atob` over - * the ~1.5 M-char blob. */ -let inlineWasmBytes: Uint8Array | null = null; + * the ~1.5 M-char blob. Dropped after a successful init: the overall + * load is then memoized in `wasmModulePromise` and this path is never + * re-entered. */ let inlineWasmBytesPromise: Promise | null = null; /** @@ -39,6 +40,25 @@ async function loadBundlerModule(): Promise { return await import('../target/browser/superscript.js'); } +/** + * Decode the base64-inlined wasm once. Cached on the promise so a retry + * after a failed `glue.default` does not redo `atob`; the cache is + * dropped after a successful init. + */ +function loadInlineWasmBytes(): Promise { + inlineWasmBytesPromise ??= import('../target/web/superscript_bg_inline.js') + .then((inline) => + Uint8Array.from(atob(inline.wasmBase64), (c) => c.charCodeAt(0)), + ) + .catch((error) => { + // Don't cache a failed import (missing/mangled chunk) — + // a later retry after cooldown should try again. + inlineWasmBytesPromise = null; + throw error; + }); + return inlineWasmBytesPromise; +} + /** * Fallback path: wasm-pack `--target web` output initialised from * base64-inlined wasm bytes. Covers bundlers that resolve `.wasm` imports as @@ -53,30 +73,15 @@ async function loadBundlerModule(): Promise { * inline chunk in a separate lazily-loaded chunk that is never fetched on * the happy path. */ -function loadInlineWasmBytes(): Promise { - if (inlineWasmBytes) return Promise.resolve(inlineWasmBytes); - inlineWasmBytesPromise ??= import('../target/web/superscript_bg_inline.js') - .then((inline) => { - inlineWasmBytes = Uint8Array.from(atob(inline.wasmBase64), (c) => - c.charCodeAt(0) - ); - return inlineWasmBytes; - }) - .catch((error) => { - // Don't cache a failed import (missing/mangled chunk) as - // bytes — a later retry after cooldown should try again. - inlineWasmBytesPromise = null; - throw error; - }); - return inlineWasmBytesPromise; -} - async function loadInlineModule(): Promise { const [glue, binary] = await Promise.all([ import('../target/web/superscript.js'), loadInlineWasmBytes(), ]); await glue.default({ module_or_path: binary }); + // Init succeeded, so the overall load is memoized and this path is + // never re-entered — drop the ~1.15 MB decode cache. + inlineWasmBytesPromise = null; return glue as unknown as WasmExports; } From edff047bb1e98489c8291752b1c3ca9d8566490b Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 17:26:51 +0200 Subject: [PATCH 08/11] Make the jsDelivr wasm fetch opt-in and document it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CDN path is no longer registered by default — customers' pages must not silently request a third-party origin. Opt in before the first evaluateWithContext: SUPERWALL_SUPERSCRIPT_WASM_CDN = true for the pinned jsDelivr URL, or SUPERWALL_SUPERSCRIPT_WASM_URL for a self-hosted copy (wins if both are set). wasm/README.md covers entries, CSP connect-src, and the ordering constraint. Co-authored-by: Cursor --- CHANGELOG.md | 2 +- wasm/README.md | 24 ++++++++++++++++++++++ wasm/src/browser.ts | 50 ++++++++++++++++++++++++++++----------------- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a243ce..ef338d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ npm-only release (`@superwall/superscript`). Also aligns the npm package version ### Fixes -- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules (Bun out of the box, esbuild with `--loader:.wasm=file`). The loader tries three paths in order: (1) the existing wasm-pack `--target bundler` output, (2) a new `--target web` build initialised from base64-inlined wasm bytes (code-split, so webpack `asyncWebAssembly` / vite-plugin-wasm consumers never fetch it), (3) a last-resort fetch of the exact-version `superscript_bg.wasm` from jsDelivr (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`; override via `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL`). A total miss is memoized for 10s so N audience evaluations don't issue N CDN fetches; after the cooldown one retry is allowed. Successful inline `atob` is cached independently of init. When every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — default esbuild and Next.js' default webpack config still fail at *build* time and need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. Also removes noisy `console.log` calls from the browser host-context callbacks. +- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules (Bun out of the box, esbuild with `--loader:.wasm=file`). The loader tries the wasm-pack `--target bundler` output first, then a new `--target web` build initialised from base64-inlined wasm bytes (code-split, so webpack `asyncWebAssembly` / vite-plugin-wasm consumers never fetch it). An optional third path fetches wasm from a URL, but only if the consumer opts in before the first `evaluateWithContext`: `globalThis.SUPERWALL_SUPERSCRIPT_WASM_CDN = true` uses the exact-version jsDelivr URL (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`); `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` points at a self-hosted copy and wins if both are set. Off by default — no third-party request, no CSP change. A total miss is memoized for 10s so N audience evaluations don't retry the full load N times; after the cooldown one retry is allowed. Successful inline `atob` is cached until init succeeds, then dropped. When every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — default esbuild and Next.js' default webpack config still fail at *build* time and need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. Also removes noisy `console.log` calls from the browser host-context callbacks. ## 1.0.15 diff --git a/wasm/README.md b/wasm/README.md index feebec8..a9cf2ec 100644 --- a/wasm/README.md +++ b/wasm/README.md @@ -3,6 +3,30 @@ This is the JS (WASM) runner for [Superscript expression language](https://github.com/superwall/Superscript). The evaluator can call host environment functions and compute dynamic properties while evaluating expressions. +## Entries + +- `@superwall/superscript/node` — Node/Bun. Loads wasm via `fs`. +- `@superwall/superscript/browser` — browsers. Tries wasm-pack `--target bundler` first (`import` of the `.wasm` file). If that throws at runtime (Bun, esbuild with `--loader:.wasm=file`), it falls back to a `--target web` build initialised from base64-inlined bytes, with no network. + +Default esbuild and Next.js webpack still fail **at build time** on the `.wasm` import. Those need `--loader:.wasm=file` or `experiments.asyncWebAssembly: true`. + +## Optional CDN fallback + +The browser entry does **not** fetch wasm from the network unless you opt in **before** the first `evaluateWithContext` call: + +```js +// Exact-version file on jsDelivr (must match this package's version). +globalThis.SUPERWALL_SUPERSCRIPT_WASM_CDN = true; + +// Or a self-hosted copy. Wins if both are set. +globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL = + "https://your.cdn.example/superscript_bg.wasm"; +``` + +jsDelivr URL shape: `https://cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`. + +CSP: allow the origin you actually fetch in `connect-src` (for the default, `https://cdn.jsdelivr.net`). Setting neither flag issues no request and needs no CSP change. + ## Setup First, import the module: diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index 3657adf..0e9847f 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -6,15 +6,24 @@ interface WasmExports { evaluate_with_context(input: string, context: unknown): Promise; } -/** Exact-version wasm binary on jsDelivr (mirrors the published npm dist/). - * Must match the local glue module, hence the pinned VERSION rather than a - * range. Override with `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` to point - * at a self-hosted copy (CSP, air-gapped, tests). */ -function cdnWasmUrl(): string { - const override = (globalThis as { SUPERWALL_SUPERSCRIPT_WASM_URL?: unknown }) - .SUPERWALL_SUPERSCRIPT_WASM_URL; - if (typeof override === 'string' && override.length > 0) return override; - return `https://cdn.jsdelivr.net/npm/@superwall/superscript@${VERSION}/dist/target/web/superscript_bg.wasm`; +type CdnGlobals = { + SUPERWALL_SUPERSCRIPT_WASM_URL?: unknown; + SUPERWALL_SUPERSCRIPT_WASM_CDN?: unknown; +}; + +/** Opt-in CDN wasm URL. `SUPERWALL_SUPERSCRIPT_WASM_URL` (self-hosted) wins + * over `SUPERWALL_SUPERSCRIPT_WASM_CDN === true` (pinned jsDelivr). Both + * must be set on `globalThis` before the first `evaluateWithContext`. + * Returns null when neither is set — the CDN path is then skipped. */ +function cdnWasmUrl(): string | null { + const g = globalThis as CdnGlobals; + if (typeof g.SUPERWALL_SUPERSCRIPT_WASM_URL === 'string' && g.SUPERWALL_SUPERSCRIPT_WASM_URL.length > 0) { + return g.SUPERWALL_SUPERSCRIPT_WASM_URL; + } + if (g.SUPERWALL_SUPERSCRIPT_WASM_CDN === true) { + return `https://cdn.jsdelivr.net/npm/@superwall/superscript@${VERSION}/dist/target/web/superscript_bg.wasm`; + } + return null; } let wasmModulePromise: Promise | null = null; @@ -86,17 +95,16 @@ async function loadInlineModule(): Promise { } /** - * Last-resort path: fetch the exact-version wasm binary from jsDelivr and - * initialise the local `--target web` glue with it. Independent of any - * bundler `.wasm`/asset handling (only the small plain-JS glue module has to - * survive bundling), but requires network access and a CSP allowing - * jsDelivr in `connect-src`. + * Opt-in last-resort path: fetch wasm bytes from a URL and initialise the + * local `--target web` glue with them. Only registered when the consumer + * set `SUPERWALL_SUPERSCRIPT_WASM_CDN` or `SUPERWALL_SUPERSCRIPT_WASM_URL` + * before the first eval — see wasm/README.md. */ -async function loadCdnModule(): Promise { +async function loadCdnModule(url: string): Promise { const glue = await import('../target/web/superscript.js'); // Pass the URL string — wasm-bindgen's web-target init fetches it. // (`fetch()` here would skip MIME/streaming checks the glue already does.) - await glue.default({ module_or_path: cdnWasmUrl() }); + await glue.default({ module_or_path: url }); return glue as unknown as WasmExports; } @@ -107,11 +115,15 @@ async function loadCdnModule(): Promise { */ async function tryLoadPaths(): Promise { const failures: { path: string; error: unknown }[] = []; - for (const [path, load] of [ + const paths: [string, () => Promise][] = [ ['bundler target', loadBundlerModule], ['inline web target', loadInlineModule], - ['cdn web target', loadCdnModule], - ] as const) { + ]; + const cdnUrl = cdnWasmUrl(); + if (cdnUrl !== null) { + paths.push(['cdn web target', () => loadCdnModule(cdnUrl)]); + } + for (const [path, load] of paths) { try { return await load(); } catch (error) { From ff720eca35a7ab2c090b67fed9913f6633809cbe Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 19:05:26 +0200 Subject: [PATCH 09/11] Hint CDN opt-in in load errors; fix README import and load timing The aggregated failure only listed attempted paths, so a mangled-inline report had no pointer at SUPERWALL_SUPERSCRIPT_WASM_CDN / _URL. Append that hint when the CDN path was skipped. README Setup imported the package root which is not an exports target; use /browser and /node. Phrase the opt-in gate around a load attempt, not the first evaluate: flags are re-read on each attempt, including the post-cooldown retry. Co-authored-by: Cursor --- CHANGELOG.md | 2 +- wasm/README.md | 14 +++++++++----- wasm/src/browser.ts | 19 +++++++++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef338d2..9b07c85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ npm-only release (`@superwall/superscript`). Also aligns the npm package version ### Fixes -- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules (Bun out of the box, esbuild with `--loader:.wasm=file`). The loader tries the wasm-pack `--target bundler` output first, then a new `--target web` build initialised from base64-inlined wasm bytes (code-split, so webpack `asyncWebAssembly` / vite-plugin-wasm consumers never fetch it). An optional third path fetches wasm from a URL, but only if the consumer opts in before the first `evaluateWithContext`: `globalThis.SUPERWALL_SUPERSCRIPT_WASM_CDN = true` uses the exact-version jsDelivr URL (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`); `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` points at a self-hosted copy and wins if both are set. Off by default — no third-party request, no CSP change. A total miss is memoized for 10s so N audience evaluations don't retry the full load N times; after the cooldown one retry is allowed. Successful inline `atob` is cached until init succeeds, then dropped. When every path fails, the thrown error aggregates all per-path causes. This is a runtime fallback only — default esbuild and Next.js' default webpack config still fail at *build* time and need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. Also removes noisy `console.log` calls from the browser host-context callbacks. +- Fixes the `/browser` entry throwing `wasm.__wbindgen_start is not a function` at load time in bundlers that resolve `.wasm` imports as plain file assets instead of wasm modules (Bun out of the box, esbuild with `--loader:.wasm=file`). The loader tries the wasm-pack `--target bundler` output first, then a new `--target web` build initialised from base64-inlined wasm bytes (code-split, so webpack `asyncWebAssembly` / vite-plugin-wasm consumers never fetch it). An optional third path fetches wasm from a URL, but only if the consumer opts in before a load attempt (flags are re-read on each attempt, including the post-cooldown retry): `globalThis.SUPERWALL_SUPERSCRIPT_WASM_CDN = true` uses the exact-version jsDelivr URL (`cdn.jsdelivr.net/npm/@superwall/superscript@/dist/target/web/superscript_bg.wasm`); `globalThis.SUPERWALL_SUPERSCRIPT_WASM_URL` points at a self-hosted copy and wins if both are set. Off by default — no third-party request, no CSP change. A total miss is memoized for 10s so N audience evaluations don't retry the full load N times; after the cooldown one retry is allowed. Successful inline `atob` is cached until init succeeds, then dropped. When every path fails, the thrown error aggregates all per-path causes and, if the CDN path was not attempted, names the opt-in flags. This is a runtime fallback only — default esbuild and Next.js' default webpack config still fail at *build* time and need `--loader:.wasm=file` / `experiments.asyncWebAssembly`. Also removes noisy `console.log` calls from the browser host-context callbacks. ## 1.0.15 diff --git a/wasm/README.md b/wasm/README.md index a9cf2ec..ac6461a 100644 --- a/wasm/README.md +++ b/wasm/README.md @@ -12,7 +12,7 @@ Default esbuild and Next.js webpack still fail **at build time** on the `.wasm` ## Optional CDN fallback -The browser entry does **not** fetch wasm from the network unless you opt in **before** the first `evaluateWithContext` call: +The browser entry does **not** fetch wasm from the network unless you opt in before a **load attempt**. The flags are re-read at the start of each attempt (including the post-cooldown retry after a total miss), so setting them from an error handler still takes effect. After a successful load they are not read again. ```js // Exact-version file on jsDelivr (must match this package's version). @@ -29,8 +29,12 @@ CSP: allow the origin you actually fetch in `connect-src` (for the default, `htt ## Setup -First, import the module: -`import * as wasm from "@superwall/superscript";` +First, import the matching entry: + +```ts +import { evaluateWithContext } from "@superwall/superscript/browser"; +// Node/Bun: import { evaluateWithContext } from "@superwall/superscript/node"; +``` Next, create a WasmHostContext class to allow the expression evaluator to call the host environment (your JS) and compute the dynamic properties, i.e. `platform.daysSinceEvent("event_name")`. @@ -81,8 +85,8 @@ class TestHostContext implements SuperscriptHostContext { ``` -Then create an instance of the `WasmHostContext` and provide it together with the arguments to -`wasm.evaluateWithContext(arguments, wasmHostContext)`. +Then create an instance of the host context and pass it with the arguments to +`evaluateWithContext(input, hostContext)`. ```javascript async function main() { diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index 0e9847f..b131b7c 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -12,9 +12,11 @@ type CdnGlobals = { }; /** Opt-in CDN wasm URL. `SUPERWALL_SUPERSCRIPT_WASM_URL` (self-hosted) wins - * over `SUPERWALL_SUPERSCRIPT_WASM_CDN === true` (pinned jsDelivr). Both - * must be set on `globalThis` before the first `evaluateWithContext`. - * Returns null when neither is set — the CDN path is then skipped. */ + * over `SUPERWALL_SUPERSCRIPT_WASM_CDN === true` (pinned jsDelivr). Read at + * the start of each load attempt (including the post-cooldown retry after + * a total miss); a late opt-in from an error handler still takes effect. + * After a successful load they are not read again. Returns null when + * neither is set — the CDN path is then skipped. */ function cdnWasmUrl(): string | null { const g = globalThis as CdnGlobals; if (typeof g.SUPERWALL_SUPERSCRIPT_WASM_URL === 'string' && g.SUPERWALL_SUPERSCRIPT_WASM_URL.length > 0) { @@ -130,10 +132,15 @@ async function tryLoadPaths(): Promise { failures.push({ path, error }); } } + const detail = failures + .map((f) => `${f.path}: ${String(f.error)}`) + .join('; '); + const hint = + cdnUrl === null + ? '; set globalThis.SUPERWALL_SUPERSCRIPT_WASM_CDN = true or SUPERWALL_SUPERSCRIPT_WASM_URL before the next load attempt for a network fallback' + : ''; const error = new Error( - `superscript: all wasm load paths failed — ${failures - .map((f) => `${f.path}: ${String(f.error)}`) - .join('; ')}` + `superscript: all wasm load paths failed — ${detail}${hint}` ); (error as Error & { failures: unknown }).failures = failures; throw error; From 2c7a6326ffcb67e2aeec67e8d32c2c6f0d32b7f8 Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Tue, 8 Sep 2026 20:14:04 +0200 Subject: [PATCH 10/11] Test the real cdnWasmUrl() and generate version.ts from build:ts The post-build URL check reconstructed the jsDelivr path from package.json and compared it to itself. Call the exported cdnWasmUrl() instead: null when unset, pinned jsDelivr when SUPERWALL_SUPERSCRIPT_WASM_CDN is true, URL override wins. Chain generate:version into build:ts so a fresh clone can tsc without a prior full wasm build. Co-authored-by: Cursor --- .gitignore | 6 +++--- wasm/package.json | 4 ++-- wasm/scripts/generate-version.ts | 7 ++++--- wasm/scripts/test-browser-loader.ts | 32 ++++++++++++++++++++++++----- wasm/src/browser.ts | 2 ++ 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index d35f6d6..8db26e3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,9 +6,9 @@ **/.DS_Store **/.so **/.kt -# Generated by `bun run generate:version` from wasm/package.json during -# `npm run build`. Not committed — a tracked copy would go dirty whenever -# a build ran against a different package version. +# Generated by `bun run generate:version` (chained into `npm run build:ts`). +# Not committed — a tracked copy would go dirty whenever a build ran against +# a different package version. wasm/src/version.ts # Created by https://www.toptal.com/developers/gitignore/api/intellij,rust # Edit at https://www.toptal.com/developers/gitignore?templates=intellij,rust diff --git a/wasm/package.json b/wasm/package.json index ebecdd0..c9e8e98 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -31,9 +31,9 @@ "test:browser-loader": "bun scripts/test-browser-loader.ts", "build:ts:esm": "tsc --outDir ./dist/esm --module ES2020", "build:ts:cjs": "tsc --outDir ./dist/cjs --module CommonJS", - "build:ts": "npm run build:ts:esm && npm run build:ts:cjs", + "build:ts": "npm run generate:version && npm run build:ts:esm && npm run build:ts:cjs", "copy:wasm": "mkdir -p dist/target/node dist/target/browser dist/target/web && cp -r target/node/* dist/target/node/ && cp -r target/browser/* dist/target/browser/ && cp -r target/web/* dist/target/web/", - "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:wasm:web && npm run generate:version && npm run build:ts && npm run copy:wasm && npm run test:browser-loader", + "build": "npm run clean && npm run build:wasm:node && npm run build:wasm:browser && npm run build:wasm:web && npm run build:ts && npm run copy:wasm && npm run test:browser-loader", "prepublishOnly": "npm run build" }, "devDependencies": { diff --git a/wasm/scripts/generate-version.ts b/wasm/scripts/generate-version.ts index 8abb2f1..9c6a8a3 100644 --- a/wasm/scripts/generate-version.ts +++ b/wasm/scripts/generate-version.ts @@ -1,7 +1,8 @@ // Regenerates `src/version.ts` from package.json so the CDN fallback in -// browser.ts pins the exact published version. Runs as part of `build` -// (before `build:ts`). The file is gitignored — committing it made every -// `npm run build` on a version-bumped branch leave a dirty working tree. +// browser.ts pins the exact published version. Runs at the start of +// `build:ts` (and therefore `build`) so a bare `tsc` / editor still needs +// one generate, but `npm run build:ts` is self-sufficient. The file is +// gitignored — committing it made every version-bumped build dirty. import { join } from 'node:path'; diff --git a/wasm/scripts/test-browser-loader.ts b/wasm/scripts/test-browser-loader.ts index 4b997f5..18bb561 100644 --- a/wasm/scripts/test-browser-loader.ts +++ b/wasm/scripts/test-browser-loader.ts @@ -1,7 +1,8 @@ // Post-build check for the /browser fallback surface. No bundler involved: // atob-decode the inline module, init the web-target glue, evaluate one // known expression. Also asserts the generated VERSION matches package.json -// and that the jsDelivr URL shape is what browser.ts will request. +// and that `cdnWasmUrl()` in browser.ts produces the jsDelivr URL (or null +// when the consumer has not opted in). import { join } from 'node:path'; import { pathToFileURL } from 'node:url'; @@ -24,11 +25,32 @@ if (VERSION !== pkg.version) { ); } -const cdnUrl = `https://cdn.jsdelivr.net/npm/${pkg.name}@${VERSION}/dist/target/web/superscript_bg.wasm`; -const expected = `https://cdn.jsdelivr.net/npm/@superwall/superscript@${pkg.version}/dist/target/web/superscript_bg.wasm`; -if (cdnUrl !== expected) { - throw new Error(`CDN URL shape mismatch: ${cdnUrl} != ${expected}`); +const g = globalThis as { + SUPERWALL_SUPERSCRIPT_WASM_CDN?: boolean; + SUPERWALL_SUPERSCRIPT_WASM_URL?: string; +}; +const { cdnWasmUrl } = (await import(fileUrl('dist/esm/browser.js'))) as { + cdnWasmUrl: () => string | null; +}; + +delete g.SUPERWALL_SUPERSCRIPT_WASM_CDN; +delete g.SUPERWALL_SUPERSCRIPT_WASM_URL; +if (cdnWasmUrl() !== null) { + throw new Error(`cdnWasmUrl() must be null when neither opt-in flag is set; got ${cdnWasmUrl()}`); +} + +g.SUPERWALL_SUPERSCRIPT_WASM_CDN = true; +const jsdelivr = `https://cdn.jsdelivr.net/npm/${pkg.name}@${pkg.version}/dist/target/web/superscript_bg.wasm`; +if (cdnWasmUrl() !== jsdelivr) { + throw new Error(`cdnWasmUrl() with CDN flag: ${cdnWasmUrl()} != ${jsdelivr}`); +} + +g.SUPERWALL_SUPERSCRIPT_WASM_URL = 'https://example.test/superscript_bg.wasm'; +if (cdnWasmUrl() !== 'https://example.test/superscript_bg.wasm') { + throw new Error(`cdnWasmUrl() URL override lost to CDN flag: ${cdnWasmUrl()}`); } +delete g.SUPERWALL_SUPERSCRIPT_WASM_CDN; +delete g.SUPERWALL_SUPERSCRIPT_WASM_URL; const glue = (await import(fileUrl('dist/target/web/superscript.js'))) as { default: (init: { module_or_path: BufferSource }) => Promise; diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index b131b7c..751e7cd 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -197,3 +197,5 @@ export type { ExecutionContext, ValueType, } from './types'; + +export { cdnWasmUrl }; From a8560fa7d8d3c95552fe7c75435dab9d76a8fee9 Mon Sep 17 00:00:00 2001 From: Ian Rumac Date: Wed, 9 Sep 2026 08:58:59 +0200 Subject: [PATCH 11/11] Export PassableValue from /browser and match README types --- wasm/README.md | 13 +++++++++---- wasm/src/browser.ts | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/wasm/README.md b/wasm/README.md index ac6461a..734a429 100644 --- a/wasm/README.md +++ b/wasm/README.md @@ -32,11 +32,16 @@ CSP: allow the origin you actually fetch in `connect-src` (for the default, `htt First, import the matching entry: ```ts -import { evaluateWithContext } from "@superwall/superscript/browser"; -// Node/Bun: import { evaluateWithContext } from "@superwall/superscript/node"; +import { + evaluateWithContext, + type ExecutionContext, + type PassableValue, + type WasmHostContext, +} from "@superwall/superscript/browser"; +// Node/Bun: import { ... } from "@superwall/superscript/node"; ``` -Next, create a WasmHostContext class to allow the expression evaluator to call the host environment (your JS) +Next, create a `WasmHostContext` class to allow the expression evaluator to call the host environment (your JS) and compute the dynamic properties, i.e. `platform.daysSinceEvent("event_name")`. ```typescript @@ -45,7 +50,7 @@ and compute the dynamic properties, i.e. `platform.daysSinceEvent("event_name")` * @param args - arguments for the function. * @returns a resolved value. * */ -class TestHostContext implements SuperscriptHostContext { +class TestHostContext implements WasmHostContext { computed_property(name: string, args: [PassableValue]): PassableValue { console.log(`computed_property called with name: ${name}, args: ${JSON.stringify(args)}`); const parsedArgs = args; diff --git a/wasm/src/browser.ts b/wasm/src/browser.ts index 751e7cd..1c99f97 100644 --- a/wasm/src/browser.ts +++ b/wasm/src/browser.ts @@ -195,6 +195,7 @@ export async function evaluateWithContext( export type { SuperscriptHostContext as WasmHostContext, ExecutionContext, + PassableValue, ValueType, } from './types';