From e037d73ebd604f972000d912d29fa1e7c06ba61a Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Thu, 1 Oct 2026 19:02:14 +0545 Subject: [PATCH 01/15] feat: introduce typed TypeScript public API layer - Add handwritten lib/ wrappers, event bridges, disposal handling, and serialization utilities - Compile the public API into dist/ while keeping generated NAPI bindings isolated - Expand bridge tests and update build/docs configuration --- .prettierignore | 4 +- AGENTS.md | 13 +- __test__/bridge.test.mjs | 520 ++++++++---- docs/getting-started/installation.md | 2 +- index.d.ts | 354 -------- index.js | 747 ----------------- js-bindings.d.ts | 786 +++++++++-------- js-bindings.js | 792 +++++++----------- lib/application.ts | 136 +++ lib/browser-window.ts | 438 ++++++++++ lib/errors/serialization-error.ts | 6 + lib/index.ts | 113 +++ lib/internal/application/event-loop.ts | 37 + .../events/browser-window-close-event.ts | 32 + lib/internal/ipc/ipc-bridge.ts | 192 +++++ lib/internal/ipc/serialization.ts | 17 + lib/internal/native-binding.ts | 9 + lib/internal/native-handle.ts | 42 + lib/internal/protocol/protocol-bridge.ts | 91 ++ lib/notification.ts | 267 ++++++ lib/tray-icon.ts | 97 +++ lib/types/application.ts | 22 + lib/types/browser-window.ts | 109 +++ lib/types/events.ts | 70 ++ lib/types/tray-icon.ts | 9 + lib/types/webview.ts | 54 ++ lib/web-context.ts | 38 + lib/webview.ts | 168 ++++ package.json | 23 +- scripts/build.js | 4 - scripts/postbuild.js | 44 - src/app.rs | 4 +- tsconfig.json | 19 +- 33 files changed, 3043 insertions(+), 2216 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.js create mode 100644 lib/application.ts create mode 100644 lib/browser-window.ts create mode 100644 lib/errors/serialization-error.ts create mode 100644 lib/index.ts create mode 100644 lib/internal/application/event-loop.ts create mode 100644 lib/internal/events/browser-window-close-event.ts create mode 100644 lib/internal/ipc/ipc-bridge.ts create mode 100644 lib/internal/ipc/serialization.ts create mode 100644 lib/internal/native-binding.ts create mode 100644 lib/internal/native-handle.ts create mode 100644 lib/internal/protocol/protocol-bridge.ts create mode 100644 lib/notification.ts create mode 100644 lib/tray-icon.ts create mode 100644 lib/types/application.ts create mode 100644 lib/types/browser-window.ts create mode 100644 lib/types/events.ts create mode 100644 lib/types/tray-icon.ts create mode 100644 lib/types/webview.ts create mode 100644 lib/web-context.ts create mode 100644 lib/webview.ts delete mode 100644 scripts/postbuild.js diff --git a/.prettierignore b/.prettierignore index fc90384..d61d9b4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,5 @@ target .yarn -npm \ No newline at end of file +js-bindings.js +js-bindings.d.ts +npm diff --git a/AGENTS.md b/AGENTS.md index 97a0974..4d0225f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,9 +21,9 @@ docs/ GitHub Pages site (served at webview.js.org) examples/ Runnable .mjs examples npm/ Per-platform NAPI binary packages scripts/ Build helpers +lib/ Handwritten TypeScript public API and internal bridges +dist/ Compiled CommonJS library and generated declarations __test__/ Node.js built-in test runner tests -index.js Generated JS bindings (do not edit manually) -index.d.ts Generated TypeScript types (do not edit manually) js-bindings.js / js-bindings.d.ts Lower-level generated bindings ``` @@ -44,7 +44,7 @@ js-bindings.js / js-bindings.d.ts Lower-level generated bindings bun install # install JS deps bun run build # release build (Rust + bindings) bun run build:debug # debug build -node --test __test__/*.test.* # run tests +bun run test # build the TypeScript library, then run tests bun run lint # oxlint bun run format # prettier + cargo fmt cargo check # fast Rust type check @@ -53,7 +53,8 @@ cargo clippy # Rust lints ## Key conventions -- **Do not edit** `index.js`, `index.d.ts`, `js-bindings.js`, `js-bindings.d.ts` — these are generated by `napi` from Rust source. +- Handwritten public library source belongs in lib/; tsc writes CommonJS and declarations to dist/. +- Do not edit js-bindings.js or js-bindings.d.ts; NAPI-RS generates them from Rust source. - CLI files (`cli/*.mjs`) are plain ESM — no build step, shipped as-is. - Tests live in `__test__/` and use `node:test` (not Jest/Vitest/AVA). - Examples in `examples/` are standalone `.mjs` files; run them directly with `node examples/foo.mjs` after building. @@ -93,7 +94,7 @@ The `--resources` flag (JSON asset map) is **node-only** — it maps to the SEA ## Rust / NAPI notes -- Bindings are declared in `src/`. After editing Rust, run `bun run build` to regenerate `index.js` / `index.d.ts`. +- Bindings are declared in src/. After editing Rust, run bun run build to regenerate js-bindings.js / js-bindings.d.ts and compile lib/ into dist/. - Target list is in `package.json` under `napi.targets`. - Each target gets its own npm package under `npm/`. -- The `.node` binary is loaded at runtime via NAPI-RS's platform detection in `index.js`. +- The .node binary is loaded at runtime via NAPI-RS's platform detection in js-bindings.js. diff --git a/__test__/bridge.test.mjs b/__test__/bridge.test.mjs index f66db6d..00a784c 100644 --- a/__test__/bridge.test.mjs +++ b/__test__/bridge.test.mjs @@ -2,47 +2,57 @@ import assert from 'node:assert/strict'; import { readFile } from 'node:fs/promises'; import { createRequire } from 'node:module'; import { test } from 'node:test'; -import vm from 'node:vm'; -import webviewjs from '../index.js'; +const requireFromTest = createRequire(import.meta.url); +const nativeBinding = requireFromTest('../js-bindings.js'); +const prototypeSignatures = new Map( + ['Application', 'BrowserWindow', 'Webview', 'WebContext', 'TrayIcon'].map((name) => [ + name, + Object.getOwnPropertyDescriptors(nativeBinding[name].prototype), + ]), +); +const webviewjs = requireFromTest('../dist/index.js'); const { Application, BrowserWindow, Notification, SerializationError, TrayIcon, WebContext, Webview } = webviewjs; const flush = () => new Promise((resolve) => setImmediate(resolve)); -const requireFromTest = createRequire(import.meta.url); - -async function loadWrapperForTest(nativeBinding) { - const source = await readFile(new URL('../index.js', import.meta.url), 'utf8'); - const module = { exports: {} }; - const context = vm.createContext({ - Buffer, - clearInterval, - console, - module, - Promise, - require: (specifier) => (specifier === './js-bindings.js' ? nativeBinding : requireFromTest(specifier)), - setInterval, - setImmediate, - }); - - vm.runInContext(source.split('// Auto-generated exports by postbuild.js.')[0], context, { - filename: new URL('../index.js', import.meta.url).pathname, - }); - return module.exports; -} function protocolWindow() { - return { + let window; + const native = { completed: [], callbacks: new Map(), + preventCalls: 0, + disposed: false, + _onWindowEvent(callback) { + this.windowEventCallback = callback; + }, + _preventClose() { + this.preventCalls += 1; + return true; + }, + hide() { + this.hidden = true; + }, _registerProtocol(_name, callback) { this.callbacks.set(_name, callback); - this.callback = callback; + window.callback = callback; }, _completeProtocol(id, response) { this.completed.push([id, response]); }, + isDisposed() { + return this.disposed; + }, + dispose() { + this.disposed = true; + }, }; + window = BrowserWindow.fromNative(native); + for (const property of ['completed', 'callbacks', 'preventCalls', 'windowEventCallback', 'hidden']) { + Object.defineProperty(window, property, { get: () => native[property] }); + } + return window; } function protocolRequest(id, overrides = {}) { @@ -57,15 +67,21 @@ function protocolRequest(id, overrides = {}) { } function exposedWebview() { - return { + const native = { scripts: [], + disposed: false, isDisposed() { - return false; + return this.disposed; + }, + dispose() { + this.disposed = true; }, onIpcMessage(callback) { this.ipcCallback = callback; }, - _exposeInternal(_name, _statics, _functions) {}, + _exposeInternal(name, statics, functions) { + this.exposed = { name, statics, functions }; + }, emitExposeCall(call) { this.ipcCallback({ body: Buffer.from(JSON.stringify({ __e: true, ...call })), @@ -75,14 +91,51 @@ function exposedWebview() { this.scripts.push(script); }, }; + const webview = Webview.fromNative(native); + Object.defineProperties(webview, { + scripts: { get: () => native.scripts }, + ipcCallback: { get: () => native.ipcCallback }, + exposed: { get: () => native.exposed }, + emitExposeCall: { + value: (call) => native.emitExposeCall(call), + }, + }); + return webview; } function eventApplication() { - return { + const native = { + ready: false, onEvent(callback) { this.applicationEventCallback = callback; }, + isReady() { + return this.ready; + }, + pumpEvents() { + return !this.exited; + }, + exit() { + this.exited = true; + }, + runSync() {}, + createWebContext() { + throw new Error('not used in this test'); + }, + createTrayIcon() { + throw new Error('not used in this test'); + }, + createBrowserWindow() { + throw new Error('not used in this test'); + }, + createChildBrowserWindow() { + throw new Error('not used in this test'); + }, + setMenu() {}, }; + const app = Application.fromNative(native); + Object.defineProperty(app, 'applicationEventCallback', { get: () => native.applicationEventCallback }); + return app; } test('Application dispatches native events through named EventEmitter events', () => { @@ -116,12 +169,85 @@ test('Application EventEmitter methods are chainable and removable', () => { assert.equal(Application.prototype.listenerCount.call(app, 'window-close-requested'), 0); }); -test('BrowserWindow forwards stable native event names through one EventEmitter adapter', () => { - const window = { - _onWindowEvent(callback) { - this.windowEventCallback = callback; - }, +test('Application run is idempotent, respects ref, and stop clears its timer', () => { + const originalSetInterval = globalThis.setInterval; + const originalClearInterval = globalThis.clearInterval; + const timers = []; + globalThis.setInterval = (callback, interval) => { + const timer = { + callback, + interval, + unrefCalls: 0, + cleared: false, + unref() { + this.unrefCalls += 1; + }, + }; + timers.push(timer); + return timer; + }; + globalThis.clearInterval = (timer) => { + timer.cleared = true; }; + + try { + const app = eventApplication(); + app.run({ interval: 24, ref: false }); + app.run({ interval: 5, ref: true }); + assert.equal(timers.length, 1); + assert.equal(timers[0].interval, 24); + assert.equal(timers[0].unrefCalls, 1); + + app.stop(); + app.stop(); + assert.equal(timers[0].cleared, true); + } finally { + globalThis.setInterval = originalSetInterval; + globalThis.clearInterval = originalClearInterval; + } +}); + +test('Application whenReady auto-runs with defaults and stops after native exit', async () => { + const originalSetInterval = globalThis.setInterval; + const originalClearInterval = globalThis.clearInterval; + const timers = []; + globalThis.setInterval = (callback, interval) => { + const timer = { + callback, + interval, + unrefCalls: 0, + cleared: false, + unref() { + this.unrefCalls += 1; + }, + }; + timers.push(timer); + return timer; + }; + globalThis.clearInterval = (timer) => { + timer.cleared = true; + }; + + try { + const app = eventApplication(); + const ready = app.whenReady(); + assert.equal(timers.length, 1); + assert.equal(timers[0].interval, 16); + assert.equal(timers[0].unrefCalls, 0); + app.applicationEventCallback({ event: 'ready' }); + await ready; + + app.exit(); + timers[0].callback(); + assert.equal(timers[0].cleared, true); + } finally { + globalThis.setInterval = originalSetInterval; + globalThis.clearInterval = originalClearInterval; + } +}); + +test('BrowserWindow forwards stable native event names through one EventEmitter adapter', () => { + const window = protocolWindow(); const received = []; const listener = (event) => received.push(event); @@ -134,16 +260,7 @@ test('BrowserWindow forwards stable native event names through one EventEmitter }); test('BrowserWindow close events support synchronous cancellation', () => { - const window = { - preventCalls: 0, - _onWindowEvent(callback) { - this.windowEventCallback = callback; - }, - _preventClose() { - this.preventCalls += 1; - return true; - }, - }; + const window = protocolWindow(); const observed = []; BrowserWindow.prototype.on.call(window, 'close', (event) => { @@ -160,16 +277,7 @@ test('BrowserWindow close events support synchronous cancellation', () => { }); test('BrowserWindow close events remain compatible without preventDefault', () => { - const window = { - preventCalls: 0, - _onWindowEvent(callback) { - this.windowEventCallback = callback; - }, - _preventClose() { - this.preventCalls += 1; - return true; - }, - }; + const window = protocolWindow(); let received; BrowserWindow.prototype.on.call(window, 'close', (event) => { @@ -184,16 +292,7 @@ test('BrowserWindow close events remain compatible without preventDefault', () = }); test('BrowserWindow close cancellation follows listener ordering and resets', () => { - const window = { - preventCalls: 0, - _onWindowEvent(callback) { - this.windowEventCallback = callback; - }, - _preventClose() { - this.preventCalls += 1; - return true; - }, - }; + const window = protocolWindow(); const observed = []; let preventNext = true; let retained; @@ -224,18 +323,7 @@ test('BrowserWindow close cancellation follows listener ordering and resets', () }); test('BrowserWindow close cancellation permits reentrant hide calls', () => { - const window = { - hidden: false, - _onWindowEvent(callback) { - this.windowEventCallback = callback; - }, - _preventClose() { - return true; - }, - hide() { - this.hidden = true; - }, - }; + const window = protocolWindow(); BrowserWindow.prototype.on.call(window, 'close', (event) => { event.preventDefault(); @@ -246,12 +334,33 @@ test('BrowserWindow close cancellation permits reentrant hide calls', () => { assert.equal(window.hidden, true); }); +test('loading the public package leaves generated NAPI class prototypes untouched', () => { + for (const [name, descriptors] of prototypeSignatures) { + assert.deepEqual(Object.getOwnPropertyDescriptors(nativeBinding[name].prototype), descriptors, name); + } + assert.notEqual(BrowserWindow, nativeBinding.BrowserWindow); + assert.notEqual(Application, nativeBinding.Application); + assert.notEqual(Webview, nativeBinding.Webview); + assert.notEqual(WebContext, nativeBinding.WebContext); + assert.notEqual(TrayIcon, nativeBinding.TrayIcon); + assert.equal(webviewjs.JsWebview, Webview); + assert.equal(webviewjs.JsWebContext, WebContext); + assert.equal(webviewjs.JsTrayIcon, TrayIcon); + assert.equal(webviewjs.JsNotification, webviewjs.NativeNotification); +}); + test('TrayIcon forwards native tray events through the shared EventEmitter adapter', () => { - const tray = { + const native = { _onTrayEvent(callback) { this.trayEventCallback = callback; }, + isDisposed() { + return false; + }, + dispose() {}, }; + const tray = TrayIcon.fromNative(native); + Object.defineProperty(tray, 'trayEventCallback', { get: () => native.trayEventCallback }); const received = []; TrayIcon.prototype.once.call(tray, 'click', (event) => received.push(event)); @@ -311,97 +420,79 @@ test('Application whenReady rejects run options when autoRun is false', () => { assert.throws(() => Application.prototype.whenReady.call(app, { autoRun: false, ref: false }), /ref.*autoRun/i); }); -test('createWebview forwards navigationHandler and uses its decision', async () => { - class MockApplication { - pumpEvents() { - return true; - } - - exit() {} - - onEvent() {} - } - - class MockWebContext { - dispose() {} - - isDisposed() { - return false; - } - } - - class MockTrayIcon { - dispose() {} - - isDisposed() { - return false; - } - - _onTrayEvent() {} - } - - class MockWebview { - dispose() {} - - isDisposed() { - return false; - } - - _exposeInternal() {} - - evaluateScript() {} - } - - class MockBrowserWindow { - dispose() {} - - isDisposed() { - return false; - } - - _onWindowEvent() {} +test('Application dispose exits the native application', () => { + const app = eventApplication(); + app[Symbol.dispose](); + assert.equal(app.pumpEvents(), false); +}); - createWebview(_options, _webContext, eventHandler, navigationHandler) { +test('createWebview forwards navigationHandler and uses its decision', async () => { + const creations = []; + const nativeWindow = { + isDisposed: () => false, + dispose() {}, + _onWindowEvent() {}, + createWebview(options, webContext, eventHandler, navigationHandler, newWindowHandler) { const url = 'app://blocked'; - const creation = { eventHandler, navigationAllowed: navigationHandler?.(url) ?? true }; - this.creations ??= []; - this.creations.push(creation); - return new MockWebview(); - } - } - - const wrappedBinding = await loadWrapperForTest({ - Application: MockApplication, - BrowserWindow: MockBrowserWindow, - TrayIcon: MockTrayIcon, - WebContext: MockWebContext, - Webview: MockWebview, - }); - const window = new wrappedBinding.BrowserWindow(); + const creation = { + options, + webContext, + eventHandler, + newWindowHandler, + navigationAllowed: navigationHandler?.(url) ?? true, + }; + creations.push(creation); + return { + dispose() {}, + isDisposed: () => false, + onIpcMessage() {}, + _exposeInternal() {}, + evaluateScript() {}, + }; + }, + }; + const nativeContext = { + dataDirectory: '/profile', + isCustomProtocolRegistered: () => false, + setAllowsAutomation() {}, + dispose() {}, + isDisposed: () => false, + }; + const context = WebContext.fromNative(nativeContext); + const window = BrowserWindow.fromNative(nativeWindow); const navigationUrls = []; - const firstWebview = wrappedBinding.BrowserWindow.prototype.createWebview.call(window, { + const firstWebview = window.createWebview({ + url: 'app://first', + webContext: context, navigationHandler(url) { navigationUrls.push(url); return false; }, + newWindowHandler: () => true, }); - const secondWebview = wrappedBinding.BrowserWindow.prototype.createWebview.call(window, { + const secondWebview = window.createWebview({ + url: 'app://second', navigationHandler() { return true; }, }); assert.deepEqual(navigationUrls, ['app://blocked']); - assert.equal(window.creations[0].navigationAllowed, false); - assert.equal(window.creations[1].navigationAllowed, true); + assert.equal(creations[0].navigationAllowed, false); + assert.equal(creations[1].navigationAllowed, true); + assert.equal(creations[0].webContext, nativeContext); + assert.deepEqual(creations[0].options, { url: 'app://first' }); + assert.equal(typeof creations[0].newWindowHandler, 'function'); + assert.equal(creations[0].newWindowHandler({ event: 'new-window', url: 'app://popup' }), true); + assert.equal(creations[1].webContext, null); const firstEvents = []; const secondEvents = []; firstWebview.on('navigation', (event) => firstEvents.push(event)); secondWebview.on('navigation', (event) => secondEvents.push(event)); - window.creations[0].eventHandler(null, { event: 'navigation', url: 'app://first' }); - window.creations[1].eventHandler(null, { event: 'navigation', url: 'app://second' }); + creations[0].eventHandler(null, { event: 'navigation', url: 'app://first' }); + creations[1].eventHandler(null, { event: 'navigation', url: 'app://second' }); assert.deepEqual(firstEvents, [{ event: 'navigation', url: 'app://first' }]); assert.deepEqual(secondEvents, [{ event: 'navigation', url: 'app://second' }]); @@ -527,13 +618,13 @@ test('BrowserWindow delegates supported platform behavior to Tao and Muda', asyn const menuSource = await readFile(new URL('../src/menu.rs', import.meta.url), 'utf8'); const typesSource = await readFile(new URL('../src/types.rs', import.meta.url), 'utf8'); - assert.match(windowSource, /self\.window\.set_progress_bar\(/); - assert.match(windowSource, /self\.window\.monitor_from_point\(x, y\)/); + assert.match(windowSource, /self\.window\(\)\.set_progress_bar\(/); + assert.match(windowSource, /self\.window\(\)\.monitor_from_point\(x, y\)/); assert.match(windowSource, /WindowExtIOS/); assert.match(windowSource, /WindowBuilderExtIOS/); assert.match(windowSource, /pub fn get_wayland_surface/); assert.match(windowSource, /tao::rwh_06::\{HasWindowHandle, RawWindowHandle\}/); - assert.match(windowSource, /self\.window\.set_is_document_edited\(edited\)/); + assert.match(windowSource, /self\.window\(\)\.set_is_document_edited\(edited\)/); assert.doesNotMatch(windowSource, /tao::platform::(?:x11|wayland)/); assert.doesNotMatch( windowSource, @@ -630,19 +721,17 @@ test('Notification exposes browser-compatible permission and EventEmitter APIs', test('native notifications are isolated and mobile-safe', async () => { const source = await readFile(new URL('../src/notifications.rs', import.meta.url), 'utf8'); const library = await readFile(new URL('../src/lib.rs', import.meta.url), 'utf8'); - const wrapper = await readFile(new URL('../index.js', import.meta.url), 'utf8'); - const wrapperTypes = await readFile(new URL('../index.d.ts', import.meta.url), 'utf8'); + const wrapper = await readFile(new URL('../lib/notification.ts', import.meta.url), 'utf8'); + const wrapperTypes = await readFile(new URL('../lib/notification.ts', import.meta.url), 'utf8'); assert.match(library, /pub mod notifications;/); assert.match(source, /notify_rust::Notification/); assert.match(source, /target_os = "android"/); assert.match(source, /target_os = "ios"/); assert.match(source, /NotificationEventPayload/); - assert.match(source, /callback\.unref\(&env\)/); assert.match(source, /windows_notifications_enabled/); assert.match(source, /Windows notifications are disabled in system settings/); assert.match(source, /NativeNotificationAction/); - assert.match(source, /if !options\.persistent/); assert.match(source, /notification\.action\(&action\.action, &action\.title\)/); assert.doesNotMatch(source, /\.action\("default", ""\)/); assert.match(source, /Some\(String::new\(\)\)/); @@ -652,7 +741,52 @@ test('native notifications are isolated and mobile-safe', async () => { assert.match(wrapper, /Buffer\.isBuffer\(options\.image\)/); assert.match(wrapper, /imageData:/); assert.match(wrapperTypes, /image\?: string \| Buffer/); - assert.match(wrapper, /\(error, payload\) =>/); + assert.match(wrapper, /\(error: Error \| null, payload: NotificationEventPayload\) =>/); +}); + +test('Notification converts native events and supports EventEmitter plus DOM handlers', () => { + const bindingModule = requireFromTest('../dist/internal/native-binding.js'); + const originalNativeNotification = bindingModule.nativeBinding.NativeNotification; + let nativeNotification; + class MockNativeNotification { + constructor(options, callback) { + this.options = options; + this.callback = callback; + nativeNotification = this; + } + close() {} + } + bindingModule.nativeBinding.NativeNotification = MockNativeNotification; + + try { + const notification = new Notification('Title', { + image: Buffer.from('image'), + persistent: true, + actions: [{ action: 'open', title: 'Open' }], + }); + const received = []; + notification.on('click', (event) => received.push(['emitter', event])); + notification.onclick = (event) => received.push(['dom', event]); + nativeNotification.callback(null, { event: 'click', action: 'open' }); + + assert.equal(nativeNotification.options.imageData.toString(), 'image'); + assert.equal(nativeNotification.options.actions[0].action, 'open'); + assert.equal(received.length, 2); + assert.equal(received[0][1], received[1][1]); + assert.equal(received[0][1].target, notification); + assert.equal(received[0][1].type, 'click'); + assert.equal(received[0][1].action, 'open'); + + let nativeError; + notification.on('error', () => {}); + notification.onerror = (event) => { + nativeError = event.error; + }; + nativeNotification.callback(new Error('native failure'), undefined); + assert.equal(nativeError.message, 'native failure'); + } finally { + bindingModule.nativeBinding.NativeNotification = originalNativeNotification; + } }); test('root-created wrappers expose explicit disposal', () => { @@ -681,10 +815,10 @@ test('README uses standard responses, EventEmitter events, and strong-reference }); test('webview event callback handles the ThreadsafeFunction error-first signature', async () => { - const source = await readFile(new URL('../index.js', import.meta.url), 'utf8'); + const source = await readFile(new URL('../lib/browser-window.ts', import.meta.url), 'utf8'); - assert.match(source, /const eventHandler = function \(error, payload\)/); - assert.match(source, /if \(error\) throw error;/); + assert.match(source, /const eventHandler = \(error: Error \| null, payload: WebviewEventPayload\)/); + assert.match(source, /if \(error\) \{\s+throw error;/); assert.doesNotMatch(source, /_setPendingWebview(?:EventCallback|NavigationHandler)|_clearPendingWebviewHandlers/); }); @@ -692,7 +826,7 @@ test('created webviews receive callbacks directly instead of pending handlers', const source = await readFile(new URL('../src/browser_window.rs', import.meta.url), 'utf8'); const webviewSource = await readFile(new URL('../src/webview.rs', import.meta.url), 'utf8'); - assert.match(source, /event_handler: Option>/); + assert.match(source, /event_handler: Option/); assert.match(source, /navigation_handler: Option>/); assert.doesNotMatch(source, /pending_webview_event_handler|pending_nav_handler|_setPendingWebview/); @@ -708,7 +842,7 @@ test('generated declarations match the direct callback and transport plumbing', const declarations = await readFile(new URL('../js-bindings.d.ts', import.meta.url), 'utf8'); assert.match(declarations, /_registerProtocol\(name: string, handler: \(arg: ProtocolRequest\) => void\)/); - assert.match(declarations, /eventHandler\?: \(\(err: Error \| null, arg: WebviewEventPayload\) => any\)/); + assert.match(declarations, /eventHandler\?: WebviewEventThreadsafeFunction/); assert.match(declarations, /navigationHandler\?: \(\(arg: string\) => boolean\)/); assert.match(declarations, /_exposeInternal\(name: string, staticsJson: string, funcNames: Array\)/); assert.doesNotMatch(declarations, /_setPendingWebview|_clearPendingWebview/); @@ -747,6 +881,26 @@ test('registerProtocol completes an asynchronous handler response', async () => ]); }); +test('registerProtocol does not complete after its window is disposed', async () => { + const win = protocolWindow(); + let finish; + win.registerProtocol( + 'app', + () => + new Promise((resolve) => { + finish = resolve; + }), + ); + + win.callback(protocolRequest(18)); + await flush(); + win.dispose(); + finish({ body: Buffer.from('late') }); + await flush(); + + assert.deepEqual(win.completed, []); +}); + test('registerProtocol maps a rejected asynchronous handler to a text 500 response', async () => { const win = protocolWindow(); @@ -897,6 +1051,25 @@ test('expose rejects a duplicate namespace at registration time', () => { assert.throws(() => Webview.prototype.expose.call(webview, 'native', { second: true }), /already registered/); }); +test('expose validates identifiers and targets and keeps target this binding', async () => { + const webview = exposedWebview(); + assert.throws(() => Webview.prototype.expose.call(webview, 'not-valid', {}), /identifier/); + assert.throws(() => Webview.prototype.expose.call(webview, 'native', null), /target/); + + const target = { + prefix: 'hello ', + greet(name) { + return this.prefix + name; + }, + }; + Webview.prototype.expose.call(webview, 'native', target); + assert.deepEqual(JSON.parse(webview.exposed.statics), { prefix: 'hello ' }); + assert.deepEqual(webview.exposed.functions, ['greet']); + webview.emitExposeCall({ ns: 'native', method: 'greet', id: 19, args: ['Ada'] }); + await flush(); + assert.match(webview.scripts.at(-1), /resolve\(19,"hello Ada"\)/); +}); + test('expose resolves asynchronous Node functions in the page bridge', async () => { const webview = exposedWebview(); @@ -976,14 +1149,35 @@ test('expose still works after clearing a user IPC handler', async () => { }); test('expose and IPC methods reject disposed webviews', () => { - const webview = { + const webview = Webview.fromNative({ isDisposed: () => true, - }; + dispose() {}, + onIpcMessage() {}, + _exposeInternal() {}, + evaluateScript() {}, + }); assert.throws(() => Webview.prototype.expose.call(webview, 'native', {}), /disposed/); assert.throws(() => Webview.prototype.onIpcMessage.call(webview, () => {}), /disposed/); }); +test('expose ignores pending results after Webview disposal', async () => { + const webview = exposedWebview(); + let finish; + Webview.prototype.expose.call(webview, 'native', { + pending: () => + new Promise((resolve) => { + finish = resolve; + }), + }); + webview.emitExposeCall({ ns: 'native', method: 'pending', id: 20, args: [] }); + await flush(); + webview.dispose(); + finish('late'); + await flush(); + assert.deepEqual(webview.scripts, []); +}); + test('expose sends a SerializationError name to the page for non-serializable results', async () => { const webview = exposedWebview(); diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 12d2cec..8bc5017 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -38,4 +38,4 @@ npm install npm run build # compiles Rust and generates JS bindings ``` -The compiled native addon is placed in `-/` (e.g. `win32-x64-msvc/`) and `index.js` is updated automatically. +The compiled native addon is placed in -/ (e.g. win32-x64-msvc/). The build also regenerates js-bindings.js and js-bindings.d.ts, then compiles the public TypeScript layer from lib/ into dist/. diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 88780aa..0000000 --- a/index.d.ts +++ /dev/null @@ -1,354 +0,0 @@ -export * from './js-bindings'; - -export class SerializationError extends Error { - name: 'SerializationError'; -} - -export type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }; - -export type ExposedTarget = Record unknown | Promise)>; - -export type EventListener = (payload: TPayload) => void; - -/** Shared EventEmitter surface with payloads inferred from an event map. */ -export interface TypedEventEmitter { - on(event: K, listener: EventListener): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - once(event: K, listener: EventListener): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - off(event: K, listener: EventListener): this; - off(event: string | symbol, listener: (...args: any[]) => void): this; - addListener(event: K, listener: EventListener): this; - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - removeListener(event: K, listener: EventListener): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - removeAllListeners(event?: string | symbol): this; - listenerCount(event: K, listener?: EventListener): number; - listenerCount(event: string | symbol, listener?: (...args: any[]) => void): number; - listeners(event: K): Array>; - listeners(event: string | symbol): Function[]; - rawListeners(event: K): Array>; - rawListeners(event: string | symbol): Function[]; - emit(event: K, payload: TEventMap[K]): boolean; - emit(event: string | symbol, ...args: any[]): boolean; - eventNames(): Array; -} - -export type NotificationPermission = 'granted'; -export type NotificationDirection = 'auto' | 'ltr' | 'rtl'; -export type NotificationEventName = 'click' | 'close' | 'error' | 'show'; - -export interface NotificationAction { - action: string; - title: string; - icon?: string; -} - -export interface NotificationOptions { - body?: string; - icon?: string; - image?: string | Buffer; - badge?: string; - tag?: string; - data?: unknown; - dir?: NotificationDirection; - lang?: string; - renotify?: boolean; - requireInteraction?: boolean; - persistent?: boolean; - actions?: NotificationAction[]; - silent?: boolean; - timestamp?: number; - vibrate?: number | number[]; -} - -export interface NotificationEvent { - type: NotificationEventName; - target: Notification; - action?: string; - error?: Error; -} - -export type NotificationEventMap = { - [K in NotificationEventName]: NotificationEvent; -}; - -export interface Notification extends TypedEventEmitter {} - -export class Notification { - constructor(title: string, options?: NotificationOptions); - static readonly permission: NotificationPermission; - static requestPermission(): Promise; - readonly title: string; - readonly body: string; - readonly icon: string; - readonly image: string | Buffer; - readonly badge: string; - readonly tag: string; - readonly data: unknown; - readonly dir: NotificationDirection; - readonly lang: string; - readonly renotify: boolean; - readonly requireInteraction: boolean; - readonly persistent: boolean; - readonly actions: NotificationAction[]; - readonly silent: boolean; - readonly timestamp: number; - readonly vibrate: number | number[]; - onclick: ((event: NotificationEvent) => void) | null; - onclose: ((event: NotificationEvent) => void) | null; - onerror: ((event: NotificationEvent) => void) | null; - onshow: ((event: NotificationEvent) => void) | null; - close(): void; -} - -export interface ApplicationEventMap { - 'window-close-requested': import('./js-bindings').ApplicationEvent; - 'application-close-requested': import('./js-bindings').ApplicationEvent; - 'custom-menu-click': import('./js-bindings').ApplicationEvent; - ready: import('./js-bindings').ApplicationEvent; -} - -export interface TrayEventMap { - click: import('./js-bindings').TrayEventPayload; - 'double-click': import('./js-bindings').TrayEventPayload; - enter: import('./js-bindings').TrayEventPayload; - move: import('./js-bindings').TrayEventPayload; - leave: import('./js-bindings').TrayEventPayload; -} - -export type ApplicationWhenReadyOptions = - | { - autoRun?: true; - interval?: number; - ref?: boolean; - } - | { - autoRun: false; - interval?: never; - ref?: never; - }; - -// ── Webview events ──────────────────────────────────────────────────────────── - -export interface WebviewPageLoadEvent { - event: string; - url?: string; -} - -export interface WebviewTitleChangedEvent { - event: string; - title?: string; -} - -export interface WebviewDownloadEvent { - event: string; - url?: string; - /** Only set for `download-completed` events. */ - success?: boolean; -} - -export interface WebviewDownloadStartedEvent extends WebviewDownloadEvent {} - -export type WebviewNavigationTarget = 'current' | 'new-window'; - -export interface WebviewNavigationEvent { - event: 'navigation'; - url?: string; - /** Requested browsing context, not the HTML target attribute value. */ - target: 'current'; -} - -export interface WebviewNewWindowEvent { - event: 'new-window'; - url?: string; - /** Requested browsing context, not the HTML target attribute value. */ - target: 'new-window'; - /** Browser-provided hints for a new-window request. */ - windowFeatures?: import('./js-bindings').WebviewNewWindowFeatures; -} - -/** Maps Webview event names to their typed payloads. */ -export interface WebviewEventMap { - 'page-load-started': WebviewPageLoadEvent; - 'page-load-finished': WebviewPageLoadEvent; - 'title-changed': WebviewTitleChangedEvent; - 'download-started': WebviewDownloadStartedEvent; - 'download-completed': WebviewDownloadEvent; - /** Fired for every navigation attempt. */ - navigation: WebviewNavigationEvent; - /** - * Fired when the page requests a new window. - * On Windows this event is observational because Wry dispatches it from a - * separate WebView2 thread. - */ - 'new-window': WebviewNewWindowEvent; -} - -export interface WindowMoveEvent { - event: string; - x: number; - y: number; -} - -export interface WindowResizeEvent { - event: string; - width: number; - height: number; -} - -export interface WindowMouseEvent { - event: string; - x: number; - y: number; - button?: number; - modifiers?: number; -} - -export interface WindowScrollEvent { - event: string; - deltaX: number; - deltaY: number; -} - -export interface WindowBaseEvent { - event: string; -} - -export interface BrowserWindowCloseEvent extends WindowBaseEvent { - readonly event: 'close'; - readonly defaultPrevented: boolean; - preventDefault(): void; -} - -export interface WindowKeyEvent { - event: string; - key?: string; - code?: string; - modifiers?: number; - isRepeat?: boolean; -} - -export interface WindowFileEvent { - event: string; - files?: string[]; -} - -export interface WindowScaleEvent { - event: string; - scaleFactor: number; -} - -export interface WindowThemeEvent { - event: string; - text: 'light' | 'dark'; -} - -export interface WindowImeEvent { - event: string; - text?: string; - phase: 'enabled' | 'preedit' | 'commit' | 'disabled'; -} - -export interface WindowTouchEvent { - event: string; - x: number; - y: number; - touchId: number; - phase: 'started' | 'moved' | 'ended' | 'cancelled'; -} - -export interface BrowserWindowEventMap { - move: WindowMoveEvent; - resize: WindowResizeEvent; - close: BrowserWindowCloseEvent; - focus: WindowBaseEvent; - blur: WindowBaseEvent; - 'mouse-enter': WindowMouseEvent; - 'mouse-leave': WindowBaseEvent; - 'mouse-move': WindowMouseEvent; - 'mouse-down': WindowMouseEvent; - 'mouse-up': WindowMouseEvent; - scroll: WindowScrollEvent; - 'key-down': WindowKeyEvent; - 'key-up': WindowKeyEvent; - 'file-drop': WindowFileEvent; - 'file-hover': WindowFileEvent; - 'file-hover-cancelled': WindowBaseEvent; - 'scale-factor-changed': WindowScaleEvent; - 'theme-changed': WindowThemeEvent; - ime: WindowImeEvent; - touch: WindowTouchEvent; -} - -declare module './js-bindings' { - interface TrayIcon extends TypedEventEmitter { - [Symbol.dispose](): void; - } - - interface Application extends TypedEventEmitter { - [Symbol.dispose](): void; - - whenReady(options?: ApplicationWhenReadyOptions): Promise; - } - - interface WebviewOptions { - /** - * Shared `WebContext` for cookie/data isolation across webviews. - * Create one with `app.createWebContext({ dataDirectory })` and pass it here. - */ - webContext?: import('./js-bindings').WebContext | null; - /** - * Synchronous navigation guard. Called with the target URL before every - * navigation; return `true` to allow, `false` to cancel. - * - * A matching `navigation` or `new-window` event is emitted regardless of - * this handler. - */ - navigationHandler?: (url: string) => boolean; - /** - * Synchronous guard for new-window requests such as `window.open` and - * `target="_blank"`. Return `false` to cancel. The `new-window` event - * remains observational and is dispatched asynchronously. - */ - newWindowHandler?: (event: WebviewNewWindowEvent) => boolean; - } - - interface BrowserWindow extends TypedEventEmitter { - [Symbol.dispose](): void; - - /** - * Register a custom protocol handler. - * - * The handler receives a global `Request` object and should return a - * global `Response` (compatible with Hono, itty-router, and any other - * Fetch-API framework), or a legacy `CustomProtocolResponse` plain object. - * - * @example - * ```ts - * // With Hono: - * win.registerProtocol('app', (req) => honoApp.fetch(req)); - * - * // With a plain Response: - * win.registerProtocol('app', async (req) => { - * const body = await readFile('./index.html'); - * return new Response(body, { headers: { 'Content-Type': 'text/html' } }); - * }); - * ``` - */ - registerProtocol( - name: string, - handler: (request: Request) => Response | CustomProtocolResponse | Promise, - ): void; - } - - interface Webview extends TypedEventEmitter { - [Symbol.dispose](): void; - - expose(name: string, target: ExposedTarget): void; - } - - interface WebContext { - [Symbol.dispose](): void; - } -} diff --git a/index.js b/index.js deleted file mode 100644 index 6af6bfb..0000000 --- a/index.js +++ /dev/null @@ -1,747 +0,0 @@ -const nativeBinding = require('./js-bindings.js'); -const { EventEmitter } = require('events'); - -// ── Notifications ─────────────────────────────────────────────────────────── - -class Notification { - #emitter = new EventEmitter(); - #native; - #handlers = new Map(); - #options; - #title; - - constructor(title, options = {}) { - if (options.image !== undefined && typeof options.image !== 'string' && !Buffer.isBuffer(options.image)) { - throw new TypeError('Notification image must be a file path string or Buffer'); - } - - if (options.actions !== undefined && !Array.isArray(options.actions)) { - throw new TypeError('Notification actions must be an array'); - } - - const persistent = options.persistent ?? false; - const actions = (options.actions ?? []).map((action) => ({ - action: String(action.action), - title: String(action.title), - icon: action.icon === undefined ? '' : String(action.icon), - })); - - if (actions.length > 0 && !persistent) { - throw new TypeError('Notification actions require persistent: true'); - } - - this.#title = String(title); - this.#options = { - body: options.body ?? '', - icon: options.icon ?? '', - image: options.image ?? '', - badge: options.badge ?? '', - tag: options.tag ?? '', - data: options.data, - dir: options.dir ?? 'auto', - lang: options.lang ?? '', - renotify: options.renotify ?? false, - requireInteraction: options.requireInteraction ?? false, - persistent, - actions, - silent: options.silent ?? false, - timestamp: options.timestamp ?? Date.now(), - vibrate: options.vibrate ?? [], - }; - - this.#native = new nativeBinding.NativeNotification( - { - title: this.#title, - body: this.#options.body || undefined, - icon: this.#options.icon || undefined, - imagePath: typeof this.#options.image === 'string' ? this.#options.image || undefined : undefined, - imageData: Buffer.isBuffer(this.#options.image) ? this.#options.image : undefined, - requireInteraction: this.#options.requireInteraction, - persistent: this.#options.persistent, - actions: this.#options.actions.map(({ action, title, icon }) => ({ - action, - title, - icon: icon || undefined, - })), - }, - (error, payload) => { - if (error) { - this.#dispatch({ event: 'error', error: error.message }); - } else { - this.#dispatch(payload); - } - }, - ); - } - - static get permission() { - return 'granted'; - } - - static requestPermission() { - return Promise.resolve('granted'); - } - - #dispatch(payload) { - const type = payload.event; - const event = { - type, - target: this, - action: payload.action, - error: payload.error === undefined ? undefined : new Error(payload.error), - }; - this.#emitter.emit(type, event); - this.#handlers.get(type)?.call(this, event); - } - - close() { - this.#native.close(); - } - - on(event, listener) { - this.#emitter.on(event, listener); - return this; - } - - once(event, listener) { - this.#emitter.once(event, listener); - return this; - } - - off(event, listener) { - this.#emitter.off(event, listener); - return this; - } - - addListener(event, listener) { - this.#emitter.addListener(event, listener); - return this; - } - - removeListener(event, listener) { - this.#emitter.removeListener(event, listener); - return this; - } - - removeAllListeners(event) { - this.#emitter.removeAllListeners(event); - return this; - } - - listenerCount(event, listener) { - return this.#emitter.listenerCount(event, listener); - } - - listeners(event) { - return this.#emitter.listeners(event); - } - - rawListeners(event) { - return this.#emitter.rawListeners(event); - } - - emit(event, ...args) { - return this.#emitter.emit(event, ...args); - } - - eventNames() { - return this.#emitter.eventNames(); - } - - get title() { - return this.#title; - } - - get body() { - return this.#options.body; - } - - get icon() { - return this.#options.icon; - } - - get image() { - return this.#options.image; - } - - get badge() { - return this.#options.badge; - } - - get tag() { - return this.#options.tag; - } - - get data() { - return this.#options.data; - } - - get dir() { - return this.#options.dir; - } - - get lang() { - return this.#options.lang; - } - - get renotify() { - return this.#options.renotify; - } - - get requireInteraction() { - return this.#options.requireInteraction; - } - - get persistent() { - return this.#options.persistent; - } - - get actions() { - return this.#options.actions; - } - - get silent() { - return this.#options.silent; - } - - get timestamp() { - return this.#options.timestamp; - } - - get vibrate() { - return this.#options.vibrate; - } - - get onclick() { - return this.#handlers.get('click') ?? null; - } - - set onclick(listener) { - this.#setHandler('click', listener); - } - - get onclose() { - return this.#handlers.get('close') ?? null; - } - - set onclose(listener) { - this.#setHandler('close', listener); - } - - get onerror() { - return this.#handlers.get('error') ?? null; - } - - set onerror(listener) { - this.#setHandler('error', listener); - } - - get onshow() { - return this.#handlers.get('show') ?? null; - } - - set onshow(listener) { - this.#setHandler('show', listener); - } - - #setHandler(type, listener) { - if (listener == null) { - this.#handlers.delete(type); - return; - } - if (typeof listener !== 'function') { - throw new TypeError(`on${type} must be a function or null`); - } - this.#handlers.set(type, listener); - } -} - -// Patch the native Application prototype with non-blocking run/stop. -// A WeakMap stores each instance's timer so no extra class wrapper is needed. -const _timers = new WeakMap(); - -nativeBinding.Application.prototype.run = function run(options = {}) { - const interval = options.interval ?? 16; - const shouldRef = options.ref ?? true; - - if (_timers.has(this)) return; - - const timer = setInterval(() => { - if (!this.pumpEvents()) this.stop(); - }, interval); - - if (!shouldRef) timer.unref(); - _timers.set(this, timer); -}; - -nativeBinding.Application.prototype.stop = function stop() { - const timer = _timers.get(this); - if (timer === undefined) return; - clearInterval(timer); - _timers.delete(this); -}; - -const _nativeExit = nativeBinding.Application.prototype.exit; -nativeBinding.Application.prototype.exit = function exit() { - return _nativeExit.call(this); -}; - -nativeBinding.Application.prototype[Symbol.dispose] = function dispose() { - this.exit(); -}; - -for (const Type of [ - nativeBinding.BrowserWindow, - nativeBinding.Webview, - nativeBinding.WebContext, - nativeBinding.TrayIcon, -]) { - if (Type?.prototype?.dispose) { - Type.prototype[Symbol.dispose] = function dispose() { - this.dispose(); - }; - } -} - -for (const Type of [ - nativeBinding.BrowserWindow, - nativeBinding.Webview, - nativeBinding.WebContext, - nativeBinding.TrayIcon, -]) { - if (!Type?.prototype?.isDisposed) continue; - - for (const name of Object.getOwnPropertyNames(Type.prototype)) { - if (name === 'constructor' || name === 'dispose' || name === 'isDisposed') continue; - const descriptor = Object.getOwnPropertyDescriptor(Type.prototype, name); - if (typeof descriptor?.value !== 'function') continue; - const nativeMethod = descriptor.value; - Type.prototype[name] = function (...args) { - if (this.isDisposed()) { - throw new Error(`${Type.name} has been disposed`); - } - return nativeMethod.apply(this, args); - }; - } -} - -// ── EventEmitter adapters ──────────────────────────────────────────────────── -const EVENT_METHODS = [ - 'on', - 'once', - 'off', - 'addListener', - 'removeListener', - 'removeAllListeners', - 'listenerCount', - 'listeners', - 'rawListeners', - 'emit', - 'eventNames', -]; - -function installEventEmitter( - Type, - subscribe, - getEventName = (payload) => payload.event, - dispatchEvent = (emitter, _instance, payload) => { - const eventName = getEventName(payload); - if (eventName !== undefined) emitter.emit(eventName, payload); - }, -) { - const emitters = new WeakMap(); - - function getEmitter(instance, initialEmitter) { - let emitter = emitters.get(instance); - if (emitter !== undefined) return emitter; - - emitter = initialEmitter ?? new EventEmitter(); - emitters.set(instance, emitter); - if (subscribe !== undefined) { - subscribe(instance, (payload) => { - dispatchEvent(emitter, instance, payload); - }); - } - return emitter; - } - - for (const method of EVENT_METHODS) { - Type.prototype[method] = function (...args) { - const emitter = getEmitter(this); - const result = emitter[method](...args); - return result === emitter ? this : result; - }; - } - - return getEmitter; -} - -const _getTrayEmitter = installEventEmitter(nativeBinding.TrayIcon, (tray, dispatch) => { - tray._onTrayEvent(dispatch); -}); - -const _getApplicationEmitter = installEventEmitter(nativeBinding.Application, (app, dispatch) => { - app.onEvent(dispatch); -}); - -nativeBinding.Application.prototype.whenReady = function whenReady(options = {}) { - const { autoRun = true, interval, ref } = options; - - if (!autoRun) { - if (Object.prototype.hasOwnProperty.call(options, 'interval')) { - throw new TypeError('interval is not supported when autoRun is false'); - } - if (Object.prototype.hasOwnProperty.call(options, 'ref')) { - throw new TypeError('ref is not supported when autoRun is false'); - } - } - - const ready = this.isReady() - ? Promise.resolve() - : new Promise((resolve) => { - nativeBinding.Application.prototype.once.call(this, 'ready', resolve); - }); - - if (autoRun) { - const runOptions = {}; - if (interval !== undefined) runOptions.interval = interval; - if (ref !== undefined) runOptions.ref = ref; - this.run(runOptions); - } - - return ready; -}; - -const _getWindowEmitter = installEventEmitter( - nativeBinding.BrowserWindow, - (win, dispatch) => { - win._onWindowEvent((payload) => dispatch(payload)); - }, - undefined, - (emitter, win, payload) => { - if (payload?.event !== 'close') { - const eventName = payload?.event; - if (eventName !== undefined) emitter.emit(eventName, payload); - return; - } - - let active = true; - let prevented = false; - const event = { - ...payload, - get defaultPrevented() { - return prevented; - }, - preventDefault() { - // A retained close event is only meaningful during this synchronous - // dispatch. This prevents a delayed callback from vetoing a later close. - if (!active || prevented) return; - if (win._preventClose()) prevented = true; - }, - }; - - try { - emitter.emit('close', event); - } finally { - active = false; - } - }, -); - -// ── BrowserWindow.registerProtocol ─────────────────────────────────────────── -// Wraps the low-level `_registerProtocol(name, (request) => void)` native -// API with a clean async handler: `(request: Request) => Promise`. -// The handler receives a global `Request` object and should return a global -// `Response` (or a legacy `CustomProtocolResponse` plain object for compat). -// This allows frameworks like Hono to be used directly: -// win.registerProtocol('app', (req) => honoApp.fetch(req)); -nativeBinding.BrowserWindow.prototype.registerProtocol = function registerProtocol(name, asyncHandler) { - const win = this; - const completeProtocol = (id, response) => { - if (typeof win.isDisposed === 'function' && win.isDisposed()) return; - return win._completeProtocol(id, response); - }; - win._registerProtocol(name, function (protocolRequest) { - const id = protocolRequest?.id; - - Promise.resolve() - .then(() => { - const { url, method, headers: rawHeaders, body } = protocolRequest; - - const headersObj = new Headers(); - for (const { key, value } of rawHeaders ?? []) { - if (value != null) headersObj.set(key, value); - } - - // GET/HEAD requests cannot carry a body in the Fetch API. - const canHaveBody = !['GET', 'HEAD'].includes(method.toUpperCase()); - const reqInit = { method, headers: headersObj }; - if (canHaveBody && body?.length > 0) reqInit.body = body; - - return asyncHandler(new Request(url, reqInit)); - }) - .then(async (resp) => { - // Accept a global Response object (from Hono / fetch-compatible handlers) - if (typeof Response !== 'undefined' && resp instanceof Response) { - const bodyBuf = Buffer.from(await resp.arrayBuffer()); - const contentType = resp.headers.get('content-type') ?? 'application/octet-stream'; - const extraHeaders = []; - resp.headers.forEach((value, key) => { - if (key.toLowerCase() !== 'content-type') extraHeaders.push({ key, value }); - }); - return completeProtocol(id, { - statusCode: resp.status, - body: bodyBuf, - mimeType: contentType, - headers: extraHeaders, - }); - } - // Legacy CustomProtocolResponse plain object - return completeProtocol(id, resp); - }) - .catch((err) => - completeProtocol(id, { - statusCode: 500, - body: Buffer.from(String(err?.message ?? err)), - mimeType: 'text/plain', - }), - ); - }); -}; - -// Webview events are subscribed during construction, so the callback is passed -// directly to native createWebview and the shared adapter stores that emitter. -const _getWebviewEmitter = installEventEmitter(nativeBinding.Webview); - -// ── BrowserWindow.createWebview wrapper ────────────────────────────────────── -// Intercepts `createWebview(options)` to: -// - Extract callback options from options -// - Pass event dispatch and sync guard callbacks directly to native construction -// - Attach an EventEmitter to the returned Webview -const _nativeCreateWebview = nativeBinding.BrowserWindow.prototype.createWebview; - -nativeBinding.BrowserWindow.prototype.createWebview = function createWebview(opts) { - const { webContext = null, navigationHandler = null, newWindowHandler = null, ...rustOpts } = opts ?? {}; - - const emitter = new EventEmitter(); - - const eventHandler = function (error, payload) { - if (error) throw error; - const eventName = payload?.event; - if (eventName !== undefined) emitter.emit(eventName, payload); - }; - - const webview = _nativeCreateWebview.call( - this, - rustOpts, - webContext, - eventHandler, - navigationHandler, - newWindowHandler, - ); - _getWebviewEmitter(webview, emitter); - return webview; -}; - -// ── Webview.expose ──────────────────────────────────────────────────────────── -// Injects a proxy object at `window[name]` in the page. -// Static (non-function) properties are serialised once at call time. -// Every function call from the page side is async (returns a Promise). -// Throws SerializationError for non-JSON-serialisable args or return values. -class SerializationError extends Error { - constructor(msg) { - super(msg); - this.name = 'SerializationError'; - } -} - -const _nativeOnIpcMessage = nativeBinding.Webview.prototype.onIpcMessage; -const _nativeExposeInternal = nativeBinding.Webview.prototype._exposeInternal; -const _ipcStates = new WeakMap(); - -function jsonValue(value, context) { - try { - const json = JSON.stringify(value); - if (json === undefined) throw new TypeError('JSON.stringify returned undefined'); - return json; - } catch { - throw new SerializationError(`${context} is not JSON-serialisable`); - } -} - -function sendExposeError(webview, id, message, name = 'Error') { - if (typeof webview.isDisposed === 'function' && webview.isDisposed()) return; - try { - webview.evaluateScript( - `window.__webviewjs__&&window.__webviewjs__.reject(${Number(id)},${JSON.stringify(String(message))},${JSON.stringify(name)})`, - ); - } catch { - // A response may race with disposal; the native object has already cleaned - // up its IPC state in that case. - } -} - -function dispatchIpcMessage(webview, state, message) { - if (typeof webview.isDisposed === 'function' && webview.isDisposed()) return; - - let call; - try { - call = JSON.parse(message.body.toString()); - } catch { - state.userHandler?.(message); - return; - } - - if (call?.__e !== true) { - state.userHandler?.(message); - return; - } - - const { ns, method, id, args } = call; - const namespace = state.namespaces.get(ns); - const fn = namespace?.functions.get(method); - if (fn === undefined) { - sendExposeError(webview, id, `No such method: ${method}`); - return; - } - if (!Array.isArray(args)) { - sendExposeError(webview, id, 'Arguments must be an array', 'SerializationError'); - return; - } - - Promise.resolve() - .then(() => fn.apply(namespace.target, args)) - .then((result) => { - try { - const resultJson = jsonValue(result, 'Return value'); - if (typeof webview.isDisposed !== 'function' || !webview.isDisposed()) { - webview.evaluateScript(`window.__webviewjs__&&window.__webviewjs__.resolve(${Number(id)},${resultJson})`); - } - } catch { - sendExposeError(webview, id, 'Return value is not JSON-serialisable', 'SerializationError'); - } - }) - .catch((err) => { - sendExposeError( - webview, - id, - String(err?.message ?? err), - err?.name === 'SerializationError' ? 'SerializationError' : 'Error', - ); - }); -} - -function setIpcHandler(webview, handler) { - const nativeSetter = Object.prototype.hasOwnProperty.call(webview, 'onIpcMessage') - ? webview.onIpcMessage - : _nativeOnIpcMessage; - nativeSetter.call(webview, handler); -} - -function installIpcTransport(webview, state) { - if (state.transportInstalled) return; - state.transportHandler ??= (message) => dispatchIpcMessage(webview, state, message); - setIpcHandler(webview, state.transportHandler); - state.transportInstalled = true; -} - -function getIpcState(webview) { - let state = _ipcStates.get(webview); - if (state !== undefined) return state; - - state = { - namespaces: new Map(), - userHandler: null, - transportHandler: null, - transportInstalled: false, - }; - _ipcStates.set(webview, state); - installIpcTransport(webview, state); - return state; -} - -nativeBinding.Webview.prototype.onIpcMessage = function onIpcMessage(handler) { - if (this.isDisposed()) throw new Error('Webview has been disposed'); - if (handler != null && typeof handler !== 'function') { - throw new TypeError('onIpcMessage handler must be a function or null'); - } - - const state = getIpcState(this); - state.userHandler = handler ?? null; - if (handler != null) installIpcTransport(this, state); - if (state.namespaces.size === 0 && handler == null && state.transportInstalled) { - setIpcHandler(this, null); - state.transportInstalled = false; - } -}; - -nativeBinding.Webview.prototype.expose = function expose(name, target) { - const self = this; - if (self.isDisposed()) throw new Error('Webview has been disposed'); - if (!/^[A-Za-z_$][\w$]*$/u.test(name)) { - throw new TypeError('expose(): name must be a valid JavaScript identifier'); - } - if (target === null || (typeof target !== 'object' && typeof target !== 'function')) { - throw new TypeError('expose(): target must be an object'); - } - - const state = getIpcState(self); - if (state.namespaces.has(name)) { - throw new Error(`expose(): namespace "${name}" is already registered`); - } - - const statics = {}; - const functions = new Map(); - for (const [k, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(target))) { - if (!descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) continue; - const { value: v } = descriptor; - if (typeof v === 'function') { - functions.set(k, v); - } else { - JSON.parse(jsonValue(v, `expose(): value for property "${k}"`)); - statics[k] = v; - } - } - - const nativeExposeInternal = Object.prototype.hasOwnProperty.call(self, '_exposeInternal') - ? self._exposeInternal - : _nativeExposeInternal; - nativeExposeInternal.call(self, name, jsonValue(statics, 'expose(): static properties'), [...functions.keys()]); - state.namespaces.set(name, { functions, target }); - installIpcTransport(self, state); -}; - -module.exports = nativeBinding; -module.exports.SerializationError = SerializationError; -module.exports.Notification = Notification; - -// Auto-generated exports by postbuild.js. Do not edit directly. -module.exports.Application = nativeBinding.Application; -module.exports.BrowserWindow = nativeBinding.BrowserWindow; -module.exports.NativeNotification = nativeBinding.NativeNotification; -module.exports.JsNotification = nativeBinding.JsNotification; -module.exports.TrayIcon = nativeBinding.TrayIcon; -module.exports.JsTrayIcon = nativeBinding.JsTrayIcon; -module.exports.WebContext = nativeBinding.WebContext; -module.exports.JsWebContext = nativeBinding.JsWebContext; -module.exports.Webview = nativeBinding.Webview; -module.exports.JsWebview = nativeBinding.JsWebview; -module.exports.applyUriWorkAround = nativeBinding.applyUriWorkAround; -module.exports.ControlFlow = nativeBinding.ControlFlow; -module.exports.JsControlFlow = nativeBinding.JsControlFlow; -module.exports.CursorType = nativeBinding.CursorType; -module.exports.FullscreenType = nativeBinding.FullscreenType; -module.exports.getWebviewVersion = nativeBinding.getWebviewVersion; -module.exports.IosValidOrientations = nativeBinding.IosValidOrientations; -module.exports.isWorkAroundUri = nativeBinding.isWorkAroundUri; -module.exports.originalUriPrefix = nativeBinding.originalUriPrefix; -module.exports.ProgressBarState = nativeBinding.ProgressBarState; -module.exports.JsProgressBarState = nativeBinding.JsProgressBarState; -module.exports.revertUriWorkAround = nativeBinding.revertUriWorkAround; -module.exports.Theme = nativeBinding.Theme; -module.exports.VERSION = nativeBinding.VERSION; -module.exports.WebviewApplicationEvent = nativeBinding.WebviewApplicationEvent; -module.exports.WebviewEventType = nativeBinding.WebviewEventType; -module.exports.WindowCommand = nativeBinding.WindowCommand; -module.exports.WindowEventType = nativeBinding.WindowEventType; -module.exports.workAroundUriPrefix = nativeBinding.workAroundUriPrefix; diff --git a/js-bindings.d.ts b/js-bindings.d.ts index c6cc09a..7ac791e 100644 --- a/js-bindings.d.ts +++ b/js-bindings.d.ts @@ -1,196 +1,178 @@ /* auto-generated by NAPI-RS */ /* eslint-disable */ export declare class Application { - constructor(options?: ApplicationOptions | undefined | null); - onEvent(handler?: ((arg: ApplicationEvent) => void) | undefined | null): void; - bind(handler?: ((arg: ApplicationEvent) => void) | undefined | null): void; - isReady(): boolean; - exit(): void; + constructor(options?: ApplicationOptions | undefined | null) + onEvent(handler?: ((arg: ApplicationEvent) => void) | undefined | null): void + bind(handler?: ((arg: ApplicationEvent) => void) | undefined | null): void + isReady(): boolean + exit(): void /** Creates a new WebContext with the given options. */ - createWebContext(options?: WebContextOptions | undefined | null): JsWebContext; - createTrayIcon(options: TrayIconOptions): JsTrayIcon; - createBrowserWindow(options?: BrowserWindowOptions | undefined | null): BrowserWindow; - createChildBrowserWindow(options?: BrowserWindowOptions | undefined | null): BrowserWindow; - setMenu(menuOptions?: MenuOptions | undefined | null): void; + createWebContext(options?: WebContextOptions | undefined | null): JsWebContext + createTrayIcon(options: TrayIconOptions): JsTrayIcon + createBrowserWindow(options?: BrowserWindowOptions | undefined | null): BrowserWindow + createChildBrowserWindow(options?: BrowserWindowOptions | undefined | null): BrowserWindow + setMenu(menuOptions?: MenuOptions | undefined | null): void /** * Pump the tao event loop once without blocking. Returns `true` while - * the app is alive, `false` when it should stop. Drive this from a JS - * `setInterval` via the `run()` wrapper in `index.js`. + * the app is alive, `false` when it should stop. Drive this from the + * public JavaScript Application.run() wrapper. */ - pumpEvents(): boolean; + pumpEvents(): boolean /** * Run Tao's native event loop continuously on the current thread. * * This blocks JavaScript until the application exits. Use `run()` when the * Node.js event loop must remain available. */ - runSync(): void; + runSync(): void /** Run the application event loop. */ - run(options?: ApplicationRunOptions | undefined | null): void; + run(options?: ApplicationRunOptions | undefined | null): void } export declare class BrowserWindow { - _registerProtocol(name: string, handler: (arg: ProtocolRequest) => void): void; - _completeProtocol(id: number, response: CustomProtocolResponse): void; - createWebview( - options?: WebviewOptions | undefined | null, - webContext?: JsWebContext | undefined | null, - eventHandler?: WebviewEventThreadsafeFunction | undefined | null, - navigationHandler?: ((arg: string) => boolean) | undefined | null, - newWindowHandler?: ((arg: WebviewEventPayload) => boolean) | undefined | null, - ): JsWebview; - get isChild(): boolean; - getNativeHandle(): bigint; - isFocused(): boolean; - isVisible(): boolean; - isDecorated(): boolean; - isClosable(): boolean; - isMaximizable(): boolean; - isMinimizable(): boolean; - isMaximized(): boolean; - isMinimized(): boolean; - isResizable(): boolean; - setTitle(title: string): void; - get title(): string; - setClosable(closable: boolean): void; - setMaximizable(maximizable: boolean): void; - setMinimizable(minimizable: boolean): void; - setResizable(resizable: boolean): void; - setSize(width: number, height: number, logical?: boolean | undefined | null): Dimensions | null; - setMinSize(width: number, height: number, logical?: boolean | undefined | null): void; - getInnerSize(logical?: boolean | undefined | null): Dimensions; - setMaxSize(width: number, height: number, logical?: boolean | undefined | null): void; - getOuterSize(logical?: boolean | undefined | null): Dimensions; - openFileDialog(options?: FileDialogOptions | undefined | null): Array; - id(): number; - hasMenu(): boolean; - dispose(): void; - isDisposed(): boolean; + _registerProtocol(name: string, handler: (arg: ProtocolRequest) => void): void + _completeProtocol(id: number, response: CustomProtocolResponse): void + createWebview(options?: WebviewOptions | undefined | null, webContext?: JsWebContext | undefined | null, eventHandler?: WebviewEventThreadsafeFunction | undefined | null, navigationHandler?: ((arg: string) => boolean) | undefined | null, newWindowHandler?: ((arg: WebviewEventPayload) => boolean) | undefined | null): JsWebview + get isChild(): boolean + getNativeHandle(): bigint + isFocused(): boolean + isVisible(): boolean + isDecorated(): boolean + isClosable(): boolean + isMaximizable(): boolean + isMinimizable(): boolean + isMaximized(): boolean + isMinimized(): boolean + isResizable(): boolean + setTitle(title: string): void + get title(): string + setClosable(closable: boolean): void + setMaximizable(maximizable: boolean): void + setMinimizable(minimizable: boolean): void + setResizable(resizable: boolean): void + setSize(width: number, height: number, logical?: boolean | undefined | null): Dimensions | null + setMinSize(width: number, height: number, logical?: boolean | undefined | null): void + getInnerSize(logical?: boolean | undefined | null): Dimensions + setMaxSize(width: number, height: number, logical?: boolean | undefined | null): void + getOuterSize(logical?: boolean | undefined | null): Dimensions + openFileDialog(options?: FileDialogOptions | undefined | null): Array + id(): number + hasMenu(): boolean + dispose(): void + isDisposed(): boolean /** * Internal bridge used by the JavaScript close event. It is intentionally * not part of the documented BrowserWindow API. */ - _preventClose(): boolean; - _onWindowEvent(handler?: ((arg: WindowEventPayload) => void) | undefined | null): void; - get theme(): Theme; - setTheme(theme: Theme): void; - setWindowIcon( - icon: Uint8Array | Array, - width?: number | undefined | null, - height?: number | undefined | null, - ): void; - removeWindowIcon(): void; - setEnable(enabled: boolean): void; - setTaskbarIcon( - icon: Uint8Array | Array, - width?: number | undefined | null, - height?: number | undefined | null, - ): void; - removeTaskbarIcon(): void; - setUndecoratedShadow(shadow: boolean): void; - getNativeHandleAnyThread(): bigint; - simpleFullscreen(): boolean; - setSimpleFullscreen(fullscreen: boolean): boolean; - hasShadow(): boolean; - setHasShadow(value: boolean): void; - setTabbingIdentifier(identifier: string): void; - tabbingIdentifier(): string; - isDocumentEdited(): boolean; - setDocumentEdited(edited: boolean): void; - getWaylandSurface(): bigint; - setIosScaleFactor(value: number): void; - setValidOrientations(value: IosValidOrientations): void; - setPrefersHomeIndicatorHidden(value: boolean): void; - setPreferredScreenEdgesDeferringSystemGestures(edges: number): void; - setPrefersStatusBarHidden(value: boolean): void; - androidContentRect(): AndroidContentRect; - androidConfig(): string; - setVisible(visible: boolean): void; - setProgressBar(state: JsProgressBar): void; - setMaximized(value: boolean): void; - setMinimized(value: boolean): void; - focus(): void; - getAvailableMonitors(): Array; - getCurrentMonitor(): Monitor | null; - getPrimaryMonitor(): Monitor | null; - getMonitorFromPoint(x: number, y: number): Monitor | null; - setContentProtection(enabled: boolean): void; - setAlwaysOnTop(enabled: boolean): void; - setAlwaysOnBottom(enabled: boolean): void; - setDecorations(enabled: boolean): void; - get fullscreen(): FullscreenType | null; - setFullscreen(fullscreenType?: FullscreenType | undefined | null): void; - close(): void; - hide(): void; - show(): void; - setPosition(x: number, y: number, logical?: boolean | undefined | null): void; - getPosition(logical?: boolean | undefined | null): Position; - center(): void; - get width(): number; - get height(): number; - get x(): number; - get y(): number; - scaleFactor(): number; - setCursor(cursor: CursorType): void; - setCursorVisible(visible: boolean): void; - setCursorPosition(x: number, y: number): void; - setIgnoreCursorEvents(ignore: boolean): void; - setSkipTaskbar(skip: boolean): void; - requestRedraw(): void; + _preventClose(): boolean + _onWindowEvent(handler?: ((arg: WindowEventPayload) => void) | undefined | null): void + get theme(): Theme + setTheme(theme: Theme): void + setWindowIcon(icon: Uint8Array | Array, width?: number | undefined | null, height?: number | undefined | null): void + removeWindowIcon(): void + setEnable(enabled: boolean): void + setTaskbarIcon(icon: Uint8Array | Array, width?: number | undefined | null, height?: number | undefined | null): void + removeTaskbarIcon(): void + setUndecoratedShadow(shadow: boolean): void + getNativeHandleAnyThread(): bigint + simpleFullscreen(): boolean + setSimpleFullscreen(fullscreen: boolean): boolean + hasShadow(): boolean + setHasShadow(value: boolean): void + setTabbingIdentifier(identifier: string): void + tabbingIdentifier(): string + isDocumentEdited(): boolean + setDocumentEdited(edited: boolean): void + getWaylandSurface(): bigint + setIosScaleFactor(value: number): void + setValidOrientations(value: IosValidOrientations): void + setPrefersHomeIndicatorHidden(value: boolean): void + setPreferredScreenEdgesDeferringSystemGestures(edges: number): void + setPrefersStatusBarHidden(value: boolean): void + androidContentRect(): AndroidContentRect + androidConfig(): string + setVisible(visible: boolean): void + setProgressBar(state: JsProgressBar): void + setMaximized(value: boolean): void + setMinimized(value: boolean): void + focus(): void + getAvailableMonitors(): Array + getCurrentMonitor(): Monitor | null + getPrimaryMonitor(): Monitor | null + getMonitorFromPoint(x: number, y: number): Monitor | null + setContentProtection(enabled: boolean): void + setAlwaysOnTop(enabled: boolean): void + setAlwaysOnBottom(enabled: boolean): void + setDecorations(enabled: boolean): void + get fullscreen(): FullscreenType | null + setFullscreen(fullscreenType?: FullscreenType | undefined | null): void + close(): void + hide(): void + show(): void + setPosition(x: number, y: number, logical?: boolean | undefined | null): void + getPosition(logical?: boolean | undefined | null): Position + center(): void + get width(): number + get height(): number + get x(): number + get y(): number + scaleFactor(): number + setCursor(cursor: CursorType): void + setCursorVisible(visible: boolean): void + setCursorPosition(x: number, y: number): void + setIgnoreCursorEvents(ignore: boolean): void + setSkipTaskbar(skip: boolean): void + requestRedraw(): void } export declare class NativeNotification { - constructor(options: NativeNotificationOptions, callback: NotificationEventThreadsafeFunction); - close(): void; + constructor(options: NativeNotificationOptions, callback: NotificationEventThreadsafeFunction) + close(): void } -export type JsNotification = NativeNotification; +export type JsNotification = NativeNotification export declare class TrayIcon { - constructor(); - get id(): string; - _onTrayEvent(handler?: ((arg: TrayEventPayload) => void) | undefined | null): void; - setIcon( - icon: Uint8Array | Array, - width?: number | undefined | null, - height?: number | undefined | null, - ): void; - removeIcon(): void; - setMenu(menu?: MenuOptions | undefined | null): void; - setTooltip(tooltip?: string | undefined | null): void; - setTitle(title?: string | undefined | null): void; - setVisible(visible: boolean): void; - setIconAsTemplate(value: boolean): void; - setShowMenuOnLeftClick(value: boolean): void; - setShowMenuOnRightClick(value: boolean): void; - showMenu(): void; - rect(): TrayRect | null; - dispose(): void; - isDisposed(): boolean; -} -export type JsTrayIcon = TrayIcon; + constructor() + get id(): string + _onTrayEvent(handler?: ((arg: TrayEventPayload) => void) | undefined | null): void + setIcon(icon: Uint8Array | Array, width?: number | undefined | null, height?: number | undefined | null): void + removeIcon(): void + setMenu(menu?: MenuOptions | undefined | null): void + setTooltip(tooltip?: string | undefined | null): void + setTitle(title?: string | undefined | null): void + setVisible(visible: boolean): void + setIconAsTemplate(value: boolean): void + setShowMenuOnLeftClick(value: boolean): void + setShowMenuOnRightClick(value: boolean): void + showMenu(): void + rect(): TrayRect | null + dispose(): void + isDisposed(): boolean +} +export type JsTrayIcon = TrayIcon export declare class WebContext { /** Not supported. Use `app.createWebContext(options)` instead. */ - constructor(); + constructor() /** A reference to the data directory the context was created with. */ - get dataDirectory(): string | null; + get dataDirectory(): string | null /** Check if a custom protocol has been registered on this context. */ - isCustomProtocolRegistered(scheme: string): boolean; + isCustomProtocolRegistered(scheme: string): boolean /** * Set if this context allows automation. * Note: this is currently only enforced on Linux, and has the stipulation that only 1 context allows automation at a time. */ - setAllowsAutomation(flag: boolean): void; - dispose(): void; - isDisposed(): boolean; + setAllowsAutomation(flag: boolean): void + dispose(): void + isDisposed(): boolean } -export type JsWebContext = WebContext; +export type JsWebContext = WebContext export declare class Webview { - constructor(); - onIpcMessage(handler?: ((arg: IpcMessage) => void) | undefined | null): void; - dispose(): void; - isDisposed(): boolean; + constructor() + onIpcMessage(handler?: ((arg: IpcMessage) => void) | undefined | null): void + dispose(): void + isDisposed(): boolean /** * Low-level method used by the JS `expose()` wrapper. * @@ -201,134 +183,134 @@ export declare class Webview { * The generated page calls are delivered through the generic IPC transport; * the JavaScript wrapper owns namespace dispatch and Promise completion. */ - _exposeInternal(name: string, staticsJson: string, funcNames: Array): void; - print(): void; - zoom(scaleFactor: number): void; - setWebviewVisibility(visible: boolean): void; - isDevtoolsOpen(): boolean; - openDevtools(): void; - closeDevtools(): void; - loadUrl(url: string): void; - loadHtml(html: string): void; - evaluateScript(js: string): void; - evaluateScriptWithCallback(js: string, callback: WebviewScriptThreadsafeFunction): void; - reload(): void; + _exposeInternal(name: string, staticsJson: string, funcNames: Array): void + print(): void + zoom(scaleFactor: number): void + setWebviewVisibility(visible: boolean): void + isDevtoolsOpen(): boolean + openDevtools(): void + closeDevtools(): void + loadUrl(url: string): void + loadHtml(html: string): void + evaluateScript(js: string): void + evaluateScriptWithCallback(js: string, callback: WebviewScriptThreadsafeFunction): void + reload(): void /** The URL the webview is currently showing. */ - url(): string | null; + url(): string | null /** Webview width in logical pixels (same coordinate space as `set_bounds`). */ - get width(): number | null; + get width(): number | null /** Webview height in logical pixels (same coordinate space as `set_bounds`). */ - get height(): number | null; + get height(): number | null /** Webview x offset from the window's top-left corner, in logical pixels. */ - get x(): number | null; + get x(): number | null /** Webview y offset from the window's top-left corner, in logical pixels. */ - get y(): number | null; + get y(): number | null /** Load `url` with additional HTTP request headers. */ - loadUrlWithHeaders(url: string, headers: Array): void; + loadUrlWithHeaders(url: string, headers: Array): void /** * Return all cookies currently stored for `url`, or every cookie if `url` * is `null` / `undefined`. */ - getCookies(url?: string | undefined | null): Array; + getCookies(url?: string | undefined | null): Array /** Store a cookie in the webview's session. */ - setCookie(cookie: WebviewCookie): void; + setCookie(cookie: WebviewCookie): void /** * Delete a cookie by name. `domain` and `path` narrow the match; * omit them to delete across all domains/paths. */ - deleteCookie(name: string, domain?: string | undefined | null, path?: string | undefined | null): void; + deleteCookie(name: string, domain?: string | undefined | null, path?: string | undefined | null): void /** Erase all cookies, cache, local storage, and IndexedDB data. */ - clearAllBrowsingData(): void; + clearAllBrowsingData(): void /** * Set the background colour shown before (or behind) page content. * Values are 0-255. */ - setBackgroundColor(r: number, g: number, b: number, a: number): void; + setBackgroundColor(r: number, g: number, b: number, a: number): void /** * Return the webview's current bounds relative to the window, in logical * pixels. */ - getBounds(): WebviewBounds | null; + getBounds(): WebviewBounds | null /** Reposition and resize the webview within its window. */ - setBounds(bounds: WebviewBounds): void; + setBounds(bounds: WebviewBounds): void /** Give keyboard focus to the webview content area. */ - focus(): void; + focus(): void /** Return focus to the parent/host window. */ - focusParent(): void; + focusParent(): void } -export type JsWebview = Webview; +export type JsWebview = Webview export interface AndroidContentRect { - left: number; - top: number; - right: number; - bottom: number; + left: number + top: number + right: number + bottom: number } export interface ApplicationEvent { - event: string; - customMenuEvent?: CustomMenuEvent; + event: string + customMenuEvent?: CustomMenuEvent } export interface ApplicationOptions { - controlFlow?: ControlFlow; - waitTime?: number; - exitCode?: number; + controlFlow?: ControlFlow + waitTime?: number + exitCode?: number } export interface ApplicationRunOptions { /** The interval in milliseconds to pump events. Defaults to 16 (60 FPS). */ - interval?: number; + interval?: number /** Whether to keep the event loop alive. Defaults to true. */ - ref?: boolean; + ref?: boolean } /** Converting `{protocol}://localhost/abc` to `{http_or_https}://{protocol}.localhost/abc` */ -export declare function applyUriWorkAround(uri: string, httpOrHttps: string, protocol: string): string; +export declare function applyUriWorkAround(uri: string, httpOrHttps: string, protocol: string): string export interface BrowserWindowOptions { - menu?: MenuOptions; - showMenu?: boolean; - resizable?: boolean; - title?: string; - logical?: boolean; - width?: number; - height?: number; - x?: number; - y?: number; - contentProtection?: boolean; - alwaysOnTop?: boolean; - alwaysOnBottom?: boolean; - visible?: boolean; - decorations?: boolean; - visibleOnAllWorkspaces?: boolean; - maximized?: boolean; - maximizable?: boolean; - minimizable?: boolean; - focused?: boolean; - transparent?: boolean; - fullscreen?: FullscreenType; - windowsOwnerWindow?: bigint; - windowsTaskbarIcon?: TrayIconImage; - windowsNoRedirectionBitmap?: boolean; - windowsDragAndDrop?: boolean; - windowsSkipTaskbar?: boolean; - windowsClassName?: string; - windowsUndecoratedShadow?: boolean; - macosMovableByWindowBackground?: boolean; - macosTitlebarTransparent?: boolean; - macosTitleHidden?: boolean; - macosTitlebarHidden?: boolean; - macosTitlebarButtonsHidden?: boolean; - macosFullsizeContentView?: boolean; - macosDisallowHidpi?: boolean; - macosHasShadow?: boolean; - macosTabbingIdentifier?: string; - iosScaleFactor?: number; - iosValidOrientations?: IosValidOrientations; - iosPrefersHomeIndicatorHidden?: boolean; - iosDeferredSystemGestureEdges?: number; - iosPrefersStatusBarHidden?: boolean; + menu?: MenuOptions + showMenu?: boolean + resizable?: boolean + title?: string + logical?: boolean + width?: number + height?: number + x?: number + y?: number + contentProtection?: boolean + alwaysOnTop?: boolean + alwaysOnBottom?: boolean + visible?: boolean + decorations?: boolean + visibleOnAllWorkspaces?: boolean + maximized?: boolean + maximizable?: boolean + minimizable?: boolean + focused?: boolean + transparent?: boolean + fullscreen?: FullscreenType + windowsOwnerWindow?: bigint + windowsTaskbarIcon?: TrayIconImage + windowsNoRedirectionBitmap?: boolean + windowsDragAndDrop?: boolean + windowsSkipTaskbar?: boolean + windowsClassName?: string + windowsUndecoratedShadow?: boolean + macosMovableByWindowBackground?: boolean + macosTitlebarTransparent?: boolean + macosTitleHidden?: boolean + macosTitlebarHidden?: boolean + macosTitlebarButtonsHidden?: boolean + macosFullsizeContentView?: boolean + macosDisallowHidpi?: boolean + macosHasShadow?: boolean + macosTabbingIdentifier?: string + iosScaleFactor?: number + iosValidOrientations?: IosValidOrientations + iosPrefersHomeIndicatorHidden?: boolean + iosDeferredSystemGestureEdges?: number + iosPrefersStatusBarHidden?: boolean } /** Kept for backward compat; no longer used internally. */ @@ -337,7 +319,7 @@ export declare enum ControlFlow { Wait = 1, WaitUntil = 2, Exit = 3, - ExitWithCode = 4, + ExitWithCode = 4 } /** Cursor shape passed to [`BrowserWindow::set_cursor`]. */ @@ -376,37 +358,37 @@ export declare enum CursorType { ResizeNorthWestSouthEast = 31, ResizeColumn = 32, ResizeRow = 33, - AllScroll = 34, + AllScroll = 34 } export interface CustomMenuEvent { - id: string; - windowId: number; + id: string + windowId: number } /** Incoming request delivered to a custom-protocol handler. */ export interface CustomProtocolRequest { - url: string; - method: string; - headers: Array; - body?: Buffer; + url: string + method: string + headers: Array + body?: Buffer } /** Response returned by a custom-protocol handler. */ export interface CustomProtocolResponse { /** HTTP status code. Defaults to 200. */ - statusCode?: number; + statusCode?: number /** Extra response headers (e.g. `[{ key: "Cache-Control", value: "no-store" }]`). */ - headers?: Array; + headers?: Array /** Response body bytes. */ - body: Buffer; + body: Buffer /** MIME type (e.g. `"text/html"`, `"application/javascript"`). */ - mimeType?: string; + mimeType?: string } export interface Dimensions { - width: number; - height: number; + width: number + height: number } /** @@ -414,107 +396,107 @@ export interface Dimensions { * The current expose bridge uses [`IpcMessage`] and dispatches in JavaScript. */ export interface ExposeCallData { - ns: string; - method: string; - id: number; - argsJson: string; + ns: string + method: string + id: number + argsJson: string } export interface FileDialogOptions { - multiple?: boolean; - title?: string; - defaultPath?: string; - filters?: Array; + multiple?: boolean + title?: string + defaultPath?: string + filters?: Array } export interface FileFilter { - name: string; - extensions: Array; + name: string + extensions: Array } export declare enum FullscreenType { Exclusive = 0, - Borderless = 1, + Borderless = 1 } -export declare function getWebviewVersion(): string; +export declare function getWebviewVersion(): string export interface HeaderData { - key: string; - value?: string; + key: string + value?: string } export declare enum IosValidOrientations { LandscapeAndPortrait = 0, Landscape = 1, - Portrait = 2, + Portrait = 2 } export interface IpcMessage { - body: Buffer; - method: string; - headers: Array; - uri: string; + body: Buffer + method: string + headers: Array + uri: string } /** If the URI is a work around URI for this protocol which starts with `{http_or_https}://{protocol}.` */ -export declare function isWorkAroundUri(uri: string, httpOrHttps: string, protocol: string): boolean; +export declare function isWorkAroundUri(uri: string, httpOrHttps: string, protocol: string): boolean export interface JsProgressBar { - state?: ProgressBarState; - progress?: number; + state?: ProgressBarState + progress?: number } export interface MenuItemOptions { - id?: string; - label?: string; - enabled?: boolean; - accelerator?: string; - submenu?: MenuOptions; - role?: string; + id?: string + label?: string + enabled?: boolean + accelerator?: string + submenu?: MenuOptions + role?: string } export interface MenuOptions { - items: Array; + items: Array } export interface Monitor { - name?: string; - scaleFactor: number; - size: Dimensions; - position: Position; - videoModes: Array; + name?: string + scaleFactor: number + size: Dimensions + position: Position + videoModes: Array } export interface NativeNotificationAction { - action: string; - title: string; - icon?: string; + action: string + title: string + icon?: string } export interface NativeNotificationOptions { - title: string; - body?: string; - icon?: string; - imagePath?: string; - imageData?: Buffer; - requireInteraction?: boolean; - persistent: boolean; - actions: Array; + title: string + body?: string + icon?: string + imagePath?: string + imageData?: Buffer + requireInteraction?: boolean + persistent: boolean + actions: Array } export interface NotificationEventPayload { - event: string; - action?: string; - error?: string; + event: string + action?: string + error?: string } /** Returns `{protocol}://` */ -export declare function originalUriPrefix(protocol: string): string; +export declare function originalUriPrefix(protocol: string): string export interface Position { - x: number; - y: number; + x: number + y: number } export declare enum ProgressBarState { @@ -522,69 +504,69 @@ export declare enum ProgressBarState { Normal = 1, Indeterminate = 2, Paused = 3, - Error = 4, + Error = 4 } /** Native request payload delivered to the JavaScript custom-protocol bridge. */ export interface ProtocolRequest { /** Request ID allocated by the owning BrowserWindow. */ - id: number; - url: string; - method: string; - headers: Array; - body: Buffer; + id: number + url: string + method: string + headers: Array + body: Buffer } /** Converting `{http_or_https}://{protocol}.localhost/abc` back to `{protocol}://localhost/abc` */ -export declare function revertUriWorkAround(uri: string, httpOrHttps: string, protocol: string): string; +export declare function revertUriWorkAround(uri: string, httpOrHttps: string, protocol: string): string export declare enum Theme { Light = 0, Dark = 1, - System = 2, + System = 2 } export interface TrayEventPayload { - event: string; - id: string; - x: number; - y: number; - rect: TrayRect; - button?: string; - buttonState?: string; + event: string + id: string + x: number + y: number + rect: TrayRect + button?: string + buttonState?: string } export interface TrayIconImage { - data: Buffer; - width?: number; - height?: number; + data: Buffer + width?: number + height?: number } export interface TrayIconOptions { - id?: string; - icon?: TrayIconImage; - tooltip?: string; - title?: string; - menu?: MenuOptions; - iconIsTemplate?: boolean; - menuOnLeftClick?: boolean; - menuOnRightClick?: boolean; + id?: string + icon?: TrayIconImage + tooltip?: string + title?: string + menu?: MenuOptions + iconIsTemplate?: boolean + menuOnLeftClick?: boolean + menuOnRightClick?: boolean } export interface TrayRect { - x: number; - y: number; - width: number; - height: number; + x: number + y: number + width: number + height: number } /** The current version of the `@webviewjs/webview` package */ -export const VERSION: string; +export const VERSION: string export interface VideoMode { - size: Dimensions; - bitDepth: number; - refreshRate: number; + size: Dimensions + bitDepth: number + refreshRate: number } export interface WebContextOptions { @@ -592,52 +574,52 @@ export interface WebContextOptions { * Whether the WebView window should have a custom user data path. * This is useful in Windows when a bundled application can’t have the webview data inside Program Files. */ - dataDirectory?: string; + dataDirectory?: string /** * Whether the WebView window should allow automation (e.g. for testing). * Note: this is currently only enforced on Linux, and has the stipulation that only 1 context allows automation at a time. */ - allowsAutomation?: boolean; + allowsAutomation?: boolean } export declare enum WebviewApplicationEvent { WindowCloseRequested = 0, ApplicationCloseRequested = 1, CustomMenuClick = 2, - Ready = 3, + Ready = 3 } export interface WebviewBounds { - x: number; - y: number; - width: number; - height: number; + x: number + y: number + width: number + height: number } export interface WebviewCookie { - name: string; - value: string; - domain?: string; - path?: string; - httpOnly?: boolean; - secure?: boolean; + name: string + value: string + domain?: string + path?: string + httpOnly?: boolean + secure?: boolean /** `"strict"`, `"lax"`, or `"none"`. */ - sameSite?: string; + sameSite?: string } /** Payload delivered to the webview event dispatch callback. */ export interface WebviewEventPayload { - event: string; + event: string /** URL associated with the event (navigation, page load, download). */ - url?: string; + url?: string /** Requested browsing context for navigation and new-window events. */ - target?: string; + target?: string /** Browser-provided size and position hints for a new-window request. */ - windowFeatures?: WebviewNewWindowFeatures; + windowFeatures?: WebviewNewWindowFeatures /** Document title for `TitleChanged` events. */ - title?: string; + title?: string /** Download success flag for `DownloadCompleted` events. */ - success?: boolean; + success?: boolean } /** Event types fired by a Webview and surfaced as EventEmitter events in JS. */ @@ -652,101 +634,101 @@ export declare enum WebviewEventType { * Fired when a page attempts to open a new browser window * (`window.open`, `target="_blank"`, etc.). */ - NewWindowRequested = 6, + NewWindowRequested = 6 } /** Optional size and position hints supplied for a new-window request. */ export interface WebviewNewWindowFeatures { - size?: WebviewWindowSize; - position?: WebviewWindowPosition; + size?: WebviewWindowSize + position?: WebviewWindowPosition } export interface WebviewOptions { - url?: string; - html?: string; - width?: number; - height?: number; - x?: number; - y?: number; - enableDevtools?: boolean; - incognito?: boolean; - userAgent?: string; - child?: boolean; - preload?: string; - transparent?: boolean; - theme?: Theme; - hotkeysZoom?: boolean; - clipboard?: boolean; - autoplay?: boolean; - backForwardNavigationGestures?: boolean; + url?: string + html?: string + width?: number + height?: number + x?: number + y?: number + enableDevtools?: boolean + incognito?: boolean + userAgent?: string + child?: boolean + preload?: string + transparent?: boolean + theme?: Theme + hotkeysZoom?: boolean + clipboard?: boolean + autoplay?: boolean + backForwardNavigationGestures?: boolean /** Custom name for the IPC global injected by wry (default: `"ipc"`). */ - ipcName?: string; + ipcName?: string /** Whether to automatically normalize URL passed to `loadUrl` or `loadUrlWithHeaders` on windows (default: true). */ - autoNormalizeLoadUrl?: boolean; + autoNormalizeLoadUrl?: boolean /** * Determines whether the custom protocols should use `https://.path/to/page` instead of the default `http://.path/to/page`. * Using a http scheme will allow mixed content when trying to fetch http endpoints and is therefore less secure but will match the behavior * of the `://path/to/page` protocols used on macOS and Linux. */ - useHttpsScheme?: boolean; + useHttpsScheme?: boolean } export interface WebviewWindowPosition { - x: number; - y: number; + x: number + y: number } export interface WebviewWindowSize { - width: number; - height: number; + width: number + height: number } export declare enum WindowCommand { Close = 0, Show = 1, - Hide = 2, + Hide = 2 } export interface WindowEventPayload { - event: string; + event: string /** Physical x position (cursor or window). */ - x?: number; + x?: number /** Physical y position (cursor or window). */ - y?: number; + y?: number /** Physical width (resize event). */ - width?: number; + width?: number /** Physical height (resize event). */ - height?: number; + height?: number /** Mouse button index: 0=left, 1=middle, 2=right. */ - button?: number; + button?: number /** Horizontal scroll delta (pixels). */ - deltaX?: number; + deltaX?: number /** Vertical scroll delta (pixels). */ - deltaY?: number; + deltaY?: number /** Logical key name (DOM KeyboardEvent.key, e.g. "a", "Enter", "ArrowLeft"). */ - key?: string; + key?: string /** Physical key code (DOM KeyboardEvent.code, e.g. "KeyA", "ArrowLeft"). */ - code?: string; + code?: string /** Modifier bitmask: 1=Shift, 2=Ctrl, 4=Alt, 8=Meta/Super/Command. */ - modifiers?: number; + modifiers?: number /** Whether this key event is a repeat from holding the key down. */ - isRepeat?: boolean; + isRepeat?: boolean /** File paths for FileDrop / FileHover events. */ - files?: Array; + files?: Array /** DPI scale factor for ScaleFactorChanged events. */ - scaleFactor?: number; + scaleFactor?: number /** * Text for Ime events (preedit string or committed text); * "light" or "dark" for ThemeChanged events. */ - text?: string; + text?: string /** Touch point identifier (cast from u64) for Touch events. */ - touchId?: number; + touchId?: number /** * Phase string: "started"/"moved"/"ended"/"cancelled" for Touch; * "enabled"/"preedit"/"commit"/"disabled" for Ime events. */ - phase?: string; + phase?: string } export declare enum WindowEventType { @@ -769,8 +751,8 @@ export declare enum WindowEventType { ScaleFactorChanged = 16, ThemeChanged = 17, Ime = 18, - Touch = 19, + Touch = 19 } /** Returns `{http_or_https}://{protocol}.` */ -export declare function workAroundUriPrefix(httpOrHttps: string, protocol: string): string; +export declare function workAroundUriPrefix(httpOrHttps: string, protocol: string): string diff --git a/js-bindings.js b/js-bindings.js index 7ddf29b..9eebcb1 100644 --- a/js-bindings.js +++ b/js-bindings.js @@ -3,686 +3,527 @@ // @ts-nocheck /* auto-generated by NAPI-RS */ -const { readFileSync } = require('fs'); -let nativeBinding = null; -const loadErrors = []; +const { readFileSync } = require('fs') +let nativeBinding = null +const loadErrors = [] const isMusl = () => { - let musl = false; + let musl = false if (process.platform === 'linux') { - musl = isMuslFromFilesystem(); + musl = isMuslFromFilesystem() if (musl === null) { - musl = isMuslFromReport(); + musl = isMuslFromReport() } if (musl === null) { - musl = isMuslFromChildProcess(); + musl = isMuslFromChildProcess() } } - return musl; -}; + return musl +} -const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-'); +const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-') const isMuslFromFilesystem = () => { try { - return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl'); + return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl') } catch { - return null; + return null } -}; +} const isMuslFromReport = () => { - let report = null; + let report = null if (process.report && typeof process.report.getReport === 'function') { - process.report.excludeNetwork = true; - report = process.report.getReport(); + process.report.excludeNetwork = true + report = process.report.getReport() } if (!report) { - return null; + return null } if (report.header && report.header.glibcVersionRuntime) { - return false; + return false } if (Array.isArray(report.sharedObjects)) { if (report.sharedObjects.some(isFileMusl)) { - return true; + return true } } - return false; -}; + return false +} const isMuslFromChildProcess = () => { try { - return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl'); + return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl') } catch (e) { // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false - return false; + return false } -}; +} function requireNative() { if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) { try { return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH); } catch (err) { - loadErrors.push(err); + loadErrors.push(err) } } else if (process.platform === 'android') { if (process.arch === 'arm64') { try { - return require('./webview.android-arm64.node'); + return require('./webview.android-arm64.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-android-arm64'); - const bindingPackageVersion = require('@webviewjs/webview-android-arm64/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-android-arm64') + const bindingPackageVersion = require('@webviewjs/webview-android-arm64/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else if (process.arch === 'arm') { try { - return require('./webview.android-arm-eabi.node'); + return require('./webview.android-arm-eabi.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-android-arm-eabi'); - const bindingPackageVersion = require('@webviewjs/webview-android-arm-eabi/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-android-arm-eabi') + const bindingPackageVersion = require('@webviewjs/webview-android-arm-eabi/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { - loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`)); + loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`)) } } else if (process.platform === 'win32') { if (process.arch === 'x64') { - if ( - (process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || - (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library') - ) { + if ((process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library')) { try { - return require('./webview.win32-x64-gnu.node'); - } catch (e) { - loadErrors.push(e); - } - try { - const binding = require('@webviewjs/webview-win32-x64-gnu'); - const bindingPackageVersion = require('@webviewjs/webview-win32-x64-gnu/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; - } catch (e) { - loadErrors.push(e); + return require('./webview.win32-x64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + const binding = require('@webviewjs/webview-win32-x64-gnu') + const bindingPackageVersion = require('@webviewjs/webview-win32-x64-gnu/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } + return binding + } catch (e) { + loadErrors.push(e) + } } else { try { - return require('./webview.win32-x64-msvc.node'); - } catch (e) { - loadErrors.push(e); - } - try { - const binding = require('@webviewjs/webview-win32-x64-msvc'); - const bindingPackageVersion = require('@webviewjs/webview-win32-x64-msvc/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; - } catch (e) { - loadErrors.push(e); + return require('./webview.win32-x64-msvc.node') + } catch (e) { + loadErrors.push(e) + } + try { + const binding = require('@webviewjs/webview-win32-x64-msvc') + const bindingPackageVersion = require('@webviewjs/webview-win32-x64-msvc/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } + return binding + } catch (e) { + loadErrors.push(e) + } } } else if (process.arch === 'ia32') { try { - return require('./webview.win32-ia32-msvc.node'); + return require('./webview.win32-ia32-msvc.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-win32-ia32-msvc'); - const bindingPackageVersion = require('@webviewjs/webview-win32-ia32-msvc/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-win32-ia32-msvc') + const bindingPackageVersion = require('@webviewjs/webview-win32-ia32-msvc/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else if (process.arch === 'arm64') { try { - return require('./webview.win32-arm64-msvc.node'); + return require('./webview.win32-arm64-msvc.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-win32-arm64-msvc'); - const bindingPackageVersion = require('@webviewjs/webview-win32-arm64-msvc/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-win32-arm64-msvc') + const bindingPackageVersion = require('@webviewjs/webview-win32-arm64-msvc/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { - loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`)); + loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`)) } } else if (process.platform === 'darwin') { try { - return require('./webview.darwin-universal.node'); + return require('./webview.darwin-universal.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-darwin-universal'); - const bindingPackageVersion = require('@webviewjs/webview-darwin-universal/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-darwin-universal') + const bindingPackageVersion = require('@webviewjs/webview-darwin-universal/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } if (process.arch === 'x64') { try { - return require('./webview.darwin-x64.node'); + return require('./webview.darwin-x64.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-darwin-x64'); - const bindingPackageVersion = require('@webviewjs/webview-darwin-x64/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-darwin-x64') + const bindingPackageVersion = require('@webviewjs/webview-darwin-x64/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else if (process.arch === 'arm64') { try { - return require('./webview.darwin-arm64.node'); + return require('./webview.darwin-arm64.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-darwin-arm64'); - const bindingPackageVersion = require('@webviewjs/webview-darwin-arm64/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-darwin-arm64') + const bindingPackageVersion = require('@webviewjs/webview-darwin-arm64/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { - loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`)); + loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`)) } } else if (process.platform === 'freebsd') { if (process.arch === 'x64') { try { - return require('./webview.freebsd-x64.node'); + return require('./webview.freebsd-x64.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-freebsd-x64'); - const bindingPackageVersion = require('@webviewjs/webview-freebsd-x64/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-freebsd-x64') + const bindingPackageVersion = require('@webviewjs/webview-freebsd-x64/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else if (process.arch === 'arm64') { try { - return require('./webview.freebsd-arm64.node'); + return require('./webview.freebsd-arm64.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-freebsd-arm64'); - const bindingPackageVersion = require('@webviewjs/webview-freebsd-arm64/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-freebsd-arm64') + const bindingPackageVersion = require('@webviewjs/webview-freebsd-arm64/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { - loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`)); + loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`)) } } else if (process.platform === 'linux') { if (process.arch === 'x64') { if (isMusl()) { try { - return require('./webview.linux-x64-musl.node'); + return require('./webview.linux-x64-musl.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-x64-musl'); - const bindingPackageVersion = require('@webviewjs/webview-linux-x64-musl/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-x64-musl') + const bindingPackageVersion = require('@webviewjs/webview-linux-x64-musl/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { try { - return require('./webview.linux-x64-gnu.node'); + return require('./webview.linux-x64-gnu.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-x64-gnu'); - const bindingPackageVersion = require('@webviewjs/webview-linux-x64-gnu/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-x64-gnu') + const bindingPackageVersion = require('@webviewjs/webview-linux-x64-gnu/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } } else if (process.arch === 'arm64') { if (isMusl()) { try { - return require('./webview.linux-arm64-musl.node'); + return require('./webview.linux-arm64-musl.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-arm64-musl'); - const bindingPackageVersion = require('@webviewjs/webview-linux-arm64-musl/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-arm64-musl') + const bindingPackageVersion = require('@webviewjs/webview-linux-arm64-musl/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { try { - return require('./webview.linux-arm64-gnu.node'); + return require('./webview.linux-arm64-gnu.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-arm64-gnu'); - const bindingPackageVersion = require('@webviewjs/webview-linux-arm64-gnu/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-arm64-gnu') + const bindingPackageVersion = require('@webviewjs/webview-linux-arm64-gnu/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } } else if (process.arch === 'arm') { if (isMusl()) { try { - return require('./webview.linux-arm-musleabihf.node'); + return require('./webview.linux-arm-musleabihf.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-arm-musleabihf'); - const bindingPackageVersion = require('@webviewjs/webview-linux-arm-musleabihf/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-arm-musleabihf') + const bindingPackageVersion = require('@webviewjs/webview-linux-arm-musleabihf/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { try { - return require('./webview.linux-arm-gnueabihf.node'); + return require('./webview.linux-arm-gnueabihf.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-arm-gnueabihf'); - const bindingPackageVersion = require('@webviewjs/webview-linux-arm-gnueabihf/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-arm-gnueabihf') + const bindingPackageVersion = require('@webviewjs/webview-linux-arm-gnueabihf/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } } else if (process.arch === 'loong64') { if (isMusl()) { try { - return require('./webview.linux-loong64-musl.node'); + return require('./webview.linux-loong64-musl.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-loong64-musl'); - const bindingPackageVersion = require('@webviewjs/webview-linux-loong64-musl/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-loong64-musl') + const bindingPackageVersion = require('@webviewjs/webview-linux-loong64-musl/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { try { - return require('./webview.linux-loong64-gnu.node'); + return require('./webview.linux-loong64-gnu.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-loong64-gnu'); - const bindingPackageVersion = require('@webviewjs/webview-linux-loong64-gnu/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-loong64-gnu') + const bindingPackageVersion = require('@webviewjs/webview-linux-loong64-gnu/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } } else if (process.arch === 'riscv64') { if (isMusl()) { try { - return require('./webview.linux-riscv64-musl.node'); + return require('./webview.linux-riscv64-musl.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-riscv64-musl'); - const bindingPackageVersion = require('@webviewjs/webview-linux-riscv64-musl/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-riscv64-musl') + const bindingPackageVersion = require('@webviewjs/webview-linux-riscv64-musl/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { try { - return require('./webview.linux-riscv64-gnu.node'); + return require('./webview.linux-riscv64-gnu.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-riscv64-gnu'); - const bindingPackageVersion = require('@webviewjs/webview-linux-riscv64-gnu/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); + const binding = require('@webviewjs/webview-linux-riscv64-gnu') + const bindingPackageVersion = require('@webviewjs/webview-linux-riscv64-gnu/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) } - return binding; + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } } else if (process.arch === 'ppc64') { try { - return require('./webview.linux-ppc64-gnu.node'); + return require('./webview.linux-ppc64-gnu.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-ppc64-gnu'); - const bindingPackageVersion = require('@webviewjs/webview-linux-ppc64-gnu/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-linux-ppc64-gnu') + const bindingPackageVersion = require('@webviewjs/webview-linux-ppc64-gnu/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else if (process.arch === 's390x') { try { - return require('./webview.linux-s390x-gnu.node'); + return require('./webview.linux-s390x-gnu.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-linux-s390x-gnu'); - const bindingPackageVersion = require('@webviewjs/webview-linux-s390x-gnu/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-linux-s390x-gnu') + const bindingPackageVersion = require('@webviewjs/webview-linux-s390x-gnu/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { - loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`)); + loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`)) } } else if (process.platform === 'openharmony') { if (process.arch === 'arm64') { try { - return require('./webview.openharmony-arm64.node'); + return require('./webview.openharmony-arm64.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-openharmony-arm64'); - const bindingPackageVersion = require('@webviewjs/webview-openharmony-arm64/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-openharmony-arm64') + const bindingPackageVersion = require('@webviewjs/webview-openharmony-arm64/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else if (process.arch === 'x64') { try { - return require('./webview.openharmony-x64.node'); + return require('./webview.openharmony-x64.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-openharmony-x64'); - const bindingPackageVersion = require('@webviewjs/webview-openharmony-x64/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-openharmony-x64') + const bindingPackageVersion = require('@webviewjs/webview-openharmony-x64/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else if (process.arch === 'arm') { try { - return require('./webview.openharmony-arm.node'); + return require('./webview.openharmony-arm.node') } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } try { - const binding = require('@webviewjs/webview-openharmony-arm'); - const bindingPackageVersion = require('@webviewjs/webview-openharmony-arm/package.json').version; - if ( - bindingPackageVersion !== '0.4.6' && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK && - process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0' - ) { - throw new Error( - `Native binding package version mismatch, expected 0.4.6 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`, - ); - } - return binding; + const binding = require('@webviewjs/webview-openharmony-arm') + const bindingPackageVersion = require('@webviewjs/webview-openharmony-arm/package.json').version + if (bindingPackageVersion !== '0.4.7' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.4.7 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding } catch (e) { - loadErrors.push(e); + loadErrors.push(e) } } else { - loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`)); + loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`)) } } else { - loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`)); + loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`)) } } -nativeBinding = requireNative(); +nativeBinding = requireNative() // NAPI_RS_FORCE_WASI is a tri-state flag: // unset / any other value → native binding preferred, WASI is only a fallback @@ -691,38 +532,39 @@ nativeBinding = requireNative(); // Treating any non-empty string as truthy (the historical behavior) meant // NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered // the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file. -const forceWasi = process.env.NAPI_RS_FORCE_WASI === 'true' || process.env.NAPI_RS_FORCE_WASI === 'error'; +const forceWasi = + process.env.NAPI_RS_FORCE_WASI === 'true' || process.env.NAPI_RS_FORCE_WASI === 'error' if (!nativeBinding || forceWasi) { - let wasiBinding = null; - let wasiBindingError = null; + let wasiBinding = null + let wasiBindingError = null try { - wasiBinding = require('./webview.wasi.cjs'); - nativeBinding = wasiBinding; + wasiBinding = require('./webview.wasi.cjs') + nativeBinding = wasiBinding } catch (err) { if (forceWasi) { - wasiBindingError = err; + wasiBindingError = err } } if (!nativeBinding || forceWasi) { try { - wasiBinding = require('@webviewjs/webview-wasm32-wasi'); - nativeBinding = wasiBinding; + wasiBinding = require('@webviewjs/webview-wasm32-wasi') + nativeBinding = wasiBinding } catch (err) { if (forceWasi) { if (!wasiBindingError) { - wasiBindingError = err; + wasiBindingError = err } else { - wasiBindingError.cause = err; + wasiBindingError.cause = err } - loadErrors.push(err); + loadErrors.push(err) } } } if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) { - const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error'); - error.cause = wasiBindingError; - throw error; + const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error') + error.cause = wasiBindingError + throw error } } @@ -732,45 +574,45 @@ if (!nativeBinding) { `Cannot find native binding. ` + `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` + 'Please try `npm i` again after removing both package-lock.json and node_modules directory.', - ); + ) // assign instead of the `new Error(message, { cause })` options form, // which Node < 16.9 silently ignores error.cause = loadErrors.reduce((err, cur) => { - cur.cause = err; - return cur; - }); - throw error; + cur.cause = err + return cur + }) + throw error } - throw new Error(`Failed to load native binding`); + throw new Error(`Failed to load native binding`) } -module.exports = nativeBinding; -module.exports.Application = nativeBinding.Application; -module.exports.BrowserWindow = nativeBinding.BrowserWindow; -module.exports.NativeNotification = nativeBinding.NativeNotification; -module.exports.JsNotification = nativeBinding.JsNotification; -module.exports.TrayIcon = nativeBinding.TrayIcon; -module.exports.JsTrayIcon = nativeBinding.JsTrayIcon; -module.exports.WebContext = nativeBinding.WebContext; -module.exports.JsWebContext = nativeBinding.JsWebContext; -module.exports.Webview = nativeBinding.Webview; -module.exports.JsWebview = nativeBinding.JsWebview; -module.exports.applyUriWorkAround = nativeBinding.applyUriWorkAround; -module.exports.ControlFlow = nativeBinding.ControlFlow; -module.exports.JsControlFlow = nativeBinding.JsControlFlow; -module.exports.CursorType = nativeBinding.CursorType; -module.exports.FullscreenType = nativeBinding.FullscreenType; -module.exports.getWebviewVersion = nativeBinding.getWebviewVersion; -module.exports.IosValidOrientations = nativeBinding.IosValidOrientations; -module.exports.isWorkAroundUri = nativeBinding.isWorkAroundUri; -module.exports.originalUriPrefix = nativeBinding.originalUriPrefix; -module.exports.ProgressBarState = nativeBinding.ProgressBarState; -module.exports.JsProgressBarState = nativeBinding.JsProgressBarState; -module.exports.revertUriWorkAround = nativeBinding.revertUriWorkAround; -module.exports.Theme = nativeBinding.Theme; -module.exports.VERSION = nativeBinding.VERSION; -module.exports.WebviewApplicationEvent = nativeBinding.WebviewApplicationEvent; -module.exports.WebviewEventType = nativeBinding.WebviewEventType; -module.exports.WindowCommand = nativeBinding.WindowCommand; -module.exports.WindowEventType = nativeBinding.WindowEventType; -module.exports.workAroundUriPrefix = nativeBinding.workAroundUriPrefix; +module.exports = nativeBinding +module.exports.Application = nativeBinding.Application +module.exports.BrowserWindow = nativeBinding.BrowserWindow +module.exports.NativeNotification = nativeBinding.NativeNotification +module.exports.JsNotification = nativeBinding.JsNotification +module.exports.TrayIcon = nativeBinding.TrayIcon +module.exports.JsTrayIcon = nativeBinding.JsTrayIcon +module.exports.WebContext = nativeBinding.WebContext +module.exports.JsWebContext = nativeBinding.JsWebContext +module.exports.Webview = nativeBinding.Webview +module.exports.JsWebview = nativeBinding.JsWebview +module.exports.applyUriWorkAround = nativeBinding.applyUriWorkAround +module.exports.ControlFlow = nativeBinding.ControlFlow +module.exports.JsControlFlow = nativeBinding.JsControlFlow +module.exports.CursorType = nativeBinding.CursorType +module.exports.FullscreenType = nativeBinding.FullscreenType +module.exports.getWebviewVersion = nativeBinding.getWebviewVersion +module.exports.IosValidOrientations = nativeBinding.IosValidOrientations +module.exports.isWorkAroundUri = nativeBinding.isWorkAroundUri +module.exports.originalUriPrefix = nativeBinding.originalUriPrefix +module.exports.ProgressBarState = nativeBinding.ProgressBarState +module.exports.JsProgressBarState = nativeBinding.JsProgressBarState +module.exports.revertUriWorkAround = nativeBinding.revertUriWorkAround +module.exports.Theme = nativeBinding.Theme +module.exports.VERSION = nativeBinding.VERSION +module.exports.WebviewApplicationEvent = nativeBinding.WebviewApplicationEvent +module.exports.WebviewEventType = nativeBinding.WebviewEventType +module.exports.WindowCommand = nativeBinding.WindowCommand +module.exports.WindowEventType = nativeBinding.WindowEventType +module.exports.workAroundUriPrefix = nativeBinding.workAroundUriPrefix diff --git a/lib/application.ts b/lib/application.ts new file mode 100644 index 0000000..72c46fa --- /dev/null +++ b/lib/application.ts @@ -0,0 +1,136 @@ +import type { + ApplicationEvent, + ApplicationOptions, + ApplicationRunOptions, + BrowserWindowOptions, + MenuOptions, + TrayIconOptions, + WebContextOptions, +} from '../js-bindings'; +import { nativeBinding, type NativeApplication } from './internal/native-binding'; +import { ApplicationEventLoop } from './internal/application/event-loop'; +import { BrowserWindow } from './browser-window'; +import { TrayIcon } from './tray-icon'; +import { WebContext } from './web-context'; +import type { ApplicationEventMap, ApplicationWhenReadyOptions } from './types/application'; +import { TypedEventEmitter } from './types/events'; + +const INTERNAL_APPLICATION = Symbol('Application internal construction'); + +export class Application extends TypedEventEmitter { + readonly #native: NativeApplication; + readonly #eventLoop: ApplicationEventLoop; + #legacyEventHandler: ((event: ApplicationEvent) => void) | null = null; + + constructor(options?: ApplicationOptions | null); + /** @internal */ + constructor(token: typeof INTERNAL_APPLICATION, native: NativeApplication); + constructor(optionsOrToken?: ApplicationOptions | null | typeof INTERNAL_APPLICATION, native?: NativeApplication) { + super(); + this.#native = + optionsOrToken === INTERNAL_APPLICATION + ? (native as NativeApplication) + : new nativeBinding.Application(optionsOrToken); + this.#eventLoop = new ApplicationEventLoop(() => this.#native.pumpEvents()); + this.#native.onEvent((event) => this.#dispatchNativeEvent(event)); + } + + /** @internal */ + static fromNative(native: NativeApplication): Application { + return new Application(INTERNAL_APPLICATION, native); + } + + #dispatchNativeEvent(event: ApplicationEvent): void { + this.emit(event.event, event); + this.#legacyEventHandler?.(event); + } + + onEvent(handler?: ((event: ApplicationEvent) => void) | null): void { + this.#legacyEventHandler = handler ?? null; + } + + bind(handler?: ((event: ApplicationEvent) => void) | null): void { + this.onEvent(handler); + } + + isReady(): boolean { + return this.#native.isReady(); + } + + exit(): void { + this.#native.exit(); + } + + createWebContext(options?: WebContextOptions | null): WebContext { + return WebContext.fromNative(this.#native.createWebContext(options)); + } + + createTrayIcon(options: TrayIconOptions): TrayIcon { + return TrayIcon.fromNative(this.#native.createTrayIcon(options)); + } + + createBrowserWindow(options?: BrowserWindowOptions | null): BrowserWindow { + return BrowserWindow.fromNative(this.#native.createBrowserWindow(options)); + } + + createChildBrowserWindow(options?: BrowserWindowOptions | null): BrowserWindow { + return BrowserWindow.fromNative(this.#native.createChildBrowserWindow(options)); + } + + setMenu(menuOptions?: MenuOptions | null): void { + this.#native.setMenu(menuOptions); + } + + pumpEvents(): boolean { + return this.#native.pumpEvents(); + } + + runSync(): void { + this.#native.runSync(); + } + + run(options?: ApplicationRunOptions | null): void { + this.#eventLoop.start(options as ApplicationRunOptions | undefined); + } + + stop(): void { + this.#eventLoop.stop(); + } + + whenReady(options: ApplicationWhenReadyOptions = {}): Promise { + const { autoRun = true, interval, ref } = options; + if (!autoRun) { + if (Object.prototype.hasOwnProperty.call(options, 'interval')) { + throw new TypeError('interval is not supported when autoRun is false'); + } + if (Object.prototype.hasOwnProperty.call(options, 'ref')) { + throw new TypeError('ref is not supported when autoRun is false'); + } + } + + const ready = this.isReady() + ? Promise.resolve() + : new Promise((resolve) => { + this.once('ready', resolve); + }); + + if (autoRun) { + const runOptions: ApplicationRunOptions = {}; + if (interval !== undefined) { + runOptions.interval = interval; + } + if (ref !== undefined) { + runOptions.ref = ref; + } + this.run(runOptions); + } + + return ready; + } + + [Symbol.dispose](): void { + this.exit(); + } +} + +export type { ApplicationEventMap, ApplicationOptions, ApplicationRunOptions, ApplicationWhenReadyOptions }; diff --git a/lib/browser-window.ts b/lib/browser-window.ts new file mode 100644 index 0000000..c7ff4fb --- /dev/null +++ b/lib/browser-window.ts @@ -0,0 +1,438 @@ +import type { + AndroidContentRect, + CursorType, + Dimensions, + FileDialogOptions, + FullscreenType, + IosValidOrientations, + JsProgressBar, + Monitor, + Position, + Theme, + WebviewEventPayload, + WebviewNewWindowFeatures, + WindowEventPayload, +} from '../js-bindings'; +import type { NativeBrowserWindow } from './internal/native-binding'; +import { NativeHandle } from './internal/native-handle'; +import { ProtocolBridge } from './internal/protocol/protocol-bridge'; +import { BrowserWindowCloseEvent } from './internal/events/browser-window-close-event'; +import type { BrowserWindowProtocolHandler, BrowserWindowEventMap } from './types/browser-window'; +import { TypedEventEmitter } from './types/events'; +import { Webview } from './webview'; +import type { WebviewEventMap, WebviewOptions, WebviewNewWindowEvent } from './types/webview'; + +export class BrowserWindow extends TypedEventEmitter { + readonly #handle: NativeHandle; + readonly #protocolBridge: ProtocolBridge; + + private constructor(native: NativeBrowserWindow) { + super(); + this.#handle = new NativeHandle(native, 'BrowserWindow'); + this.#protocolBridge = new ProtocolBridge(native, () => this.isDisposed()); + native._onWindowEvent((payload) => this.#dispatchWindowEvent(payload)); + } + + /** @internal */ + static fromNative(native: NativeBrowserWindow): BrowserWindow { + return new BrowserWindow(native); + } + + isDisposed(): boolean { + return this.#handle.isDisposed(); + } + + dispose(): void { + this.#handle.dispose(); + } + + [Symbol.dispose](): void { + this.dispose(); + } + + protected unwrap(): NativeBrowserWindow { + return this.#handle.unwrapForNative(); + } + + registerProtocol(name: string, handler: BrowserWindowProtocolHandler): void { + this.unwrap(); + this.#protocolBridge.register(name, handler); + } + + createWebview(options?: WebviewOptions | null): Webview { + const native = this.unwrap(); + const { webContext, navigationHandler, newWindowHandler, ...nativeOptions } = options ?? {}; + const nativeContext = webContext == null ? null : webContext.unwrapForNative(); + + let wrappedWebview: Webview | undefined; + const eventHandler = (error: Error | null, payload: WebviewEventPayload): void => { + if (error) { + throw error; + } + wrappedWebview?.dispatchNativeEvent(payload); + }; + const newWindowAdapter = newWindowHandler + ? (payload: WebviewEventPayload): boolean => newWindowHandler(payload as WebviewNewWindowEvent) + : null; + + const nativeWebview = native.createWebview( + nativeOptions, + nativeContext, + eventHandler, + navigationHandler ?? null, + newWindowAdapter, + ); + wrappedWebview = Webview.fromNative(nativeWebview); + return wrappedWebview; + } + + #dispatchWindowEvent(payload: WindowEventPayload): void { + if (payload.event !== 'close') { + this.emit(payload.event, payload); + return; + } + + const event = new BrowserWindowCloseEvent(payload, () => this.unwrap()._preventClose()); + try { + this.emit('close', event); + } finally { + event.finishDispatch(); + } + } + + get isChild(): boolean { + return this.unwrap().isChild; + } + + getNativeHandle(): bigint { + return this.unwrap().getNativeHandle(); + } + + isFocused(): boolean { + return this.unwrap().isFocused(); + } + + isVisible(): boolean { + return this.unwrap().isVisible(); + } + + isDecorated(): boolean { + return this.unwrap().isDecorated(); + } + + isClosable(): boolean { + return this.unwrap().isClosable(); + } + + isMaximizable(): boolean { + return this.unwrap().isMaximizable(); + } + + isMinimizable(): boolean { + return this.unwrap().isMinimizable(); + } + + isMaximized(): boolean { + return this.unwrap().isMaximized(); + } + + isMinimized(): boolean { + return this.unwrap().isMinimized(); + } + + isResizable(): boolean { + return this.unwrap().isResizable(); + } + + setTitle(title: string): void { + this.unwrap().setTitle(title); + } + + get title(): string { + return this.unwrap().title; + } + + setClosable(closable: boolean): void { + this.unwrap().setClosable(closable); + } + + setMaximizable(maximizable: boolean): void { + this.unwrap().setMaximizable(maximizable); + } + + setMinimizable(minimizable: boolean): void { + this.unwrap().setMinimizable(minimizable); + } + + setResizable(resizable: boolean): void { + this.unwrap().setResizable(resizable); + } + + setSize(width: number, height: number, logical?: boolean | null): Dimensions | null { + return this.unwrap().setSize(width, height, logical); + } + + setMinSize(width: number, height: number, logical?: boolean | null): void { + this.unwrap().setMinSize(width, height, logical); + } + + getInnerSize(logical?: boolean | null): Dimensions { + return this.unwrap().getInnerSize(logical); + } + + setMaxSize(width: number, height: number, logical?: boolean | null): void { + this.unwrap().setMaxSize(width, height, logical); + } + + getOuterSize(logical?: boolean | null): Dimensions { + return this.unwrap().getOuterSize(logical); + } + + openFileDialog(options?: FileDialogOptions | null): string[] { + return this.unwrap().openFileDialog(options); + } + + id(): number { + return this.unwrap().id(); + } + + hasMenu(): boolean { + return this.unwrap().hasMenu(); + } + + get theme(): Theme { + return this.unwrap().theme; + } + + setTheme(theme: Theme): void { + this.unwrap().setTheme(theme); + } + + setWindowIcon(icon: Uint8Array | number[], width?: number | null, height?: number | null): void { + this.unwrap().setWindowIcon(icon, width, height); + } + + removeWindowIcon(): void { + this.unwrap().removeWindowIcon(); + } + + setEnable(enabled: boolean): void { + this.unwrap().setEnable(enabled); + } + + setTaskbarIcon(icon: Uint8Array | number[], width?: number | null, height?: number | null): void { + this.unwrap().setTaskbarIcon(icon, width, height); + } + + removeTaskbarIcon(): void { + this.unwrap().removeTaskbarIcon(); + } + + setUndecoratedShadow(shadow: boolean): void { + this.unwrap().setUndecoratedShadow(shadow); + } + + getNativeHandleAnyThread(): bigint { + return this.unwrap().getNativeHandleAnyThread(); + } + + simpleFullscreen(): boolean { + return this.unwrap().simpleFullscreen(); + } + + setSimpleFullscreen(fullscreen: boolean): boolean { + return this.unwrap().setSimpleFullscreen(fullscreen); + } + + hasShadow(): boolean { + return this.unwrap().hasShadow(); + } + + setHasShadow(value: boolean): void { + this.unwrap().setHasShadow(value); + } + + setTabbingIdentifier(identifier: string): void { + this.unwrap().setTabbingIdentifier(identifier); + } + + tabbingIdentifier(): string { + return this.unwrap().tabbingIdentifier(); + } + + isDocumentEdited(): boolean { + return this.unwrap().isDocumentEdited(); + } + + setDocumentEdited(edited: boolean): void { + this.unwrap().setDocumentEdited(edited); + } + + getWaylandSurface(): bigint { + return this.unwrap().getWaylandSurface(); + } + + setIosScaleFactor(value: number): void { + this.unwrap().setIosScaleFactor(value); + } + + setValidOrientations(value: IosValidOrientations): void { + this.unwrap().setValidOrientations(value); + } + + setPrefersHomeIndicatorHidden(value: boolean): void { + this.unwrap().setPrefersHomeIndicatorHidden(value); + } + + setPreferredScreenEdgesDeferringSystemGestures(edges: number): void { + this.unwrap().setPreferredScreenEdgesDeferringSystemGestures(edges); + } + + setPrefersStatusBarHidden(value: boolean): void { + this.unwrap().setPrefersStatusBarHidden(value); + } + + androidContentRect(): AndroidContentRect { + return this.unwrap().androidContentRect(); + } + + androidConfig(): string { + return this.unwrap().androidConfig(); + } + + setVisible(visible: boolean): void { + this.unwrap().setVisible(visible); + } + + setProgressBar(state: JsProgressBar): void { + this.unwrap().setProgressBar(state); + } + + setMaximized(value: boolean): void { + this.unwrap().setMaximized(value); + } + + setMinimized(value: boolean): void { + this.unwrap().setMinimized(value); + } + + focus(): void { + this.unwrap().focus(); + } + + getAvailableMonitors(): Monitor[] { + return this.unwrap().getAvailableMonitors(); + } + + getCurrentMonitor(): Monitor | null { + return this.unwrap().getCurrentMonitor(); + } + + getPrimaryMonitor(): Monitor | null { + return this.unwrap().getPrimaryMonitor(); + } + + getMonitorFromPoint(x: number, y: number): Monitor | null { + return this.unwrap().getMonitorFromPoint(x, y); + } + + setContentProtection(enabled: boolean): void { + this.unwrap().setContentProtection(enabled); + } + + setAlwaysOnTop(enabled: boolean): void { + this.unwrap().setAlwaysOnTop(enabled); + } + + setAlwaysOnBottom(enabled: boolean): void { + this.unwrap().setAlwaysOnBottom(enabled); + } + + setDecorations(enabled: boolean): void { + this.unwrap().setDecorations(enabled); + } + + get fullscreen(): FullscreenType | null { + return this.unwrap().fullscreen; + } + + setFullscreen(fullscreenType?: FullscreenType | null): void { + this.unwrap().setFullscreen(fullscreenType); + } + + close(): void { + this.unwrap().close(); + } + + hide(): void { + this.unwrap().hide(); + } + + show(): void { + this.unwrap().show(); + } + + setPosition(x: number, y: number, logical?: boolean | null): void { + this.unwrap().setPosition(x, y, logical); + } + + getPosition(logical?: boolean | null): Position { + return this.unwrap().getPosition(logical); + } + + center(): void { + this.unwrap().center(); + } + + get width(): number { + return this.unwrap().width; + } + + get height(): number { + return this.unwrap().height; + } + + get x(): number { + return this.unwrap().x; + } + + get y(): number { + return this.unwrap().y; + } + + scaleFactor(): number { + return this.unwrap().scaleFactor(); + } + + setCursor(cursor: CursorType): void { + this.unwrap().setCursor(cursor); + } + + setCursorVisible(visible: boolean): void { + this.unwrap().setCursorVisible(visible); + } + + setCursorPosition(x: number, y: number): void { + this.unwrap().setCursorPosition(x, y); + } + + setIgnoreCursorEvents(ignore: boolean): void { + this.unwrap().setIgnoreCursorEvents(ignore); + } + + setSkipTaskbar(skip: boolean): void { + this.unwrap().setSkipTaskbar(skip); + } + + requestRedraw(): void { + this.unwrap().requestRedraw(); + } +} + +export type { + BrowserWindowEventMap, + BrowserWindowProtocolHandler, + WebviewEventMap, + WebviewEventPayload, + WebviewNewWindowFeatures, +}; diff --git a/lib/errors/serialization-error.ts b/lib/errors/serialization-error.ts new file mode 100644 index 0000000..856cf99 --- /dev/null +++ b/lib/errors/serialization-error.ts @@ -0,0 +1,6 @@ +export class SerializationError extends Error { + constructor(message: string) { + super(message); + this.name = 'SerializationError'; + } +} diff --git a/lib/index.ts b/lib/index.ts new file mode 100644 index 0000000..f537136 --- /dev/null +++ b/lib/index.ts @@ -0,0 +1,113 @@ +export { Application } from './application'; +export { BrowserWindow } from './browser-window'; +export { WebContext } from './web-context'; +export { Webview } from './webview'; +export { TrayIcon } from './tray-icon'; +export { + Notification, + type NotificationAction, + type NotificationDirection, + type NotificationEvent, + type NotificationEventMap, + type NotificationEventName, + type NotificationOptions, + type NotificationPermission, +} from './notification'; +export { SerializationError } from './errors/serialization-error'; + +export { TrayIcon as JsTrayIcon } from './tray-icon'; +export { WebContext as JsWebContext } from './web-context'; +export { Webview as JsWebview } from './webview'; +export { NativeNotification, NativeNotification as JsNotification } from '../js-bindings'; + +export { + ControlFlow, + CursorType, + FullscreenType, + IosValidOrientations, + ProgressBarState, + Theme, + WebviewApplicationEvent, + WebviewEventType, + WindowCommand, + WindowEventType, + VERSION, + applyUriWorkAround, + getWebviewVersion, + isWorkAroundUri, + originalUriPrefix, + revertUriWorkAround, + workAroundUriPrefix, +} from '../js-bindings'; + +export type { + AndroidContentRect, + ApplicationEvent, + ApplicationOptions, + ApplicationRunOptions, + BrowserWindowOptions, + CustomMenuEvent, + CustomProtocolRequest, + CustomProtocolResponse, + Dimensions, + ExposeCallData, + FileDialogOptions, + FileFilter, + HeaderData, + IpcMessage, + JsProgressBar, + MenuItemOptions, + MenuOptions, + Monitor, + NativeNotificationAction, + NativeNotificationOptions, + NotificationEventPayload, + Position, + ProtocolRequest, + TrayEventPayload, + TrayIconImage, + TrayIconOptions, + TrayRect, + VideoMode, + WebContextOptions, + WebviewBounds, + WebviewCookie, + WebviewEventPayload, + WebviewNewWindowFeatures, + WebviewWindowPosition, + WebviewWindowSize, + WindowEventPayload, +} from '../js-bindings'; + +export type { ApplicationEventMap, ApplicationWhenReadyOptions } from './types/application'; +export type { + BrowserWindowCloseEvent, + BrowserWindowEventMap, + BrowserWindowProtocolHandler, + PublicNewWindowEvent, + WindowBaseEvent, + WindowFileEvent, + WindowImeEvent, + WindowKeyEvent, + WindowMouseEvent, + WindowMoveEvent, + WindowResizeEvent, + WindowScaleEvent, + WindowScrollEvent, + WindowThemeEvent, + WindowTouchEvent, +} from './types/browser-window'; +export type { EventListener, TypedEventEmitter } from './types/events'; +export type { + ExposedTarget, + JsonValue, + WebviewDownloadEvent, + WebviewDownloadStartedEvent, + WebviewEventMap, + WebviewNavigationEvent, + WebviewNewWindowEvent, + WebviewOptions, + WebviewPageLoadEvent, + WebviewTitleChangedEvent, +} from './types/webview'; +export type { TrayEventMap } from './types/tray-icon'; diff --git a/lib/internal/application/event-loop.ts b/lib/internal/application/event-loop.ts new file mode 100644 index 0000000..722d1fa --- /dev/null +++ b/lib/internal/application/event-loop.ts @@ -0,0 +1,37 @@ +import type { ApplicationRunOptions } from '../../../js-bindings'; + +export class ApplicationEventLoop { + #timer?: NodeJS.Timeout; + readonly #pumpEvents: () => boolean; + + constructor(pumpEvents: () => boolean) { + this.#pumpEvents = pumpEvents; + } + + start(options: ApplicationRunOptions = {}): void { + if (this.#timer !== undefined) { + return; + } + + const interval = options.interval ?? 16; + const shouldRef = options.ref ?? true; + const timer = setInterval(() => { + if (!this.#pumpEvents()) { + this.stop(); + } + }, interval); + + if (!shouldRef) { + timer.unref(); + } + this.#timer = timer; + } + + stop(): void { + if (this.#timer === undefined) { + return; + } + clearInterval(this.#timer); + this.#timer = undefined; + } +} diff --git a/lib/internal/events/browser-window-close-event.ts b/lib/internal/events/browser-window-close-event.ts new file mode 100644 index 0000000..8fa2a0a --- /dev/null +++ b/lib/internal/events/browser-window-close-event.ts @@ -0,0 +1,32 @@ +import type { WindowEventPayload } from '../../../js-bindings'; +import type { BrowserWindowCloseEvent as BrowserWindowCloseEventShape } from '../../types/browser-window'; + +export class BrowserWindowCloseEvent implements BrowserWindowCloseEventShape { + readonly event = 'close' as const; + #active = true; + #prevented = false; + readonly #preventClose: () => boolean; + + constructor(payload: WindowEventPayload, preventClose: () => boolean) { + Object.assign(this, payload); + this.#preventClose = preventClose; + } + + get defaultPrevented(): boolean { + return this.#prevented; + } + + preventDefault(): void { + if (!this.#active || this.#prevented) { + return; + } + if (this.#preventClose()) { + this.#prevented = true; + } + } + + /** @internal */ + finishDispatch(): void { + this.#active = false; + } +} diff --git a/lib/internal/ipc/ipc-bridge.ts b/lib/internal/ipc/ipc-bridge.ts new file mode 100644 index 0000000..5f8883d --- /dev/null +++ b/lib/internal/ipc/ipc-bridge.ts @@ -0,0 +1,192 @@ +import type { IpcMessage } from '../../../js-bindings'; +import type { NativeWebview } from '../native-binding'; +import { SerializationError } from '../../errors/serialization-error'; +import { serializeJson, validateJsonValue } from './serialization'; + +export type IpcMessageHandler = (message: IpcMessage) => void; + +interface ExposedNamespace { + target: object; + functions: Map; +} + +interface ExposeCall { + __e?: unknown; + ns?: unknown; + method?: unknown; + id?: unknown; + args?: unknown; +} + +export class WebviewIpcBridge { + readonly #native: NativeWebview; + readonly #isDisposed: () => boolean; + readonly #namespaces = new Map(); + #userHandler: IpcMessageHandler | null = null; + #transportInstalled = false; + readonly #transportHandler: (message: IpcMessage) => void; + + constructor(native: NativeWebview, isDisposed: () => boolean) { + this.#native = native; + this.#isDisposed = isDisposed; + this.#transportHandler = (message) => this.#dispatchMessage(message); + } + + setUserHandler(handler: IpcMessageHandler | null | undefined): void { + this.#assertNotDisposed(); + if (handler != null && typeof handler !== 'function') { + throw new TypeError('onIpcMessage handler must be a function or null'); + } + + this.#userHandler = handler ?? null; + if (this.#userHandler !== null || this.#namespaces.size > 0) { + this.#installTransport(); + } else { + this.#removeTransport(); + } + } + + expose(name: string, target: object): void { + this.#assertNotDisposed(); + if (!/^[A-Za-z_$][\w$]*$/u.test(name)) { + throw new TypeError('expose(): name must be a valid JavaScript identifier'); + } + if (target === null || (typeof target !== 'object' && typeof target !== 'function')) { + throw new TypeError('expose(): target must be an object'); + } + if (this.#namespaces.has(name)) { + throw new Error('expose(): namespace "' + name + '" is already registered'); + } + + const statics: Record = {}; + const functions = new Map(); + for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(target))) { + if (!descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) { + continue; + } + const value: unknown = descriptor.value; + if (typeof value === 'function') { + functions.set(key, value); + } else { + validateJsonValue(value, 'expose(): value for property "' + key + '"'); + statics[key] = value; + } + } + + this.#native._exposeInternal(name, serializeJson(statics, 'expose(): static properties'), [...functions.keys()]); + this.#namespaces.set(name, { functions, target }); + this.#installTransport(); + } + + dispose(): void { + this.#namespaces.clear(); + this.#userHandler = null; + this.#removeTransport(); + } + + #assertNotDisposed(): void { + if (this.#isDisposed()) { + throw new Error('Webview has been disposed'); + } + } + + #installTransport(): void { + if (this.#transportInstalled) { + return; + } + this.#native.onIpcMessage(this.#transportHandler); + this.#transportInstalled = true; + } + + #removeTransport(): void { + if (!this.#transportInstalled) { + return; + } + try { + this.#native.onIpcMessage(null); + } catch { + // Native disposal clears the IPC callback at the same time. + } + this.#transportInstalled = false; + } + + #dispatchMessage(message: IpcMessage): void { + if (this.#isDisposed()) { + return; + } + + let parsed: unknown; + try { + parsed = JSON.parse(message.body.toString()); + } catch { + this.#userHandler?.(message); + return; + } + + if (parsed === null || typeof parsed !== 'object' || (parsed as ExposeCall).__e !== true) { + this.#userHandler?.(message); + return; + } + + const call = parsed as ExposeCall; + const namespaceName = typeof call.ns === 'string' ? call.ns : ''; + const methodName = typeof call.method === 'string' ? call.method : ''; + const id = call.id; + const namespace = this.#namespaces.get(namespaceName); + const fn = namespace?.functions.get(methodName); + if (fn === undefined || namespace === undefined) { + this.#sendError(id, 'No such method: ' + String(call.method)); + return; + } + if (!Array.isArray(call.args)) { + this.#sendError(id, 'Arguments must be an array', 'SerializationError'); + return; + } + + const args: unknown[] = call.args; + void Promise.resolve() + .then(() => Reflect.apply(fn, namespace.target, args) as unknown) + .then((result) => { + try { + const resultJson = serializeJson(result, 'Return value'); + if (!this.#isDisposed()) { + this.#native.evaluateScript( + 'window.__webviewjs__&&window.__webviewjs__.resolve(' + Number(id) + ',' + resultJson + ')', + ); + } + } catch { + this.#sendError(id, 'Return value is not JSON-serialisable', 'SerializationError'); + } + }) + .catch((error: unknown) => { + const messageText = + error !== null && typeof error === 'object' && 'message' in error ? String(error.message) : String(error); + const errorName = + error !== null && typeof error === 'object' && 'name' in error && error.name === 'SerializationError' + ? 'SerializationError' + : 'Error'; + this.#sendError(id, messageText, errorName); + }); + } + + #sendError(id: unknown, message: string, name = 'Error'): void { + if (this.#isDisposed()) { + return; + } + try { + this.#native.evaluateScript( + 'window.__webviewjs__&&window.__webviewjs__.reject(' + + Number(id) + + ',' + + JSON.stringify(String(message)) + + ',' + + JSON.stringify(name) + + ')', + ); + } catch { + // A response can race with disposal after the initial check. + } + } +} + +export { SerializationError }; diff --git a/lib/internal/ipc/serialization.ts b/lib/internal/ipc/serialization.ts new file mode 100644 index 0000000..6b36a77 --- /dev/null +++ b/lib/internal/ipc/serialization.ts @@ -0,0 +1,17 @@ +import { SerializationError } from '../../errors/serialization-error'; + +export function serializeJson(value: unknown, context: string): string { + try { + const json = JSON.stringify(value); + if (json === undefined) { + throw new TypeError('JSON.stringify returned undefined'); + } + return json; + } catch { + throw new SerializationError(context + ' is not JSON-serialisable'); + } +} + +export function validateJsonValue(value: unknown, context: string): void { + JSON.parse(serializeJson(value, context)); +} diff --git a/lib/internal/native-binding.ts b/lib/internal/native-binding.ts new file mode 100644 index 0000000..a63d000 --- /dev/null +++ b/lib/internal/native-binding.ts @@ -0,0 +1,9 @@ +const nativeBinding: typeof import('../../js-bindings') = require('../../js-bindings.js'); + +export { nativeBinding }; + +export type NativeApplication = InstanceType; +export type NativeBrowserWindow = InstanceType; +export type NativeWebview = InstanceType; +export type NativeWebContext = InstanceType; +export type NativeTrayIcon = InstanceType; diff --git a/lib/internal/native-handle.ts b/lib/internal/native-handle.ts new file mode 100644 index 0000000..ea5f032 --- /dev/null +++ b/lib/internal/native-handle.ts @@ -0,0 +1,42 @@ +export interface NativeDisposable { + dispose(): void; + isDisposed(): boolean; +} + +export class NativeHandle { + readonly #native: T; + readonly #name: string; + + constructor(native: T, name: string) { + this.#native = native; + this.#name = name; + } + + protected unwrap(): T { + this.assertNotDisposed(); + return this.#native; + } + + /** @internal */ + unwrapForNative(): T { + return this.unwrap(); + } + + protected assertNotDisposed(): void { + if (this.#native.isDisposed()) { + throw new Error(this.#name + ' has been disposed'); + } + } + + isDisposed(): boolean { + return this.#native.isDisposed(); + } + + dispose(): void { + this.#native.dispose(); + } + + [Symbol.dispose](): void { + this.dispose(); + } +} diff --git a/lib/internal/protocol/protocol-bridge.ts b/lib/internal/protocol/protocol-bridge.ts new file mode 100644 index 0000000..1d0168d --- /dev/null +++ b/lib/internal/protocol/protocol-bridge.ts @@ -0,0 +1,91 @@ +import type { CustomProtocolResponse, ProtocolRequest } from '../../../js-bindings'; +import type { NativeBrowserWindow } from '../native-binding'; +import type { BrowserWindowProtocolHandler } from '../../types/browser-window'; + +export class ProtocolBridge { + readonly #native: NativeBrowserWindow; + readonly #isDisposed: () => boolean; + + constructor(native: NativeBrowserWindow, isDisposed: () => boolean) { + this.#native = native; + this.#isDisposed = isDisposed; + } + + register(name: string, handler: BrowserWindowProtocolHandler): void { + this.#native._registerProtocol(name, (protocolRequest) => { + void this.#handle(protocolRequest, handler); + }); + } + + async #handle(protocolRequest: ProtocolRequest, handler: BrowserWindowProtocolHandler): Promise { + try { + const response = await handler(this.#toRequest(protocolRequest)); + const nativeResponse = await this.#toNativeResponse(response); + this.#complete(protocolRequest.id, nativeResponse); + } catch (error) { + this.#completeSafely(protocolRequest.id, this.#errorResponse(error)); + } + } + + #toRequest(protocolRequest: ProtocolRequest): Request { + const headers = new Headers(); + for (const { key, value } of protocolRequest.headers ?? []) { + if (value != null) { + headers.set(key, value); + } + } + + const method = protocolRequest.method; + const canHaveBody = !['GET', 'HEAD'].includes(method.toUpperCase()); + const requestInit: RequestInit = { method, headers }; + if (canHaveBody && protocolRequest.body?.length) { + requestInit.body = new Uint8Array(protocolRequest.body); + } + return new Request(protocolRequest.url, requestInit); + } + + async #toNativeResponse(response: Response | CustomProtocolResponse): Promise { + if (typeof Response !== 'undefined' && response instanceof Response) { + const body = Buffer.from(await response.arrayBuffer()); + const mimeType = response.headers.get('content-type') ?? 'application/octet-stream'; + const headers: Array<{ key: string; value: string }> = []; + response.headers.forEach((value, key) => { + if (key.toLowerCase() !== 'content-type') { + headers.push({ key, value }); + } + }); + return { + statusCode: response.status, + body, + mimeType, + headers, + }; + } + return response as CustomProtocolResponse; + } + + #complete(id: number, response: CustomProtocolResponse): void { + if (this.#isDisposed()) { + return; + } + this.#native._completeProtocol(id, response); + } + + #completeSafely(id: number, response: CustomProtocolResponse): void { + try { + this.#complete(id, response); + } catch { + // The native request responder can be gone if the window was disposed. + } + } + + #errorResponse(error: unknown): CustomProtocolResponse { + const message = + error !== null && typeof error === 'object' && 'message' in error ? String(error.message) : String(error); + return { + statusCode: 500, + body: Buffer.from(message), + mimeType: 'text/plain', + }; + } +} diff --git a/lib/notification.ts b/lib/notification.ts new file mode 100644 index 0000000..8ba8371 --- /dev/null +++ b/lib/notification.ts @@ -0,0 +1,267 @@ +import { TypedEventEmitter } from './types/events'; +import type { NativeNotificationAction, NativeNotificationOptions, NotificationEventPayload } from '../js-bindings'; +import { nativeBinding } from './internal/native-binding'; + +export type NotificationPermission = 'granted'; +export type NotificationDirection = 'auto' | 'ltr' | 'rtl'; +export type NotificationEventName = 'click' | 'close' | 'error' | 'show'; + +export interface NotificationAction { + action: string; + title: string; + icon?: string; +} + +export interface NotificationOptions { + body?: string; + icon?: string; + image?: string | Buffer; + badge?: string; + tag?: string; + data?: unknown; + dir?: NotificationDirection; + lang?: string; + renotify?: boolean; + requireInteraction?: boolean; + persistent?: boolean; + actions?: NotificationAction[]; + silent?: boolean; + timestamp?: number; + vibrate?: number | number[]; +} + +export interface NotificationEvent { + type: NotificationEventName; + target: Notification; + action?: string; + error?: Error; +} + +export interface NotificationEventMap { + click: NotificationEvent; + close: NotificationEvent; + error: NotificationEvent; + show: NotificationEvent; +} + +interface NormalizedNotificationOptions { + body: string; + icon: string; + image: string | Buffer; + badge: string; + tag: string; + data: unknown; + dir: NotificationDirection; + lang: string; + renotify: boolean; + requireInteraction: boolean; + persistent: boolean; + actions: Array<{ action: string; title: string; icon: string }>; + silent: boolean; + timestamp: number; + vibrate: number | number[]; +} + +export class Notification extends TypedEventEmitter { + readonly #native: InstanceType; + readonly #handlers = new Map void>(); + readonly #options: NormalizedNotificationOptions; + readonly #title: string; + + constructor(title: string, options: NotificationOptions = {}) { + super(); + + if (options.image !== undefined && typeof options.image !== 'string' && !Buffer.isBuffer(options.image)) { + throw new TypeError('Notification image must be a file path string or Buffer'); + } + if (options.actions !== undefined && !Array.isArray(options.actions)) { + throw new TypeError('Notification actions must be an array'); + } + + const persistent = options.persistent ?? false; + const actions = (options.actions ?? []).map((action) => ({ + action: String(action.action), + title: String(action.title), + icon: action.icon === undefined ? '' : String(action.icon), + })); + if (actions.length > 0 && !persistent) { + throw new TypeError('Notification actions require persistent: true'); + } + + this.#title = String(title); + this.#options = { + body: options.body ?? '', + icon: options.icon ?? '', + image: options.image ?? '', + badge: options.badge ?? '', + tag: options.tag ?? '', + data: options.data, + dir: options.dir ?? 'auto', + lang: options.lang ?? '', + renotify: options.renotify ?? false, + requireInteraction: options.requireInteraction ?? false, + persistent, + actions, + silent: options.silent ?? false, + timestamp: options.timestamp ?? Date.now(), + vibrate: options.vibrate ?? [], + }; + + const nativeOptions: NativeNotificationOptions = { + title: this.#title, + body: this.#options.body || undefined, + icon: this.#options.icon || undefined, + imagePath: typeof this.#options.image === 'string' ? this.#options.image || undefined : undefined, + imageData: Buffer.isBuffer(this.#options.image) ? this.#options.image : undefined, + requireInteraction: this.#options.requireInteraction, + persistent: this.#options.persistent, + actions: this.#options.actions.map((action): NativeNotificationAction => ({ + action: action.action, + title: action.title, + icon: action.icon || undefined, + })), + }; + + this.#native = new nativeBinding.NativeNotification( + nativeOptions, + (error: Error | null, payload: NotificationEventPayload) => { + if (error) { + this.#dispatch({ event: 'error', error: error.message }); + } else { + this.#dispatch(payload); + } + }, + ); + } + + static get permission(): NotificationPermission { + return 'granted'; + } + + static requestPermission(): Promise { + return Promise.resolve('granted'); + } + + #dispatch(payload: NotificationEventPayload): void { + const type = payload.event as NotificationEventName; + const event: NotificationEvent = { + type, + target: this, + action: payload.action, + error: payload.error === undefined ? undefined : new Error(payload.error), + }; + this.emit(type, event); + this.#handlers.get(type)?.call(this, event); + } + + close(): void { + this.#native.close(); + } + + get title(): string { + return this.#title; + } + + get body(): string { + return this.#options.body; + } + + get icon(): string { + return this.#options.icon; + } + + get image(): string | Buffer { + return this.#options.image; + } + + get badge(): string { + return this.#options.badge; + } + + get tag(): string { + return this.#options.tag; + } + + get data(): unknown { + return this.#options.data; + } + + get dir(): NotificationDirection { + return this.#options.dir; + } + + get lang(): string { + return this.#options.lang; + } + + get renotify(): boolean { + return this.#options.renotify; + } + + get requireInteraction(): boolean { + return this.#options.requireInteraction; + } + + get persistent(): boolean { + return this.#options.persistent; + } + + get actions(): NotificationAction[] { + return this.#options.actions; + } + + get silent(): boolean { + return this.#options.silent; + } + + get timestamp(): number { + return this.#options.timestamp; + } + + get vibrate(): number | number[] { + return this.#options.vibrate; + } + + get onclick(): ((event: NotificationEvent) => void) | null { + return this.#handlers.get('click') ?? null; + } + + set onclick(listener: ((event: NotificationEvent) => void) | null) { + this.#setHandler('click', listener); + } + + get onclose(): ((event: NotificationEvent) => void) | null { + return this.#handlers.get('close') ?? null; + } + + set onclose(listener: ((event: NotificationEvent) => void) | null) { + this.#setHandler('close', listener); + } + + get onerror(): ((event: NotificationEvent) => void) | null { + return this.#handlers.get('error') ?? null; + } + + set onerror(listener: ((event: NotificationEvent) => void) | null) { + this.#setHandler('error', listener); + } + + get onshow(): ((event: NotificationEvent) => void) | null { + return this.#handlers.get('show') ?? null; + } + + set onshow(listener: ((event: NotificationEvent) => void) | null) { + this.#setHandler('show', listener); + } + + #setHandler(type: NotificationEventName, listener: ((event: NotificationEvent) => void) | null): void { + if (listener == null) { + this.#handlers.delete(type); + return; + } + if (typeof listener !== 'function') { + throw new TypeError('on' + type + ' must be a function or null'); + } + this.#handlers.set(type, listener); + } +} diff --git a/lib/tray-icon.ts b/lib/tray-icon.ts new file mode 100644 index 0000000..1a24f8b --- /dev/null +++ b/lib/tray-icon.ts @@ -0,0 +1,97 @@ +import type { TrayEventPayload, TrayIconOptions, TrayRect } from '../js-bindings'; +import { nativeBinding, type NativeTrayIcon } from './internal/native-binding'; +import { NativeHandle } from './internal/native-handle'; +import type { TrayEventMap } from './types/tray-icon'; +import { TypedEventEmitter } from './types/events'; + +const INTERNAL_TRAY_ICON = Symbol('TrayIcon internal construction'); + +export class TrayIcon extends TypedEventEmitter { + readonly #handle: NativeHandle; + + constructor(); + /** @internal */ + constructor(token: typeof INTERNAL_TRAY_ICON, native: NativeTrayIcon); + constructor(token?: typeof INTERNAL_TRAY_ICON, native?: NativeTrayIcon) { + super(); + const wrappedNative = token === INTERNAL_TRAY_ICON && native !== undefined ? native : new nativeBinding.TrayIcon(); + this.#handle = new NativeHandle(wrappedNative, 'TrayIcon'); + wrappedNative._onTrayEvent((payload) => this.#dispatchNativeEvent(payload)); + } + + /** @internal */ + static fromNative(native: NativeTrayIcon): TrayIcon { + return new TrayIcon(INTERNAL_TRAY_ICON, native); + } + + /** @internal */ + #dispatchNativeEvent(payload: TrayEventPayload): void { + this.emit(payload.event, payload); + } + + protected unwrap(): NativeTrayIcon { + return this.#handle.unwrapForNative(); + } + + isDisposed(): boolean { + return this.#handle.isDisposed(); + } + + dispose(): void { + this.#handle.dispose(); + } + + [Symbol.dispose](): void { + this.dispose(); + } + + get id(): string { + return this.unwrap().id; + } + + setIcon(icon: Uint8Array | number[], width?: number | null, height?: number | null): void { + this.unwrap().setIcon(icon, width, height); + } + + removeIcon(): void { + this.unwrap().removeIcon(); + } + + setMenu(menu?: import('../js-bindings').MenuOptions | null): void { + this.unwrap().setMenu(menu); + } + + setTooltip(tooltip?: string | null): void { + this.unwrap().setTooltip(tooltip); + } + + setTitle(title?: string | null): void { + this.unwrap().setTitle(title); + } + + setVisible(visible: boolean): void { + this.unwrap().setVisible(visible); + } + + setIconAsTemplate(value: boolean): void { + this.unwrap().setIconAsTemplate(value); + } + + setShowMenuOnLeftClick(value: boolean): void { + this.unwrap().setShowMenuOnLeftClick(value); + } + + setShowMenuOnRightClick(value: boolean): void { + this.unwrap().setShowMenuOnRightClick(value); + } + + showMenu(): void { + this.unwrap().showMenu(); + } + + rect(): TrayRect | null { + return this.unwrap().rect(); + } +} + +export type { TrayIconOptions }; diff --git a/lib/types/application.ts b/lib/types/application.ts new file mode 100644 index 0000000..49478ff --- /dev/null +++ b/lib/types/application.ts @@ -0,0 +1,22 @@ +import type { ApplicationEvent as NativeApplicationEvent } from '../../js-bindings'; + +export type { ApplicationOptions, ApplicationRunOptions, MenuOptions } from '../../js-bindings'; + +export interface ApplicationEventMap { + 'window-close-requested': NativeApplicationEvent; + 'application-close-requested': NativeApplicationEvent; + 'custom-menu-click': NativeApplicationEvent; + ready: NativeApplicationEvent; +} + +export type ApplicationWhenReadyOptions = + | { + autoRun?: true; + interval?: number; + ref?: boolean; + } + | { + autoRun: false; + interval?: never; + ref?: never; + }; diff --git a/lib/types/browser-window.ts b/lib/types/browser-window.ts new file mode 100644 index 0000000..85aeb7e --- /dev/null +++ b/lib/types/browser-window.ts @@ -0,0 +1,109 @@ +import type { CustomProtocolResponse, WebviewEventPayload, WebviewNewWindowFeatures } from '../../js-bindings'; + +export type { BrowserWindowOptions, CustomProtocolResponse, FileDialogOptions } from '../../js-bindings'; + +export interface WindowMoveEvent { + event: string; + x: number; + y: number; +} + +export interface WindowResizeEvent { + event: string; + width: number; + height: number; +} + +export interface WindowMouseEvent { + event: string; + x: number; + y: number; + button?: number; + modifiers?: number; +} + +export interface WindowScrollEvent { + event: string; + deltaX: number; + deltaY: number; +} + +export interface WindowBaseEvent { + event: string; +} + +export interface BrowserWindowCloseEvent extends WindowBaseEvent { + readonly event: 'close'; + readonly defaultPrevented: boolean; + preventDefault(): void; +} + +export interface WindowKeyEvent { + event: string; + key?: string; + code?: string; + modifiers?: number; + isRepeat?: boolean; +} + +export interface WindowFileEvent { + event: string; + files?: string[]; +} + +export interface WindowScaleEvent { + event: string; + scaleFactor: number; +} + +export interface WindowThemeEvent { + event: string; + text: 'light' | 'dark'; +} + +export interface WindowImeEvent { + event: string; + text?: string; + phase: 'enabled' | 'preedit' | 'commit' | 'disabled'; +} + +export interface WindowTouchEvent { + event: string; + x: number; + y: number; + touchId: number; + phase: 'started' | 'moved' | 'ended' | 'cancelled'; +} + +export interface BrowserWindowEventMap { + move: WindowMoveEvent; + resize: WindowResizeEvent; + close: BrowserWindowCloseEvent; + focus: WindowBaseEvent; + blur: WindowBaseEvent; + 'mouse-enter': WindowMouseEvent; + 'mouse-leave': WindowBaseEvent; + 'mouse-move': WindowMouseEvent; + 'mouse-down': WindowMouseEvent; + 'mouse-up': WindowMouseEvent; + scroll: WindowScrollEvent; + 'key-down': WindowKeyEvent; + 'key-up': WindowKeyEvent; + 'file-drop': WindowFileEvent; + 'file-hover': WindowFileEvent; + 'file-hover-cancelled': WindowBaseEvent; + 'scale-factor-changed': WindowScaleEvent; + 'theme-changed': WindowThemeEvent; + ime: WindowImeEvent; + touch: WindowTouchEvent; +} + +export type BrowserWindowProtocolHandler = ( + request: Request, +) => Response | CustomProtocolResponse | Promise; + +export interface PublicNewWindowEvent extends WebviewEventPayload { + event: 'new-window'; + target?: 'new-window'; + windowFeatures?: WebviewNewWindowFeatures; +} diff --git a/lib/types/events.ts b/lib/types/events.ts new file mode 100644 index 0000000..3987601 --- /dev/null +++ b/lib/types/events.ts @@ -0,0 +1,70 @@ +import { EventEmitter } from 'node:events'; + +export type EventListener = (payload: TPayload) => void; + +/** EventEmitter methods with payloads inferred from a public event map. */ +export class TypedEventEmitter extends EventEmitter { + on(event: K, listener: EventListener): this; + override on(event: string | symbol, listener: (...args: any[]) => void): this; + override on(event: string | symbol, listener: (...args: any[]) => void): this { + super.on(event, listener); + return this; + } + + once(event: K, listener: EventListener): this; + override once(event: string | symbol, listener: (...args: any[]) => void): this; + override once(event: string | symbol, listener: (...args: any[]) => void): this { + super.once(event, listener); + return this; + } + + off(event: K, listener: EventListener): this; + override off(event: string | symbol, listener: (...args: any[]) => void): this; + override off(event: string | symbol, listener: (...args: any[]) => void): this { + super.off(event, listener); + return this; + } + + addListener(event: K, listener: EventListener): this; + override addListener(event: string | symbol, listener: (...args: any[]) => void): this; + override addListener(event: string | symbol, listener: (...args: any[]) => void): this { + super.addListener(event, listener); + return this; + } + + removeListener(event: K, listener: EventListener): this; + override removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + override removeListener(event: string | symbol, listener: (...args: any[]) => void): this { + super.removeListener(event, listener); + return this; + } + + override removeAllListeners(event?: string | symbol): this { + super.removeAllListeners(event); + return this; + } + + listenerCount(event: K, listener?: EventListener): number; + override listenerCount(event: string | symbol, listener?: (...args: any[]) => void): number; + override listenerCount(event: string | symbol, listener?: (...args: any[]) => void): number { + return super.listenerCount(event, listener); + } + + listeners(event: K): Array<(...args: any[]) => void>; + override listeners(event: string | symbol): Array<(...args: any[]) => void>; + override listeners(event: string | symbol): Array<(...args: any[]) => void> { + return super.listeners(event); + } + + rawListeners(event: K): Array<(...args: any[]) => void>; + override rawListeners(event: string | symbol): Array<(...args: any[]) => void>; + override rawListeners(event: string | symbol): Array<(...args: any[]) => void> { + return super.rawListeners(event); + } + + emit(event: K, payload: TEventMap[K]): boolean; + override emit(event: string | symbol, ...args: any[]): boolean; + override emit(event: string | symbol, ...args: any[]): boolean { + return super.emit(event, ...args); + } +} diff --git a/lib/types/tray-icon.ts b/lib/types/tray-icon.ts new file mode 100644 index 0000000..8b8670c --- /dev/null +++ b/lib/types/tray-icon.ts @@ -0,0 +1,9 @@ +import type { TrayEventPayload } from '../../js-bindings'; + +export type TrayEventMap = { + click: TrayEventPayload; + 'double-click': TrayEventPayload; + enter: TrayEventPayload; + move: TrayEventPayload; + leave: TrayEventPayload; +}; diff --git a/lib/types/webview.ts b/lib/types/webview.ts new file mode 100644 index 0000000..aef60d4 --- /dev/null +++ b/lib/types/webview.ts @@ -0,0 +1,54 @@ +import type { + WebviewEventPayload, + WebviewNewWindowFeatures, + WebviewOptions as NativeWebviewOptions, +} from '../../js-bindings'; + +export type { IpcMessage, WebviewBounds, WebviewCookie } from '../../js-bindings'; + +export type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }; +export type ExposedTarget = object; + +export interface WebviewOptions extends Omit< + NativeWebviewOptions, + 'webContext' | 'navigationHandler' | 'newWindowHandler' +> { + webContext?: import('../web-context').WebContext | null; + navigationHandler?: (url: string) => boolean; + newWindowHandler?: (event: WebviewNewWindowEvent) => boolean; +} + +export interface WebviewPageLoadEvent extends WebviewEventPayload { + event: string; +} + +export interface WebviewTitleChangedEvent extends WebviewEventPayload { + event: string; +} + +export interface WebviewDownloadEvent extends WebviewEventPayload { + event: string; +} + +export interface WebviewDownloadStartedEvent extends WebviewDownloadEvent {} + +export interface WebviewNavigationEvent extends WebviewEventPayload { + event: 'navigation'; + target: 'current'; +} + +export interface WebviewNewWindowEvent extends WebviewEventPayload { + event: 'new-window'; + target: 'new-window'; + windowFeatures?: WebviewNewWindowFeatures; +} + +export interface WebviewEventMap { + 'page-load-started': WebviewPageLoadEvent; + 'page-load-finished': WebviewPageLoadEvent; + 'title-changed': WebviewTitleChangedEvent; + 'download-started': WebviewDownloadStartedEvent; + 'download-completed': WebviewDownloadEvent; + navigation: WebviewNavigationEvent; + 'new-window': WebviewNewWindowEvent; +} diff --git a/lib/web-context.ts b/lib/web-context.ts new file mode 100644 index 0000000..602b75c --- /dev/null +++ b/lib/web-context.ts @@ -0,0 +1,38 @@ +import { nativeBinding, type NativeWebContext } from './internal/native-binding'; +import { NativeHandle } from './internal/native-handle'; + +const INTERNAL_WEB_CONTEXT = Symbol('WebContext internal construction'); + +export class WebContext extends NativeHandle { + constructor(); + /** @internal */ + constructor(token: typeof INTERNAL_WEB_CONTEXT, native: NativeWebContext); + constructor(token?: typeof INTERNAL_WEB_CONTEXT, native?: NativeWebContext) { + super( + token === INTERNAL_WEB_CONTEXT && native !== undefined ? native : new nativeBinding.WebContext(), + 'WebContext', + ); + } + + /** @internal */ + static fromNative(native: NativeWebContext): WebContext { + return new WebContext(INTERNAL_WEB_CONTEXT, native); + } + + get dataDirectory(): string | null { + return this.unwrap().dataDirectory; + } + + isCustomProtocolRegistered(scheme: string): boolean { + return this.unwrap().isCustomProtocolRegistered(scheme); + } + + setAllowsAutomation(flag: boolean): void { + this.unwrap().setAllowsAutomation(flag); + } + + /** @internal */ + unwrapForNative(): NativeWebContext { + return this.unwrap(); + } +} diff --git a/lib/webview.ts b/lib/webview.ts new file mode 100644 index 0000000..e4756d3 --- /dev/null +++ b/lib/webview.ts @@ -0,0 +1,168 @@ +import type { HeaderData, IpcMessage, WebviewBounds, WebviewCookie, WebviewEventPayload } from '../js-bindings'; +import { nativeBinding, type NativeWebview } from './internal/native-binding'; +import { NativeHandle } from './internal/native-handle'; +import { WebviewIpcBridge, type IpcMessageHandler } from './internal/ipc/ipc-bridge'; +import type { ExposedTarget, WebviewEventMap } from './types/webview'; +import { TypedEventEmitter } from './types/events'; + +const INTERNAL_WEBVIEW = Symbol('Webview internal construction'); +type ScriptResultHandler = (error: Error | null, result: string) => void; + +export class Webview extends TypedEventEmitter { + readonly #handle: NativeHandle; + readonly #ipc: WebviewIpcBridge; + + constructor(); + /** @internal */ + constructor(token: typeof INTERNAL_WEBVIEW, native: NativeWebview); + constructor(token?: typeof INTERNAL_WEBVIEW, native?: NativeWebview) { + super(); + const wrappedNative = token === INTERNAL_WEBVIEW && native !== undefined ? native : new nativeBinding.Webview(); + this.#handle = new NativeHandle(wrappedNative, 'Webview'); + this.#ipc = new WebviewIpcBridge(wrappedNative, () => this.isDisposed()); + } + + /** @internal */ + static fromNative(native: NativeWebview): Webview { + return new Webview(INTERNAL_WEBVIEW, native); + } + + isDisposed(): boolean { + return this.#handle.isDisposed(); + } + + dispose(): void { + if (this.isDisposed()) { + return; + } + this.#ipc.dispose(); + this.#handle.dispose(); + } + + [Symbol.dispose](): void { + this.dispose(); + } + + protected unwrap(): NativeWebview { + return this.#handle.unwrapForNative(); + } + + /** @internal */ + dispatchNativeEvent(payload: WebviewEventPayload): void { + this.emit(payload.event, payload); + } + + onIpcMessage(handler?: IpcMessageHandler | null): void { + this.#ipc.setUserHandler(handler); + } + + expose(name: string, target: ExposedTarget): void { + this.#ipc.expose(name, target); + } + + print(): void { + this.unwrap().print(); + } + + zoom(scaleFactor: number): void { + this.unwrap().zoom(scaleFactor); + } + + setWebviewVisibility(visible: boolean): void { + this.unwrap().setWebviewVisibility(visible); + } + + isDevtoolsOpen(): boolean { + return this.unwrap().isDevtoolsOpen(); + } + + openDevtools(): void { + this.unwrap().openDevtools(); + } + + closeDevtools(): void { + this.unwrap().closeDevtools(); + } + + loadUrl(url: string): void { + this.unwrap().loadUrl(url); + } + + loadHtml(html: string): void { + this.unwrap().loadHtml(html); + } + + evaluateScript(js: string): void { + this.unwrap().evaluateScript(js); + } + + evaluateScriptWithCallback(js: string, callback: ScriptResultHandler): void { + this.unwrap().evaluateScriptWithCallback(js, callback); + } + + reload(): void { + this.unwrap().reload(); + } + + url(): string | null { + return this.unwrap().url(); + } + + get width(): number | null { + return this.unwrap().width; + } + + get height(): number | null { + return this.unwrap().height; + } + + get x(): number | null { + return this.unwrap().x; + } + + get y(): number | null { + return this.unwrap().y; + } + + loadUrlWithHeaders(url: string, headers: HeaderData[]): void { + this.unwrap().loadUrlWithHeaders(url, headers); + } + + getCookies(url?: string | null): WebviewCookie[] { + return this.unwrap().getCookies(url); + } + + setCookie(cookie: WebviewCookie): void { + this.unwrap().setCookie(cookie); + } + + deleteCookie(name: string, domain?: string | null, path?: string | null): void { + this.unwrap().deleteCookie(name, domain, path); + } + + clearAllBrowsingData(): void { + this.unwrap().clearAllBrowsingData(); + } + + setBackgroundColor(r: number, g: number, b: number, a: number): void { + this.unwrap().setBackgroundColor(r, g, b, a); + } + + getBounds(): WebviewBounds | null { + return this.unwrap().getBounds(); + } + + setBounds(bounds: WebviewBounds): void { + this.unwrap().setBounds(bounds); + } + + focus(): void { + this.unwrap().focus(); + } + + focusParent(): void { + this.unwrap().focusParent(); + } +} + +export type { ExposedTarget, IpcMessage, WebviewEventMap }; diff --git a/package.json b/package.json index 9940c97..b1194af 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "webviewjs": "./cli/index.mjs" }, "description": "Robust cross-platform webview library for Node.js written in Rust. It also works with deno and bun.", - "main": "./index.js", - "types": "./index.d.ts", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "repository": "git@github.com:webviewjs/webview.git", "license": "MIT", "type": "commonjs", @@ -20,8 +20,7 @@ ], "files": [ "cli", - "index.d.ts", - "index.js", + "dist", "js-bindings.js", "js-bindings.d.ts", "docs" @@ -53,17 +52,23 @@ }, "scripts": { "artifacts": "napi artifacts", - "build": "node ./scripts/build.js --release", - "build:debug": "node ./scripts/build.js", + "build": "run-s build:native build:lib", + "build:native": "node ./scripts/build.js --release", + "build:lib": "tsc -p tsconfig.json", + "build:debug": "run-s build:native:debug build:lib", + "build:native:debug": "node ./scripts/build.js", "clean": "napi clean && cargo clean", "format": "run-p format:prettier format:rs", "format:prettier": "prettier . -w", "format:rs": "cargo fmt", "lint": "oxlint .", "lint:fix": "oxlint --fix .", - "test": "node --test __test__/*.test.*", - "test:watch": "node --test --watch __test__/*.test.*", - "prepublishOnly": "napi prepublish -t npm", + "test": "run-s build:lib test:node", + "test:node": "node --test __test__/*.test.*", + "test:watch": "run-s build:lib test:watch:node", + "test:watch:node": "node --test --watch __test__/*.test.*", + "prepublishOnly": "run-s build:lib prepublish:napi", + "prepublish:napi": "napi prepublish -t npm", "version": "napi version", "check": "cargo check", "clippy": "cargo clippy -- -D warnings", diff --git a/scripts/build.js b/scripts/build.js index 516a6b1..31d5cb9 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -1,8 +1,6 @@ const { spawnSync } = require('node:child_process'); const { dirname, join } = require('node:path'); -const postbuild = require('./postbuild'); - const cliPackageJson = require.resolve('@napi-rs/cli/package.json'); const napiCli = join(dirname(cliPackageJson), 'dist', 'cli.js'); const args = [ @@ -29,5 +27,3 @@ if (result.error) { if (result.status !== 0) { process.exit(result.status ?? 1); } - -postbuild(); diff --git a/scripts/postbuild.js b/scripts/postbuild.js deleted file mode 100644 index 988a4df..0000000 --- a/scripts/postbuild.js +++ /dev/null @@ -1,44 +0,0 @@ -const { readFileSync, writeFileSync } = require('node:fs'); - -const EXPORT_MARKER = '// Auto-generated exports by postbuild.js. Do not edit directly.'; - -function collectNativeExportNames(jsBindings) { - const names = []; - const seen = new Set(); - const matches = jsBindings.matchAll(/module\.exports\.(\w+)/g); - - for (const match of matches) { - const name = match[1]; - if (!seen.has(name)) { - seen.add(name); - names.push(name); - } - } - - return names; -} - -function buildIndexJs(nativeExportNames) { - const originalSource = readFileSync('./index.js', 'utf-8'); - const exportStatements = nativeExportNames - .map((name) => `module.exports.${name} = nativeBinding.${name};`) - .join('\n'); - - return `${originalSource.split(EXPORT_MARKER)[0].trimEnd()}\n -${EXPORT_MARKER} -${exportStatements} -`; -} - -function postbuild() { - const jsBindings = readFileSync('./js-bindings.js', 'utf-8'); - const nativeExportNames = collectNativeExportNames(jsBindings); - - writeFileSync('./index.js', buildIndexJs(nativeExportNames)); -} - -if (require.main === module) { - postbuild(); -} - -module.exports = postbuild; diff --git a/src/app.rs b/src/app.rs index caaa896..9634b56 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1031,8 +1031,8 @@ impl Application { } /// Pump the tao event loop once without blocking. Returns `true` while - /// the app is alive, `false` when it should stop. Drive this from a JS - /// `setInterval` via the `run()` wrapper in `index.js`. + /// the app is alive, `false` when it should stop. Drive this from the + /// public JavaScript Application.run() wrapper. #[napi] pub fn pump_events(&mut self) -> bool { use tao::event::Event; diff --git a/tsconfig.json b/tsconfig.json index b283acb..30fd054 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,17 @@ { "compilerOptions": { - "target": "ESNext", - "strict": true, + "target": "ES2022", "module": "CommonJS", + "moduleResolution": "Node", + "rootDir": "./lib", + "outDir": "./dist", + "strict": true, + "declaration": true, + "sourceMap": true, + "skipLibCheck": true, "types": ["node"], - "noUnusedLocals": true, - "noUnusedParameters": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true + "lib": ["ES2022", "DOM"], + "stripInternal": true }, - "include": ["."], - "exclude": ["node_modules", "bench", "__test__"] + "include": ["lib/**/*.ts"] } From 21fe9cc7068abe4d797756603b0eb7554d957f37 Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Thu, 1 Oct 2026 20:19:07 +0545 Subject: [PATCH 02/15] refactor(api): augment native classes with JS behavior - Preserve native NAPI classes as public runtime objects - Move lifecycle, events, protocol, IPC, and disposal into augmentations - Update bridge tests for native prototype integration --- AGENTS.md | 3 +- __test__/bridge.test.mjs | 149 +++++--- lib/application.ts | 136 ------- lib/application/lifecycle.ts | 96 +++++ lib/augmentations.ts | 41 +++ lib/browser-window.ts | 438 ----------------------- lib/browser-window/create-webview.ts | 45 +++ lib/browser-window/events.ts | 30 ++ lib/browser-window/protocol.ts | 7 + lib/index.ts | 21 +- lib/install.ts | 52 +++ lib/internal/events/event-emitter.ts | 100 ++++++ lib/internal/ipc/ipc-bridge.ts | 57 ++- lib/internal/native-binding.ts | 9 - lib/internal/native-handle.ts | 42 --- lib/internal/protocol/protocol-bridge.ts | 14 +- lib/notification.ts | 26 +- lib/tray-icon.ts | 97 ----- lib/tray-icon/events.ts | 19 + lib/types/events.ts | 73 +--- lib/types/webview.ts | 3 +- lib/web-context.ts | 38 -- lib/webview.ts | 168 --------- package.json | 6 +- scripts/clean-lib.js | 3 + 25 files changed, 581 insertions(+), 1092 deletions(-) delete mode 100644 lib/application.ts create mode 100644 lib/application/lifecycle.ts create mode 100644 lib/augmentations.ts delete mode 100644 lib/browser-window.ts create mode 100644 lib/browser-window/create-webview.ts create mode 100644 lib/browser-window/events.ts create mode 100644 lib/browser-window/protocol.ts create mode 100644 lib/install.ts create mode 100644 lib/internal/events/event-emitter.ts delete mode 100644 lib/internal/native-binding.ts delete mode 100644 lib/internal/native-handle.ts delete mode 100644 lib/tray-icon.ts create mode 100644 lib/tray-icon/events.ts delete mode 100644 lib/web-context.ts delete mode 100644 lib/webview.ts create mode 100644 scripts/clean-lib.js diff --git a/AGENTS.md b/AGENTS.md index 4d0225f..3bc15e4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,7 +21,7 @@ docs/ GitHub Pages site (served at webview.js.org) examples/ Runnable .mjs examples npm/ Per-platform NAPI binary packages scripts/ Build helpers -lib/ Handwritten TypeScript public API and internal bridges +lib/ Handwritten TypeScript public API augmentations and internal bridges dist/ Compiled CommonJS library and generated declarations __test__/ Node.js built-in test runner tests js-bindings.js / js-bindings.d.ts Lower-level generated bindings @@ -54,6 +54,7 @@ cargo clippy # Rust lints ## Key conventions - Handwritten public library source belongs in lib/; tsc writes CommonJS and declarations to dist/. +- Native NAPI classes remain the public runtime objects. TypeScript explicitly augments them with JS-only lifecycle, event, protocol, and IPC behavior. - Do not edit js-bindings.js or js-bindings.d.ts; NAPI-RS generates them from Rust source. - CLI files (`cli/*.mjs`) are plain ESM — no build step, shipped as-is. - Tests live in `__test__/` and use `node:test` (not Jest/Vitest/AVA). diff --git a/__test__/bridge.test.mjs b/__test__/bridge.test.mjs index 00a784c..4651ba6 100644 --- a/__test__/bridge.test.mjs +++ b/__test__/bridge.test.mjs @@ -19,7 +19,7 @@ const flush = () => new Promise((resolve) => setImmediate(resolve)); function protocolWindow() { let window; - const native = { + window = Object.assign(Object.create(BrowserWindow.prototype), { completed: [], callbacks: new Map(), preventCalls: 0, @@ -47,11 +47,7 @@ function protocolWindow() { dispose() { this.disposed = true; }, - }; - window = BrowserWindow.fromNative(native); - for (const property of ['completed', 'callbacks', 'preventCalls', 'windowEventCallback', 'hidden']) { - Object.defineProperty(window, property, { get: () => native[property] }); - } + }); return window; } @@ -91,20 +87,12 @@ function exposedWebview() { this.scripts.push(script); }, }; - const webview = Webview.fromNative(native); - Object.defineProperties(webview, { - scripts: { get: () => native.scripts }, - ipcCallback: { get: () => native.ipcCallback }, - exposed: { get: () => native.exposed }, - emitExposeCall: { - value: (call) => native.emitExposeCall(call), - }, - }); + const webview = Object.assign(Object.create(Webview.prototype), native); return webview; } function eventApplication() { - const native = { + const app = Object.assign(Object.create(Application.prototype), { ready: false, onEvent(callback) { this.applicationEventCallback = callback; @@ -132,9 +120,7 @@ function eventApplication() { throw new Error('not used in this test'); }, setMenu() {}, - }; - const app = Application.fromNative(native); - Object.defineProperty(app, 'applicationEventCallback', { get: () => native.applicationEventCallback }); + }); return app; } @@ -334,15 +320,83 @@ test('BrowserWindow close cancellation permits reentrant hide calls', () => { assert.equal(window.hidden, true); }); -test('loading the public package leaves generated NAPI class prototypes untouched', () => { - for (const [name, descriptors] of prototypeSignatures) { - assert.deepEqual(Object.getOwnPropertyDescriptors(nativeBinding[name].prototype), descriptors, name); +test('public classes are native objects with only explicit JS augmentations', () => { + assert.equal(Application, nativeBinding.Application); + assert.equal(BrowserWindow, nativeBinding.BrowserWindow); + assert.equal(Webview, nativeBinding.Webview); + assert.equal(WebContext, nativeBinding.WebContext); + assert.equal(TrayIcon, nativeBinding.TrayIcon); + + for (const [className, methodName] of [ + ['BrowserWindow', 'setTitle'], + ['BrowserWindow', 'getWaylandSurface'], + ['Webview', 'loadUrl'], + ['TrayIcon', 'setTooltip'], + ['WebContext', 'setAllowsAutomation'], + ]) { + const before = prototypeSignatures.get(className)[methodName]; + const after = Object.getOwnPropertyDescriptor(nativeBinding[className].prototype, methodName); + assert.deepEqual(after, before, `${className}.${methodName} remains native`); + } + + const emitterMethods = [ + 'on', + 'once', + 'off', + 'addListener', + 'removeListener', + 'removeAllListeners', + 'listenerCount', + 'listeners', + 'rawListeners', + 'emit', + 'eventNames', + ]; + const addedMembers = new Map([ + ['Application', [...emitterMethods, 'stop', 'whenReady']], + ['BrowserWindow', [...emitterMethods, 'registerProtocol']], + ['Webview', [...emitterMethods, 'expose']], + ['TrayIcon', emitterMethods], + ['WebContext', []], + ]); + const replacedMembers = new Map([ + ['Application', ['bind', 'onEvent', 'run']], + ['BrowserWindow', ['createWebview']], + ['Webview', ['dispose', 'onIpcMessage']], + ['TrayIcon', []], + ['WebContext', []], + ]); + for (const [name, original] of prototypeSignatures) { + const prototype = nativeBinding[name].prototype; + const addedNames = Object.getOwnPropertyNames(prototype) + .filter((member) => !Object.hasOwn(original, member)) + .sort(); + assert.deepEqual(addedNames, [...addedMembers.get(name)].sort(), `${name} added members`); + + for (const member of Object.keys(original)) { + if (!replacedMembers.get(name).includes(member)) { + assert.deepEqual(Object.getOwnPropertyDescriptor(prototype, member), original[member], `${name}.${member}`); + } + } + + const addedSymbols = Object.getOwnPropertySymbols(prototype).filter((symbol) => !Object.hasOwn(original, symbol)); + assert.deepEqual(addedSymbols, [Symbol.dispose], `${name} symbol additions`); } - assert.notEqual(BrowserWindow, nativeBinding.BrowserWindow); - assert.notEqual(Application, nativeBinding.Application); - assert.notEqual(Webview, nativeBinding.Webview); - assert.notEqual(WebContext, nativeBinding.WebContext); - assert.notEqual(TrayIcon, nativeBinding.TrayIcon); + + for (const [type, method] of [ + [Application, 'whenReady'], + [Application, 'stop'], + [BrowserWindow, 'registerProtocol'], + [Webview, 'expose'], + [Webview, 'on'], + [TrayIcon, 'on'], + ]) { + assert.equal(typeof type.prototype[method], 'function', `${type.name}.${method}`); + } + for (const type of [Application, BrowserWindow, Webview, WebContext, TrayIcon]) { + assert.equal(typeof type.prototype[Symbol.dispose], 'function', `${type.name}[Symbol.dispose]`); + } + assert.equal(webviewjs.JsWebview, Webview); assert.equal(webviewjs.JsWebContext, WebContext); assert.equal(webviewjs.JsTrayIcon, TrayIcon); @@ -359,8 +413,7 @@ test('TrayIcon forwards native tray events through the shared EventEmitter adapt }, dispose() {}, }; - const tray = TrayIcon.fromNative(native); - Object.defineProperty(tray, 'trayEventCallback', { get: () => native.trayEventCallback }); + const tray = Object.assign(Object.create(TrayIcon.prototype), native); const received = []; TrayIcon.prototype.once.call(tray, 'click', (event) => received.push(event)); @@ -428,7 +481,7 @@ test('Application dispose exits the native application', () => { test('createWebview forwards navigationHandler and uses its decision', async () => { const creations = []; - const nativeWindow = { + const nativeWindow = Object.assign(Object.create(BrowserWindow.prototype), { isDisposed: () => false, dispose() {}, _onWindowEvent() {}, @@ -442,27 +495,26 @@ test('createWebview forwards navigationHandler and uses its decision', async () navigationAllowed: navigationHandler?.(url) ?? true, }; creations.push(creation); - return { + return Object.assign(Object.create(Webview.prototype), { dispose() {}, isDisposed: () => false, onIpcMessage() {}, _exposeInternal() {}, evaluateScript() {}, - }; + }); }, - }; - const nativeContext = { + }); + const context = { dataDirectory: '/profile', isCustomProtocolRegistered: () => false, setAllowsAutomation() {}, dispose() {}, isDisposed: () => false, }; - const context = WebContext.fromNative(nativeContext); - const window = BrowserWindow.fromNative(nativeWindow); + const window = nativeWindow; const navigationUrls = []; - const firstWebview = window.createWebview({ + const firstWebview = BrowserWindow.prototype.createWebview.call(window, { url: 'app://first', webContext: context, navigationHandler(url) { @@ -471,7 +523,7 @@ test('createWebview forwards navigationHandler and uses its decision', async () }, newWindowHandler: () => true, }); - const secondWebview = window.createWebview({ + const secondWebview = BrowserWindow.prototype.createWebview.call(window, { url: 'app://second', navigationHandler() { return true; @@ -481,7 +533,7 @@ test('createWebview forwards navigationHandler and uses its decision', async () assert.deepEqual(navigationUrls, ['app://blocked']); assert.equal(creations[0].navigationAllowed, false); assert.equal(creations[1].navigationAllowed, true); - assert.equal(creations[0].webContext, nativeContext); + assert.equal(creations[0].webContext, context); assert.deepEqual(creations[0].options, { url: 'app://first' }); assert.equal(typeof creations[0].newWindowHandler, 'function'); assert.equal(creations[0].newWindowHandler({ event: 'new-window', url: 'app://popup' }), true); @@ -745,8 +797,8 @@ test('native notifications are isolated and mobile-safe', async () => { }); test('Notification converts native events and supports EventEmitter plus DOM handlers', () => { - const bindingModule = requireFromTest('../dist/internal/native-binding.js'); - const originalNativeNotification = bindingModule.nativeBinding.NativeNotification; + const nativeBindings = requireFromTest('../js-bindings.js'); + const originalNativeNotification = nativeBindings.NativeNotification; let nativeNotification; class MockNativeNotification { constructor(options, callback) { @@ -756,7 +808,7 @@ test('Notification converts native events and supports EventEmitter plus DOM han } close() {} } - bindingModule.nativeBinding.NativeNotification = MockNativeNotification; + nativeBindings.NativeNotification = MockNativeNotification; try { const notification = new Notification('Title', { @@ -785,11 +837,11 @@ test('Notification converts native events and supports EventEmitter plus DOM han nativeNotification.callback(new Error('native failure'), undefined); assert.equal(nativeError.message, 'native failure'); } finally { - bindingModule.nativeBinding.NativeNotification = originalNativeNotification; + nativeBindings.NativeNotification = originalNativeNotification; } }); -test('root-created wrappers expose explicit disposal', () => { +test('native resource classes expose explicit Symbol.dispose integration', () => { for (const type of [BrowserWindow, Webview, WebContext, TrayIcon]) { assert.equal(typeof type.prototype.dispose, 'function', `${type.name}.dispose`); } @@ -815,9 +867,10 @@ test('README uses standard responses, EventEmitter events, and strong-reference }); test('webview event callback handles the ThreadsafeFunction error-first signature', async () => { - const source = await readFile(new URL('../lib/browser-window.ts', import.meta.url), 'utf8'); + const source = await readFile(new URL('../lib/browser-window/create-webview.ts', import.meta.url), 'utf8'); - assert.match(source, /const eventHandler = \(error: Error \| null, payload: WebviewEventPayload\)/); + assert.match(source, /type NativeEventHandler = \(error: Error \| null, payload: WebviewEventPayload\)/); + assert.match(source, /const eventHandler: NativeEventHandler = \(error, payload\)/); assert.match(source, /if \(error\) \{\s+throw error;/); assert.doesNotMatch(source, /_setPendingWebview(?:EventCallback|NavigationHandler)|_clearPendingWebviewHandlers/); }); @@ -1149,7 +1202,7 @@ test('expose still works after clearing a user IPC handler', async () => { }); test('expose and IPC methods reject disposed webviews', () => { - const webview = Webview.fromNative({ + const webview = Object.assign(Object.create(Webview.prototype), { isDisposed: () => true, dispose() {}, onIpcMessage() {}, @@ -1172,7 +1225,7 @@ test('expose ignores pending results after Webview disposal', async () => { }); webview.emitExposeCall({ ns: 'native', method: 'pending', id: 20, args: [] }); await flush(); - webview.dispose(); + Webview.prototype.dispose.call(webview); finish('late'); await flush(); assert.deepEqual(webview.scripts, []); diff --git a/lib/application.ts b/lib/application.ts deleted file mode 100644 index 72c46fa..0000000 --- a/lib/application.ts +++ /dev/null @@ -1,136 +0,0 @@ -import type { - ApplicationEvent, - ApplicationOptions, - ApplicationRunOptions, - BrowserWindowOptions, - MenuOptions, - TrayIconOptions, - WebContextOptions, -} from '../js-bindings'; -import { nativeBinding, type NativeApplication } from './internal/native-binding'; -import { ApplicationEventLoop } from './internal/application/event-loop'; -import { BrowserWindow } from './browser-window'; -import { TrayIcon } from './tray-icon'; -import { WebContext } from './web-context'; -import type { ApplicationEventMap, ApplicationWhenReadyOptions } from './types/application'; -import { TypedEventEmitter } from './types/events'; - -const INTERNAL_APPLICATION = Symbol('Application internal construction'); - -export class Application extends TypedEventEmitter { - readonly #native: NativeApplication; - readonly #eventLoop: ApplicationEventLoop; - #legacyEventHandler: ((event: ApplicationEvent) => void) | null = null; - - constructor(options?: ApplicationOptions | null); - /** @internal */ - constructor(token: typeof INTERNAL_APPLICATION, native: NativeApplication); - constructor(optionsOrToken?: ApplicationOptions | null | typeof INTERNAL_APPLICATION, native?: NativeApplication) { - super(); - this.#native = - optionsOrToken === INTERNAL_APPLICATION - ? (native as NativeApplication) - : new nativeBinding.Application(optionsOrToken); - this.#eventLoop = new ApplicationEventLoop(() => this.#native.pumpEvents()); - this.#native.onEvent((event) => this.#dispatchNativeEvent(event)); - } - - /** @internal */ - static fromNative(native: NativeApplication): Application { - return new Application(INTERNAL_APPLICATION, native); - } - - #dispatchNativeEvent(event: ApplicationEvent): void { - this.emit(event.event, event); - this.#legacyEventHandler?.(event); - } - - onEvent(handler?: ((event: ApplicationEvent) => void) | null): void { - this.#legacyEventHandler = handler ?? null; - } - - bind(handler?: ((event: ApplicationEvent) => void) | null): void { - this.onEvent(handler); - } - - isReady(): boolean { - return this.#native.isReady(); - } - - exit(): void { - this.#native.exit(); - } - - createWebContext(options?: WebContextOptions | null): WebContext { - return WebContext.fromNative(this.#native.createWebContext(options)); - } - - createTrayIcon(options: TrayIconOptions): TrayIcon { - return TrayIcon.fromNative(this.#native.createTrayIcon(options)); - } - - createBrowserWindow(options?: BrowserWindowOptions | null): BrowserWindow { - return BrowserWindow.fromNative(this.#native.createBrowserWindow(options)); - } - - createChildBrowserWindow(options?: BrowserWindowOptions | null): BrowserWindow { - return BrowserWindow.fromNative(this.#native.createChildBrowserWindow(options)); - } - - setMenu(menuOptions?: MenuOptions | null): void { - this.#native.setMenu(menuOptions); - } - - pumpEvents(): boolean { - return this.#native.pumpEvents(); - } - - runSync(): void { - this.#native.runSync(); - } - - run(options?: ApplicationRunOptions | null): void { - this.#eventLoop.start(options as ApplicationRunOptions | undefined); - } - - stop(): void { - this.#eventLoop.stop(); - } - - whenReady(options: ApplicationWhenReadyOptions = {}): Promise { - const { autoRun = true, interval, ref } = options; - if (!autoRun) { - if (Object.prototype.hasOwnProperty.call(options, 'interval')) { - throw new TypeError('interval is not supported when autoRun is false'); - } - if (Object.prototype.hasOwnProperty.call(options, 'ref')) { - throw new TypeError('ref is not supported when autoRun is false'); - } - } - - const ready = this.isReady() - ? Promise.resolve() - : new Promise((resolve) => { - this.once('ready', resolve); - }); - - if (autoRun) { - const runOptions: ApplicationRunOptions = {}; - if (interval !== undefined) { - runOptions.interval = interval; - } - if (ref !== undefined) { - runOptions.ref = ref; - } - this.run(runOptions); - } - - return ready; - } - - [Symbol.dispose](): void { - this.exit(); - } -} - -export type { ApplicationEventMap, ApplicationOptions, ApplicationRunOptions, ApplicationWhenReadyOptions }; diff --git a/lib/application/lifecycle.ts b/lib/application/lifecycle.ts new file mode 100644 index 0000000..ba250c3 --- /dev/null +++ b/lib/application/lifecycle.ts @@ -0,0 +1,96 @@ +import { Application as NativeApplication } from '../../js-bindings'; +import type { Application, ApplicationEvent, ApplicationRunOptions } from '../../js-bindings'; +import { ApplicationEventLoop } from '../internal/application/event-loop'; +import { emitEvent, eventEmitterFor } from '../internal/events/event-emitter'; +import type { ApplicationWhenReadyOptions } from '../types/application'; + +interface ApplicationState { + eventLoop: ApplicationEventLoop; + legacyEventHandler: ((event: ApplicationEvent) => void) | null; + nativeEventsInstalled: boolean; +} + +const states = new WeakMap(); +const nativeOnEvent = NativeApplication.prototype.onEvent; + +function stateFor(application: Application): ApplicationState { + let state = states.get(application); + if (state === undefined) { + state = { + eventLoop: new ApplicationEventLoop(() => application.pumpEvents()), + legacyEventHandler: null, + nativeEventsInstalled: false, + }; + states.set(application, state); + } + return state; +} + +export function ensureApplicationEvents(target: object): void { + const application = target as Application; + const state = stateFor(application); + if (state.nativeEventsInstalled) { + return; + } + + state.nativeEventsInstalled = true; + const subscribe = Object.hasOwn(application, 'onEvent') ? application.onEvent : nativeOnEvent; + subscribe.call(application, (event) => { + emitEvent(application, event.event, event); + state.legacyEventHandler?.(event); + }); + eventEmitterFor(application); +} + +export function onEvent(this: Application, handler?: ((event: ApplicationEvent) => void) | null): void { + stateFor(this).legacyEventHandler = handler ?? null; + ensureApplicationEvents(this); +} + +export function bind(this: Application, handler?: ((event: ApplicationEvent) => void) | null): void { + onEvent.call(this, handler); +} + +export function run(this: Application, options?: ApplicationRunOptions | null): void { + ensureApplicationEvents(this); + stateFor(this).eventLoop.start(options ?? undefined); +} + +export function stop(this: Application): void { + stateFor(this).eventLoop.stop(); +} + +export function whenReady(this: Application, options: ApplicationWhenReadyOptions = {}): Promise { + const { autoRun = true, interval, ref } = options; + if (!autoRun) { + if (Object.prototype.hasOwnProperty.call(options, 'interval')) { + throw new TypeError('interval is not supported when autoRun is false'); + } + if (Object.prototype.hasOwnProperty.call(options, 'ref')) { + throw new TypeError('ref is not supported when autoRun is false'); + } + } + + const ready = this.isReady() + ? Promise.resolve() + : new Promise((resolve) => { + this.once('ready', () => resolve()); + }); + + if (autoRun) { + const runOptions: ApplicationRunOptions = {}; + if (interval !== undefined) { + runOptions.interval = interval; + } + if (ref !== undefined) { + runOptions.ref = ref; + } + this.run(runOptions); + } + + return ready; +} + +export function disposeApplication(this: Application): void { + this.exit(); +} diff --git a/lib/augmentations.ts b/lib/augmentations.ts new file mode 100644 index 0000000..ba13538 --- /dev/null +++ b/lib/augmentations.ts @@ -0,0 +1,41 @@ +import type { EventEmitter } from 'node:events'; +import type { ApplicationRunOptions } from '../js-bindings'; +import type { ApplicationEventMap, ApplicationWhenReadyOptions } from './types/application'; +import type { BrowserWindowEventMap, BrowserWindowProtocolHandler } from './types/browser-window'; +import type { NodeEventMap } from './internal/events/event-emitter'; +import type { TrayEventMap } from './types/tray-icon'; +import type { ExposedTarget, WebviewEventMap, WebviewOptions as PublicWebviewOptions } from './types/webview'; +import type { ApplicationEvent, IpcMessage } from '../js-bindings'; + +declare module '../js-bindings' { + interface Application extends EventEmitter> { + run(options?: ApplicationRunOptions | null): void; + stop(): void; + whenReady(options?: ApplicationWhenReadyOptions): Promise; + onEvent(handler?: ((event: ApplicationEvent) => void) | null): void; + bind(handler?: ((event: ApplicationEvent) => void) | null): void; + [Symbol.dispose](): void; + } + + interface BrowserWindow extends EventEmitter> { + registerProtocol(name: string, handler: BrowserWindowProtocolHandler): void; + createWebview(options?: PublicWebviewOptions | null): Webview; + [Symbol.dispose](): void; + } + + interface Webview extends EventEmitter> { + onIpcMessage(handler?: ((message: IpcMessage) => void) | null): void; + expose(name: string, target: ExposedTarget): void; + [Symbol.dispose](): void; + } + + interface TrayIcon extends EventEmitter> { + [Symbol.dispose](): void; + } + + interface WebContext { + [Symbol.dispose](): void; + } +} + +export {}; diff --git a/lib/browser-window.ts b/lib/browser-window.ts deleted file mode 100644 index c7ff4fb..0000000 --- a/lib/browser-window.ts +++ /dev/null @@ -1,438 +0,0 @@ -import type { - AndroidContentRect, - CursorType, - Dimensions, - FileDialogOptions, - FullscreenType, - IosValidOrientations, - JsProgressBar, - Monitor, - Position, - Theme, - WebviewEventPayload, - WebviewNewWindowFeatures, - WindowEventPayload, -} from '../js-bindings'; -import type { NativeBrowserWindow } from './internal/native-binding'; -import { NativeHandle } from './internal/native-handle'; -import { ProtocolBridge } from './internal/protocol/protocol-bridge'; -import { BrowserWindowCloseEvent } from './internal/events/browser-window-close-event'; -import type { BrowserWindowProtocolHandler, BrowserWindowEventMap } from './types/browser-window'; -import { TypedEventEmitter } from './types/events'; -import { Webview } from './webview'; -import type { WebviewEventMap, WebviewOptions, WebviewNewWindowEvent } from './types/webview'; - -export class BrowserWindow extends TypedEventEmitter { - readonly #handle: NativeHandle; - readonly #protocolBridge: ProtocolBridge; - - private constructor(native: NativeBrowserWindow) { - super(); - this.#handle = new NativeHandle(native, 'BrowserWindow'); - this.#protocolBridge = new ProtocolBridge(native, () => this.isDisposed()); - native._onWindowEvent((payload) => this.#dispatchWindowEvent(payload)); - } - - /** @internal */ - static fromNative(native: NativeBrowserWindow): BrowserWindow { - return new BrowserWindow(native); - } - - isDisposed(): boolean { - return this.#handle.isDisposed(); - } - - dispose(): void { - this.#handle.dispose(); - } - - [Symbol.dispose](): void { - this.dispose(); - } - - protected unwrap(): NativeBrowserWindow { - return this.#handle.unwrapForNative(); - } - - registerProtocol(name: string, handler: BrowserWindowProtocolHandler): void { - this.unwrap(); - this.#protocolBridge.register(name, handler); - } - - createWebview(options?: WebviewOptions | null): Webview { - const native = this.unwrap(); - const { webContext, navigationHandler, newWindowHandler, ...nativeOptions } = options ?? {}; - const nativeContext = webContext == null ? null : webContext.unwrapForNative(); - - let wrappedWebview: Webview | undefined; - const eventHandler = (error: Error | null, payload: WebviewEventPayload): void => { - if (error) { - throw error; - } - wrappedWebview?.dispatchNativeEvent(payload); - }; - const newWindowAdapter = newWindowHandler - ? (payload: WebviewEventPayload): boolean => newWindowHandler(payload as WebviewNewWindowEvent) - : null; - - const nativeWebview = native.createWebview( - nativeOptions, - nativeContext, - eventHandler, - navigationHandler ?? null, - newWindowAdapter, - ); - wrappedWebview = Webview.fromNative(nativeWebview); - return wrappedWebview; - } - - #dispatchWindowEvent(payload: WindowEventPayload): void { - if (payload.event !== 'close') { - this.emit(payload.event, payload); - return; - } - - const event = new BrowserWindowCloseEvent(payload, () => this.unwrap()._preventClose()); - try { - this.emit('close', event); - } finally { - event.finishDispatch(); - } - } - - get isChild(): boolean { - return this.unwrap().isChild; - } - - getNativeHandle(): bigint { - return this.unwrap().getNativeHandle(); - } - - isFocused(): boolean { - return this.unwrap().isFocused(); - } - - isVisible(): boolean { - return this.unwrap().isVisible(); - } - - isDecorated(): boolean { - return this.unwrap().isDecorated(); - } - - isClosable(): boolean { - return this.unwrap().isClosable(); - } - - isMaximizable(): boolean { - return this.unwrap().isMaximizable(); - } - - isMinimizable(): boolean { - return this.unwrap().isMinimizable(); - } - - isMaximized(): boolean { - return this.unwrap().isMaximized(); - } - - isMinimized(): boolean { - return this.unwrap().isMinimized(); - } - - isResizable(): boolean { - return this.unwrap().isResizable(); - } - - setTitle(title: string): void { - this.unwrap().setTitle(title); - } - - get title(): string { - return this.unwrap().title; - } - - setClosable(closable: boolean): void { - this.unwrap().setClosable(closable); - } - - setMaximizable(maximizable: boolean): void { - this.unwrap().setMaximizable(maximizable); - } - - setMinimizable(minimizable: boolean): void { - this.unwrap().setMinimizable(minimizable); - } - - setResizable(resizable: boolean): void { - this.unwrap().setResizable(resizable); - } - - setSize(width: number, height: number, logical?: boolean | null): Dimensions | null { - return this.unwrap().setSize(width, height, logical); - } - - setMinSize(width: number, height: number, logical?: boolean | null): void { - this.unwrap().setMinSize(width, height, logical); - } - - getInnerSize(logical?: boolean | null): Dimensions { - return this.unwrap().getInnerSize(logical); - } - - setMaxSize(width: number, height: number, logical?: boolean | null): void { - this.unwrap().setMaxSize(width, height, logical); - } - - getOuterSize(logical?: boolean | null): Dimensions { - return this.unwrap().getOuterSize(logical); - } - - openFileDialog(options?: FileDialogOptions | null): string[] { - return this.unwrap().openFileDialog(options); - } - - id(): number { - return this.unwrap().id(); - } - - hasMenu(): boolean { - return this.unwrap().hasMenu(); - } - - get theme(): Theme { - return this.unwrap().theme; - } - - setTheme(theme: Theme): void { - this.unwrap().setTheme(theme); - } - - setWindowIcon(icon: Uint8Array | number[], width?: number | null, height?: number | null): void { - this.unwrap().setWindowIcon(icon, width, height); - } - - removeWindowIcon(): void { - this.unwrap().removeWindowIcon(); - } - - setEnable(enabled: boolean): void { - this.unwrap().setEnable(enabled); - } - - setTaskbarIcon(icon: Uint8Array | number[], width?: number | null, height?: number | null): void { - this.unwrap().setTaskbarIcon(icon, width, height); - } - - removeTaskbarIcon(): void { - this.unwrap().removeTaskbarIcon(); - } - - setUndecoratedShadow(shadow: boolean): void { - this.unwrap().setUndecoratedShadow(shadow); - } - - getNativeHandleAnyThread(): bigint { - return this.unwrap().getNativeHandleAnyThread(); - } - - simpleFullscreen(): boolean { - return this.unwrap().simpleFullscreen(); - } - - setSimpleFullscreen(fullscreen: boolean): boolean { - return this.unwrap().setSimpleFullscreen(fullscreen); - } - - hasShadow(): boolean { - return this.unwrap().hasShadow(); - } - - setHasShadow(value: boolean): void { - this.unwrap().setHasShadow(value); - } - - setTabbingIdentifier(identifier: string): void { - this.unwrap().setTabbingIdentifier(identifier); - } - - tabbingIdentifier(): string { - return this.unwrap().tabbingIdentifier(); - } - - isDocumentEdited(): boolean { - return this.unwrap().isDocumentEdited(); - } - - setDocumentEdited(edited: boolean): void { - this.unwrap().setDocumentEdited(edited); - } - - getWaylandSurface(): bigint { - return this.unwrap().getWaylandSurface(); - } - - setIosScaleFactor(value: number): void { - this.unwrap().setIosScaleFactor(value); - } - - setValidOrientations(value: IosValidOrientations): void { - this.unwrap().setValidOrientations(value); - } - - setPrefersHomeIndicatorHidden(value: boolean): void { - this.unwrap().setPrefersHomeIndicatorHidden(value); - } - - setPreferredScreenEdgesDeferringSystemGestures(edges: number): void { - this.unwrap().setPreferredScreenEdgesDeferringSystemGestures(edges); - } - - setPrefersStatusBarHidden(value: boolean): void { - this.unwrap().setPrefersStatusBarHidden(value); - } - - androidContentRect(): AndroidContentRect { - return this.unwrap().androidContentRect(); - } - - androidConfig(): string { - return this.unwrap().androidConfig(); - } - - setVisible(visible: boolean): void { - this.unwrap().setVisible(visible); - } - - setProgressBar(state: JsProgressBar): void { - this.unwrap().setProgressBar(state); - } - - setMaximized(value: boolean): void { - this.unwrap().setMaximized(value); - } - - setMinimized(value: boolean): void { - this.unwrap().setMinimized(value); - } - - focus(): void { - this.unwrap().focus(); - } - - getAvailableMonitors(): Monitor[] { - return this.unwrap().getAvailableMonitors(); - } - - getCurrentMonitor(): Monitor | null { - return this.unwrap().getCurrentMonitor(); - } - - getPrimaryMonitor(): Monitor | null { - return this.unwrap().getPrimaryMonitor(); - } - - getMonitorFromPoint(x: number, y: number): Monitor | null { - return this.unwrap().getMonitorFromPoint(x, y); - } - - setContentProtection(enabled: boolean): void { - this.unwrap().setContentProtection(enabled); - } - - setAlwaysOnTop(enabled: boolean): void { - this.unwrap().setAlwaysOnTop(enabled); - } - - setAlwaysOnBottom(enabled: boolean): void { - this.unwrap().setAlwaysOnBottom(enabled); - } - - setDecorations(enabled: boolean): void { - this.unwrap().setDecorations(enabled); - } - - get fullscreen(): FullscreenType | null { - return this.unwrap().fullscreen; - } - - setFullscreen(fullscreenType?: FullscreenType | null): void { - this.unwrap().setFullscreen(fullscreenType); - } - - close(): void { - this.unwrap().close(); - } - - hide(): void { - this.unwrap().hide(); - } - - show(): void { - this.unwrap().show(); - } - - setPosition(x: number, y: number, logical?: boolean | null): void { - this.unwrap().setPosition(x, y, logical); - } - - getPosition(logical?: boolean | null): Position { - return this.unwrap().getPosition(logical); - } - - center(): void { - this.unwrap().center(); - } - - get width(): number { - return this.unwrap().width; - } - - get height(): number { - return this.unwrap().height; - } - - get x(): number { - return this.unwrap().x; - } - - get y(): number { - return this.unwrap().y; - } - - scaleFactor(): number { - return this.unwrap().scaleFactor(); - } - - setCursor(cursor: CursorType): void { - this.unwrap().setCursor(cursor); - } - - setCursorVisible(visible: boolean): void { - this.unwrap().setCursorVisible(visible); - } - - setCursorPosition(x: number, y: number): void { - this.unwrap().setCursorPosition(x, y); - } - - setIgnoreCursorEvents(ignore: boolean): void { - this.unwrap().setIgnoreCursorEvents(ignore); - } - - setSkipTaskbar(skip: boolean): void { - this.unwrap().setSkipTaskbar(skip); - } - - requestRedraw(): void { - this.unwrap().requestRedraw(); - } -} - -export type { - BrowserWindowEventMap, - BrowserWindowProtocolHandler, - WebviewEventMap, - WebviewEventPayload, - WebviewNewWindowFeatures, -}; diff --git a/lib/browser-window/create-webview.ts b/lib/browser-window/create-webview.ts new file mode 100644 index 0000000..27a977f --- /dev/null +++ b/lib/browser-window/create-webview.ts @@ -0,0 +1,45 @@ +import type { BrowserWindow, Webview as NativeWebview, WebviewEventPayload } from '../../js-bindings'; +import { BrowserWindow as NativeBrowserWindow, WebContext as NativeWebContext } from '../../js-bindings'; +import type { WebviewNewWindowEvent, WebviewOptions } from '../types/webview'; +import { emitEvent } from '../internal/events/event-emitter'; + +type NativeEventHandler = (error: Error | null, payload: WebviewEventPayload) => void; +type NativeCreateWebview = ( + this: BrowserWindow, + options?: import('../../js-bindings').WebviewOptions | null, + webContext?: InstanceType | null, + eventHandler?: NativeEventHandler | null, + navigationHandler?: ((url: string) => boolean) | null, + newWindowHandler?: ((payload: WebviewEventPayload) => boolean) | null, +) => NativeWebview; + +const nativeCreateWebview = NativeBrowserWindow.prototype.createWebview as NativeCreateWebview; + +export function createWebview(this: BrowserWindow, options?: WebviewOptions | null): NativeWebview { + const { webContext, navigationHandler, newWindowHandler, ...nativeOptions } = options ?? {}; + let webview: NativeWebview | undefined; + const eventHandler: NativeEventHandler = (error, payload) => { + if (error) { + throw error; + } + if (webview !== undefined) { + emitEvent(webview, payload.event, payload); + } + }; + const newWindowAdapter = newWindowHandler + ? (payload: WebviewEventPayload): boolean => newWindowHandler(payload as WebviewNewWindowEvent) + : null; + + const createNative = Object.hasOwn(this, 'createWebview') + ? (this.createWebview as NativeCreateWebview) + : nativeCreateWebview; + webview = createNative.call( + this, + nativeOptions, + webContext ?? null, + eventHandler, + navigationHandler ?? null, + newWindowAdapter, + ); + return webview; +} diff --git a/lib/browser-window/events.ts b/lib/browser-window/events.ts new file mode 100644 index 0000000..84d5660 --- /dev/null +++ b/lib/browser-window/events.ts @@ -0,0 +1,30 @@ +import type { BrowserWindow, WindowEventPayload } from '../../js-bindings'; +import { BrowserWindowCloseEvent } from '../internal/events/browser-window-close-event'; +import { emitEvent, eventEmitterFor } from '../internal/events/event-emitter'; + +const subscribedWindows = new WeakSet(); + +export function ensureBrowserWindowEvents(target: object): void { + const window = target as BrowserWindow; + if (subscribedWindows.has(window)) { + return; + } + + subscribedWindows.add(window); + eventEmitterFor(window); + window._onWindowEvent((payload) => dispatchWindowEvent(window, payload)); +} + +function dispatchWindowEvent(window: BrowserWindow, payload: WindowEventPayload): void { + if (payload.event !== 'close') { + emitEvent(window, payload.event, payload); + return; + } + + const event = new BrowserWindowCloseEvent(payload, () => window._preventClose()); + try { + emitEvent(window, 'close', event); + } finally { + event.finishDispatch(); + } +} diff --git a/lib/browser-window/protocol.ts b/lib/browser-window/protocol.ts new file mode 100644 index 0000000..ba91d73 --- /dev/null +++ b/lib/browser-window/protocol.ts @@ -0,0 +1,7 @@ +import type { BrowserWindow } from '../../js-bindings'; +import type { BrowserWindowProtocolHandler } from '../types/browser-window'; +import { ProtocolBridge } from '../internal/protocol/protocol-bridge'; + +export function registerProtocol(this: BrowserWindow, name: string, handler: BrowserWindowProtocolHandler): void { + new ProtocolBridge(this).register(name, handler); +} diff --git a/lib/index.ts b/lib/index.ts index f537136..ab4169c 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,8 +1,14 @@ -export { Application } from './application'; -export { BrowserWindow } from './browser-window'; -export { WebContext } from './web-context'; -export { Webview } from './webview'; -export { TrayIcon } from './tray-icon'; +import './augmentations'; +import './install'; + +export { Application, BrowserWindow, NativeNotification, TrayIcon, WebContext, Webview } from '../js-bindings'; +export { + NativeNotification as JsNotification, + TrayIcon as JsTrayIcon, + WebContext as JsWebContext, + Webview as JsWebview, +} from '../js-bindings'; + export { Notification, type NotificationAction, @@ -15,11 +21,6 @@ export { } from './notification'; export { SerializationError } from './errors/serialization-error'; -export { TrayIcon as JsTrayIcon } from './tray-icon'; -export { WebContext as JsWebContext } from './web-context'; -export { Webview as JsWebview } from './webview'; -export { NativeNotification, NativeNotification as JsNotification } from '../js-bindings'; - export { ControlFlow, CursorType, diff --git a/lib/install.ts b/lib/install.ts new file mode 100644 index 0000000..6b8c34b --- /dev/null +++ b/lib/install.ts @@ -0,0 +1,52 @@ +import { Application, BrowserWindow, TrayIcon, WebContext, Webview } from '../js-bindings'; +import { + bind, + disposeApplication, + ensureApplicationEvents, + onEvent, + run, + stop, + whenReady, +} from './application/lifecycle'; +import { createWebview } from './browser-window/create-webview'; +import { ensureBrowserWindowEvents } from './browser-window/events'; +import { registerProtocol } from './browser-window/protocol'; +import { installEventEmitterMethods } from './internal/events/event-emitter'; +import { disposeWebview, expose, onIpcMessage } from './internal/ipc/ipc-bridge'; +import { ensureTrayEvents } from './tray-icon/events'; +import type { ApplicationEventMap } from './types/application'; +import type { BrowserWindowEventMap } from './types/browser-window'; +import type { TrayEventMap } from './types/tray-icon'; +import type { WebviewEventMap } from './types/webview'; + +installEventEmitterMethods(Application.prototype, ensureApplicationEvents); +Application.prototype.onEvent = onEvent; +Application.prototype.bind = bind; +Application.prototype.run = run; +Application.prototype.stop = stop; +Application.prototype.whenReady = whenReady; +Application.prototype[Symbol.dispose] = disposeApplication; + +installEventEmitterMethods(BrowserWindow.prototype, ensureBrowserWindowEvents); +BrowserWindow.prototype.registerProtocol = registerProtocol; +BrowserWindow.prototype.createWebview = createWebview; +BrowserWindow.prototype[Symbol.dispose] = function (): void { + this.dispose(); +}; + +installEventEmitterMethods(Webview.prototype); +Webview.prototype.onIpcMessage = onIpcMessage; +Webview.prototype.expose = expose; +Webview.prototype.dispose = disposeWebview; +Webview.prototype[Symbol.dispose] = function (): void { + this.dispose(); +}; + +installEventEmitterMethods(TrayIcon.prototype, ensureTrayEvents); +TrayIcon.prototype[Symbol.dispose] = function (): void { + this.dispose(); +}; + +WebContext.prototype[Symbol.dispose] = function (): void { + this.dispose(); +}; diff --git a/lib/internal/events/event-emitter.ts b/lib/internal/events/event-emitter.ts new file mode 100644 index 0000000..57bd904 --- /dev/null +++ b/lib/internal/events/event-emitter.ts @@ -0,0 +1,100 @@ +import { EventEmitter } from 'node:events'; + +export type EventListener = (payload: TPayload) => void; + +/** Converts payload maps into the listener-signature event maps Node expects. */ +export type NodeEventMap = { + [TEvent in keyof TEventMap]: [payload: TEventMap[TEvent]]; +}; + +type RuntimeListener = (...args: any[]) => void; +type PrepareEvents = (target: object) => void; + +const emitters = new WeakMap(); + +export function eventEmitterFor(target: object): EventEmitter { + let emitter = emitters.get(target); + if (emitter === undefined) { + emitter = new EventEmitter(); + emitters.set(target, emitter); + } + return emitter; +} + +export function installEventEmitterMethods(prototype: object, prepare?: PrepareEvents): void { + const get = (target: object): EventEmitter> => { + prepare?.(target); + return eventEmitterFor(target) as EventEmitter>; + }; + + const on = function (this: object, event: string | symbol, listener: RuntimeListener): object { + get(this).on(event, listener); + return this; + }; + const once = function (this: object, event: string | symbol, listener: RuntimeListener): object { + get(this).once(event, listener); + return this; + }; + const off = function (this: object, event: string | symbol, listener: RuntimeListener): object { + get(this).off(event, listener); + return this; + }; + const addListener = function (this: object, event: string | symbol, listener: RuntimeListener): object { + get(this).addListener(event, listener); + return this; + }; + const removeListener = function (this: object, event: string | symbol, listener: RuntimeListener): object { + get(this).removeListener(event, listener); + return this; + }; + const removeAllListeners = function (this: object, event?: string | symbol): object { + get(this).removeAllListeners(event); + return this; + }; + const listenerCount = function (this: object, event: string | symbol, listener?: RuntimeListener): number { + return get(this).listenerCount(event, listener); + }; + const listeners = function (this: object, event: string | symbol): Function[] { + return get(this).listeners(event); + }; + const rawListeners = function (this: object, event: string | symbol): Function[] { + return get(this).rawListeners(event); + }; + const emit = function (this: object, event: string | symbol, ...args: any[]): boolean { + return (get(this) as EventEmitter).emit(event, ...args); + }; + const eventNames = function (this: object): Array { + return get(this).eventNames(); + }; + + const methods = { + on, + once, + off, + addListener, + removeListener, + removeAllListeners, + listenerCount, + listeners, + rawListeners, + emit, + eventNames, + } as unknown as EventEmitter>; + + const target = prototype as unknown as EventEmitter>; + target.on = methods.on; + target.once = methods.once; + target.off = methods.off; + target.addListener = methods.addListener; + target.removeListener = methods.removeListener; + target.removeAllListeners = methods.removeAllListeners; + target.listenerCount = methods.listenerCount; + target.listeners = methods.listeners; + target.rawListeners = methods.rawListeners; + target.emit = methods.emit; + target.eventNames = methods.eventNames; +} + +export function emitEvent(target: object, event: string | symbol, payload: unknown): boolean { + return eventEmitterFor(target).emit(event, payload); +} diff --git a/lib/internal/ipc/ipc-bridge.ts b/lib/internal/ipc/ipc-bridge.ts index 5f8883d..3fc2f19 100644 --- a/lib/internal/ipc/ipc-bridge.ts +++ b/lib/internal/ipc/ipc-bridge.ts @@ -1,10 +1,13 @@ -import type { IpcMessage } from '../../../js-bindings'; -import type { NativeWebview } from '../native-binding'; +import { Webview as NativeWebview } from '../../../js-bindings'; +import type { IpcMessage, Webview } from '../../../js-bindings'; import { SerializationError } from '../../errors/serialization-error'; import { serializeJson, validateJsonValue } from './serialization'; export type IpcMessageHandler = (message: IpcMessage) => void; +const nativeDispose = NativeWebview.prototype.dispose; +const bridges = new WeakMap(); + interface ExposedNamespace { target: object; functions: Map; @@ -19,16 +22,14 @@ interface ExposeCall { } export class WebviewIpcBridge { - readonly #native: NativeWebview; - readonly #isDisposed: () => boolean; + readonly #native: Webview; readonly #namespaces = new Map(); #userHandler: IpcMessageHandler | null = null; #transportInstalled = false; readonly #transportHandler: (message: IpcMessage) => void; - constructor(native: NativeWebview, isDisposed: () => boolean) { + constructor(native: Webview) { this.#native = native; - this.#isDisposed = isDisposed; this.#transportHandler = (message) => this.#dispatchMessage(message); } @@ -85,7 +86,7 @@ export class WebviewIpcBridge { } #assertNotDisposed(): void { - if (this.#isDisposed()) { + if (this.#native.isDisposed()) { throw new Error('Webview has been disposed'); } } @@ -94,7 +95,7 @@ export class WebviewIpcBridge { if (this.#transportInstalled) { return; } - this.#native.onIpcMessage(this.#transportHandler); + this.#setNativeHandler(this.#transportHandler); this.#transportInstalled = true; } @@ -103,15 +104,22 @@ export class WebviewIpcBridge { return; } try { - this.#native.onIpcMessage(null); + this.#setNativeHandler(null); } catch { // Native disposal clears the IPC callback at the same time. } this.#transportInstalled = false; } + #setNativeHandler(handler: IpcMessageHandler | null): void { + const nativeMethod = Object.hasOwn(this.#native, 'onIpcMessage') + ? this.#native.onIpcMessage + : NativeWebview.prototype.onIpcMessage; + nativeMethod.call(this.#native, handler); + } + #dispatchMessage(message: IpcMessage): void { - if (this.#isDisposed()) { + if (this.#native.isDisposed()) { return; } @@ -149,7 +157,7 @@ export class WebviewIpcBridge { .then((result) => { try { const resultJson = serializeJson(result, 'Return value'); - if (!this.#isDisposed()) { + if (!this.#native.isDisposed()) { this.#native.evaluateScript( 'window.__webviewjs__&&window.__webviewjs__.resolve(' + Number(id) + ',' + resultJson + ')', ); @@ -170,7 +178,7 @@ export class WebviewIpcBridge { } #sendError(id: unknown, message: string, name = 'Error'): void { - if (this.#isDisposed()) { + if (this.#native.isDisposed()) { return; } try { @@ -189,4 +197,29 @@ export class WebviewIpcBridge { } } +function bridgeFor(webview: Webview): WebviewIpcBridge { + let bridge = bridges.get(webview); + if (bridge === undefined) { + bridge = new WebviewIpcBridge(webview); + bridges.set(webview, bridge); + } + return bridge; +} + +export function onIpcMessage(this: Webview, handler?: IpcMessageHandler | null): void { + bridgeFor(this).setUserHandler(handler); +} + +export function expose(this: Webview, name: string, target: object): void { + bridgeFor(this).expose(name, target); +} + +export function disposeWebview(this: Webview): void { + const bridge = bridges.get(this); + bridge?.dispose(); + bridges.delete(this); + const dispose = Object.hasOwn(this, 'dispose') ? this.dispose : nativeDispose; + dispose.call(this); +} + export { SerializationError }; diff --git a/lib/internal/native-binding.ts b/lib/internal/native-binding.ts deleted file mode 100644 index a63d000..0000000 --- a/lib/internal/native-binding.ts +++ /dev/null @@ -1,9 +0,0 @@ -const nativeBinding: typeof import('../../js-bindings') = require('../../js-bindings.js'); - -export { nativeBinding }; - -export type NativeApplication = InstanceType; -export type NativeBrowserWindow = InstanceType; -export type NativeWebview = InstanceType; -export type NativeWebContext = InstanceType; -export type NativeTrayIcon = InstanceType; diff --git a/lib/internal/native-handle.ts b/lib/internal/native-handle.ts deleted file mode 100644 index ea5f032..0000000 --- a/lib/internal/native-handle.ts +++ /dev/null @@ -1,42 +0,0 @@ -export interface NativeDisposable { - dispose(): void; - isDisposed(): boolean; -} - -export class NativeHandle { - readonly #native: T; - readonly #name: string; - - constructor(native: T, name: string) { - this.#native = native; - this.#name = name; - } - - protected unwrap(): T { - this.assertNotDisposed(); - return this.#native; - } - - /** @internal */ - unwrapForNative(): T { - return this.unwrap(); - } - - protected assertNotDisposed(): void { - if (this.#native.isDisposed()) { - throw new Error(this.#name + ' has been disposed'); - } - } - - isDisposed(): boolean { - return this.#native.isDisposed(); - } - - dispose(): void { - this.#native.dispose(); - } - - [Symbol.dispose](): void { - this.dispose(); - } -} diff --git a/lib/internal/protocol/protocol-bridge.ts b/lib/internal/protocol/protocol-bridge.ts index 1d0168d..5942f7b 100644 --- a/lib/internal/protocol/protocol-bridge.ts +++ b/lib/internal/protocol/protocol-bridge.ts @@ -1,17 +1,17 @@ -import type { CustomProtocolResponse, ProtocolRequest } from '../../../js-bindings'; -import type { NativeBrowserWindow } from '../native-binding'; +import type { BrowserWindow, CustomProtocolResponse, ProtocolRequest } from '../../../js-bindings'; import type { BrowserWindowProtocolHandler } from '../../types/browser-window'; export class ProtocolBridge { - readonly #native: NativeBrowserWindow; - readonly #isDisposed: () => boolean; + readonly #native: BrowserWindow; - constructor(native: NativeBrowserWindow, isDisposed: () => boolean) { + constructor(native: BrowserWindow) { this.#native = native; - this.#isDisposed = isDisposed; } register(name: string, handler: BrowserWindowProtocolHandler): void { + if (this.#native.isDisposed()) { + throw new Error('BrowserWindow has been disposed'); + } this.#native._registerProtocol(name, (protocolRequest) => { void this.#handle(protocolRequest, handler); }); @@ -65,7 +65,7 @@ export class ProtocolBridge { } #complete(id: number, response: CustomProtocolResponse): void { - if (this.#isDisposed()) { + if (this.#native.isDisposed()) { return; } this.#native._completeProtocol(id, response); diff --git a/lib/notification.ts b/lib/notification.ts index 8ba8371..7289c21 100644 --- a/lib/notification.ts +++ b/lib/notification.ts @@ -1,6 +1,7 @@ -import { TypedEventEmitter } from './types/events'; +import { EventEmitter } from 'node:events'; +import type { NodeEventMap } from './internal/events/event-emitter'; import type { NativeNotificationAction, NativeNotificationOptions, NotificationEventPayload } from '../js-bindings'; -import { nativeBinding } from './internal/native-binding'; +import { NativeNotification } from '../js-bindings'; export type NotificationPermission = 'granted'; export type NotificationDirection = 'auto' | 'ltr' | 'rtl'; @@ -62,8 +63,8 @@ interface NormalizedNotificationOptions { vibrate: number | number[]; } -export class Notification extends TypedEventEmitter { - readonly #native: InstanceType; +export class Notification extends EventEmitter> { + readonly #native: NativeNotification; readonly #handlers = new Map void>(); readonly #options: NormalizedNotificationOptions; readonly #title: string; @@ -122,16 +123,13 @@ export class Notification extends TypedEventEmitter { })), }; - this.#native = new nativeBinding.NativeNotification( - nativeOptions, - (error: Error | null, payload: NotificationEventPayload) => { - if (error) { - this.#dispatch({ event: 'error', error: error.message }); - } else { - this.#dispatch(payload); - } - }, - ); + this.#native = new NativeNotification(nativeOptions, (error: Error | null, payload: NotificationEventPayload) => { + if (error) { + this.#dispatch({ event: 'error', error: error.message }); + } else { + this.#dispatch(payload); + } + }); } static get permission(): NotificationPermission { diff --git a/lib/tray-icon.ts b/lib/tray-icon.ts deleted file mode 100644 index 1a24f8b..0000000 --- a/lib/tray-icon.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { TrayEventPayload, TrayIconOptions, TrayRect } from '../js-bindings'; -import { nativeBinding, type NativeTrayIcon } from './internal/native-binding'; -import { NativeHandle } from './internal/native-handle'; -import type { TrayEventMap } from './types/tray-icon'; -import { TypedEventEmitter } from './types/events'; - -const INTERNAL_TRAY_ICON = Symbol('TrayIcon internal construction'); - -export class TrayIcon extends TypedEventEmitter { - readonly #handle: NativeHandle; - - constructor(); - /** @internal */ - constructor(token: typeof INTERNAL_TRAY_ICON, native: NativeTrayIcon); - constructor(token?: typeof INTERNAL_TRAY_ICON, native?: NativeTrayIcon) { - super(); - const wrappedNative = token === INTERNAL_TRAY_ICON && native !== undefined ? native : new nativeBinding.TrayIcon(); - this.#handle = new NativeHandle(wrappedNative, 'TrayIcon'); - wrappedNative._onTrayEvent((payload) => this.#dispatchNativeEvent(payload)); - } - - /** @internal */ - static fromNative(native: NativeTrayIcon): TrayIcon { - return new TrayIcon(INTERNAL_TRAY_ICON, native); - } - - /** @internal */ - #dispatchNativeEvent(payload: TrayEventPayload): void { - this.emit(payload.event, payload); - } - - protected unwrap(): NativeTrayIcon { - return this.#handle.unwrapForNative(); - } - - isDisposed(): boolean { - return this.#handle.isDisposed(); - } - - dispose(): void { - this.#handle.dispose(); - } - - [Symbol.dispose](): void { - this.dispose(); - } - - get id(): string { - return this.unwrap().id; - } - - setIcon(icon: Uint8Array | number[], width?: number | null, height?: number | null): void { - this.unwrap().setIcon(icon, width, height); - } - - removeIcon(): void { - this.unwrap().removeIcon(); - } - - setMenu(menu?: import('../js-bindings').MenuOptions | null): void { - this.unwrap().setMenu(menu); - } - - setTooltip(tooltip?: string | null): void { - this.unwrap().setTooltip(tooltip); - } - - setTitle(title?: string | null): void { - this.unwrap().setTitle(title); - } - - setVisible(visible: boolean): void { - this.unwrap().setVisible(visible); - } - - setIconAsTemplate(value: boolean): void { - this.unwrap().setIconAsTemplate(value); - } - - setShowMenuOnLeftClick(value: boolean): void { - this.unwrap().setShowMenuOnLeftClick(value); - } - - setShowMenuOnRightClick(value: boolean): void { - this.unwrap().setShowMenuOnRightClick(value); - } - - showMenu(): void { - this.unwrap().showMenu(); - } - - rect(): TrayRect | null { - return this.unwrap().rect(); - } -} - -export type { TrayIconOptions }; diff --git a/lib/tray-icon/events.ts b/lib/tray-icon/events.ts new file mode 100644 index 0000000..97ecc1b --- /dev/null +++ b/lib/tray-icon/events.ts @@ -0,0 +1,19 @@ +import type { TrayEventPayload, TrayIcon } from '../../js-bindings'; +import { emitEvent, eventEmitterFor } from '../internal/events/event-emitter'; + +const subscribedTrays = new WeakSet(); + +export function ensureTrayEvents(target: object): void { + const tray = target as TrayIcon; + if (subscribedTrays.has(tray)) { + return; + } + + subscribedTrays.add(tray); + eventEmitterFor(tray); + tray._onTrayEvent((payload) => dispatchTrayEvent(tray, payload)); +} + +function dispatchTrayEvent(tray: TrayIcon, payload: TrayEventPayload): void { + emitEvent(tray, payload.event, payload); +} diff --git a/lib/types/events.ts b/lib/types/events.ts index 3987601..0c89542 100644 --- a/lib/types/events.ts +++ b/lib/types/events.ts @@ -1,70 +1,5 @@ -import { EventEmitter } from 'node:events'; +import type { EventEmitter } from 'node:events'; +import type { EventListener, NodeEventMap } from '../internal/events/event-emitter'; -export type EventListener = (payload: TPayload) => void; - -/** EventEmitter methods with payloads inferred from a public event map. */ -export class TypedEventEmitter extends EventEmitter { - on(event: K, listener: EventListener): this; - override on(event: string | symbol, listener: (...args: any[]) => void): this; - override on(event: string | symbol, listener: (...args: any[]) => void): this { - super.on(event, listener); - return this; - } - - once(event: K, listener: EventListener): this; - override once(event: string | symbol, listener: (...args: any[]) => void): this; - override once(event: string | symbol, listener: (...args: any[]) => void): this { - super.once(event, listener); - return this; - } - - off(event: K, listener: EventListener): this; - override off(event: string | symbol, listener: (...args: any[]) => void): this; - override off(event: string | symbol, listener: (...args: any[]) => void): this { - super.off(event, listener); - return this; - } - - addListener(event: K, listener: EventListener): this; - override addListener(event: string | symbol, listener: (...args: any[]) => void): this; - override addListener(event: string | symbol, listener: (...args: any[]) => void): this { - super.addListener(event, listener); - return this; - } - - removeListener(event: K, listener: EventListener): this; - override removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - override removeListener(event: string | symbol, listener: (...args: any[]) => void): this { - super.removeListener(event, listener); - return this; - } - - override removeAllListeners(event?: string | symbol): this { - super.removeAllListeners(event); - return this; - } - - listenerCount(event: K, listener?: EventListener): number; - override listenerCount(event: string | symbol, listener?: (...args: any[]) => void): number; - override listenerCount(event: string | symbol, listener?: (...args: any[]) => void): number { - return super.listenerCount(event, listener); - } - - listeners(event: K): Array<(...args: any[]) => void>; - override listeners(event: string | symbol): Array<(...args: any[]) => void>; - override listeners(event: string | symbol): Array<(...args: any[]) => void> { - return super.listeners(event); - } - - rawListeners(event: K): Array<(...args: any[]) => void>; - override rawListeners(event: string | symbol): Array<(...args: any[]) => void>; - override rawListeners(event: string | symbol): Array<(...args: any[]) => void> { - return super.rawListeners(event); - } - - emit(event: K, payload: TEventMap[K]): boolean; - override emit(event: string | symbol, ...args: any[]): boolean; - override emit(event: string | symbol, ...args: any[]): boolean { - return super.emit(event, ...args); - } -} +export type { EventListener }; +export type TypedEventEmitter = EventEmitter>; diff --git a/lib/types/webview.ts b/lib/types/webview.ts index aef60d4..82a804a 100644 --- a/lib/types/webview.ts +++ b/lib/types/webview.ts @@ -3,6 +3,7 @@ import type { WebviewNewWindowFeatures, WebviewOptions as NativeWebviewOptions, } from '../../js-bindings'; +import type { WebContext } from '../../js-bindings'; export type { IpcMessage, WebviewBounds, WebviewCookie } from '../../js-bindings'; @@ -13,7 +14,7 @@ export interface WebviewOptions extends Omit< NativeWebviewOptions, 'webContext' | 'navigationHandler' | 'newWindowHandler' > { - webContext?: import('../web-context').WebContext | null; + webContext?: WebContext | null; navigationHandler?: (url: string) => boolean; newWindowHandler?: (event: WebviewNewWindowEvent) => boolean; } diff --git a/lib/web-context.ts b/lib/web-context.ts deleted file mode 100644 index 602b75c..0000000 --- a/lib/web-context.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { nativeBinding, type NativeWebContext } from './internal/native-binding'; -import { NativeHandle } from './internal/native-handle'; - -const INTERNAL_WEB_CONTEXT = Symbol('WebContext internal construction'); - -export class WebContext extends NativeHandle { - constructor(); - /** @internal */ - constructor(token: typeof INTERNAL_WEB_CONTEXT, native: NativeWebContext); - constructor(token?: typeof INTERNAL_WEB_CONTEXT, native?: NativeWebContext) { - super( - token === INTERNAL_WEB_CONTEXT && native !== undefined ? native : new nativeBinding.WebContext(), - 'WebContext', - ); - } - - /** @internal */ - static fromNative(native: NativeWebContext): WebContext { - return new WebContext(INTERNAL_WEB_CONTEXT, native); - } - - get dataDirectory(): string | null { - return this.unwrap().dataDirectory; - } - - isCustomProtocolRegistered(scheme: string): boolean { - return this.unwrap().isCustomProtocolRegistered(scheme); - } - - setAllowsAutomation(flag: boolean): void { - this.unwrap().setAllowsAutomation(flag); - } - - /** @internal */ - unwrapForNative(): NativeWebContext { - return this.unwrap(); - } -} diff --git a/lib/webview.ts b/lib/webview.ts deleted file mode 100644 index e4756d3..0000000 --- a/lib/webview.ts +++ /dev/null @@ -1,168 +0,0 @@ -import type { HeaderData, IpcMessage, WebviewBounds, WebviewCookie, WebviewEventPayload } from '../js-bindings'; -import { nativeBinding, type NativeWebview } from './internal/native-binding'; -import { NativeHandle } from './internal/native-handle'; -import { WebviewIpcBridge, type IpcMessageHandler } from './internal/ipc/ipc-bridge'; -import type { ExposedTarget, WebviewEventMap } from './types/webview'; -import { TypedEventEmitter } from './types/events'; - -const INTERNAL_WEBVIEW = Symbol('Webview internal construction'); -type ScriptResultHandler = (error: Error | null, result: string) => void; - -export class Webview extends TypedEventEmitter { - readonly #handle: NativeHandle; - readonly #ipc: WebviewIpcBridge; - - constructor(); - /** @internal */ - constructor(token: typeof INTERNAL_WEBVIEW, native: NativeWebview); - constructor(token?: typeof INTERNAL_WEBVIEW, native?: NativeWebview) { - super(); - const wrappedNative = token === INTERNAL_WEBVIEW && native !== undefined ? native : new nativeBinding.Webview(); - this.#handle = new NativeHandle(wrappedNative, 'Webview'); - this.#ipc = new WebviewIpcBridge(wrappedNative, () => this.isDisposed()); - } - - /** @internal */ - static fromNative(native: NativeWebview): Webview { - return new Webview(INTERNAL_WEBVIEW, native); - } - - isDisposed(): boolean { - return this.#handle.isDisposed(); - } - - dispose(): void { - if (this.isDisposed()) { - return; - } - this.#ipc.dispose(); - this.#handle.dispose(); - } - - [Symbol.dispose](): void { - this.dispose(); - } - - protected unwrap(): NativeWebview { - return this.#handle.unwrapForNative(); - } - - /** @internal */ - dispatchNativeEvent(payload: WebviewEventPayload): void { - this.emit(payload.event, payload); - } - - onIpcMessage(handler?: IpcMessageHandler | null): void { - this.#ipc.setUserHandler(handler); - } - - expose(name: string, target: ExposedTarget): void { - this.#ipc.expose(name, target); - } - - print(): void { - this.unwrap().print(); - } - - zoom(scaleFactor: number): void { - this.unwrap().zoom(scaleFactor); - } - - setWebviewVisibility(visible: boolean): void { - this.unwrap().setWebviewVisibility(visible); - } - - isDevtoolsOpen(): boolean { - return this.unwrap().isDevtoolsOpen(); - } - - openDevtools(): void { - this.unwrap().openDevtools(); - } - - closeDevtools(): void { - this.unwrap().closeDevtools(); - } - - loadUrl(url: string): void { - this.unwrap().loadUrl(url); - } - - loadHtml(html: string): void { - this.unwrap().loadHtml(html); - } - - evaluateScript(js: string): void { - this.unwrap().evaluateScript(js); - } - - evaluateScriptWithCallback(js: string, callback: ScriptResultHandler): void { - this.unwrap().evaluateScriptWithCallback(js, callback); - } - - reload(): void { - this.unwrap().reload(); - } - - url(): string | null { - return this.unwrap().url(); - } - - get width(): number | null { - return this.unwrap().width; - } - - get height(): number | null { - return this.unwrap().height; - } - - get x(): number | null { - return this.unwrap().x; - } - - get y(): number | null { - return this.unwrap().y; - } - - loadUrlWithHeaders(url: string, headers: HeaderData[]): void { - this.unwrap().loadUrlWithHeaders(url, headers); - } - - getCookies(url?: string | null): WebviewCookie[] { - return this.unwrap().getCookies(url); - } - - setCookie(cookie: WebviewCookie): void { - this.unwrap().setCookie(cookie); - } - - deleteCookie(name: string, domain?: string | null, path?: string | null): void { - this.unwrap().deleteCookie(name, domain, path); - } - - clearAllBrowsingData(): void { - this.unwrap().clearAllBrowsingData(); - } - - setBackgroundColor(r: number, g: number, b: number, a: number): void { - this.unwrap().setBackgroundColor(r, g, b, a); - } - - getBounds(): WebviewBounds | null { - return this.unwrap().getBounds(); - } - - setBounds(bounds: WebviewBounds): void { - this.unwrap().setBounds(bounds); - } - - focus(): void { - this.unwrap().focus(); - } - - focusParent(): void { - this.unwrap().focusParent(); - } -} - -export type { ExposedTarget, IpcMessage, WebviewEventMap }; diff --git a/package.json b/package.json index b1194af..9763a2e 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,9 @@ "artifacts": "napi artifacts", "build": "run-s build:native build:lib", "build:native": "node ./scripts/build.js --release", - "build:lib": "tsc -p tsconfig.json", + "build:lib": "run-s build:lib:clean build:lib:tsc", + "build:lib:clean": "node ./scripts/clean-lib.js", + "build:lib:tsc": "tsc -p tsconfig.json", "build:debug": "run-s build:native:debug build:lib", "build:native:debug": "node ./scripts/build.js", "clean": "napi clean && cargo clean", @@ -67,7 +69,7 @@ "test:node": "node --test __test__/*.test.*", "test:watch": "run-s build:lib test:watch:node", "test:watch:node": "node --test --watch __test__/*.test.*", - "prepublishOnly": "run-s build:lib prepublish:napi", + "prepublishOnly": "run-s build prepublish:napi", "prepublish:napi": "napi prepublish -t npm", "version": "napi version", "check": "cargo check", diff --git a/scripts/clean-lib.js b/scripts/clean-lib.js new file mode 100644 index 0000000..6f11892 --- /dev/null +++ b/scripts/clean-lib.js @@ -0,0 +1,3 @@ +const { rmSync } = require('node:fs'); + +rmSync('./dist', { recursive: true, force: true }); From 44ff273abde363919cfb34b98e4b72cbc38dfd69 Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Thu, 1 Oct 2026 21:24:54 +0545 Subject: [PATCH 03/15] feat: restructure repository as Bun monorepo - Add static Fumadocs site with GitHub Pages deployment - Move package, examples, and documentation into workspace apps and packages - Update CI, tooling, documentation, and repository metadata --- .eslintrc.yml | 169 --- .github/workflows/CI.yml | 43 +- .github/workflows/docs.yml | 64 + .github/workflows/lint.yml | 54 +- .gitignore | 175 +-- .prettierignore | 16 +- AGENTS.md | 126 +- README.md | 137 ++- apps/docs/.gitignore | 26 + apps/docs/README.md | 15 + apps/docs/app/(docs)/[[...slug]]/page.tsx | 65 + apps/docs/app/(docs)/layout.tsx | 12 + apps/docs/app/api/search/route.ts | 9 + apps/docs/app/global.css | 12 + apps/docs/app/layout.tsx | 26 + apps/docs/app/llms-full.txt/route.ts | 7 + .../app/llms.mdx/docs/[[...slug]]/route.ts | 24 + apps/docs/app/llms.txt/route.ts | 7 + apps/docs/app/og/docs/[...slug]/route.tsx | 25 + apps/docs/components/mdx.tsx | 15 + apps/docs/components/provider.tsx | 8 + apps/docs/components/search.tsx | 38 + .../docs/content/docs}/api/application.md | 7 +- .../docs/content/docs}/api/browser-window.md | 7 +- {docs => apps/docs/content/docs}/api/menu.md | 5 +- apps/docs/content/docs/api/meta.json | 4 + .../docs/content/docs}/api/notification.md | 7 +- {docs => apps/docs/content/docs}/api/tray.md | 7 +- {docs => apps/docs/content/docs}/api/types.md | 5 +- .../docs/content/docs}/api/web-context.md | 6 +- .../docs/content/docs}/api/webview.md | 11 +- .../docs}/getting-started/event-loop.md | 5 +- .../docs}/getting-started/installation.md | 12 +- .../content/docs/getting-started/meta.json | 4 + .../docs}/getting-started/quick-start.md | 4 +- .../docs}/guides/building-executables.md | 5 +- .../docs}/guides/cookies-and-storage.md | 4 +- .../content/docs}/guides/custom-protocols.md | 9 +- .../content/docs}/guides/ipc-messaging.md | 5 +- .../docs/content/docs}/guides/menus.md | 4 +- apps/docs/content/docs/guides/meta.json | 11 + .../content/docs}/guides/multiple-windows.md | 4 +- .../docs/content/docs/index.mdx | 94 +- apps/docs/content/docs/meta.json | 4 + .../docs/content/docs}/platform/android.md | 5 +- .../docs/content/docs}/platform/ios.md | 5 +- .../docs/content/docs}/platform/linux.md | 4 +- .../docs/content/docs}/platform/macos.md | 4 +- apps/docs/content/docs/platform/meta.json | 4 + .../docs/content/docs}/platform/windows.md | 4 +- apps/docs/lib/cn.ts | 1 + apps/docs/lib/layout.shared.tsx | 12 + apps/docs/lib/shared.ts | 28 + apps/docs/lib/source.ts | 30 + apps/docs/next.config.mjs | 12 + apps/docs/package.json | 31 + apps/docs/postcss.config.mjs | 7 + apps/docs/public/.nojekyll | 1 + {docs => apps/docs/public}/CNAME | 0 apps/docs/public/preview.png | Bin 0 -> 1093595 bytes apps/docs/scripts/export-markdown-aliases.mjs | 37 + apps/docs/tsconfig.json | 28 + .../examples}/application-events.mjs | 2 +- .../assets/custom-protocol/index.html | 0 .../examples}/assets/expose/index.html | 0 {examples => apps/examples}/close-example.mjs | 2 +- .../examples}/custom-protocol-hono.mjs | 2 +- .../examples}/custom-protocol.mjs | 2 +- {examples => apps/examples}/expose.mjs | 2 +- {examples => apps/examples}/html.js | 4 +- {examples => apps/examples}/http/server.mjs | 0 {examples => apps/examples}/http/webview.mjs | 2 +- {examples => apps/examples}/issue-47.mts | 4 +- {examples => apps/examples}/issue-50.mts | 2 +- {examples => apps/examples}/issue-52.mts | 2 +- {examples => apps/examples}/issue-53.mjs | 2 +- {examples => apps/examples}/linux_close.rs | 0 {examples => apps/examples}/menu-system.mjs | 2 +- {examples => apps/examples}/multi-webview.mjs | 2 +- {examples => apps/examples}/multiple.mjs | 2 +- .../examples}/navigation-handler.mjs | 2 +- {examples => apps/examples}/notification.mjs | 2 +- apps/examples/package.json | 9 + {examples => apps/examples}/simple.mjs | 2 +- {examples => apps/examples}/transparent.mjs | 2 +- {examples => apps/examples}/tray.mjs | 2 +- {examples => apps/examples}/undecorated.mjs | 2 +- {examples => apps/examples}/url-sync.mjs | 2 +- {examples => apps/examples}/url.mjs | 2 +- {examples => apps/examples}/web-context.mjs | 2 +- .../examples}/webview-events.mjs | 2 +- {examples => apps/examples}/window-menus.mjs | 2 +- {examples => apps/examples}/windows-leak.mjs | 6 +- {examples => apps/examples}/windows-leak.txt | 0 bun.lock | 1056 ++++++++++++----- lib/augmentations.ts | 41 - lib/errors/serialization-error.ts | 6 - lib/types/application.ts | 22 - lib/types/browser-window.ts | 109 -- lib/types/tray-icon.ts | 9 - package.json | 130 +- Cargo.toml => packages/webview/Cargo.toml | 0 packages/webview/LICENSE | 21 + packages/webview/README.md | 597 ++++++++++ .../webview/__test__}/bridge.test.mjs | 6 +- .../webview/__test__}/webview.test.mjs | 0 build.rs => packages/webview/build.rs | 0 {cli => packages/webview/cli}/build.mjs | 0 {cli => packages/webview/cli}/index.mjs | 0 {cli => packages/webview/cli}/utils.mjs | 0 .../webview/js-bindings.d.ts | 0 .../webview/js-bindings.js | 0 .../webview/lib}/application/lifecycle.ts | 25 + packages/webview/lib/augmentations.ts | 91 ++ .../lib}/browser-window/create-webview.ts | 7 + .../webview/lib}/browser-window/events.ts | 7 + .../webview/lib}/browser-window/protocol.ts | 5 + .../webview/lib/errors/serialization-error.ts | 11 + {lib => packages/webview/lib}/index.ts | 0 {lib => packages/webview/lib}/install.ts | 0 .../lib}/internal/application/event-loop.ts | 11 + .../events/browser-window-close-event.ts | 16 +- .../lib}/internal/events/event-emitter.ts | 70 ++ .../webview/lib}/internal/ipc/ipc-bridge.ts | 62 + .../lib}/internal/ipc/serialization.ts | 10 + .../lib}/internal/protocol/protocol-bridge.ts | 38 + {lib => packages/webview/lib}/notification.ts | 95 ++ .../webview/lib}/tray-icon/events.ts | 7 + packages/webview/lib/types/application.ts | 38 + packages/webview/lib/types/browser-window.ts | 188 +++ {lib => packages/webview/lib}/types/events.ts | 2 + packages/webview/lib/types/tray-icon.ts | 15 + .../webview/lib}/types/webview.ts | 31 + .../webview/npm}/android-arm-eabi/README.md | 0 .../npm}/android-arm-eabi/package.json | 0 .../webview/npm}/android-arm64/README.md | 0 .../webview/npm}/android-arm64/package.json | 0 .../webview/npm}/darwin-arm64/README.md | 0 .../webview/npm}/darwin-arm64/package.json | 0 .../webview/npm}/darwin-x64/README.md | 0 .../webview/npm}/darwin-x64/package.json | 0 .../webview/npm}/freebsd-x64/README.md | 0 .../webview/npm}/freebsd-x64/package.json | 0 .../npm}/linux-arm-gnueabihf/README.md | 0 .../npm}/linux-arm-gnueabihf/package.json | 0 .../webview/npm}/linux-arm64-gnu/README.md | 0 .../webview/npm}/linux-arm64-gnu/package.json | 0 .../webview/npm}/linux-ia32-gnu/README.md | 0 .../webview/npm}/linux-ia32-gnu/package.json | 0 .../webview/npm}/linux-x64-gnu/README.md | 0 .../webview/npm}/linux-x64-gnu/package.json | 0 .../webview/npm}/win32-arm64-msvc/README.md | 0 .../npm}/win32-arm64-msvc/package.json | 0 .../webview/npm}/win32-ia32-msvc/README.md | 0 .../webview/npm}/win32-ia32-msvc/package.json | 0 .../webview/npm}/win32-x64-msvc/README.md | 0 .../webview/npm}/win32-x64-msvc/package.json | 0 packages/webview/package.json | 83 ++ .../webview/scripts}/build.js | 0 .../webview/scripts}/clean-lib.js | 0 {src => packages/webview/src}/app.rs | 0 .../webview/src}/browser_window.rs | 0 .../src}/custom_protocol_workaround.rs | 0 {src => packages/webview/src}/freebsd_stub.rs | 0 {src => packages/webview/src}/lib.rs | 0 {src => packages/webview/src}/menu.rs | 0 .../webview/src}/notifications.rs | 0 {src => packages/webview/src}/tray.rs | 0 {src => packages/webview/src}/tray_stub.rs | 0 {src => packages/webview/src}/types.rs | 0 {src => packages/webview/src}/version.rs | 0 {src => packages/webview/src}/web_context.rs | 0 {src => packages/webview/src}/webview.rs | 0 .../webview/tsconfig.json | 0 prettier.config.mjs | 11 + skills/webviewjs/SKILL.md | 22 +- turbo.json | 27 + 177 files changed, 3303 insertions(+), 1145 deletions(-) delete mode 100644 .eslintrc.yml create mode 100644 .github/workflows/docs.yml create mode 100644 apps/docs/.gitignore create mode 100644 apps/docs/README.md create mode 100644 apps/docs/app/(docs)/[[...slug]]/page.tsx create mode 100644 apps/docs/app/(docs)/layout.tsx create mode 100644 apps/docs/app/api/search/route.ts create mode 100644 apps/docs/app/global.css create mode 100644 apps/docs/app/layout.tsx create mode 100644 apps/docs/app/llms-full.txt/route.ts create mode 100644 apps/docs/app/llms.mdx/docs/[[...slug]]/route.ts create mode 100644 apps/docs/app/llms.txt/route.ts create mode 100644 apps/docs/app/og/docs/[...slug]/route.tsx create mode 100644 apps/docs/components/mdx.tsx create mode 100644 apps/docs/components/provider.tsx create mode 100644 apps/docs/components/search.tsx rename {docs => apps/docs/content/docs}/api/application.md (96%) rename {docs => apps/docs/content/docs}/api/browser-window.md (97%) rename {docs => apps/docs/content/docs}/api/menu.md (97%) create mode 100644 apps/docs/content/docs/api/meta.json rename {docs => apps/docs/content/docs}/api/notification.md (96%) rename {docs => apps/docs/content/docs}/api/tray.md (87%) rename {docs => apps/docs/content/docs}/api/types.md (98%) rename {docs => apps/docs/content/docs}/api/web-context.md (92%) rename {docs => apps/docs/content/docs}/api/webview.md (93%) rename {docs => apps/docs/content/docs}/getting-started/event-loop.md (95%) rename {docs => apps/docs/content/docs}/getting-started/installation.md (65%) create mode 100644 apps/docs/content/docs/getting-started/meta.json rename {docs => apps/docs/content/docs}/getting-started/quick-start.md (98%) rename {docs => apps/docs/content/docs}/guides/building-executables.md (95%) rename {docs => apps/docs/content/docs}/guides/cookies-and-storage.md (97%) rename {docs => apps/docs/content/docs}/guides/custom-protocols.md (87%) rename {docs => apps/docs/content/docs}/guides/ipc-messaging.md (91%) rename {docs => apps/docs/content/docs}/guides/menus.md (99%) create mode 100644 apps/docs/content/docs/guides/meta.json rename {docs => apps/docs/content/docs}/guides/multiple-windows.md (98%) rename docs/README.md => apps/docs/content/docs/index.mdx (85%) create mode 100644 apps/docs/content/docs/meta.json rename {docs => apps/docs/content/docs}/platform/android.md (61%) rename {docs => apps/docs/content/docs}/platform/ios.md (68%) rename {docs => apps/docs/content/docs}/platform/linux.md (98%) rename {docs => apps/docs/content/docs}/platform/macos.md (98%) create mode 100644 apps/docs/content/docs/platform/meta.json rename {docs => apps/docs/content/docs}/platform/windows.md (98%) create mode 100644 apps/docs/lib/cn.ts create mode 100644 apps/docs/lib/layout.shared.tsx create mode 100644 apps/docs/lib/shared.ts create mode 100644 apps/docs/lib/source.ts create mode 100644 apps/docs/next.config.mjs create mode 100644 apps/docs/package.json create mode 100644 apps/docs/postcss.config.mjs create mode 100644 apps/docs/public/.nojekyll rename {docs => apps/docs/public}/CNAME (100%) create mode 100644 apps/docs/public/preview.png create mode 100644 apps/docs/scripts/export-markdown-aliases.mjs create mode 100644 apps/docs/tsconfig.json rename {examples => apps/examples}/application-events.mjs (95%) rename {examples => apps/examples}/assets/custom-protocol/index.html (100%) rename {examples => apps/examples}/assets/expose/index.html (100%) rename {examples => apps/examples}/close-example.mjs (97%) rename {examples => apps/examples}/custom-protocol-hono.mjs (97%) rename {examples => apps/examples}/custom-protocol.mjs (96%) rename {examples => apps/examples}/expose.mjs (96%) rename {examples => apps/examples}/html.js (85%) rename {examples => apps/examples}/http/server.mjs (100%) rename {examples => apps/examples}/http/webview.mjs (87%) rename {examples => apps/examples}/issue-47.mts (77%) rename {examples => apps/examples}/issue-50.mts (96%) rename {examples => apps/examples}/issue-52.mts (95%) rename {examples => apps/examples}/issue-53.mjs (98%) rename {examples => apps/examples}/linux_close.rs (100%) rename {examples => apps/examples}/menu-system.mjs (99%) rename {examples => apps/examples}/multi-webview.mjs (95%) rename {examples => apps/examples}/multiple.mjs (85%) rename {examples => apps/examples}/navigation-handler.mjs (95%) rename {examples => apps/examples}/notification.mjs (96%) create mode 100644 apps/examples/package.json rename {examples => apps/examples}/simple.mjs (95%) rename {examples => apps/examples}/transparent.mjs (88%) rename {examples => apps/examples}/tray.mjs (97%) rename {examples => apps/examples}/undecorated.mjs (90%) rename {examples => apps/examples}/url-sync.mjs (87%) rename {examples => apps/examples}/url.mjs (87%) rename {examples => apps/examples}/web-context.mjs (93%) rename {examples => apps/examples}/webview-events.mjs (93%) rename {examples => apps/examples}/window-menus.mjs (99%) rename {examples => apps/examples}/windows-leak.mjs (93%) rename {examples => apps/examples}/windows-leak.txt (100%) delete mode 100644 lib/augmentations.ts delete mode 100644 lib/errors/serialization-error.ts delete mode 100644 lib/types/application.ts delete mode 100644 lib/types/browser-window.ts delete mode 100644 lib/types/tray-icon.ts rename Cargo.toml => packages/webview/Cargo.toml (100%) create mode 100644 packages/webview/LICENSE create mode 100644 packages/webview/README.md rename {__test__ => packages/webview/__test__}/bridge.test.mjs (99%) rename {__test__ => packages/webview/__test__}/webview.test.mjs (100%) rename build.rs => packages/webview/build.rs (100%) rename {cli => packages/webview/cli}/build.mjs (100%) rename {cli => packages/webview/cli}/index.mjs (100%) mode change 100644 => 100755 rename {cli => packages/webview/cli}/utils.mjs (100%) rename js-bindings.d.ts => packages/webview/js-bindings.d.ts (100%) rename js-bindings.js => packages/webview/js-bindings.js (100%) rename {lib => packages/webview/lib}/application/lifecycle.ts (69%) create mode 100644 packages/webview/lib/augmentations.ts rename {lib => packages/webview/lib}/browser-window/create-webview.ts (82%) rename {lib => packages/webview/lib}/browser-window/events.ts (72%) rename {lib => packages/webview/lib}/browser-window/protocol.ts (62%) create mode 100644 packages/webview/lib/errors/serialization-error.ts rename {lib => packages/webview/lib}/index.ts (100%) rename {lib => packages/webview/lib}/install.ts (100%) rename {lib => packages/webview/lib}/internal/application/event-loop.ts (59%) rename {lib => packages/webview/lib}/internal/events/browser-window-close-event.ts (51%) rename {lib => packages/webview/lib}/internal/events/event-emitter.ts (56%) rename {lib => packages/webview/lib}/internal/ipc/ipc-bridge.ts (68%) rename {lib => packages/webview/lib}/internal/ipc/serialization.ts (60%) rename {lib => packages/webview/lib}/internal/protocol/protocol-bridge.ts (65%) rename {lib => packages/webview/lib}/notification.ts (54%) rename {lib => packages/webview/lib}/tray-icon/events.ts (61%) create mode 100644 packages/webview/lib/types/application.ts create mode 100644 packages/webview/lib/types/browser-window.ts rename {lib => packages/webview/lib}/types/events.ts (66%) create mode 100644 packages/webview/lib/types/tray-icon.ts rename {lib => packages/webview/lib}/types/webview.ts (50%) rename {npm => packages/webview/npm}/android-arm-eabi/README.md (100%) rename {npm => packages/webview/npm}/android-arm-eabi/package.json (100%) rename {npm => packages/webview/npm}/android-arm64/README.md (100%) rename {npm => packages/webview/npm}/android-arm64/package.json (100%) rename {npm => packages/webview/npm}/darwin-arm64/README.md (100%) rename {npm => packages/webview/npm}/darwin-arm64/package.json (100%) rename {npm => packages/webview/npm}/darwin-x64/README.md (100%) rename {npm => packages/webview/npm}/darwin-x64/package.json (100%) rename {npm => packages/webview/npm}/freebsd-x64/README.md (100%) rename {npm => packages/webview/npm}/freebsd-x64/package.json (100%) rename {npm => packages/webview/npm}/linux-arm-gnueabihf/README.md (100%) rename {npm => packages/webview/npm}/linux-arm-gnueabihf/package.json (100%) rename {npm => packages/webview/npm}/linux-arm64-gnu/README.md (100%) rename {npm => packages/webview/npm}/linux-arm64-gnu/package.json (100%) rename {npm => packages/webview/npm}/linux-ia32-gnu/README.md (100%) rename {npm => packages/webview/npm}/linux-ia32-gnu/package.json (100%) rename {npm => packages/webview/npm}/linux-x64-gnu/README.md (100%) rename {npm => packages/webview/npm}/linux-x64-gnu/package.json (100%) rename {npm => packages/webview/npm}/win32-arm64-msvc/README.md (100%) rename {npm => packages/webview/npm}/win32-arm64-msvc/package.json (100%) rename {npm => packages/webview/npm}/win32-ia32-msvc/README.md (100%) rename {npm => packages/webview/npm}/win32-ia32-msvc/package.json (100%) rename {npm => packages/webview/npm}/win32-x64-msvc/README.md (100%) rename {npm => packages/webview/npm}/win32-x64-msvc/package.json (100%) create mode 100644 packages/webview/package.json rename {scripts => packages/webview/scripts}/build.js (100%) rename {scripts => packages/webview/scripts}/clean-lib.js (100%) rename {src => packages/webview/src}/app.rs (100%) rename {src => packages/webview/src}/browser_window.rs (100%) rename {src => packages/webview/src}/custom_protocol_workaround.rs (100%) rename {src => packages/webview/src}/freebsd_stub.rs (100%) rename {src => packages/webview/src}/lib.rs (100%) rename {src => packages/webview/src}/menu.rs (100%) rename {src => packages/webview/src}/notifications.rs (100%) rename {src => packages/webview/src}/tray.rs (100%) rename {src => packages/webview/src}/tray_stub.rs (100%) rename {src => packages/webview/src}/types.rs (100%) rename {src => packages/webview/src}/version.rs (100%) rename {src => packages/webview/src}/web_context.rs (100%) rename {src => packages/webview/src}/webview.rs (100%) rename tsconfig.json => packages/webview/tsconfig.json (100%) create mode 100644 prettier.config.mjs create mode 100644 turbo.json diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index a5bc21a..0000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,169 +0,0 @@ -parser: '@typescript-eslint/parser' - -parserOptions: - ecmaFeatures: - jsx: true - ecmaVersion: latest - sourceType: module - project: ./tsconfig.json - -env: - browser: true - es6: true - node: true - jest: true - -ignorePatterns: ['index.js'] - -plugins: - - import - - '@typescript-eslint' - -extends: - - eslint:recommended - - plugin:prettier/recommended - -rules: - # 0 = off, 1 = warn, 2 = error - 'space-before-function-paren': 0 - 'no-useless-constructor': 0 - 'no-undef': 2 - 'no-console': [2, { allow: ['error', 'warn', 'info', 'assert'] }] - 'comma-dangle': ['error', 'only-multiline'] - 'no-unused-vars': 0 - 'no-var': 2 - 'one-var-declaration-per-line': 2 - 'prefer-const': 2 - 'no-const-assign': 2 - 'no-duplicate-imports': 2 - 'no-use-before-define': [2, { 'functions': false, 'classes': false }] - 'eqeqeq': [2, 'always', { 'null': 'ignore' }] - 'no-case-declarations': 0 - 'no-restricted-syntax': - [ - 2, - { - 'selector': 'BinaryExpression[operator=/(==|===|!=|!==)/][left.raw=true], BinaryExpression[operator=/(==|===|!=|!==)/][right.raw=true]', - 'message': Don't compare for equality against boolean literals, - }, - ] - - # https://github.com/benmosher/eslint-plugin-import/pull/334 - 'import/no-duplicates': 2 - 'import/first': 2 - 'import/newline-after-import': 2 - 'import/order': - [ - 2, - { - 'newlines-between': 'always', - 'alphabetize': { 'order': 'asc' }, - 'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], - }, - ] - -overrides: - - files: - - ./**/*{.ts,.tsx} - rules: - 'no-unused-vars': [2, { varsIgnorePattern: '^_', argsIgnorePattern: '^_', ignoreRestSiblings: true }] - 'no-undef': 0 - # TypeScript declare merge - 'no-redeclare': 0 - 'no-useless-constructor': 0 - 'no-dupe-class-members': 0 - 'no-case-declarations': 0 - 'no-duplicate-imports': 0 - # TypeScript Interface and Type - 'no-use-before-define': 0 - - '@typescript-eslint/adjacent-overload-signatures': 2 - '@typescript-eslint/await-thenable': 2 - '@typescript-eslint/consistent-type-assertions': 2 - '@typescript-eslint/ban-types': - [ - 'error', - { - 'types': - { - 'String': { 'message': 'Use string instead', 'fixWith': 'string' }, - 'Number': { 'message': 'Use number instead', 'fixWith': 'number' }, - 'Boolean': { 'message': 'Use boolean instead', 'fixWith': 'boolean' }, - 'Function': { 'message': 'Use explicit type instead' }, - }, - }, - ] - '@typescript-eslint/explicit-member-accessibility': - [ - 'error', - { - accessibility: 'explicit', - overrides: - { - accessors: 'no-public', - constructors: 'no-public', - methods: 'no-public', - properties: 'no-public', - parameterProperties: 'explicit', - }, - }, - ] - '@typescript-eslint/method-signature-style': 2 - '@typescript-eslint/no-floating-promises': 2 - '@typescript-eslint/no-implied-eval': 2 - '@typescript-eslint/no-for-in-array': 2 - '@typescript-eslint/no-inferrable-types': 2 - '@typescript-eslint/no-invalid-void-type': 2 - '@typescript-eslint/no-misused-new': 2 - '@typescript-eslint/no-misused-promises': 2 - '@typescript-eslint/no-namespace': 2 - '@typescript-eslint/no-non-null-asserted-optional-chain': 2 - '@typescript-eslint/no-throw-literal': 2 - '@typescript-eslint/no-unnecessary-boolean-literal-compare': 2 - '@typescript-eslint/prefer-for-of': 2 - '@typescript-eslint/prefer-nullish-coalescing': 2 - '@typescript-eslint/switch-exhaustiveness-check': 2 - '@typescript-eslint/prefer-optional-chain': 2 - '@typescript-eslint/prefer-readonly': 2 - '@typescript-eslint/prefer-string-starts-ends-with': 0 - '@typescript-eslint/no-array-constructor': 2 - '@typescript-eslint/require-await': 2 - '@typescript-eslint/return-await': 2 - '@typescript-eslint/ban-ts-comment': - [2, { 'ts-expect-error': false, 'ts-ignore': true, 'ts-nocheck': true, 'ts-check': false }] - '@typescript-eslint/naming-convention': - [ - 2, - { - selector: 'memberLike', - format: ['camelCase', 'PascalCase'], - modifiers: ['private'], - leadingUnderscore: 'forbid', - }, - ] - '@typescript-eslint/no-unused-vars': - [2, { varsIgnorePattern: '^_', argsIgnorePattern: '^_', ignoreRestSiblings: true }] - '@typescript-eslint/member-ordering': - [ - 2, - { - default: - [ - 'public-static-field', - 'protected-static-field', - 'private-static-field', - 'public-static-method', - 'protected-static-method', - 'private-static-method', - 'public-instance-field', - 'protected-instance-field', - 'private-instance-field', - 'public-constructor', - 'protected-constructor', - 'private-constructor', - 'public-instance-method', - 'protected-instance-method', - 'private-instance-method', - ], - }, - ] diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index a9aa7c8..9c6e358 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -17,21 +17,25 @@ on: - main tags-ignore: - '**' - paths-ignore: - - '**/*.md' - - LICENSE - - '**/*.gitignore' - - .editorconfig - - docs/** + paths: + - packages/webview/** + - bun.lock + - package.json + - turbo.json + - .cargo/** + - rustfmt.toml + - .github/workflows/CI.yml pull_request: branches: - main - paths-ignore: - - '**/*.md' - - LICENSE - - '**/*.gitignore' - - .editorconfig - - docs/** + paths: + - packages/webview/** + - bun.lock + - package.json + - turbo.json + - .cargo/** + - rustfmt.toml + - .github/workflows/CI.yml concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -211,7 +215,7 @@ jobs: path: | ~/.bun/install/cache node_modules - key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb', '**/package-lock.json') }} + key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }} restore-keys: | ${{ runner.os }}-bun- @@ -229,7 +233,7 @@ jobs: - name: Cache Cargo build uses: actions/cache@v4 with: - path: target/ + path: packages/webview/target/ key: ${{ matrix.settings.target }}-cargo-build-${{ github.sha }} restore-keys: | ${{ matrix.settings.target }}-cargo-build- @@ -383,12 +387,13 @@ jobs: - name: Build run: ${{ matrix.settings.build_script || format('bun run build --target {0}', matrix.settings.target) }} shell: bash + working-directory: packages/webview - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.settings.target }} - path: ${{ env.APP_NAME }}.*.node + path: packages/webview/${{ env.APP_NAME }}.*.node if-no-files-found: error retention-days: 7 @@ -430,13 +435,14 @@ jobs: node -v bun --version bun install --frozen-lockfile + cd packages/webview bun run build - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-x86_64-unknown-freebsd - path: ${{ env.APP_NAME }}.*.node + path: packages/webview/${{ env.APP_NAME }}.*.node if-no-files-found: error retention-days: 7 @@ -470,14 +476,16 @@ jobs: - name: Download all artifacts uses: actions/download-artifact@v4 with: - path: artifacts + path: packages/webview/artifacts - name: Move artifacts run: bun run artifacts + working-directory: packages/webview - name: List packages run: ls -R ./npm shell: bash + working-directory: packages/webview - name: Extract version from commit message id: version @@ -498,6 +506,7 @@ jobs: run: | npm config set provenance true npm publish --access public --tag ${{ steps.version.outputs.tag }} + working-directory: packages/webview env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..3c28d57 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,64 @@ +name: Deploy docs + +on: + push: + branches: + - main + paths: + - apps/docs/** + - bun.lock + - package.json + - turbo.json + - .github/workflows/docs.yml + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Configure GitHub Pages + uses: actions/configure-pages@v5 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.14 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 24 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build static docs + run: bun run build --filter=@webviewjs/docs + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: apps/docs/out + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5e12853..3d8a95d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,4 +1,4 @@ -name: Lint +name: Lint and docs on: push: @@ -7,27 +7,31 @@ on: tags-ignore: - '**' pull_request: + branches: + - main + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true + jobs: - lint: - name: Lint + checks: + name: Repository checks runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Setup bun + - name: Setup Bun uses: oven-sh/setup-bun@v2 with: bun-version: 1.3.14 - - name: Setup node + - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 24 - - name: Install + - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt @@ -38,19 +42,45 @@ jobs: sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libglib2.0-dev pkg-config - name: Install dependencies - run: bun install + run: bun install --frozen-lockfile - - name: ESLint + - name: Oxlint run: bun run lint - - name: Cargo fmt - run: cargo fmt -- --check + - name: Format check + run: bun run format:check - name: Clippy - run: bun run clippy + run: cargo clippy --manifest-path packages/webview/Cargo.toml -- -D warnings - name: Cargo check - run: bun run check + run: cargo check --manifest-path packages/webview/Cargo.toml + + - name: Build native addon for tests + run: bun run build:native --target x86_64-unknown-linux-gnu + working-directory: packages/webview - name: Run tests run: bun run test + + docs: + name: Build documentation site + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.14 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 24 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build static docs + run: bun run build --filter=@webviewjs/docs diff --git a/.gitignore b/.gitignore index 9fe1d5c..acdcab1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,156 +1,31 @@ - -# Created by https://www.toptal.com/developers/gitignore/api/node -# Edit at https://www.toptal.com/developers/gitignore?templates=node - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories +# JavaScript tooling node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache +.turbo/ *.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' +coverage/ *.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# End of https://www.toptal.com/developers/gitignore/api/node - -superpowers - -#Added by cargo - -/target -Cargo.lock - +.npm/ +dist/ + +# Fumadocs / Next.js static site +apps/docs/.next/ +apps/docs/.source/ +apps/docs/out/ +apps/docs/next-env.d.ts + +# Webview build output +packages/webview/dist/ +packages/webview/target/ +packages/webview/npm/ +packages/webview/artifacts/ +packages/webview/Cargo.lock *.node -.pnp.* - -# Bun -bun.lockb +target/ -# Yarn (legacy) -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions - -# Build artifacts -*.a -*.lib -*.o -*.obj -*.so -*.dylib -*.dll -*.exe - -# Rust -.cargo-cache/ -Cargo.lock - -# IDE -.idea/ -*.swp -*.swo -*~ +# Local environment and logs +.env +.env.* +!.env.example +logs/ +*.log .DS_Store diff --git a/.prettierignore b/.prettierignore index d61d9b4..5fb656a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,11 @@ -target -.yarn -js-bindings.js -js-bindings.d.ts -npm +node_modules +.turbo +**/.next +**/.source +**/out +**/dist +packages/webview/target +packages/webview/npm +packages/webview/js-bindings.js +packages/webview/js-bindings.d.ts +*.node diff --git a/AGENTS.md b/AGENTS.md index 3bc15e4..9bbe278 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -# WebviewJS — CLAUDE.md +# WebviewJS repository instructions ## What this project is @@ -6,59 +6,76 @@ A native Node.js (NAPI-RS) binding to [wry](https://github.com/tauri-apps/wry) a ## Repo layout -``` -src/ Rust source (NAPI-RS bindings) -cli/ The `webview` / `webviewjs` CLI (pure JS, ESM) - index.mjs Entry point — argument parsing, help, dispatch - build.mjs Compile logic for node (SEA), deno compile, bun build --compile - utils.mjs String helpers -docs/ GitHub Pages site (served at webview.js.org) - README.md SYMLINK → ../README.md (the root README is the Pages homepage) - api/ API reference markdown - guides/ How-to guides - getting-started/ - platform/ -examples/ Runnable .mjs examples -npm/ Per-platform NAPI binary packages -scripts/ Build helpers -lib/ Handwritten TypeScript public API augmentations and internal bridges -dist/ Compiled CommonJS library and generated declarations -__test__/ Node.js built-in test runner tests -js-bindings.js / js-bindings.d.ts Lower-level generated bindings +```text +apps/docs/ Static Next.js + Fumadocs site for webview.js.org + app/ App Router routes and layouts + content/docs/ Markdown/MDX documentation source + public/CNAME GitHub Pages custom domain + out/ Static export output (generated) +apps/examples/ Runnable .mjs examples and their assets +packages/webview/ Published @webviewjs/webview package + src/ Rust NAPI-RS bindings + lib/ Handwritten TypeScript public API layer + cli/ Shipped ESM webview/webviewjs CLI + scripts/ Build helpers + __test__/ Node.js built-in test runner tests + npm/ Per-platform NAPI packages + js-bindings.js Generated and tracked NAPI-RS bindings + js-bindings.d.ts Generated and tracked NAPI-RS declarations +.cargo/ Root Cargo configuration +.github/workflows/ Native CI, repository checks, and Pages deployment +.husky/ Root Git hooks +assets/ Repository-level project assets +skills/ WebviewJS skill content ``` ## Tech stack -| Layer | Tool | -| -------------------- | -------------------------------- | -| Rust bindings | NAPI-RS (`@napi-rs/cli`) | -| Package manager | Bun (use `bun` for all JS tasks) | -| JS runtime for tests | Node.js >= 24 (`node --test`) | -| Linter | oxlint | -| Formatter | Prettier | -| Rust formatter | `cargo fmt` | +| Layer | Tool | +| -------------------- | ----------------------------- | +| Monorepo | Bun workspaces + Turborepo | +| Rust bindings | NAPI-RS (`@napi-rs/cli`) | +| Package manager | Bun 1.3.14 | +| JS runtime for tests | Node.js >= 24 (`node --test`) | +| Linter | Root Oxlint | +| Formatter | Root Prettier | +| Rust formatter | `cargo fmt` | ## Common commands +Run these from the repository root: + ```bash -bun install # install JS deps -bun run build # release build (Rust + bindings) -bun run build:debug # debug build -bun run test # build the TypeScript library, then run tests -bun run lint # oxlint -bun run format # prettier + cargo fmt -cargo check # fast Rust type check -cargo clippy # Rust lints +bun install +bun run dev +bun run build +bun run test +bun run lint +bun run lint:fix +bun run format +bun run format:check +bun run check +bun run clippy ``` +To build the published package directly: + +```bash +bun --filter @webviewjs/webview build +``` + +Run an example after building the package with `node apps/examples/simple.mjs`. To work on docs, use `bun --filter @webviewjs/docs dev` or `bun --filter @webviewjs/docs build`. + ## Key conventions -- Handwritten public library source belongs in lib/; tsc writes CommonJS and declarations to dist/. +- Handwritten public library source belongs in `packages/webview/lib/`; TypeScript writes CommonJS and declarations to `packages/webview/dist/`. - Native NAPI classes remain the public runtime objects. TypeScript explicitly augments them with JS-only lifecycle, event, protocol, and IPC behavior. -- Do not edit js-bindings.js or js-bindings.d.ts; NAPI-RS generates them from Rust source. -- CLI files (`cli/*.mjs`) are plain ESM — no build step, shipped as-is. -- Tests live in `__test__/` and use `node:test` (not Jest/Vitest/AVA). -- Examples in `examples/` are standalone `.mjs` files; run them directly with `node examples/foo.mjs` after building. +- Do not edit `packages/webview/js-bindings.js` or `packages/webview/js-bindings.d.ts`; NAPI-RS generates them from Rust source and both generated files are intentionally tracked. +- CLI files in `packages/webview/cli/` are plain ESM and ship as-is. +- Tests live in `packages/webview/__test__/` and use `node:test`, not Bun test, Jest, Vitest, or AVA. +- Examples in `apps/examples/` import `@webviewjs/webview` through the Bun workspace dependency so they use the same package entry point as consumers. +- Documentation lives in `apps/docs/content/docs/`. Its public routes start at the domain root, such as `/getting-started/installation` and `/api/application`. +- Keep repository-level tools in the root package. Application and package dependencies belong to their respective workspaces. ## CLI (`webview --build`) @@ -80,22 +97,25 @@ The `--resources` flag (JSON asset map) is **node-only** — it maps to the SEA ## Docs / GitHub Pages -- Site root: `docs/` → served at **webview.js.org** -- `docs/README.md` is a **git symlink** to `../README.md` (the repo root README is the Pages homepage) -- The symlink is stored in git as mode `120000`. On Windows it appears as a regular file in the working tree (Windows symlink limitation) — this is expected. It resolves correctly on the Linux Pages server. -- Navigation links in `docs/` use paths relative to `docs/` (e.g. `./getting-started/installation.md`). Links in the root README use `./docs/`-prefixed paths for GitHub.com rendering. -- To add a new guide: create `docs/guides/your-guide.md`, then add a row to the Guides table in the root `README.md`. +- The Fumadocs site is in `apps/docs/` and exports to `apps/docs/out/`. +- Documentation source is in `apps/docs/content/docs/`; the section order is controlled by its `meta.json` files. +- The static site includes `apps/docs/public/CNAME` for **webview.js.org**, static Orama search, `/llms.txt`, `/llms-full.txt`, and per-page Markdown. +- To add a guide, create it under `apps/docs/content/docs/guides/` and add it to `apps/docs/content/docs/guides/meta.json`. +- Documentation routes use the domain root, for example `/guides/custom-protocols`. ## Adding a new CLI flag -1. Add the option object to `options` in `cli/index.mjs`. +1. Add the option object to `options` in `packages/webview/cli/index.mjs`. 2. Destructure from `args.values` in the relevant branch. -3. Pass it through to the appropriate `build*` function in `cli/build.mjs`. -4. Update `docs/guides/building-executables.md` options table. +3. Pass it through to the appropriate build function in `packages/webview/cli/build.mjs`. +4. Update the options table in `apps/docs/content/docs/guides/building-executables.md`. ## Rust / NAPI notes -- Bindings are declared in src/. After editing Rust, run bun run build to regenerate js-bindings.js / js-bindings.d.ts and compile lib/ into dist/. -- Target list is in `package.json` under `napi.targets`. -- Each target gets its own npm package under `npm/`. -- The .node binary is loaded at runtime via NAPI-RS's platform detection in js-bindings.js. +- Bindings are declared in `packages/webview/src/`. After editing Rust, build from the Webview package with `bun --filter @webviewjs/webview build` to regenerate `js-bindings.js` / `js-bindings.d.ts` and compile the TypeScript layer. +- The NAPI target list is in `packages/webview/package.json` under `napi.targets`. +- Each target gets its own package under `packages/webview/npm/`. +- The crate manifest is `packages/webview/Cargo.toml`. There is no root Cargo workspace; root Rust commands should pass this manifest explicitly. +- Native build outputs and Cargo's `target/` directory live under `packages/webview/`. +- Native builds are platform-specific and are not cached by Turborepo. +- Publishing the public package must run from `packages/webview/`, never from the private repository root. diff --git a/README.md b/README.md index 23e34ab..1a9abd5 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,10 @@ It is a good fit for utilities, internal tools, desktop companions, and existing web applications that need a native window without bundling a second browser engine. -[Get started](https://webview.js.org/quickstart.md) · -[API reference](https://webview.js.org/api/application.md) · -[Examples](./examples) · -[Platform notes](https://webview.js.org/platforms/linux.md) +[Get started](https://webview.js.org/getting-started/quick-start) · +[API reference](https://webview.js.org/api/application) · +[Examples](./apps/examples) · +[Platform notes](https://webview.js.org/platform/linux) ![WebviewJS preview](https://github.com/webviewjs/webview/raw/main/assets/preview.png) @@ -39,49 +39,49 @@ browser engine. ## Documentation -The complete documentation is available at [webview.js.org](https://webview.js.org). For an index designed for documentation tools and assistants, see [llms.txt](https://webview.js.org/llms.txt). +The complete documentation is available at [webview.js.org](https://webview.js.org). Documentation tools and assistants can use [`llms.txt`](https://webview.js.org/llms.txt), the full [`llms-full.txt`](https://webview.js.org/llms-full.txt), or per-page Markdown such as [`/api/application.md`](https://webview.js.org/api/application.md). ### Getting started -| | | -| ------------------------------------------------------ | ------------------------------- | -| [Installation](https://webview.js.org/installation.md) | System requirements and setup | -| [Quick Start](https://webview.js.org/quickstart.md) | Your first window in minutes | -| [Event Loop](https://webview.js.org/event-loop.md) | How the non-blocking pump works | +| | | +| ------------------------------------------------------------------- | ------------------------------- | +| [Installation](https://webview.js.org/getting-started/installation) | System requirements and setup | +| [Quick Start](https://webview.js.org/getting-started/quick-start) | Your first window in minutes | +| [Event Loop](https://webview.js.org/getting-started/event-loop) | How the non-blocking pump works | ### API reference -| | | -| ------------------------------------------------------------- | ----------------------------------------------------- | -| [Application](https://webview.js.org/api/application.md) | Root object, event loop, windows, menus | -| [BrowserWindow](https://webview.js.org/api/browser-window.md) | OS window, size, position, cursor, decorations | -| [Webview](https://webview.js.org/api/webview.md) | Embedded browser, navigation, cookies, script, bounds | -| [WebContext](https://webview.js.org/api/web-context.md) | Shared browser data, profiles, and automation | -| [System Tray](https://webview.js.org/api/tray.md) | Tray icons, menus, updates, and pointer events | -| [Notification](https://webview.js.org/api/notification.md) | Native desktop notifications and lifecycle events | -| [Menu](https://webview.js.org/api/menu.md) | Native menu bar construction | -| [Types](https://webview.js.org/api/types.md) | Shared interfaces and enums | +| | | +| ---------------------------------------------------------- | ----------------------------------------------------- | +| [Application](https://webview.js.org/api/application) | Root object, event loop, windows, menus | +| [BrowserWindow](https://webview.js.org/api/browser-window) | OS window, size, position, cursor, decorations | +| [Webview](https://webview.js.org/api/webview) | Embedded browser, navigation, cookies, script, bounds | +| [WebContext](https://webview.js.org/api/web-context) | Shared browser data, profiles, and automation | +| [System Tray](https://webview.js.org/api/tray) | Tray icons, menus, updates, and pointer events | +| [Notification](https://webview.js.org/api/notification) | Native desktop notifications and lifecycle events | +| [Menu](https://webview.js.org/api/menu) | Native menu bar construction | +| [Types](https://webview.js.org/api/types) | Shared interfaces and enums | ### Guides -| | | -| ----------------------------------------------------------------------------- | ----------------------------------------------- | -| [Building Executables](https://webview.js.org/guides/building-executables.md) | Compile to `.exe` / binary with node, deno, bun | -| [IPC Messaging](https://webview.js.org/guides/ipc-messaging.md) | Page ↔ Node communication | -| [Menus](https://webview.js.org/guides/menus.md) | Building menu bars with roles and accelerators | -| [Multiple Windows](https://webview.js.org/guides/multiple-windows.md) | Managing several windows | -| [Cookies & Storage](https://webview.js.org/guides/cookies-and-storage.md) | Reading, writing, and clearing cookies | -| [Custom Protocols](https://webview.js.org/guides/custom-protocols.md) | Serving local content to the webview | +| | | +| -------------------------------------------------------------------------- | ----------------------------------------------- | +| [Building Executables](https://webview.js.org/guides/building-executables) | Compile to `.exe` / binary with node, deno, bun | +| [IPC Messaging](https://webview.js.org/guides/ipc-messaging) | Page ↔ Node communication | +| [Menus](https://webview.js.org/guides/menus) | Building menu bars with roles and accelerators | +| [Multiple Windows](https://webview.js.org/guides/multiple-windows) | Managing several windows | +| [Cookies & Storage](https://webview.js.org/guides/cookies-and-storage) | Reading, writing, and clearing cookies | +| [Custom Protocols](https://webview.js.org/guides/custom-protocols) | Serving local content to the webview | ### Platform notes -| | | -| ------------------------------------------------------ | ----------------------------------------- | -| [Windows](https://webview.js.org/platforms/windows.md) | WebView2, taskbar, DPI | -| [macOS](https://webview.js.org/platforms/macos.md) | WebKit, main-thread requirement, app menu | -| [Linux](https://webview.js.org/platforms/linux.md) | WebKitGTK, Wayland/X11, menu limitations | -| [iOS](https://webview.js.org) | Orientation, status bar, and gestures | -| [Android](https://webview.js.org) | Content rectangle and configuration | +| | | +| -------------------------------------------------- | ----------------------------------------- | +| [Windows](https://webview.js.org/platform/windows) | WebView2, taskbar, DPI | +| [macOS](https://webview.js.org/platform/macos) | WebKit, main-thread requirement, app menu | +| [Linux](https://webview.js.org/platform/linux) | WebKitGTK, Wayland/X11, menu limitations | +| [iOS](https://webview.js.org/platform/ios) | Orientation, status bar, and gestures | +| [Android](https://webview.js.org/platform/android) | Content rectangle and configuration | ## Installation @@ -105,11 +105,11 @@ addon selected for the current operating system and architecture. | --------------- | ----------------------------------------------------------------------------------------------------------- | | Windows | WebView2. It ships with Windows 11 and current Edge installations; Windows 10 can install it automatically. | | macOS | macOS 10.15 Catalina or later. WebKit is built in. | -| Linux | WebKitGTK 4.1 and `libxdo`. See the [Linux platform guide](https://webview.js.org/platforms/linux.md). | +| Linux | WebKitGTK 4.1 and `libxdo`. See the [Linux platform guide](https://webview.js.org/platform/linux). | | Android and iOS | Native project setup and platform SDKs. See the [hosted documentation](https://webview.js.org). | For distribution and platform-specific behavior, review the complete -[installation guide](https://webview.js.org/installation.md) before shipping. +[installation guide](https://webview.js.org/getting-started/installation) before shipping. ## Supported platforms @@ -204,8 +204,8 @@ app.whenReady().then(() => { }); ``` -See the [system tray reference](https://webview.js.org/api/tray.md) and -[runnable tray example](./examples/tray.mjs). +See the [system tray reference](https://webview.js.org/api/tray) and +[runnable tray example](./apps/examples/tray.mjs). ### Notifications @@ -221,8 +221,8 @@ notification.on('error', ({ error }) => console.error(error)); ``` Notification permission is always `"granted"` for native applications. See the -[notification reference](https://webview.js.org/api/notification.md) and -[runnable notification example](./examples/notification.mjs). +[notification reference](https://webview.js.org/api/notification) and +[runnable notification example](./apps/examples/notification.mjs). ### IPC and exposed functions @@ -275,7 +275,7 @@ window.registerProtocol('app', async (request) => { window.createWebview({ url: 'app://localhost/index.html' }); ``` -See [Custom Protocols](https://webview.js.org/guides/custom-protocols.md), [IPC](https://webview.js.org/guides/ipc-messaging.md), and the runnable [custom protocol](examples/custom-protocol.mjs) and [expose](examples/expose.mjs) examples. +See [Custom Protocols](https://webview.js.org/guides/custom-protocols), [IPC](https://webview.js.org/guides/ipc-messaging), and the runnable [custom protocol](./apps/examples/custom-protocol.mjs) and [expose](./apps/examples/expose.mjs) examples. ### Menu system @@ -457,8 +457,8 @@ webview.reload(); ``` For more details on application lifecycle and disposal, see the -[Application API reference](https://webview.js.org/api/application.md) and the -[closing example](./examples/close-example.mjs). +[Application API reference](https://webview.js.org/api/application) and the +[closing example](./apps/examples/close-example.mjs). ### Keep strong references @@ -483,15 +483,15 @@ true`, and method calls fail with a disposed error. Individual windows, webviews, contexts, and tray icons also support `dispose()` and `Symbol.dispose`. -Check out [examples](./examples) directory for more examples: +Check out [examples](./apps/examples) directory for more examples: -- **[menu-system.mjs](./examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features -- **[window-menus.mjs](./examples/window-menus.mjs)** - Window-specific vs global menu examples -- **[http/](./examples/http/)** - Serving content from a web server to webview -- **[transparent.mjs](./examples/transparent.mjs)** - Transparent window example -- **[close-example.mjs](./examples/close-example.mjs)** - Graceful application closing +- **[menu-system.mjs](./apps/examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features +- **[window-menus.mjs](./apps/examples/window-menus.mjs)** - Window-specific vs global menu examples +- **[http/](./apps/examples/http/)** - Serving content from a web server to webview +- **[transparent.mjs](./apps/examples/transparent.mjs)** - Transparent window example +- **[close-example.mjs](./apps/examples/close-example.mjs)** - Graceful application closing -Run any example with: `node examples/menu-system.mjs` (after building the project) +Run an example after building the package with: `node apps/examples/menu-system.mjs`. ## Building executables @@ -535,7 +535,7 @@ webview --build --runtime bun --input ./src/index.ts --name my-app | `--resources` / `-r` | none | JSON asset map (Node.js only) | For runtime-specific details, asset embedding, code signing, and release -guidance, see [Building Executables](https://webview.js.org/guides/building-executables.md). +guidance, see [Building Executables](https://webview.js.org/guides/building-executables). ## Agent skill @@ -551,9 +551,12 @@ API patterns, and executable builds. ## Development +The published library is in `packages/webview`, runnable examples are in +`apps/examples`, and the documentation website is in `apps/docs`. + ### Prerequisites -- [Bun](https://bun.sh/) >= 1.3.0 +- [Bun](https://bun.sh/) 1.3.14 - [Rust](https://www.rust-lang.org/) stable toolchain - [Node.js](https://nodejs.org/) >= 24 (for testing) @@ -563,8 +566,32 @@ API patterns, and executable builds. bun install ``` -### Build +### Build and run an example + +```bash +bun --filter @webviewjs/webview build +node apps/examples/simple.mjs +``` + +The native build requires the platform's Rust and GUI development dependencies. +To build only the TypeScript layer, run `bun --filter @webviewjs/webview build:lib`. + +### Repository commands ```bash -bun run build +bun run dev # Start the documentation app +bun run build # Build the native package and static docs +bun run test # Run Node's built-in test runner +bun run lint # Run Oxlint across the repository +bun run lint:fix +bun run format # Format JS/TS/MD and Rust source +bun run format:check +bun run check # Cargo check and docs type check +bun run clippy +``` + +The docs workspace can also be run on its own with `bun --filter @webviewjs/docs dev` or built with `bun --filter @webviewjs/docs build`. + +``` + ``` diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore new file mode 100644 index 0000000..9e429e4 --- /dev/null +++ b/apps/docs/.gitignore @@ -0,0 +1,26 @@ +# deps +/node_modules + +# generated content +.source + +# test & build +/coverage +/.next/ +/out/ +/build +*.tsbuildinfo + +# misc +.DS_Store +*.pem +/.pnp +.pnp.js +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# others +.env*.local +.vercel +next-env.d.ts \ No newline at end of file diff --git a/apps/docs/README.md b/apps/docs/README.md new file mode 100644 index 0000000..2281159 --- /dev/null +++ b/apps/docs/README.md @@ -0,0 +1,15 @@ +# WebviewJS documentation + +The static Fumadocs site is built from `content/docs` and exports to `out/`. + +From the repository root, run: + +```bash +bun install +bun --filter @webviewjs/docs dev +bun --filter @webviewjs/docs build +``` + +The app uses Fumadocs' generated static search index, `llms.txt`, +`llms-full.txt`, and processed per-page Markdown routes. Its build also copies +those Markdown pages to convenient `/.md` files in the static export. diff --git a/apps/docs/app/(docs)/[[...slug]]/page.tsx b/apps/docs/app/(docs)/[[...slug]]/page.tsx new file mode 100644 index 0000000..503ef61 --- /dev/null +++ b/apps/docs/app/(docs)/[[...slug]]/page.tsx @@ -0,0 +1,65 @@ +import { source } from '@/lib/source'; +import { + DocsBody, + DocsDescription, + DocsPage, + DocsTitle, + MarkdownCopyButton, + ViewOptionsPopover, +} from 'fumadocs-ui/layouts/docs/page'; +import { notFound } from 'next/navigation'; +import { getMDXComponents } from '@/components/mdx'; +import type { Metadata } from 'next'; +import { createRelativeLink } from 'fumadocs-ui/mdx'; +import { getPageImageUrl, getPageMarkdownUrl, gitConfig } from '@/lib/shared'; + +type DocsPageProps = { params: Promise<{ slug?: string[] }> }; + +export default async function Page(props: DocsPageProps) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + const markdownUrl = getPageMarkdownUrl(page).url; + + return ( + + {page.data.title} + {page.data.description} +
+ + +
+ + + +
+ ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: DocsPageProps): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + openGraph: { + images: getPageImageUrl(page).url, + }, + }; +} diff --git a/apps/docs/app/(docs)/layout.tsx b/apps/docs/app/(docs)/layout.tsx new file mode 100644 index 0000000..ebb4c94 --- /dev/null +++ b/apps/docs/app/(docs)/layout.tsx @@ -0,0 +1,12 @@ +import { source } from '@/lib/source'; +import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import { baseOptions } from '@/lib/layout.shared'; +import type { ReactNode } from 'react'; + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} diff --git a/apps/docs/app/api/search/route.ts b/apps/docs/app/api/search/route.ts new file mode 100644 index 0000000..aaaff7f --- /dev/null +++ b/apps/docs/app/api/search/route.ts @@ -0,0 +1,9 @@ +import { source } from '@/lib/source'; +import { createFromSource } from 'fumadocs-core/search/server'; + +export const revalidate = false; + +export const { staticGET: GET } = createFromSource(source, { + // https://docs.orama.com/docs/orama-js/supported-languages + language: 'english', +}); diff --git a/apps/docs/app/global.css b/apps/docs/app/global.css new file mode 100644 index 0000000..f86f3c9 --- /dev/null +++ b/apps/docs/app/global.css @@ -0,0 +1,12 @@ +@import 'tailwindcss'; +@import 'fumadocs-ui/css/neutral.css'; +@import 'fumadocs-ui/css/preset.css'; + +html { + scrollbar-gutter: stable; +} + +html > body[data-scroll-locked] { + margin-right: 0px !important; + --removed-body-scroll-bar-size: 0px !important; +} diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx new file mode 100644 index 0000000..9bd2786 --- /dev/null +++ b/apps/docs/app/layout.tsx @@ -0,0 +1,26 @@ +import { Inter } from 'next/font/google'; +import { Provider } from '@/components/provider'; +import type { Metadata } from 'next'; +import './global.css'; + +export const metadata: Metadata = { + metadataBase: new URL('https://webview.js.org'), + title: { + default: 'WebviewJS', + template: '%s | WebviewJS', + }, +}; + +const inter = Inter({ + subsets: ['latin'], +}); + +export default function Layout({ children }: LayoutProps<'/'>) { + return ( + + + {children} + + + ); +} diff --git a/apps/docs/app/llms-full.txt/route.ts b/apps/docs/app/llms-full.txt/route.ts new file mode 100644 index 0000000..c3271b0 --- /dev/null +++ b/apps/docs/app/llms-full.txt/route.ts @@ -0,0 +1,7 @@ +import { docsLlms } from '@/lib/source'; + +export const revalidate = false; + +export async function GET() { + return new Response(await docsLlms.full()); +} diff --git a/apps/docs/app/llms.mdx/docs/[[...slug]]/route.ts b/apps/docs/app/llms.mdx/docs/[[...slug]]/route.ts new file mode 100644 index 0000000..5aac2d3 --- /dev/null +++ b/apps/docs/app/llms.mdx/docs/[[...slug]]/route.ts @@ -0,0 +1,24 @@ +import { docsLlms, source } from '@/lib/source'; +import { getPageMarkdownUrl } from '@/lib/shared'; +import { notFound } from 'next/navigation'; + +export const revalidate = false; + +export async function GET(_req: Request, { params }: RouteContext<'/llms.mdx/docs/[[...slug]]'>) { + const { slug } = await params; + // remove the appended "content.md" + const page = source.getPage(slug?.slice(0, -1)); + if (!page) notFound(); + + return new Response(await docsLlms.page(page), { + headers: { + 'Content-Type': 'text/markdown', + }, + }); +} + +export function generateStaticParams() { + return source.getPages().map((page) => ({ + slug: getPageMarkdownUrl(page).segments, + })); +} diff --git a/apps/docs/app/llms.txt/route.ts b/apps/docs/app/llms.txt/route.ts new file mode 100644 index 0000000..b19e4dd --- /dev/null +++ b/apps/docs/app/llms.txt/route.ts @@ -0,0 +1,7 @@ +import { docsLlms } from '@/lib/source'; + +export const revalidate = false; + +export async function GET() { + return new Response(await docsLlms.index()); +} diff --git a/apps/docs/app/og/docs/[...slug]/route.tsx b/apps/docs/app/og/docs/[...slug]/route.tsx new file mode 100644 index 0000000..9e8dcc4 --- /dev/null +++ b/apps/docs/app/og/docs/[...slug]/route.tsx @@ -0,0 +1,25 @@ +import { source } from '@/lib/source'; +import { notFound } from 'next/navigation'; +import { generateOGImage } from 'fumadocs-ui/og'; +import { appName, getPageImageUrl } from '@/lib/shared'; + +export const revalidate = false; + +export async function GET(_req: Request, { params }: RouteContext<'/og/docs/[...slug]'>) { + const { slug } = await params; + const page = source.getPage(slug.slice(0, -1)); + if (!page) notFound(); + + return generateOGImage({ + title: page.data.title, + description: page.data.description, + site: appName, + }); +} + +export function generateStaticParams() { + return source.getPages().map((page) => ({ + lang: page.locale, + slug: getPageImageUrl(page).segments, + })); +} diff --git a/apps/docs/components/mdx.tsx b/apps/docs/components/mdx.tsx new file mode 100644 index 0000000..a640575 --- /dev/null +++ b/apps/docs/components/mdx.tsx @@ -0,0 +1,15 @@ +import defaultMdxComponents from 'fumadocs-ui/mdx'; +import type { MDXComponents } from 'mdx/types'; + +export function getMDXComponents(components?: MDXComponents) { + return { + ...defaultMdxComponents, + ...components, + } satisfies MDXComponents; +} + +export const useMDXComponents = getMDXComponents; + +declare global { + type MDXProvidedComponents = ReturnType; +} diff --git a/apps/docs/components/provider.tsx b/apps/docs/components/provider.tsx new file mode 100644 index 0000000..522282b --- /dev/null +++ b/apps/docs/components/provider.tsx @@ -0,0 +1,8 @@ +'use client'; +import SearchDialog from '@/components/search'; +import { RootProvider } from 'fumadocs-ui/provider/next'; +import { type ReactNode } from 'react'; + +export function Provider({ children }: { children: ReactNode }) { + return {children}; +} diff --git a/apps/docs/components/search.tsx b/apps/docs/components/search.tsx new file mode 100644 index 0000000..b0417eb --- /dev/null +++ b/apps/docs/components/search.tsx @@ -0,0 +1,38 @@ +'use client'; +import { + SearchDialog, + SearchDialogClose, + SearchDialogContent, + SearchDialogHeader, + SearchDialogIcon, + SearchDialogInput, + SearchDialogList, + SearchDialogOverlay, + type SharedProps, +} from 'fumadocs-ui/components/dialog/search'; +import { useDocsSearch } from 'fumadocs-core/search/client'; +import { staticClient } from 'fumadocs-core/search/client/orama-static'; +import { useI18n } from 'fumadocs-ui/contexts/i18n'; + +export default function DefaultSearchDialog(props: SharedProps) { + const { locale } = useI18n(); // (optional) for i18n + const { search, setSearch, query } = useDocsSearch({ + client: staticClient({ + locale, + }), + }); + + return ( + + + + + + + + + + + + ); +} diff --git a/docs/api/application.md b/apps/docs/content/docs/api/application.md similarity index 96% rename from docs/api/application.md rename to apps/docs/content/docs/api/application.md index b139fda..74fcb6f 100644 --- a/docs/api/application.md +++ b/apps/docs/content/docs/api/application.md @@ -1,4 +1,7 @@ -# Application +--- +title: 'Application' +description: 'The root object that owns the event loop and all windows.' +--- The root object that owns the event loop and all windows. @@ -121,7 +124,7 @@ The usual `on`, `once`, `off`, `addListener`, `removeListener`, `eventNames` methods are available. Listener-registration and removal methods are chainable. -See the runnable [application events example](../../examples/application-events.mjs). +See the runnable [application events example](https://github.com/webviewjs/webview/blob/main/apps/examples/application-events.mjs). ### Legacy `onEvent(handler)` / `bind(handler)` diff --git a/docs/api/browser-window.md b/apps/docs/content/docs/api/browser-window.md similarity index 97% rename from docs/api/browser-window.md rename to apps/docs/content/docs/api/browser-window.md index f341fdf..776b521 100644 --- a/docs/api/browser-window.md +++ b/apps/docs/content/docs/api/browser-window.md @@ -1,4 +1,7 @@ -# BrowserWindow +--- +title: 'BrowserWindow' +description: 'Represents an OS window. Created via app.createBrowserWindow().' +--- Represents an OS window. Created via `app.createBrowserWindow()`. @@ -349,7 +352,7 @@ equivalent pixel distance. IME phases are `enabled`, `preedit`, `commit`, or `disabled`. Touch phases are `started`, `moved`, `ended`, or `cancelled`. -See the runnable [application events example](../../examples/application-events.mjs). +See the runnable [application events example](https://github.com/webviewjs/webview/blob/main/apps/examples/application-events.mjs). ### Undecorated-window resize diff --git a/docs/api/menu.md b/apps/docs/content/docs/api/menu.md similarity index 97% rename from docs/api/menu.md rename to apps/docs/content/docs/api/menu.md index 58b9c6f..a9623b8 100644 --- a/docs/api/menu.md +++ b/apps/docs/content/docs/api/menu.md @@ -1,4 +1,7 @@ -# Menu +--- +title: 'Menu' +description: 'WebviewJS uses muda for native menu bars.' +--- WebviewJS uses [muda](https://github.com/tauri-apps/muda) for native menu bars. diff --git a/apps/docs/content/docs/api/meta.json b/apps/docs/content/docs/api/meta.json new file mode 100644 index 0000000..c5ad663 --- /dev/null +++ b/apps/docs/content/docs/api/meta.json @@ -0,0 +1,4 @@ +{ + "title": "API", + "pages": ["application", "browser-window", "webview", "web-context", "tray", "notification", "menu", "types"] +} diff --git a/docs/api/notification.md b/apps/docs/content/docs/api/notification.md similarity index 96% rename from docs/api/notification.md rename to apps/docs/content/docs/api/notification.md index 60dde0b..ee46f3c 100644 --- a/docs/api/notification.md +++ b/apps/docs/content/docs/api/notification.md @@ -1,4 +1,7 @@ -# Notification +--- +title: 'Notification' +description: 'Displays a native desktop notification through notify-rust.' +--- Displays a native desktop notification through [notify-rust](https://docs.rs/notify-rust/latest/notify_rust/). @@ -163,4 +166,4 @@ native close operation on backends where notify-rust does not expose one. Android and iOS expose the JavaScript API but do not display a notification or emit native lifecycle events. -See the runnable [notification example](../../examples/notification.mjs). +See the runnable [notification example](https://github.com/webviewjs/webview/blob/main/apps/examples/notification.mjs). diff --git a/docs/api/tray.md b/apps/docs/content/docs/api/tray.md similarity index 87% rename from docs/api/tray.md rename to apps/docs/content/docs/api/tray.md index b5ad11e..b0df721 100644 --- a/docs/api/tray.md +++ b/apps/docs/content/docs/api/tray.md @@ -1,4 +1,7 @@ -# System Tray +--- +title: 'System Tray' +description: 'Create tray icons through Application so creation occurs on the event-loop thread.' +--- Create tray icons through `Application` so creation occurs on the event-loop thread. @@ -48,4 +51,4 @@ even when the wrapper remains reachable. Call `tray.dispose()` for early removal, or use `Symbol.dispose`. `tray.isDisposed()` reports whether the icon has been disposed. -See the runnable [tray example](../../examples/tray.mjs). +See the runnable [tray example](https://github.com/webviewjs/webview/blob/main/apps/examples/tray.mjs). diff --git a/docs/api/types.md b/apps/docs/content/docs/api/types.md similarity index 98% rename from docs/api/types.md rename to apps/docs/content/docs/api/types.md index 84b88dc..1e89255 100644 --- a/docs/api/types.md +++ b/apps/docs/content/docs/api/types.md @@ -1,4 +1,7 @@ -# Types Reference +--- +title: 'Types Reference' +description: 'Common types shared across the API.' +--- Common types shared across the API. diff --git a/docs/api/web-context.md b/apps/docs/content/docs/api/web-context.md similarity index 92% rename from docs/api/web-context.md rename to apps/docs/content/docs/api/web-context.md index c26f072..dfe814a 100644 --- a/docs/api/web-context.md +++ b/apps/docs/content/docs/api/web-context.md @@ -1,4 +1,6 @@ -# WebContext +--- +title: 'WebContext' +--- A `WebContext` owns browser data and configuration shared by webviews. Use separate contexts for isolated profiles, or reuse one context when webviews @@ -44,7 +46,7 @@ const second = secondWindow.createWebview({ Both webviews use the same browser-data store. A webview created without `webContext` uses its own default context. -See the runnable [web context example](../../examples/web-context.mjs). +See the runnable [web context example](https://github.com/webviewjs/webview/blob/main/apps/examples/web-context.mjs). ## Properties and methods diff --git a/docs/api/webview.md b/apps/docs/content/docs/api/webview.md similarity index 93% rename from docs/api/webview.md rename to apps/docs/content/docs/api/webview.md index bb1a70c..0eff39d 100644 --- a/docs/api/webview.md +++ b/apps/docs/content/docs/api/webview.md @@ -1,4 +1,7 @@ -# Webview +--- +title: 'Webview' +description: 'Controls the embedded browser view attached to a BrowserWindow. Created via win.createWebview().' +--- Controls the embedded browser view attached to a `BrowserWindow`. Created via `win.createWebview()`. @@ -55,7 +58,7 @@ Navigation events include `target: 'current'`; new-window events include `target: 'new-window'`. This identifies the requested browsing context. Wry does not expose the original HTML `target` attribute value. -See the runnable [navigation handler example](../../examples/navigation-handler.mjs). +See the runnable [navigation handler example](https://github.com/webviewjs/webview/blob/main/apps/examples/navigation-handler.mjs). ## Events @@ -77,7 +80,7 @@ The `new-window` event observes attempts from `window.open`, asynchronously, so use `newWindowHandler` or `navigationHandler` to cancel a request. Download events are observational and do not cancel downloads. -See the runnable [webview events example](../../examples/webview-events.mjs). +See the runnable [webview events example](https://github.com/webviewjs/webview/blob/main/apps/examples/webview-events.mjs). `HeaderData`: @@ -190,7 +193,7 @@ const text = await window.native.readFile('/tmp/example.txt'); Only enumerable own data properties are exposed. Getters and setters are ignored. Arguments, static values, and function results must be JSON-serializable. Cyclic structures, `BigInt`, functions as values, and `undefined` results are rejected with `SerializationError`. -The namespace must be a valid JavaScript identifier and can be exposed only once for a webview. See the runnable [expose example](../../examples/expose.mjs). +The namespace must be a valid JavaScript identifier and can be exposed only once for a webview. See the runnable [expose example](https://github.com/webviewjs/webview/blob/main/apps/examples/expose.mjs). ## Custom protocols diff --git a/docs/getting-started/event-loop.md b/apps/docs/content/docs/getting-started/event-loop.md similarity index 95% rename from docs/getting-started/event-loop.md rename to apps/docs/content/docs/getting-started/event-loop.md index e97d7d0..6986135 100644 --- a/docs/getting-started/event-loop.md +++ b/apps/docs/content/docs/getting-started/event-loop.md @@ -1,4 +1,7 @@ -# Event Loop +--- +title: 'Event Loop' +description: "WebviewJS uses Tao's non-blocking pumpevents() integration so the GUI never blocks Node.js's event loop." +--- WebviewJS uses **Tao**'s non-blocking `pump_events()` integration so the GUI never blocks Node.js's event loop. diff --git a/docs/getting-started/installation.md b/apps/docs/content/docs/getting-started/installation.md similarity index 65% rename from docs/getting-started/installation.md rename to apps/docs/content/docs/getting-started/installation.md index 8bc5017..656084e 100644 --- a/docs/getting-started/installation.md +++ b/apps/docs/content/docs/getting-started/installation.md @@ -1,4 +1,6 @@ -# Installation +--- +title: 'Installation' +--- ## Requirements @@ -29,13 +31,13 @@ npm install @webviewjs/webview ## Building from source -You need the Rust toolchain and the [napi-rs CLI](https://napi.rs/docs/introduction/getting-started). +You need Bun 1.3.14 and the stable Rust toolchain. The repository includes the NAPI-RS CLI as a Webview package development dependency. ```bash git clone https://github.com/webviewjs/webview cd webview -npm install -npm run build # compiles Rust and generates JS bindings +bun install +bun --filter @webviewjs/webview build ``` -The compiled native addon is placed in -/ (e.g. win32-x64-msvc/). The build also regenerates js-bindings.js and js-bindings.d.ts, then compiles the public TypeScript layer from lib/ into dist/. +The build places the platform-specific native addon in `packages/webview/`, regenerates `js-bindings.js` and `js-bindings.d.ts`, and compiles the public TypeScript layer from `packages/webview/lib/` into `packages/webview/dist/`. diff --git a/apps/docs/content/docs/getting-started/meta.json b/apps/docs/content/docs/getting-started/meta.json new file mode 100644 index 0000000..25044e7 --- /dev/null +++ b/apps/docs/content/docs/getting-started/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Getting started", + "pages": ["installation", "quick-start", "event-loop"] +} diff --git a/docs/getting-started/quick-start.md b/apps/docs/content/docs/getting-started/quick-start.md similarity index 98% rename from docs/getting-started/quick-start.md rename to apps/docs/content/docs/getting-started/quick-start.md index 3c63fe2..194767e 100644 --- a/docs/getting-started/quick-start.md +++ b/apps/docs/content/docs/getting-started/quick-start.md @@ -1,4 +1,6 @@ -# Quick Start +--- +title: 'Quick Start' +--- ## Minimal example diff --git a/docs/guides/building-executables.md b/apps/docs/content/docs/guides/building-executables.md similarity index 95% rename from docs/guides/building-executables.md rename to apps/docs/content/docs/guides/building-executables.md index b7870e3..d5c9283 100644 --- a/docs/guides/building-executables.md +++ b/apps/docs/content/docs/guides/building-executables.md @@ -1,4 +1,7 @@ -# Building Standalone Executables +--- +title: 'Building Standalone Executables' +description: 'The webview CLI can package your application into a single self-contained executable — no Node.js, Deno, or Bun installation required on the target machine.' +--- The `webview` CLI can package your application into a single self-contained executable — no Node.js, Deno, or Bun installation required on the target machine. diff --git a/docs/guides/cookies-and-storage.md b/apps/docs/content/docs/guides/cookies-and-storage.md similarity index 97% rename from docs/guides/cookies-and-storage.md rename to apps/docs/content/docs/guides/cookies-and-storage.md index 2aa8f6c..163c912 100644 --- a/docs/guides/cookies-and-storage.md +++ b/apps/docs/content/docs/guides/cookies-and-storage.md @@ -1,4 +1,6 @@ -# Cookies and Storage +--- +title: 'Cookies and Storage' +--- ## Reading cookies diff --git a/docs/guides/custom-protocols.md b/apps/docs/content/docs/guides/custom-protocols.md similarity index 87% rename from docs/guides/custom-protocols.md rename to apps/docs/content/docs/guides/custom-protocols.md index a38a820..2cbf5fe 100644 --- a/docs/guides/custom-protocols.md +++ b/apps/docs/content/docs/guides/custom-protocols.md @@ -1,4 +1,7 @@ -# Custom Protocols +--- +title: 'Custom Protocols' +description: 'Custom protocols handle URL schemes such as app:// without starting a local HTTP server. Register each scheme before creating a webview.' +--- Custom protocols handle URL schemes such as `app://` without starting a local HTTP server. Register each scheme before creating a webview. @@ -59,7 +62,7 @@ win.registerProtocol('app', (request) => router.fetch(request)); win.createWebview({ url: 'app://localhost/' }); ``` -The runnable [Hono custom protocol example](../../examples/custom-protocol-hono.mjs) +The runnable [Hono custom protocol example](https://github.com/webviewjs/webview/blob/main/apps/examples/custom-protocol-hono.mjs) includes dynamic pages, navigation links, pathname rendering, and application shutdown handling. @@ -76,7 +79,7 @@ interface CustomProtocolResponse { ## Security -Never resolve a request path without checking it remains inside the intended asset directory. Normalize and validate the path before passing it to the file system. The runnable [custom protocol example](../../examples/custom-protocol.mjs) includes this check. +Never resolve a request path without checking it remains inside the intended asset directory. Normalize and validate the path before passing it to the file system. The runnable [custom protocol example](https://github.com/webviewjs/webview/blob/main/apps/examples/custom-protocol.mjs) includes this check. ## Multiple protocols diff --git a/docs/guides/ipc-messaging.md b/apps/docs/content/docs/guides/ipc-messaging.md similarity index 91% rename from docs/guides/ipc-messaging.md rename to apps/docs/content/docs/guides/ipc-messaging.md index 23f8cec..4873a8a 100644 --- a/docs/guides/ipc-messaging.md +++ b/apps/docs/content/docs/guides/ipc-messaging.md @@ -1,4 +1,7 @@ -# IPC Messaging +--- +title: 'IPC Messaging' +description: 'wry injects window.ipc.postMessage() into each page. Node receives those messages through webview.onIpcMessage().' +--- wry injects `window.ipc.postMessage()` into each page. Node receives those messages through `webview.onIpcMessage()`. diff --git a/docs/guides/menus.md b/apps/docs/content/docs/guides/menus.md similarity index 99% rename from docs/guides/menus.md rename to apps/docs/content/docs/guides/menus.md index dd183db..6cc2503 100644 --- a/docs/guides/menus.md +++ b/apps/docs/content/docs/guides/menus.md @@ -1,4 +1,6 @@ -# Menus +--- +title: 'Menus' +--- ## Basic setup diff --git a/apps/docs/content/docs/guides/meta.json b/apps/docs/content/docs/guides/meta.json new file mode 100644 index 0000000..b9599c4 --- /dev/null +++ b/apps/docs/content/docs/guides/meta.json @@ -0,0 +1,11 @@ +{ + "title": "Guides", + "pages": [ + "building-executables", + "custom-protocols", + "ipc-messaging", + "menus", + "multiple-windows", + "cookies-and-storage" + ] +} diff --git a/docs/guides/multiple-windows.md b/apps/docs/content/docs/guides/multiple-windows.md similarity index 98% rename from docs/guides/multiple-windows.md rename to apps/docs/content/docs/guides/multiple-windows.md index 7e7b632..c9eeaf7 100644 --- a/docs/guides/multiple-windows.md +++ b/apps/docs/content/docs/guides/multiple-windows.md @@ -1,4 +1,6 @@ -# Multiple Windows +--- +title: 'Multiple Windows' +--- ## Opening several windows diff --git a/docs/README.md b/apps/docs/content/docs/index.mdx similarity index 85% rename from docs/README.md rename to apps/docs/content/docs/index.mdx index 03fb881..6c09803 100644 --- a/docs/README.md +++ b/apps/docs/content/docs/index.mdx @@ -1,6 +1,7 @@ -# `@webviewjs/webview` - -![https://github.com/webviewjs/webview/actions](https://github.com/webviewjs/webview/workflows/CI/badge.svg) +--- +title: WebviewJS +description: 'Build lightweight native desktop applications with JavaScript and the webview engine already provided by the operating system.' +--- Robust cross-platform webview library for Node.js written in Rust. It is a native binding to [tao](https://github.com/tauri-apps/tao) and [wry](https://github.com/tauri-apps/wry) allowing you to easily manage cross platform windowing and webview. @@ -18,17 +19,17 @@ Robust cross-platform webview library for Node.js written in Rust. It is a nativ - Fetch-compatible asynchronous custom protocols, including Hono routing without an HTTP server. - Promise-based `webview.expose()` namespaces for page-to-Node calls. -![preview](https://github.com/webviewjs/webview/raw/main/assets/preview.png) +![WebviewJS preview](/preview.png) > [!NOTE] > This library is meant to be a lightweight system webview binding for JavaScript. It does not aim to be a full-featured framework like Electron or Tauri. Please report any issues you find, and consider contributing to the project if you need additional features. See the [full documentation](./) for API references, guides, platform -notes, and runnable examples. +notes, and runnable examples. Documentation tools can use [llms.txt](https://webview.js.org/llms.txt), [llms-full.txt](https://webview.js.org/llms-full.txt), and per-page Markdown such as [the Application API](https://webview.js.org/api/application.md). -# Documentation +## Documentation -## Getting started +### Getting started | | | | ---------------------------------------------- | ------------------------------- | @@ -36,7 +37,7 @@ notes, and runnable examples. | [Quick Start](./getting-started/quick-start) | Your first window in minutes | | [Event Loop](./getting-started/event-loop) | How the non-blocking pump works | -## API reference +### API reference | | | | ------------------------------------- | ------------------------------------------------------ | @@ -49,7 +50,7 @@ notes, and runnable examples. | [Menu](./api/menu) | Native menu bar construction | | [Types](./api/types) | Shared interfaces and enums | -## Guides +### Guides | | | | ----------------------------------------------------- | ----------------------------------------------- | @@ -60,7 +61,7 @@ notes, and runnable examples. | [Cookies & Storage](./guides/cookies-and-storage) | Reading, writing, and clearing cookies | | [Custom Protocols](./guides/custom-protocols) | Serving local content to the webview | -## Platform notes +### Platform notes | | | | ----------------------------- | ----------------------------------------- | @@ -70,13 +71,13 @@ notes, and runnable examples. | [iOS](./platform/ios) | Orientation, status bar, and gestures | | [Android](./platform/android) | Content rectangle and configuration | -# Installation +## Installation ```bash npm install @webviewjs/webview ``` -# Supported platforms +## Supported platforms | Platform | OS | Arch | Supported | | ----------------------------- | ------- | ----- | ----------------- | @@ -93,9 +94,9 @@ npm install @webviewjs/webview | armv7-linux-androideabi | Android | armv7 | ⚠️ (experimental) | | x86_64-unknown-freebsd | FreeBSD | x64 | ⚠️ (no CI) | -# Examples +## Examples -## Load external url +### Load external url ```js import { Application } from '@webviewjs/webview'; @@ -112,7 +113,7 @@ app.whenReady().then(() => { }); ``` -## Event pumping +### Event pumping `app.whenReady()` starts the non-blocking event pump by default: @@ -130,7 +131,7 @@ await ready; `interval` defaults to `16` milliseconds and `ref` defaults to `true`. Use `app.pumpEvents()` for manual pumping. -## System tray +### System tray Keep a strong JavaScript reference when you need to call tray methods or keep its listeners reachable: @@ -151,9 +152,9 @@ app.whenReady().then(() => { ``` See the [system tray reference](./api/tray) and -[runnable tray example](./examples/tray.mjs). +[runnable tray example](https://github.com/webviewjs/webview/blob/main/apps/examples/tray.mjs). -## Notifications +### Notifications ```js import { Notification } from '@webviewjs/webview'; @@ -168,9 +169,9 @@ notification.on('error', ({ error }) => console.error(error)); Notification permission is always `"granted"` for native applications. See the [notification reference](./api/notification) and -[runnable notification example](./examples/notification.mjs). +[runnable notification example](https://github.com/webviewjs/webview/blob/main/apps/examples/notification.mjs). -## IPC and exposed functions +### IPC and exposed functions The webview page can send messages to Node through `window.ipc.postMessage()`: @@ -199,7 +200,7 @@ const config = await window.native.readConfig(); Every exposed function returns a Promise in the page. Values, arguments, and results must be JSON-serializable. Violations use `SerializationError`. -## Asynchronous custom protocols +### Asynchronous custom protocols Register a protocol before creating its webview: @@ -221,13 +222,13 @@ window.registerProtocol('app', async (request) => { window.createWebview({ url: 'app://localhost/index.html' }); ``` -See [Custom Protocols](docs/guides/custom-protocols), [IPC](docs/guides/ipc-messaging), and the runnable [custom protocol](examples/custom-protocol.mjs) and [expose](examples/expose.mjs) examples. +See [Custom Protocols](/guides/custom-protocols), [IPC](/guides/ipc-messaging), and the runnable [custom protocol](https://github.com/webviewjs/webview/blob/main/apps/examples/custom-protocol.mjs) and [expose](https://github.com/webviewjs/webview/blob/main/apps/examples/expose.mjs) examples. -## Menu System +### Menu System WebviewJS provides a cross-platform menu system that works on macOS, Windows, and Linux. -### Basic Menu Setup +#### Basic Menu Setup ```js import { Application } from '@webviewjs/webview'; @@ -263,7 +264,7 @@ const webview = window.createWebview({ url: 'https://nodejs.org' }); app.run(); ``` -### Menu Event Handling +#### Menu Event Handling ```js import { Application } from '@webviewjs/webview'; @@ -293,7 +294,7 @@ app.on('custom-menu-click', ({ customMenuEvent: menuEvent }) => { app.setMenu({/* ... */}); ``` -### Window-Specific Menus +#### Window-Specific Menus ```js const app = new Application(); @@ -318,7 +319,7 @@ if (window.hasMenu()) { } ``` -### Menu Item Options +#### Menu Item Options - **`id`**: Unique identifier for the menu item (used in events) - **`label`**: Display text for the menu item @@ -327,7 +328,7 @@ if (window.hasMenu()) { - **`submenu`**: Nested menu items - **`role`**: Predefined menu items with built-in behavior -### Predefined Menu Roles +#### Predefined Menu Roles - **`"copy"`**: Standard copy action - **`"paste"`**: Standard paste action @@ -335,7 +336,7 @@ if (window.hasMenu()) { - **`"selectall"`**: Select all text action - **`"separator"`**: Visual separator line -## IPC +### IPC ```js const app = new Application(); @@ -374,7 +375,7 @@ webview.onIpcMessage((data) => { app.run(); ``` -## Closing the Application +### Closing the Application You can close the application, windows, and webviews gracefully to ensure all resources (including temporary folders) are cleaned up properly. @@ -402,9 +403,9 @@ window.show(); // Show the window again webview.reload(); ``` -For more details on closing applications and cleaning up resources, see the [Closing Guide](./CLOSING_GUIDE). +For more details on closing applications and cleaning up resources, see the [Application API](./api/application#exit). -## Keep strong references +### Keep strong references Retain `BrowserWindow`, `Webview`, `WebContext`, and `TrayIcon` wrappers for as long as you need to call their methods or retain their JavaScript listeners. @@ -427,17 +428,17 @@ true`, and method calls fail with a disposed error. Individual windows, webviews, contexts, and tray icons also support `dispose()` and `Symbol.dispose`. -Check out [examples](./examples) directory for more examples: +Check out [examples](https://github.com/webviewjs/webview/tree/main/apps/examples) directory for more examples: -- **[menu-system.mjs](./examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features -- **[window-menus.mjs](./examples/window-menus.mjs)** - Window-specific vs global menu examples -- **[http/](./examples/http/)** - Serving content from a web server to webview -- **[transparent.mjs](./examples/transparent.mjs)** - Transparent window example -- **[close-example.mjs](./examples/close-example.mjs)** - Graceful application closing +- **[menu-system.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features +- **[window-menus.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/window-menus.mjs)** - Window-specific vs global menu examples +- **[http/](https://github.com/webviewjs/webview/blob/main/apps/examples/http/)** - Serving content from a web server to webview +- **[transparent.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/transparent.mjs)** - Transparent window example +- **[close-example.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/close-example.mjs)** - Graceful application closing -Run any example with: `node examples/menu-system.mjs` (after building the project) +After building the package, run an example with: `node apps/examples/menu-system.mjs` -# Building executables +## Building executables > [!WARNING] > The CLI feature is very experimental and may not work as expected. Please report any issues you find. @@ -464,22 +465,23 @@ webview --build --runtime bun --input ./src/index.ts --name my-app For the full compilation guide including cross-compilation and code signing, see [Building Executables](./guides/building-executables). -# Development +## Development -## Prerequisites +### Prerequisites -- [Bun](https://bun.sh/) >= 1.3.0 +- [Bun](https://bun.sh/) 1.3.14 - [Rust](https://www.rust-lang.org/) stable toolchain - [Node.js](https://nodejs.org/) >= 24 (for testing) -## Setup +### Setup ```bash bun install ``` -## Build +### Build ```bash -bun run build +bun --filter @webviewjs/webview build +node apps/examples/simple.mjs ``` diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json new file mode 100644 index 0000000..857cc84 --- /dev/null +++ b/apps/docs/content/docs/meta.json @@ -0,0 +1,4 @@ +{ + "title": "WebviewJS", + "pages": ["index", "getting-started", "api", "guides", "platform"] +} diff --git a/docs/platform/android.md b/apps/docs/content/docs/platform/android.md similarity index 61% rename from docs/platform/android.md rename to apps/docs/content/docs/platform/android.md index 3d044a9..a4df5a6 100644 --- a/docs/platform/android.md +++ b/apps/docs/content/docs/platform/android.md @@ -1,4 +1,7 @@ -# Android +--- +title: 'Android' +description: 'androidContentRect() returns the current native content inset rectangle. androidConfig() returns the current Android configuration as a diagnostic string.' +--- `androidContentRect()` returns the current native content inset rectangle. `androidConfig()` returns the current Android configuration as a diagnostic diff --git a/docs/platform/ios.md b/apps/docs/content/docs/platform/ios.md similarity index 68% rename from docs/platform/ios.md rename to apps/docs/content/docs/platform/ios.md index 56c728d..5dff98b 100644 --- a/docs/platform/ios.md +++ b/apps/docs/content/docs/platform/ios.md @@ -1,4 +1,7 @@ -# iOS +--- +title: 'iOS' +description: 'BrowserWindowOptions supports initial content scale, valid orientations, home-indicator visibility, deferred system-gesture edges, status-bar visibility.' +--- `BrowserWindowOptions` supports initial content scale, valid orientations, home-indicator visibility, deferred system-gesture edges, status-bar diff --git a/docs/platform/linux.md b/apps/docs/content/docs/platform/linux.md similarity index 98% rename from docs/platform/linux.md rename to apps/docs/content/docs/platform/linux.md index d550c77..4a89841 100644 --- a/docs/platform/linux.md +++ b/apps/docs/content/docs/platform/linux.md @@ -1,4 +1,6 @@ -# Linux +--- +title: 'Linux' +--- ## X11 and Wayland window attributes diff --git a/docs/platform/macos.md b/apps/docs/content/docs/platform/macos.md similarity index 98% rename from docs/platform/macos.md rename to apps/docs/content/docs/platform/macos.md index fae1d85..1fa206c 100644 --- a/docs/platform/macos.md +++ b/apps/docs/content/docs/platform/macos.md @@ -1,4 +1,6 @@ -# macOS +--- +title: 'macOS' +--- ## WebKit diff --git a/apps/docs/content/docs/platform/meta.json b/apps/docs/content/docs/platform/meta.json new file mode 100644 index 0000000..eec3f4a --- /dev/null +++ b/apps/docs/content/docs/platform/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Platform", + "pages": ["windows", "macos", "linux", "ios", "android"] +} diff --git a/docs/platform/windows.md b/apps/docs/content/docs/platform/windows.md similarity index 98% rename from docs/platform/windows.md rename to apps/docs/content/docs/platform/windows.md index 4a27ffe..5da88f1 100644 --- a/docs/platform/windows.md +++ b/apps/docs/content/docs/platform/windows.md @@ -1,4 +1,6 @@ -# Windows +--- +title: 'Windows' +--- ## WebView2 runtime diff --git a/apps/docs/lib/cn.ts b/apps/docs/lib/cn.ts new file mode 100644 index 0000000..9e68605 --- /dev/null +++ b/apps/docs/lib/cn.ts @@ -0,0 +1 @@ +export { cn } from 'cn'; diff --git a/apps/docs/lib/layout.shared.tsx b/apps/docs/lib/layout.shared.tsx new file mode 100644 index 0000000..88b9ca8 --- /dev/null +++ b/apps/docs/lib/layout.shared.tsx @@ -0,0 +1,12 @@ +import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; +import { appName, gitConfig } from './shared'; + +export function baseOptions(): BaseLayoutProps { + return { + nav: { + // JSX supported + title: appName, + }, + githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`, + }; +} diff --git a/apps/docs/lib/shared.ts b/apps/docs/lib/shared.ts new file mode 100644 index 0000000..0f19007 --- /dev/null +++ b/apps/docs/lib/shared.ts @@ -0,0 +1,28 @@ +import { createGetUrl } from 'fumadocs-core/source'; + +export const appName = 'WebviewJS'; +export const docsRoute = '/'; +export const docsImageRoute = '/og/docs'; +export const docsContentRoute = '/llms.mdx/docs'; + +export const gitConfig = { + user: 'webviewjs', + repo: 'webview', + branch: 'main', +}; + +const getContentUrl = createGetUrl(docsContentRoute); + +export function getPageMarkdownUrl(page: { slugs: string[]; locale?: string }) { + const segments = [...page.slugs, 'content.md']; + + return { segments, url: getContentUrl(segments, page.locale) }; +} + +const getImageUrl = createGetUrl(docsImageRoute); + +export function getPageImageUrl(page: { slugs: string[]; locale?: string }) { + const segments = [...page.slugs, 'image.png']; + + return { segments, url: getImageUrl(segments, page.locale) }; +} diff --git a/apps/docs/lib/source.ts b/apps/docs/lib/source.ts new file mode 100644 index 0000000..61b21e9 --- /dev/null +++ b/apps/docs/lib/source.ts @@ -0,0 +1,30 @@ +import { llms, loader } from 'fumadocs-core/source'; +import { docsRoute } from './shared'; +import { defineDocs } from 'fumadocs-mdx/macro'; +import { metaSchema, pageSchema } from 'fumadocs-core/source/schema'; + +const docs = defineDocs({ + dir: 'content/docs', + docs: { + schema: pageSchema, + postprocess: { + includeProcessedMarkdown: true, + }, + }, + meta: { + schema: metaSchema, + }, +}); + +// See https://fumadocs.dev/docs/headless/source-api for more info +export const source = loader({ + baseUrl: docsRoute, + source: docs.toFumadocsSource(), + plugins: [], +}); + +export const docsLlms = llms(source, { + renderPage: async (page) => `# ${page.data.title} (${page.url}) + +${await page.data.getText('processed')}`, +}); diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs new file mode 100644 index 0000000..ad895ce --- /dev/null +++ b/apps/docs/next.config.mjs @@ -0,0 +1,12 @@ +import { createMDX } from 'fumadocs-mdx/next'; + +const withMDX = createMDX(); + +/** @type {import('next').NextConfig} */ +const config = { + output: 'export', + reactStrictMode: true, + trailingSlash: true, +}; + +export default withMDX(config); diff --git a/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 0000000..f3cd86b --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,31 @@ +{ + "name": "@webviewjs/docs", + "private": true, + "scripts": { + "build": "next build && node ./scripts/export-markdown-aliases.mjs", + "dev": "next dev", + "start": "serve out", + "check": "next typegen && tsc --noEmit" + }, + "dependencies": { + "cn": "^0.3.0", + "fumadocs-core": "16.15.17", + "fumadocs-mdx": "15.4.5", + "fumadocs-ui": "npm:@fumadocs/base-ui@16.15.17", + "lucide-react": "^1.47.0", + "next": "16.3.5", + "react": "^19.3.0", + "react-dom": "^19.3.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.3.3", + "@types/mdx": "^2.0.14", + "@types/node": "^26.6.1", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "postcss": "^8.5.28", + "serve": "^14.2.6", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2" + } +} diff --git a/apps/docs/postcss.config.mjs b/apps/docs/postcss.config.mjs new file mode 100644 index 0000000..297374d --- /dev/null +++ b/apps/docs/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; + +export default config; diff --git a/apps/docs/public/.nojekyll b/apps/docs/public/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/apps/docs/public/.nojekyll @@ -0,0 +1 @@ + diff --git a/docs/CNAME b/apps/docs/public/CNAME similarity index 100% rename from docs/CNAME rename to apps/docs/public/CNAME diff --git a/apps/docs/public/preview.png b/apps/docs/public/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..0c3e16d13417d15d531930578c78322bf2e73f98 GIT binary patch literal 1093595 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

  • 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

    ?Knd!Lz^^wX44OM`n` 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

  • =nhT+#ANs=b`g zR-4K>vMr?qE@|NmZcwU0+FW{E4L6j9wR9(n`o4%XRq9hjaFC8Z+9htc2Q71)8ALYd z;`S^^$C4N2<-MOzH0hHyo?_{v26Tq9^YC@0GB~0U#-6w&1D(2m@V`P%G~HoKi64%` z_ou&oqlZh+MPqQ-a5@|!>( zA-W)q!C0wS#JYfgB_ERbr12~D(UA0w=+BGqjO$32alJTexF+xM`*&ry=BO>F=)2UV zA=tNg%-DE$qh9YtF{=dR^hwll!qPh{-TzF&qmo2R{0yfX^nc%vhFw`QZG{FYao=d& zBVmz9-i~FW;@ghW-Od`WewH^v#6B>i_4~cknUJmk&|!&n^nf)u7hr>B1pcI|j74MQ z8AE1(O7in5pr4@kG~68gUYAMw9WsldzTqoS;)&hG1rD|E3c=6*SIU5;$LoQl^r*w$ zobWz*HIXbCcXnH&j-Jvv)y`m0whIU9=_xbgeKC*fIyJT(3?d~7*`ER6*zX@4cm6LN z$7Gld%FcVed6;-8OodT%GLu#K^c#&d-(Q&ma14XM>c?2+>p%X4a<3>v-LrQO ziWXi8sMVk>kRCN^JTnJ%ADO??swHa8$TK%BHH_it!2yqdq986(S_#OQJp;Fe5+0o5 z)h53b|62lmyQ%TZp+{tvnpgX8@bj>P)CK#l1WK6ky+*2;4ses6>*g&-h#jjpBLlRT z-uRzj2&=t$wBo8BJG>c<4ueng4z}TsWTwSk(g=oFEL3Yj{_=Y=(wfiL`hm4IdCU2G z&ENTA&hTh#y}sV23&{D zNMpkpfw89XS?-w-FuNHIuJI%R%Xsj12B^&6Eb;%j1(4wesJWs!g$97HP!{F0WZU&I z^{VH&*{QDd7liIvZX7VdbL$to6y3z1I^bxn3;wXB)-sokRQ^Rl3fpef(_oM&GQkpT&%3cVtHna0r={lT<|ONJ*%p(d%t(^{sB+qiIJr>0sfgE@FFk3vsh| zM_bWmGZGeAzLTzy9)^xkLqFj2R!#u9xp zi{ZJFl1CTJv`=cjzL4s&#T<08I!~zzV!*X2|_puLLbFF9z@=1f`w^t2a5%Sa1fOF*BMU?vE)bRW4 zcpW)$fzmg{_N>|SR)r&VD-DvRClt1Xs`gSP{^$|Wj6T|*>HQq0M;Zi@2{0Kn?SYT& zG_Y2FG{*>kM+IHQw;1_e0r61}=hL5hEeI29);^f=7a<;MZ>f0)EBztqL!9=JzxXij zfxNR0mWz;mwQ^2}qfg#h?&~geS6;8{RezCey z*3M>G1|g5;m~#Gx0Y&WJUoiD|Q1=(zOmdgyvWgvXR;mm0Aw5C+XMq^F_xbBm0u_MI zMsnm3=H}KruTm^5nnXC+`Ou13RdV9L49zkhYJO%OR#u^wLMN{u9{Nc~=Ae^sP#ts| zV2ArCFPf`VYU+ehR{C6b%;Yl=KS(E#%xiECLJX~_N`fPLN_6jZ-8o9Nn@8$J-(NPc zcu>J|-I>mBJ;=yNumd{$EGokiEvFE{ z$@=+)lNq`(a7{KQi1E;_Y-HppT1g!KaN>CtoZo?!wi)(;%L?!Jq6Bx4F{O=lgdGia zSU_bf0_80GcTt3Goo)erKT-k13|Uqqy4=15%j{pKC>cgE3(t9y$Yovz5h8bc3)-RQ zYG8&<;=I7VldY*O7Nt~>v??ABq$NhkO|Sme&JC%GB$)^V2-`V8@xL{5e^GPj(fZKn9#8*I&Xs>&&wtDb@NEgw7%u56QUBzmKAQ@{w_%)|2VI&4V zzG@wKpl=d%q#R!-BRanI;r5-^*-)nVm7{7soJ>mFGO}vlGQBgzu8HRvlXhFJd!&}> zr6DDcO9b~pxZ06(jxTRB=X#pn2!I*$CMyD-f2?oPexb-XYP{@_Mb7r*Y<*>3GT5+A z{$;@F(qvP}iLbH0laTub@7?s?)d7dp3IX5fPAl>`N6av5q9&}1GW|rp=Pi~cyPJS> zC3dS;0BilIeU7nlORr#X^`$lw^n}S%dRf8dtM-x3Ik$rwo#s0h`L(1TFigzSLf+m| zRN|_p49LmE6!Iv&IZ*a8YAPT~#<;~%*t5Z7{i^c1_BOqNAqIoUdU%_1UNhh@g|@e$ zMU`l^>oKN(^b^LPU50OScBN|dIxQWKt|2$b>FCf`KwkP2WF zIz+8~o55?lT=1cLBno~ej=8*cRV=Q5peixPo%CsavaKn0)%*MhJeB1@SoI^tX zFZRep`zy;~7jh;!Uw6qYZO*TKP)u-@yk|Nd?{z(xy>?^&K z3dzw@%&SwZfEW>*6}2cNnt#edfH}pY?zf3tGXM3jD|9=!yZPL?E!VNT-<=H8N3xMm z>@THgeH$ape2GHEhqbQ$qx(2n=)x3&>6|&_z}OVFVZh;V^eb9#*O8<8%vhb6N8Lz|Z`29#c|0hCW>G4*jXs|(1OMWKdw!(2VuLbqRKoE#9e9qu{{u>By zgmX=NK$vgfeEmho<2J=Nz&ah~1#&xgsuFsk!mQa_1ACghWFRhy21 z9PKW^mH3*fxH7k2GKg6%w3mlUW*jwNy&n*0?g$252yQcab`gFqZ0WVbCI!+GlddBqrKfw)Yd)m39=28q7JUWE- zmo`hOkSJ;Cxy6By`i15wTk2UMa6r)7!2AJha_fsnyj7>CT*HWBUgGYAA@?up%xx|Wu$Qa}F>f!ysk51dMF{?a?uAOLF@^_#KA0Kn%?hfPh9tXTH6EU-{kza`-D{VwrXvFvd}>SnpPi%6buEq0tb^5%WNDtEIvv%@5T>RY?QnyDpCIY=ge!277> z8gBMD;M;qz?5(Dq&&uCA)(WiXsgkSUF{3J97mk`lJf1RfPwmp@VXuU_Xq zx=ha|?`TQZoTR<`B_lmw=Ev0NT7Fc$81I8A32EcNEQbqAt!p?Ulo!KB;%W%FnF(45 zX&*=`tIel+ZdEjzzB>8!*#^;S9te{%xR*W~qAr8p&3oyDb8g?*T3aP>)}N-B0RAqP zndB#7t<0leD{NND81dm^dt&|!+T8~)Mer@$K+gZqHNNa7E-MEzWc;fxu8=i+@Mw$F zUlfXQ6;_p|7c;$H){SfF{`n7cdm=q8aWs73*%&zD@bat@I7~PrU;?Iew}tW1pPJ_5H|_ zqZzyTR|%c5(eaLbWgbl?bqp9M#BoS;4&fi;mBiLW`KN`r-(4SyOmeG1q}upi0t|Q> zd$f;{2P=Az!gGjGiZKfm1X2npoy`ah8I-^I?2+OzHgzex{oB#^qjp}9@vBd=?b7Zz z!ihDOsO{3drE~B z>jUrQLOx?KC}}>^X2AwC{)hxFZ~u7-`6oqKjlb^PO}@x=%3-Qtg$4E~x&?vad(L~- zoJ7-d-8ZPXjOum=imF}DOa)X&J`({1% zFC~iUGV)5+u4f!vSWw8be`df#!ATMfo4stF-Wg6?PU8gr59%d-EpMXzVRn8PS!Cc7 z(y55a%uBmmY{f&o(9_cZzSE0celo9k1RYCr+wl=v{1;kn_z}VcY~MH-dy=b z8q}nMW9bW(RC5FBk(5jufH6v?PYXXWI3vfp8kWekSXE^D0$n-cjMZaD)i zijGOux!H-W+yui=k({KTc${s*vi)nmf%@NCGDrohD0*Uwr55IGPxk^!1P%`gyf`gaS%s5)b;;_??a-%UoMT{K|G zu@JnHKqk%Koa*cbn*x$b_?{RpvTM|6bVEyj}$cIj^RyZqtmzE?+S+=(AD zme5j*`)m1pHVPli@?*?JqO~l~U7$v9Gtu;WY-yU=R$0U)_^|et()HVkQhmD-=a7$3 zgSg(`k98K&&8B#jE+U!aG`tTN^_i+6#1J=Ju+XM>ew#Y)w&Xuc12$@H1e7rY!zIyiohr-^;xtl0V0m_PZ39N z**CmDzI*!l61u!*@(kpbUH}x_D;vF$SHquHk_%t!-=CgTBvzSOfSbOwk@ZU;3Ecd1 zIqD<8_xJMhD^IaU2Zmd+t`8Is%UG@23d3xw%15tI`Qs7jO1e9_(WOBOR1}=gIpvH? z;$JSt&Kr`WXG@ek-mUySY|j_Y3?Wst-lAxVFV-1nOM(^@$s0k0Dfy>^M;}QrF)Z6b zm+!kw{@6#WR=%v>^=uEMdQ08kz+VJowm{mE3iOe(j@fm{a@=>=3*e15+#y0#8)kI8==40p!`l+){3J-*AfQ z$p8VUa~$)=9>ARimzuLJ=o#n8)bv)97tlfpe2CO?*wDBN%iMoAXNm<_qg3ZrY)L7Q zS;TM#*|rULcRnA*4*tTTGy@G1BxvqTFiBdtP3|}fynVx-lxNkOVX<+Mo`U)*ah@0~ zA5eHzDl@oR6SiG#eAHH-dYNgQU%@}kL#DbKYA73 zmM2`v4U~J>%Z*$Nd2N#-_cxkX4$~O37Sh#-(d4OpK5l-Hwb+f`W9+Ki#b2TRKC9a*;RDa zoH7Fl*t{-A=)=YpZ^IXph}ZnmP#tR`v&s}Qwn zRyp$lg5NV!YdN4JH-j@vJV&CYM3z?g`wwjXRl|Z%>26M5FvRa=0tMO}=j@ z`dp%lj?XX4l~Q9bg;uJ2s9$LiqcVW-UgEh{=NH}&zU~^Ztq6^~0r0)c@vm@y)ySD`nl+Ecby*yewg z3o270ix{Ub&H9ELV~CNcUB_*b*01-;s;Fq8s{t9j()CS({FHZP4Nv^pjEvaQv$lFn zj!HKz>m(?j{p|94qWOw+=={oj-jfEWKUlVHGiPSGhJH7yv?8fps&gJWUSPrz0~el= zyuL-*eHAOslpfQrmib!bYeiw?#gDt_NQ18_jnyPYn0E(2D#$;49R1=5$o=A;$Z)i* zYmDtI%pE6n5=z6xa75y4e{4gCZkm7+ZpM$m25W)mgpRmJD}OIxX<%+Cb+ zg_uWGW6ajJ#s%cx)TICmx_G`7lPg9r$z_7PG}LzT#T(xGZ6IQ*w><|_#ATi~g znyuF4@OtuPcGeun?`9h*u|0IHJmtq~AxM8h?0TBjNigVigg61TcRlr0{rSZ{9|Svq z#ltq0;`;H(BAzf)PzYG0m;>hC#B&?vO#=}~cQXr(D zv)HL~W@;6LqYXre(lKV$y8JUok2z_Us^C$h1uWvlOnLnxkF}WhcnOLgYaU)QKr-wQ zlJm|BNPP_|)=+=1F#4go{tquY`aq2=oVwEOucBeBc*`!f0IOO0mWN!>#1R zAm1H#ZhJY`)(_1*3B{`@v>B?s{IAwE0>iV+gE=RzMUe^99&$Pf_s<7`8Witn7#n-p z|B$&JZN;L+^Ey{q<{mk)U7<@js7UWrx|CU{kWV4~&w2OTvKHg61Z^UTh>IR%LK(>C zYnuCaf#S+tqlZKqlqd~*{(|Cp{|$)0XhKN`Rpl?FHB)?8R!aD^ue!HF-`VKR{39l7 z05Q=Y?0xXOb2WZ*rocyWS`+va*xd!ZVRWoCqTn5a3;vG0+_O{$8=7c7@hB_(2=1ak zZ7#gK7DiaeP}C?Vf`xq@=Ptq&yVB=<1J<7p&jh;sL>c2W5CRa}Xu0UKm~50L1OmU9 zQ7h7Kc5A$(RVa!KF2~O;Y#CjD9ce{A{L|c(Ikq0zY4^njLu5g6awgXNP0TQEs_>s@R=bm?c@;5yV)~!fP=r{{)%mVUCu+Frx)IF5s>De7Y1&B zKZx7WyNujJ<-6sY_s;v+^fvFU^-eGdC}!$F8m_#aEu>n0wXk^tJrl^&tZ0kB4oJ`y zB9QSyDaR$!0b;H1yG}wDMA~Uc7@s~6807dv_n@J(LOtD`4z)tYS;EurV>%P^^Lr+E zUF*B0l#hc!ugfXTN2w}~WN?1G1O#W;ote$!Gw=a^9idpt*9mHWZ^MrDeUYk&o{7L9pB{n{8scIV`*vOWiqc1cEq3_}!*8UA8X0 z>L)B1AMt`gvkBgPD#nMa&4A{bII5$*)oxhIN9)$My6M++4Ow=X(Smh-2BVmdc*Xk}j|gVKZ=sVR$vZw72* z4eJ65ZCdK^b42MpHCKPxA(@Ic%AC{KAm%kFSFNSlMneQRahhCTAe(7etr zudNjgk!&u`S1!JX4v)bxchqmvkViU5+SBXB3GPOF zF|mdiaUJbH)~q+R${7wQsCnT*PCgthJ$skC}P4RUnEWX&mt-Q z{`{&#Dm*)0OQbW4=E&Ycz;upz_d}9z%#9eWYevyF6~l|oH=CceV{sXk`6up@Zwl?J z`?M-VdDA+PKl1dJiW6Ma@KHhU$+by>K&-Ys$AN!lSP<>MPO7&qGq4ifpjj@Gq0$s4WmAWV_JN?= zRHk_7HZmROLbe*ik8r=^g~e0}FxX1J^?;D+!M3Dt6&%fFY|9MmyUwGJcJ@2|uukrn zE>Q#1Yl3aQz=Rn$;v}&aJB;Fcc@f39~+pRgJ@2&9cOh`4(_ek5OqDL)>r+SJ!jbn`DRk(T0I zNCNL(imm`EGj*_$;frm+wr1~uudQfrgyngLoxR|7s)vZK`cW#-Kz-kO2~165rNxfX z_HE+frZs*3KvQH(Su-xcuUX6@$zSV$7#2y@V$|mf`G~YwFU7D>$#>c@r_wlB9Nw90 zA8~3F;85Ia96_-EqKBb=*f?;GPk%7I_b1o}f%bH=RFQ)4b(Z+udwP~adKApNX1~Wx z9_h?f`Qb^{Z247FjPI|^WyQ4b`%T9xj6Q^?!Br&$KLh$3@VFsGlEh`;pL`sI)IbV% zoL`4EB*vOuVpkL$WSncwAzHIk=VVsYdDTJ3`M(qT92-Dfq~NK%ojin|Nk8%NG+#+4 z9n|gt1}NSCQs_Q3OSclD8m8u9I7?pM_^N%UdK|oR7UloY_0HXW_RHIF*r;h58;y;| zw%Mey8?&)(+ia4?w(X>`ZQD+sGrjh;_isIG-7g@2WPRtH&&;8*lZ4-ymc(ts9fui1 zAqAacORdoxg~Y~2K;RQ4yZtC~s5XB+S4eQNbNhn(wtrlHzj@9<2(=hwt}UgIBLED| zO=li4qNVxWTTe424*e!M$QPreHIEv(xjU8%)2&EpK$VubZU-^P>Uy+X)*9mvS&me_6;*`IzP|N@cma;{MC88S3@R{>Fv32a4Jg zoUyIXDl%Nv49{&AhxZZF4TIoO0z#=Alv-qqfo|*I7=gRH_F?aztE}yz8#K$=0g|4) zbRc^-MZJHD*JuuJTSfo$wD;rG?DAq0wORX6o#6^FYJ6lE@djxWu@AE=(Tp`D`yse= zQfE-3%8kGEFv^asyN^(leu;+n1d zh7G9~QO`{}3Z%Q71L;uQoFR2l+s7B@D^oMn%q;(@P{&^t#(`BEA9CL(03i274de|G z1p9MXZNN>c-7#|%$mDzVxWXM6h{5~3L@C2n^DsxYr^7)X0qv%S2n{S!`G8oOioIKdYhwSOGQCq-p zO$!)0tOajv>PBS5Bpam2chq?8l#ULN(WzB^!LoMHv`tgUtOoos%%aF8a=d?qy3apx z8N&@}e(>z>>IO8U$d6*c_r4W<>k_J>@(efQgm`Bu)jM zB8HZ&MhDCVH~==OtL_KSx4K8HgQW*-jIF@NxBkgQ~0tc+V>0_|$LE z&)q|93N#<=MYkaLfW#KSj@Wr);|lSKp~acxu2E#6*fuO0=?dq@_CB{yY&ciFX%^6x zdb+se&0S5vIwC~gUBCSRkiWFT8oe$CyHwg~sR zEzXh;1@Mu9x+xs!D6{uzrHQomPAO)jv_(0TMQ~3wT+rdG!*=7?P;mr=eDkS@2vyL; zfX5&$HVrP+i84SO0<@7_FIG34M&S%3c|6o1vXe{LM#?kzC}&)Y-2b!9qx{q6nW_5b zJ2g-}7@Id-OLm^93Fo$KW)oS6Oq=6&0+k?OTdoqV}}v}-SPmv?}vII zB^lt*==~YDHPInD>owwav7*+5TS`cDQxdU|-U6j-t_CR_~jSo}TV%kok6`nc8@tHd!1 z_HXz~@b!?od+d$yIVwEoVZx~;BcECi8koA;ay-x7=$QFhD`DB&dr-tXHJjEgvNpb@ zOE?6z=PTzE?{G-!${81anM^4YXF$31>&3KS`bT0HYSjr76xesn+Q)Qfs@O$aBGAne z>HW_F>CW)R#R7*(`Jjb`TKWl(ieQrN#`rA@y;NM2429*#fNpeF?Ef@;{j`lH z9ICd4|7WYe1dh&}w*sv`qU647EQw-JIYYgCd@xC)(*26XP^ax-^`kwXM`Dx__^bWk z=jki}gfK((eg@(K^Li5T`-&Y?knc%B$dH}0L6bFB`q_PtaNEYZ;uxU!~y2&dIdB>35jwQe0YA zS#rNQwd1hJmfCw)?=(GZ&RLETaYXBtPh})0*f>p4O6n@YeQruw=s{n)@o8U5vQxj1 zfX(q|X!=%jZ2-&&C}(=|LAkV_e0?ODsU!Wiu`S`nZi_{Zra?;jfp; zOTz_!M}L?fDd5Pqz}m_AckNUd*u~AwrdYHaOZJB;I@`xPB0 z)Pc{$l#tvTdS}%?(pmk>s;>`XblVEHtRhzSD(3*fr^aMfP%YPrw4I2_@H1un%r;Rk zrx|;pwZ82evtbx_4vvmz`_7k)BdXUL54takqU-St>|5Prxn>`B$z~Yq88LVpK1CZr zyfO!yxj+LXdnpmHrva`9KcYWSm+qS&6OJF>HkOCRcsAn@hrS12t-)&w1_bj^(BsWn z>2@%e@>dmvfQ7KRSCRw!5cX3nmMYRt@M}yk-DdFdMksCd&kJxH^E_Anp3F|#v>pK? zfwisRaJ#PG352~dSh7wiOiWO8GEBUmed;S^JAzK1kg3IqTCczML)u2vTiU6WkPz^ z<@ve7L02ig!Nw3Z4Fh7N$e#yEQL8Ft+!`C5^V&1k?h)S^9H8oree_(UWOVWcr>V?0 zcDmKG06eAeJ1ZnmGytFwpybw=={XaPCDT(6ETAwPhR%Y@_VZ}E;8Az%FiCy$zi}1l z=I5Q9KsY$Gpy~}$x@Fz0*|?NBzNh5m&E_?BI5o2Wx8T)^%}P*#Kny1gy#|rQcaEB;<#OL!>rBNWc0T?kXdMY> zJ1}d3`B&X1tNbaNDGERv$7MtdVG9u+@OdA# zz~O&TAIuW9NNTEx^#2Va)i^6AK|v7v(BsAC9Xd>5 z0XT7ll^o5mnq?523mXoBkFa`h^?Lyzo7QD@!ELeRV#UOMV+nVObCnjY>S;oF-$%|Vx=05!VKdcCc(~VUT$m~H$#crjG?X@wTBaj;o1^3ws`CZIHXCmRo6Bh z+itm7pLi1*76T?1XC7;bljb}u9o3dPrv$yA3Kw$FNV{!qp$!Lot5V(naGpxUr0f(*R)Mk6ygDw|*WcmGf<%WVX z*Wa%0?LaDMa-g9KFqYvPkY&?{U~xm>H!xhU(!R7Bye;`c+OX7Rx+|#Ke4O5#>$&AN zFcDQ$%}~<={I|_Vt7=kD)$e`10OQUyshB=+{U>|n)&LjV&D1GgB@BjiLc9(Fd8zRl)l zk{ILBJi-!fh!3(oII*%7&1Z8TOX#F|1M~A?hN03%l#YGm{*S**LJbzPP`JLGd^0xB zb|063)lVn+SnlK`A6c}`$FWbY$EoDDL63tEtg3_1`w%F06^em4*yX#E026U7mB z=~Rb;S2{KvNZQ}6^tDh*blPQIt>b| zT(!;6mR2$!TG18Wwu@pAGj4my^{`r6ik!$>VaCV>mA^H<0x!?|L6s_w%kMUMYHBtp zH#3b%7(suk2)9)kcY&5_-q3gQVhmM8_xD#3W}hAo1Fol_0A2IR?W;>=q8Ph-^vbLqkOvF=Qq+R)p$4qnv)Gm&xF~Z|Qh2cem zEPPc!LqCOu`toQY!F>r2B-ODxnkp6VRIxn(ITpVxpVrh}SXoEDzIMB|vG(5pFi2Hx z6KV5%-HUE(Oatg}gB_hm(&VM7WO>QUX@!{tK-_NLcr4TUv28t$tEnLy=vzGnj$K1#|5i5X^xr7Twy>c6bXC*nrC675g39 zDk@(FJlOa1*Pt)utRvb9r7T-W20Ro#Yv3fwL8`nseoWD@@WsK|J6+MkG?jko8wf1R zZ`;9>;ZZOY9|)#%^sMJAsW*K&N!mX5CAQyJ2iYCJXCB?h5q`##+15uDw~EHU{jGVs z-yB!TiY*g3N}6PVJi3r6u{o^j0bX&G0+041ixOqgQ<=5 zB+0F_udfSyeBuilMvs|Rdw1=$jh}<+g)rXk+LSim@N?47Kc*!KJzK^HmyqpqGx~DZ z$=e%R^}pT)fGkM_EFQ{~RwoSh|@f}!}n@=Jo^IZfYBWsEW+K`e>J$P$!-avK#=bLuQ(ep1JzEI-u54hz zRLzcHWHV|X-(GYbbrt&U!jA;WLBVtP>w8F&>^qI0(#?lS=32B`{%Twfg{`9l44sx~hhFvsq0hpT@$BcRwDR#q-u5}EU#7dlt0&3?n& zxjNPi;VQW_w)WcYya0dTxShtjxt2QJIDX$AFdsJtcWFP*?BsY4$Ut0(&L50;H({Pa zGhf8DE+AuJ-a>Bp)wXcRy{H^>qJP?w>>epjUZg0rLUSp5c3Oj5ZEt- zYMj}ttIoQR4@Y`t-<{TJ;pWvKY7SV_@*rvd@S~^EnCWBeX%OA*B1(}KP^nsUV*BrM z8YQR+w6i)>-v*j1i8g;_{8b2DDQS|zKd8{Y+V(X`_t^o+7cv}7g=L(;j2`L-6nb98 z4$L@E>E=iaKH=g1Pz2Gz)bw(5&B4tI6*#KV+RB2S56^!1zYavR;_f#aqeqtIL%S9G zRE}&=+(|#X3X&B7xTExmLL$mtT6Zcv(8t#k!gXe40FCU2T!-Ko5xYW_FfDvv_ zbzl`~V2G`W?=2*sW|io7;#GDK43hThn!8xJ0~4@A_4ct%+WI9?pTWH;S@k`ed}i(; z@-V-s>%t(H+)Qw|70O_&BYi^?I58SbXa7yif`vRt+pxQFgiFcW*ONFYa(J_P2@7@o z%q~z3Rf7W_uJxZ`eT2d|GtE$YyQ^8CE_0X9ijt^&EV)|#j=O%++;XQ?t)_6)+8@3w za;+cu$0&JuGU$LJ-)zE0HKBIHDw0_;^v%`#mHtkODl1_WspvU*|4WK?blX3n(r`*4MR`+C!_emJplgy=mi1Pts%X}rc9<73|}$uT)J zdV8I-jptaQfAsHN&7;=qBmCw^lhu*P+!BZGustAqA7uJy)Z#tF-5f(iezmXoA=UI1HyW^%A#Mrk5uNe zX<8n~NyCO}kcek4z;p>NAkkN3$0Dc7IflAjJCh-i?Wk>cEe|Vbx(q9-m|zCB%q9aU z0MvyVKwXln^z`h9buG>b@Tq8%dJ^v?c#9XxZ`d@3%lKFJ?8fvuOu6l`*TWd;+Au4Q zG1EIiuAKOd4x0hdcsJ>EXluO-JC)4-O)0^#{< zp`6D(sN%|RW|u$b*+*8`uEF+oNG32}B$Es}H;g0wChsASCdxS_h()VV$`UW+-nIZr zoo;_qQLsFskJ-m^^vQr0)m;b?S(JP;HiwL>(9sT6l~`0h&~+k{J>h(&yqpGj810=k$A( zaa#c^Hu*|H$u*pgq(i4M#p`;UMX-9+2|V zFT5Vy>q+Hi2+@UjO>onr^~V)`lYfknfp;GPDQ(QX4{&i20E$@8aEXAzW^C|i{fv(F zH1`?gkNTsFU}AY^dv_oa*c{eB7$d5-$AIOok##RJDu--7CRi+&g*eg?KN@efO$FoM zaOUE_;mjW}ZW11T(`@z}`U74BJkiC8rddHu^;56324Xaa(@%9lS@Gb4R^X(IiX{)* zLB5pt73VB9zMMHb@<`dOc6`t#_}uj8Vd|GuVfx*WojTcm$iF8z4d5Uz_LM!JhNmJu zF9V|hLhF@l0nh)PKU#Hwu!<%dB-;<3HaHs`50FOEZIGWmh?B1i%{XR;8qLWR09@)~ zxv^BPX%Xe7aEyadk}f_dzA&~7gRX1$Vs3+ohw*v+TaEpzXc?YPjgo!S-(9#*YlOpQ zP_>W8Gwh7zHSfAE1JGcWKB-7Y5660$xJfTEZ2S%n_cfyaHn_3@ce~l7RI4OB{Ehjl zTSdk#SUjy|b69_K7)`Wyk-6Y0?I#m60J3z;D>z+@I04$KDUuNmLp^787A)2)$ilU^ z5>yFhu%($zr!&RHJ(uDB5=4ol>T|x^Xiu*Q;LIJks$;eF`F9a#?j_=-Jn^DdfjM-t zJZ>OMKUP~a!-pt+xJiU=TIF883ZQ8tV$cC~craZIlOiSFO(k?m*dW8UG|de$>3&-U z9e^C!trlw8PhZtBlHM#&_|BVi3a<6L9elP=ae4iD(X>I7#id+5Usm^R(4p3n1}3jI zaw&a=Ma5#HI}jnQ#91`h5h2bh5V+!+T1T;zO(s%u^U|1e`t7tmpy)=vm{h#WL029( zQZRi4m9&-O6GR{L`D2>1X6&}N!a$yko*;@vk!`Yk{}nEA2=A2hUI3Ci5EFoZRGA}{ z7Ya0SM3XcT5?_-gb9&sj$@Y(mbzyVwK>DrL`hS>Hs0(_BdwXWt>n1Ep-bs5K+g@}z zgw0Pb2gRB`Imbh%oi+AeFJ)EJjOl;z^z=fQJL}6LqA;RA*n5CB{`6+l(a7eFLzkB6 zwmj?Vt6>lNTa%z#Qb* z#rKq|)3PJ}<9hoKA>7TJY`U@#W&(U7b z5`~JJETX5slWS8hM8FLGuX=Xa)iVAG?XU2x){p_qAmo*wB&9ccS+M6G8>JI#9Q9Zd z=Bg)>Qs5jJ=AU2Hr6)!vnPRHR6BgZcofJRd06(5{`kg1AJbo@6u_})3f1XBJMNpoQre=R2*<=UBR|`D-S25!+V5ERNjFokm9^XXcYbbqx+DS7 z1o@7RZ0P?a>%4y-z{Uy);UBzTU5>Y|4mP%?4i2^st}o^g@&mP}1Q*IPWbWRsogNR* z@V8@HVa3`Wic;M8=Q=bh$eu2NLkVVH$IwaRa3fUC~`mT4FAZC37S^UUQB zUCSD{8y0-aCb%7MN+j)5a_bOfx2*PzH{gC)v{ws!QQXc(bsl-&I)_96eX#nG( zV&)Wh3?u)~F7i|9l?X7vAE-UXJ7Ee3pn+s^dzNaLW1MakW5y036jM?60>zN=RBa{K zr3@K2Y1svPp;SB+2@Jd(#Ob8M3aG9v;ZYmWI2L%i!-V6z_&?mZW!0YcEhrHAQ0Uflleb5lR_x%3theSGxX z8qSi$%2`pop)J+f%s^jSbsTL5nPM>AUEFXWZ1#(;b|D@9P6yL?IuC+OamOxCL(<>-P#ks z80RR|M^HVHm zm@k?+2D`@R4Wzsjkt-)6&A-vXW25!6^ch0#7Ji1I17b4%k}W_S@yF>(PQr6iLIN0? zjOxjNo&?WZ*EOz}**l&zkE3RMnX}caxQ%3-s`sJfy(a$&&gnoV>3iPtY~X#_DnFHd zJ1>q*LjjN9%qXg`Dbn<~HM0oJ^NYGst<+N;uhI<<|4<%RBQN)-QkKgE08RP9^ zx?Sq1=2g7pEZ1oKluJ7zXxjm(YWzgy=(4aINYRn%blkL&9`p+n$Y#db8yq5(sVCG- zl))qf_?Q5d&gNbk89IIMA)@OV8Ve7lzk{v%`(T>^93I3fiMrG?Vg_49`#vgH{-yRyV`+!T~_Y!7mEHcHQRY&HwV1@y#SM*o&}=^1(Pb~z%1(-Go#8RbGW3aLmd&c)siJ&eLNC=rX)_kOFH=6#^7d7k31WOrZ$l*V)V+-a5v zP`y$2lX}aY6cO{EL+wo0P8`?VGxt97G6TL_9UzgOtPe=Ag;YD#r< zdY0Tc6N^&m_#J0R?W;Gh+`VD7m9f=VNE|^G!M2Sc6y`Dmn28OjeMh$y+c!WvbUqe7 zAkhxOVvz`+r-#7P`tHkpH#C+owEQx8_vPYH|6ISA-(l5phsvMYW-ak}xbM%l)c?qm{Ih`&x(326&t5LRy#oT6lg@5(1y<0KoWpTsNoVrJ zqv@cl@7YK#I{vb))@GA5YU{K1W%q>KVXjgG&{4;Q_%@T9ZQoLPvVx0F%V@xrSvupJ zbih@Qb{uFs(QC8NsDA{zljwf0j-`a@ZZ`)1RS<-4R?Ar{2=hpSg+Xm~yjPU*tBS{t4EBA`d>q_&~%bGuN zBI{yr_sRe1lo!whn7c3anX-;+dF?Du7EL_)LYU@}*Ob5C?ti`=TswN+%!q(})STGL zUR{|KZZav2pZ=noN+jf%`spcg`@D{Z7dW6)5#VhPRrpS`}O|>1|F?)CvtJL`yXpW^x*~0Z+AK z3HO&F?ie9m#|>Cutre4ScVD=x`RhM41R!hMC4I1}b@>T9VH;VAS^DQuem&xXRSav> zC%fpDOhKeLZsq{@D5PT$RmLxR86}BJb^Jg(~qyqdakig znwx5^(?fO%jJ52LCy{`Nn(|&k=Qxk;bKFqJkr{yV!n@|gj9|k?Bmw8gg1?`az)%5h z8v>KVWUbm;#Bz=p3x84b^wy3>#AuOzONGDofX(v1QDFZ+B@h{Y z%Vv*b25;QErGtQJZNQPG_wYTEi5STKE?A(E$i~|0?N&9R$`{1G3FZ_E(my-EPM+0m zHXhp@irgnys$#40|8KA}gV?(}AYK@RHFOs&^BEcQc5F;Ge=T=Lv+a)e_4eSUo*Xow zuHUnP-TgV$F+cE4EEdFI0RL}#D58EBRR}2Yj^E6I7!EI;M)_v z?AycJ3*~YS25b{;|4B%5@6mO(v?XD6!>mF*!cHrGGBXTjRfF;$CSh@v{%abeVG(*7 zMc{F-QKr{3g(tlVY^j+;;#OV#!t_*0HM>1R0P z4UG|)wW=Whq%Bd zPYtANJRawr{rUZUeK|;Mi+HysGTE3TBKId|kvV4hdxt$~{kOw9p3^(5>iv-eS(``# zz{}mztWsZ2eco(4m`|7805A8q!J3TO4WT3a>aGVGY(P>yJ?l7qw$bKwTIwjb2_wJs zWT6kwm^5aa{SIT#>7t+Bsbbo zha2BpzsVQwZryJvT^5u5o@{f6XZlfDst0|RRUh{Xz*2=HJbr!I(T`>L*2K3dd7b7s z2v>AaHG474ChqSg*PtVTeb|;Z9xFquF0&CCQiMgy>ql0{koro%eneF9J*fFtC;V)} z%opWUGxVjLt3{tD@e%$$FWt`-mKZ|jnhPSDRnt!AsX%@oGO#)QFP-rQG3qxu+hgk6 zbN7Mvv+UdP^~hSIUi$@BPWdY?Nz3>l?K>R&Pk`88G(igD)EG7C=W~4=h+w&3*X_(2 zZ^rBH+cRCh_FMWhB=t!5Na4IjG#S(pcDov#)^4@5``R3_`97Jc!sl76wSwM|oojQ5 z@;bm~)h;=LI1L{`Fh+QF7 zVf>YCq;|mH!QY%ST$?eb2WY!#y90T&sZ?PsHnf}DkS&KnyVQ=o=w2n~4cq($8$&@- z{d`x(Iy65M-j}3xqXJTZfB@vpizOe`3MZIp<5>@Jsm0y+yF!WS0FP3-mxbRVFRwWk zr2lME64pFT6hA)cv{iXNKne4HVD|jnL>4xIz}_$2aAQ)C@x@^d4?4~D-tjw@=zM)S zU0EwxpeK-li|swe`-CXX%nIoHZ^`n{-0q;rfy_nv9b3+6YmN;g_7V)!bCshMBW`Of z@vn8h!hoMpb*T!4BdIv9Y+qEct`1$ThtCilz&_IrjXv;hL&VQ8%a9)-C-(4NBZ?aP zk6|d5nW>J8{ZQ2L;ILZ>rq?0}GQyOO7Zd$t7@YfpFrAxzC`b$w_bt*9l9EDbX5DqV zlTSQl;tY`H0tVNJ9(4QT$W26VvoPRzjA8*hzs>dUu{{IA^9&`ghrV_vj@G9SnpRWo?N7zpnI1QuFGO#ODQBSCNy^fd`Bz7dgA0=d``k9w&b72i zH%KZEA-7-nK0~P52@f6P+uyITdr3X%#PD`8-54rh%iW2?do_eN#xUEw9Qx4#paV(! z8XySPhsfaBIrFr?V$iKix_E%M!@N-k(;@k)dSdITjY)%Xw`Sf5Bbr~ac3}U2JVA4H z3;*1U*-C6~Vzl_&QUT1SOhOW{_B5TqUA;6^CAjRy&{0lc^bG~Xc?+=`NH5eBlCvZIfkiybA5%!H_Y$z=~PdJDsbNBZJj+%6*xRH z(hntmtt3XpHPk{4n}!W#yxV5GOIb_`I zY50)WHy$59td%5p6qvn`%O+lZkGxA70%IjQDV@Eu_qUf?vvFbZFML^MQKhwDi8}4@||PlYx{M27u8v_S)#s4%^V7p*9*#U26sO^63xHz*L61M2ZVtF=T1ky?lWE>|CGM z)YW%!hVPj-g5D9uK?!Wh?sm5du_W&i%s3D37sL%+;+C6?`(u(i0KY8VjOj0F6~!B1ILEihQIS6Szv^sI?wNOX zbIW_8agjzl84025VByy!!o~|VJD)SN517~dxo6c@sW;PJ*076*(}s)aln(8ujLQw& z#bGbK&(^jV(k_fz`&>Ra?HJbnlP$le9GCZupK}B_jnw9pW;Esa^)S~+0Fg|mSP0F( zmsBHCAWuL*iY=Pt80Bm3-9!89nvasH+n~U)=I@T+d0N)Hq!U>f>zq890arCxp;6l}E1H`>HlyRCjUv;CE97|){fUTf2d@5li40PcDUXFV-k0z#Q9X=uebnhVvKgm7pmq^Be_&E$v!* zvG%|&(%jy+oI|9<{F$n;duY@xRhK+p9$Vac_ysh+7<9bvn{YL~eceLD2RT*kjZ6MbE`CGvqjT2FQ5$@F{f8i)C&S>5Lc~kRhoBGtOD~{JU zQra~x3@Cw4`swtS=$0w^Iz3ABhlyG56T9aB{5CXt?5jM0->cDncyV-4yGR-Zt!z{uko61Oz(Q4IC zttxs!Vcj$xy$=){X6nVMQAnS#1^!_7u+nATXN%`jyWW2>SP(?X!-HTl2aXQhx$4XG ziPI!kTkHHFfJnnS36{OL7Wk-Efv~gONAn#X?*q3|NSOe>u#8YJj!hIKTaGssPKO_m zUGbr17k1Ro!OMyfMGnTN0O?-1d;bHK+v|?DoAaag>zt=xE)ZB0)DM)L(+TwYX30&? zpd%2L#Pzaj)ILJ%@xDZ9zr`T^*mQiVec=HPrT!O{LIe!~S%Gl7YIo&uzyD;=Hhx=w zy_oZMo!Fiy&#k-ngrj6{zukm~wc8dTy*UDvcoeDDKI<*Sh5et(tovJ;Rjg_mma(<; z4;Frvn-4n&n8_z8rkB`u@5bcoXr&Wl&29>M_3Nxsnf%$~e9zB|Vw^AZ9k9c^HX^Pq z*;f7GqrV=&S^yfnJ;PH}52_r;+3n+A7^Bm(IRBqdI~$|z80P^{oX&!q!>$~22HEwDKW2xk9+ zE{5Ehy8;3LbdazS=v-qYvolEy205|-IBNLo9*>zuagMq?RM>dAv9?>dfN3)lw&s_5 z=`D1-tiyj^`*$=d1|CTBD9RZ@)rQakR{YS`0GpgFRM;g;d!VIC^|#s){~xH7=`U0Y zZU6;$1t=VDiX(uwKJt7z;p=GSdMIg;xW3Lqb>;y7yA-_GX(-!>VYtS)TE^EEJ`~&K$A$dQCJhvL!-A)9S2;`sKBaPl) zW6Hi9JbZGmC+I399$x=hvLTS!<_d%g)j$v(K-?H3BkSuV*2(S4y3r>Obm8q;J+wiQ z`HF&F0C-x8R3d*QGD2fq3wojto{U6ZIZC=!HtY$5#}AY{<8IQ4ft?Q2?GQJBR^6+Y_Vcq47kd$h`W$*hXK;fQ^MOiDdMxV~3>BX>gd@Q1J zK6ZP7E@;2@(g8T$8?UQ2*uL_&74E@dNdahG7?{)&AFmZlKrJ~Hz*|8>+ zT1$&kZFRHaTGPaG4@I+DrBXF@<)UopkcJAs-)284t8>Po_O*yFQKuaOQSZkOG|2coivL)fE zcU0E|PgUO_ZT18id(ec?nzjno3h4s(v8rP^SAF?e^jou(-mz=B=Rj#2{3snmPhvIn zmdq-#0X3c1bviV?J0?8@sah{pkD=i!v=LpiihV&7879o zANOPJo8l|u3usvr*!w$xF&N33k%n(9t9-BWgcr?UEzo7QRAoA$+O*Hb19|!jJ&W7n zscOdw5`$ZF6nr=*= zz$n&!{K~!vy6M+2g=XI^)8~>XXl$RK--c=3OfBn9`a`~c0Bzony1=4t4seEN)5|1I z)t^ZsZ8h>%$E_pid1#~5Ld|Bf=>;QP#9N_(h6~d30ObhE4@$_5$m|u?xUhAS%KuP% zKjTqC$(+D$Q-TX#S@1n0cW6r~k*hq3wu%-kxdqu1BS%24HZY=);FpiqcMkB`;?ysX z#2eivrhX17u$*mC)wpTyW`fF?wPD2FRl_u2nGq*xHA3cQQ+mW{c7T$z zszeyxZ>tLCGI|`|e{J)3NGF7%Q)u$%ri9sUTqhI&rI)}Uiq*V; z{jaPTfw6vp#S`f{X~kC3PIx6}XxUd0)D_j2P?Wv4;m$@FeX{5@kP7>%2xFqe6LfEh zap(SRQE)sis4v-{D%$h2sM*>EBIvg7t6Ci05Y2AdTOkb-ARSgby_fEsY+SM`Hqg{m z8f6y?Xw^nFnU-jl&3b5-ZF@$(1SaxuJyTaC%B^7x5IwRC+XK~tJd>=3^r1*pL znY{Xw_5&s&3aW8!3q``FaDnq+IA28k&icz&LG#p-Tq+~JPiP30An=;>Frhi3pZiSq zB1U{2PRXkc9$9#6cS;zgf)60ji%32x#oB)FeJ6GP+S4xk@6^Y!wOA$*X$qND6 zP>CJ?76Bo93jKI~;aOpVDaTC&-|x^8J7JfU`v#>%Ofe!Vf>Mt4f=fOQMt+Bg(>>Or zdfy#Q&tyf};VG>Ws;JZi8KD>kuQ;cKeMTKJD~{7Zb8|RYQV0`1Cj20FyDS+6@*mFR zL@eOJ`ugTiKIy`hs+zC1_#eqk8d+P8L~f}2GFYG64G_>EGawgQh!szCX?wb$P*OlB*BHt6AA7kVvJI0 z`*MsCBPlg?$ORTLuH?xc5*Lp^b#~zBuf^|`AwlUoCj|28uiHkH# zVN3TZk>#B4Uc*DPLypZ!`>FZFiQur<+1pB{$RF8leha&*}3;x+=}j;Mmoz!KtYq@@kfWT4;E zA#Sc&*mY5iR2QbHX-Cn>ys{+h&K$)5Fep?hsl((l;We_0)1K-xxs6|&6muWQ6ppQ_ zrU)dvHeoQ990bi%GRzbBqN?7v>;}0AlH&E;0gl+6?^cg=>;ThUjoTTe5=&r&fi{mz zPK{x@(uo2FKLJeZe-w1SsHNqbp4~5pSr-pllCZ zh*&vA-$Ej*S76T}K2DUYRem0k`RI3G6eT3$ZKQe+VvNqi%vw6~QZ|zv`W!Y0d>((y zIxwGz7l@1X(Ga8ID0M{`IK~1wqM_hAznNOOBun2wh=vc8>H9Ijh4N1uA>zcaDl{|7 zz)i3ivs3e?X7;1<2KL*jiS+Kd;6%Go$72nr66HC4Nfge#6wvyT-Gov#^b7U~mLTh> z2meDMz{Ox1D2*c@_zMx!=)(p%I%lmM8^%_H-RGR@tg83@e{8*DV`Xj7EF5dc*s*O) zY}?6%6Kf|E+qSKVjfp0i*tTuk_Pn{D=bZED{RivAs_yFQ>bjig@Al5o5OjwVtfE(Q zj6tNO(wbm88WKOXf+2hu%f9JR99z3pikq6`Z|sJKMQC^=BbwLYMKBt-JzHDp*0upw zaqcB*=NPP<8f}X|Bb{fSAkHCz_Fi>DWESgaoOn&+x5dYU>1Oiqbs37m zOKboa$UUFA2?$0gJ8`5f!Fp{%?O^GtAMsRkdBk7@4v zdG6E1#mbBlzZxaGfDFTcKYIXPyBVg*4>*P*g{JPdnmnbR^hMag%IiG&AjtV}SW|XY zeTZweoGff{noecV9cOVY^D2*s1AIYk30}<)97Ab%>plvkRK&ar{sxd$oRP!S6cl`rSG&7}f_>>7zMqliHsWSp3Ea`#4 zTv_Rf?+|vK%fGcr2=~ib-mTc`Aw27V^&MzTCpQ9zF#exzTx@Qs_-%fTx_(YxM_A|A zf1Ybqn)-~Df}{*GXM0BPan_ok$2;`>{sEhAS6Q3tw!qEbI!ikq|07J+OTgtFe@0v9 z8(@=}b!FQ{;)1PpM@Cr^nwP5J9dCRGET`N43ZF^u9M!&!e<<|CIlqi}MW3dxMyMYK zDQ<$`#FDxqp?)@2Kn+jo1OZJi+0S;3Dn}S9qnl#7xTWK4`N2MRo-+%>eBxX_rG4@S zWhkasN`bx9l?u+7rPW&wT*@PE@E3UcFWi)(pZCD`*|FTl<0O%oXaSog%22d~F^`~h zDEeDc8gTlfX6~Ws4=?IWU^n*yqQH*I9dxAo9})9-sDOf1AO|0!oyXp;FhN`;xWq>Ud8<$RS&1#gQ^uY&& z=JqI=d@Q??Y2JREo2D|#0?7^l;!WHn;d)K{6nR7^F(y+%J9)q`znQo=L0#& z*vi@MyQzPmp>MC!y#5FsLvdE-c|_n$KKxbe8EBWs#?K%90*B12RfXB=BoFczAgbTx zUY6Vxq`b{=NoGFIQ^!F~PhuX@Xxc3~xGYLiqI~}S1+Mhcua0CM4t*FM+Z?30xiGO6 zGP$GAH74LpsKDQl{x<0SQXPlu!gr;Vq_Y~nvl=Fq13kU|##`$-VBU24%9>f^xu22G z>|hu0-w@K+0u4g98xkAZ7>3|o^1a~Z>Ef4;f?|`La=GjCfhoNTn8@~s{N)s5>49-w z!-)0+BZ}?pnZ7GIpmVBt+KR4pk*fgn+t8mD7fTVh@S57heb&+ki_opIS3QqoLfQ1uWECzoXsCcV$5TJu*vg zWQC5gEyQ5yEB72_Q2|NrWC|pXWq?~|g~NDBpWhOFh#)Mc5kL-u?(O*j)mbZLrg}u{ z6UIg9-7jUMYZ=3;{WNt;fHP(HDI5q6rw%(k7;I8ISafOsOBA}l;2SWbE}a{n*$-+D z+G190jj*UMFdlp8PC8sEwbSNhem%L>i@TdQaYMs3V8yTn`Vd+A@~ z1%uT*R#pF_XsTcj1Q&A#wqZXHXxQ2-!d%5YZv~TrQHQDK!>o6K1W9bc@m7xMb)Sxh`MNa1bGx+F~Q|U`B%B1m9Nh(Isyb_(G2D3(T z5}sZ|SYY3)w5TDzLU_HSt>!rXn-&F+Lm!mBkZJTAFCw$`8`$9-Y~p+TJZr6HR6(9= zD6W6@X>aN#Ux1Jzc7ekFc)y!;l}jZ$9y*%ee4`@%;D!BnPD*4%Wp;~8?2ZW8k;^QO zZ+abEe~V2=Bt@eWiW05fI8Bp06DN4-F}FM~L5)cJn=Y8XvJZ@%KPyggDJ`v#3R!$v za%WZxob)zA&pz0YYf-lM1S!yA{&q&LtoSf$FkV%56>D~+< z8f(UaT>Euo7HH{z6f`QuW?zIB$iD6_g2hLZqmTRR1@2$%9w7fqC1^R?H1Gs8)cemj zX)&*w||CaoHmYQL40tr=6PQj z_SVDk0#&wotxz?UZ+#TkVEotN?t$s9fbkruN#-y+*LqNl)v;md>pM{* z*}U87p&l#ch$^q~&oJVHg&q1X8cC7`xAt%}6CM|Lvltr8u{!p8Me2!~jzMGGWU}d) z-Jc!|K-ET~pZ$sm;^hXMXU$0C_W(<7{_CPH;^-UfCub+FIR`L%TM&lTn5IR1mSu}H z&*FB&kyduLl(|>A8`qdj^`F z{VVZ3Ed6=Nm<$-)Zz*|-3?zMR#q+_rSer!`y$t!u|2 z_8@3XbmbRE=rY8__XB0q%W1}+VvKL%Um4GPNhcZl!*5JwtgFn%h=8e+lzbFmw1SzbB3mCE1+a|(kiJsDaf1ToH7&F@K9`P$mg1&v-v;Z zEOFpL2eh?!2S69%RB%NX#3C-k)5Q7|ZzSvy285C?3rlnW|LX1U3!mZrvczs*Whu(} z`+gf;et302X-uUa0kg5(?oXvhc2Oi35wIgf64{zJNpEl8lMc(WF#&D)mJ{+C;QcxU z9;*r=rY7?clT|sN;N*X7?23brGAhCd&rBgSrsa zr=?AZI0C>jp+V|&Ec1KO%Tdgm=jmSuiTEQL!6>4YBhOzu9^b>IkSvXM(GCix%%RXZ zkEiuL1lZ$Vg84&s@dD;*_oA?}hHU81C4>`V-+Es}~0$-77=M&VFaXp+&QCBqQ2`ML0wv!b8P)A=a$Vd+czoiHlff%|+iNWz=ny}8#zv$!vT3+(bS;kv-) zG|)E@pV<*Om{gA16dtr1p1|>S7>ZPVq4JagOp1=X>vvnJ0e^YD3d+_0sut?nhR#b> zwqZf0MkkYF#Lj0LgH9I{*Ft`|*JMbbJlU1VgjSGVeb~fYmn#^npx*#+oq8 zFo31!RU(Wxmwc^GUXy+Kih&W<)nb9%RJjUwaf0xBKolK0X1%0EdG7YGoJiszev= zZz8@iM*O0A z+?$LlZn77^Q<|`7&FQY6MU1(DH)oe>^jNE-6Y2lUN3-gb5?%fvlo+Ojrwaif<)_bIs;d#+|ga!=oW!-{p!>k#bg>V27^$r*bJDJymgfH(0e(vbvfPc zom8Tb&CZ>+?GB)X*C#kFBPzvOV`K=O-Ut*!{A;2Mx-~-N(~!Wz(CDLJs9ZqA`44RQcDpuvhwM6_&>0HH9alJ+m8G zRM^ztmpH)n%V~$W=djkI`}J5AyuI@R3^7>3m}c9VlXww4=r5^6ILOvYZ02j;bD?Fm zjF-`NC+__S3jzdoqN}7Joa}a_Syy|N`JIvkeS-0~P2cTerE*hKQk`gER4JHj|9c0mf|E0J{}@Ep9I~UD*F(=Q_7gZ{M!RxXWkBJ zooPI~`p&8mxDq}+=^TuLe9CPC=5h9ZLQvHpGzwp5mNNoRC+g|f z6=p26_48+G3iQ24Y3dR%@I7D;5tx5`eOo-%@eMoty#of8Fv+Phn)J?F-OdKeoN+*n4HXOa%~M1F}?- zM$ZyG>Y}t*H3s55@aDJzIh$QsRC+b_M|GTR0m%KO27W$2+96B4E_w^)Q zJc;QvbPAMk&w!d#?|sSz)ZOul;HfyQ`6M=@fd+@OR@> zx11wZ^x6UDrj~N`H9tv7T1EeQ_|+};O1W(nY}!AJ5E)|Bn=IlXdFq2SHG%rm_%5(R zcy%U}2Yo%z;CwKohBLTNyms{57(x`2i%J4y@P8h{8HNqRaPGB1UXHMt-M_skQaK;< zM~f9+u((=uN@OJU$j}iP)wHEF5KdeIg z?=)TAMZ~Aaz28mS*#LT|q~*$z)?iSnjL-KY7IE|fxuY+@4O_pW%4P}kv9^l}%i%Cp zV`yYr`ORJ$rw-IQpDG}J&^e8&H8cDZ5bGO6cwc3 zAp-GZZam3;=Fq}>8VKk-kPpUHni|~;O_qG-RrmrXWs0PP^Sz`Y76tPR0z4BpS%RVs z>4zZ_p)@y0uo}JL#(3|=Is_i(p6o6XOesWeFe*_d41@_theuS#9PwgimFn4N?%|F} zjHF1I5{00W=oV(umsr9A}K&0GSnF*sN>Yxt{%eZ=vR`arInaeo~Xo z;BOIe_O~lg3%~xZXHih2HPw|3TnbL{s>NL z9?6n7}fal`3+maX;@ zb2NI-W*aOB%mUk`r0x%193;(k)=gd`mrWvIw^S9q+U7g$LT<1M?M_6ZNet))^^SL) zGv2=Q2x^YAu)hT2&b#GO%L31JHwZF%o|?hx&e%-jnx%_FJ)g~H^|p-FxkP8MopeRR zcF?%C{eOwA4Ce@KhUgcu?dOSgd(LP0WXl1*P7~csn%b-8d;M0V(}*ZQ9Lqs^MVZE0(7_bKG`UDn~ltVsCdb-nbA#b{rcEL1u_uuW^!HES#%PS$HZRYSo z1hd$ZBDwDns2;>mGZxXh*}+QeL;iN8y6dhQz334AH*-Fk2fUY&A5S@nf7Su+BtU&9 z#H$K#@{UrI?9XTg!hPe3>fIthh&$1?{-Wm|J}K1duakM}I5}+@)CyV`ZxM1d0CB^i zq|ALB9s(14G)qx(*x}MsPvc)8Q8yO;*)Bgfg3^zC{AWi)Q;Y{LsVoU~>QOFZ(NgIK zwCMEFC+1)cWG%xtWl@Y5d#4bhX4!37NE}LV3)>26!(owo~hQ{=J%d>{uhwPj4V9B^tLx3m!BVA z)ZEHG*S~jgt1t%w*~vBtY1E2m8BXd3moMAf6;p3va80`^EyRF(4bT4k&H@MNSe^Bu zFd9&MPvWmCiC?jNTdlv4QtRyQ&akyC1`5MFSgQOky`7hW_G%XDk%_bx@oG2Hp)?2t@Mg%cy|IBE;nxLepcA_N-71{4a)-nlIKVaPx&}f z{RtgP1iKo|Z(-dT8-;-E;=}QT5DVW+)-AE8q&W9H?k%;}B{A3fF}?%F7aJnR@f3!^{cm~n%QVh`fF>+!_4Ygm@@ zw0U7%B9H2-9>PUHOR0lx?Pwjs$Qi$@rwC!T7+{r+8XgvYSe-g_!o6aARs;q{%2 z2wsET6;MQ0X!VkkP=^<8$gg5~i4S-U@05$>OXP8oF)_-FRqDNw!a%HRSm^w#{<*lz zuoobX<{`>PO8p0q=5M&+u|h*+rsgk#LgDB)S`+-1BO3Y~r3UyiNH+cIlX`@A$ArvO z*5oTd1hZ>LkO|bQq|M#(P7|ck!Nvw#QCSPywaY7dpnHi2E$JDq(VQ>th>L24@%ZFu@q^u(J$t<>= zoK+r}iz}?qhF+?QzoVls;DQ;BR23FVTe^n44Do!O()3DQ=tfx6)OR%gOsm1e_3+$- zKF$Ne;2-cgW`h>!B|}QVGJ>mHaB2-;GS3Gs@&FG8SUh;bp_0!s@-lK!w0dwPxU+%C z0fLYypMFp{dD#Yo(gA5qvJ|HE>q5h|QLU!bHE!a2t#`?N_-G$R6d@U{b^r#_7TDp@ z01FXVAj$-4HxVg!kA1!w%SejE9|@Qvc>fdr8Ym?;I11Or+f$bTg|T%R>b{%et($>g zja~B75U!{NznyEp!hcq=AV0iWYFIjYsl15ll5{1= zIRe!>Yjqd~0s%G^hcc<4N*33*Z7dR=ton_^p@E zW!ji%m2my*Y2#(RQJCyI6R2MzH;K{e)U?xZSIDA1luKCM$0$Cjz+$o9*ZK_Io3bKor|xXc!hLS2QOhl|F_!JT@u z1>(zqw{^ULDxDLHy}UneBs4&E!LlR{V4O~J9eqT4*=R-N=tQupoBm6I80X%Q4* z0i%80VoZb0g2XnpjzzG!d7v!*{yp#|7#~G)27B|366Yc8@5;f24vAV7$(W*e-}Wm5 zX*>7jAp5n{x3@{qLBV*TvpDu>;*FYMl6S_ULGVz}f%>08iJt{^CZydM9+>GG1)`<) zlcva{(~c$xc*7#qIU%FGs6tGTqY9lm60&rUyFP|eB4`qYJr(Q21suI*YpTF#$E zAyOIJvUu)=I-sfgAb7QE+htjP{gaNJBFZ>G_WM)~)BCZw!LrL)^N6G#qv9%P7^~~u z>`ki`G#lgvX!z6pu@v31z_mnBKOHF+H~-~s`7(`dLg+EFSR7T^_VhFuvP-sgzFTAY zVbSwvzWuwdm?dF}y`QL5VDwGa+_mwL0758i9U0q3AI$G?a26;t49$)w3TA40#SF00 zpoNbp3F-$|{{ai$a5de*h2r+4G2my9o&}ly>V+-Rg7rp=ftEvPz3v;*cy>O)L6;;_ zrJCCvnohft?6!`@5u6BTbmF`H8I-eBnSYw3LY#EcY|-oo#|w@i1!G+<*r`o*^YF12 zj~v@bi|Vk`ia;n$)EOLFh-s)LE$*)dd8(MMX?X1VoV3+mEdjEesNi@mJKGnh8HfxQr>aScZ-Gzx%umsUAfF1m-I4EwvgL?Ioys{IM1~x z=(SyJ(}Ey5aUrOjO4g84{`|?Sr61q`o?KT&akgIuf4@w(&b1D>WDch}$Jx(@JzdR) z(~MOKp`)nTsuM2j%I{2+htiiXqGuLW`V%J zV31RZ)YX%Hf&V?+2xt07vE3*fLBtAnMq=O658Q&bzvU8@m!J&QzUz9N`l(9)yHWN( z&-bG2VS7ob8L3{CzV#a2@AsI z5>R4x1>fh_wQynntcYY0{P;2+r4g-jaQBiJ5}G4^NUT9{(e*L(#Z}2QZhiT2>~p$j zWC>VcM$hcF*<=!sJyGac(PkENB#aMGdhic~0KDUm9-p~}UK|z)Av%<$ z#CCM+NcEGIN8mCQ&~OOb^L$e1>FxZP%t;bN0XO{bAfpH-<>8K&{g0%9&>W_HGF1VK zq$uPg50MC5kzQgRAXc#Oecbbb%q<4(WB%${l|H*c`fl1EL|*97GALSc>iHK2)i-m_ zp0Y0fcbE4OSOBGwP%d+O0B*oBlmmIgw`A^ztQ@LaD8E|y8v*6x9=u=*IQJbzw&ZWn zlOU>zQxZncfYb*x%mOqEylXW9Qb`vRZ73~=ImgwT19tN{zRqqzpLA!w}K+S7CP#&fIoCF%L&EUF~-G@2Ckq?y9DID@u{&P9_m@+>S-x=D z`?tM7J>c}2srODxF@~$eYPb%wuqf_uL0=A{UH!VRfH_Mab-qPn?)9LqoqRzyKDryakB;TDe{sKczMg}J7_w+rzc_ukr!JF35gqm{T1>^vAhDw ziNk#UIo)s9HaceKsC%%cp4ZsUPqgt$kt|+YFJsS??zP76A5B&M&e%~sqc{++F2L{wvpG^-0#b209 z19C3mB6^2{mDR#UmSU+~a>*7BV>TWYJ`AOQ?IST9wd9krwmHx$<&b2duvdTq@^cYx z$;QSWxH~u@dMKuveD`Q&eC~$<@E+&ZQcsoWrwhOHV8CW5F2shz(dG%y-G>x2^#vVg zF1I)T2+ltyUm5MIMV61YVEOYk*rZs>7@`5;LsLf(uru5sCBGkcvIi&jz-8w;YzZ0a z1!#VQ!#4STj!I>M?BM%zJI9=ZF0rs=_)F9ld>c`UUP5#KEnj9IzS6EeXhvHqBVAk} z57EaK^`B=)c|w6PDrOp8n_3_^z{S0XNx(hF;or7(Ad8^P5T3-qPvgzJ_!w7|1zhl3 zXsQ!l*mRML3}vBl-y~V?53?lCz*aK8JWQF+%rs(XS z0W>FYMem6t1pGOv#Oh7!?a{8@q(j)dt=2DCqh(!>z;tK8GB`v!_0(38+^-izR!A)-5QS|vE_?*smz?~yD;vHmR=ZkT|EOzdIsWv~gL5y`-_E1u2mkbtaDZ4~)%%a# zW*Yo-qVOfI0E1VaEe%fVHg-VN^8e#rW>7Wjh1tPxbdwgxQ}87EY245NX38A`Qc)bP zioqP)pXleC-hL(*-G%p=g?~NK!Zlcpoh$lO?m5=&1TePX2{O{2&hTDa1?iOA*o2?{ zm2+f?m{LUOPa3-DyaYpLJ#P?>icC>14BDJS@Rbu*WFBJb$pG+)81BIG;izo%V9&5) ztF$$*sBXFjrD_IpMlP)vau!i$aZ{7G?2`B&tu7I^N_pGCfvw-%#17#hsSPF;_@mX> zo2G5K1f-B{^pi@u0(&4Vh~CGO{izGobXR+QMs2dsw0_yr&#~YzRCYIju`xuc(8DSM zmPy61Gwa$g#{FGkACG}d z$nTIA?civIkI$Y{rpa-fCC=|V%Si#p+T%l~kzbxG%CoHz07eai`4bT1HaLiY%#$EN zX}%DX8V7FjI;BiKZJNsn8&B{uJUQtAxK)!_f)i&n{_P~c@Um}M>B|uWVaD~hip|B8 z(FN@Yo%{A~I_V5BSUGojU2vd)82KdY$B;L*^ogo~=8D$)yg50McAERgcUk}2F9l7W z;+%eja4*Pon4$+?TI<%Dio(-^*Bz^~3Fotgu`@=N@4)a_=GHv`#fVe+L#|n2_E7@F zrW(zbP%C`MWrb zNOEw@F-CL7=5s}oJby$n?%0-n|92B21+oM1)t*s6r0f$Lh0JXLWo=&R5fWxX+|Oi+ zo9Iw`&Gm-gTQ?FHs|Ka>5RVyQBnp+&%4t~FENzFeOf)&YhZo$Z$O1lfYqG>kRV{%) z^FLCXnZ{uQ^&9$1S=8JhE_0CZ3XpMmpi1vwo;L@#*u(h(8Q{5kcM`zW`tYPl-Ry-g zz|Y9y2ks*x`{cX#T8FDE%&^X=#l2*s#l`tva23tCF;CaHW#Z~q+I5HnydA6eJ4pT5 zKP<-rHD5J@i2P<+%ojW%FA609%0iuUXwK^JE+6#1pZ;s@b?Y#1n$ctc!2C|1;XAiK z%?=&$m@X{!%QNGE$d}Qmsrt)kG`s%)`0+DaHW1||gq8I`M#1VnPvH;ul38Lq%}_Xl z_|LHca|Vs7y;BkVqMlSE|BZ19e~6Gr zuO5_>eHKesD`0RZ%T~sK^yGkAJ~2c_3PinO3U&axI`(#m;(_xS8{VvhDpt6PHmV{x z?1p4V1v+70A=ZW5rx6M$cRBDQxZ;llO-g;wd?#>FZdLHGxdnyTWAAaAIiv$aslP6$=Kr;SVNWW-=*~re|)*&?g?M#+uifED08`1fHts!A}3w=aGi91W(Z+8&f; zXJNgu(<=T15ets19dAco3&Q7@3vwlCfR~ZvA$|Da>ebT>lNvAvJyo7$@A@aNvD8L+ ztmLmq8DE-22%VY&O1orWzL}_`={IF##=sq;0@_wC;9z)RyI4GT^EQt1Y0EmCz9LQc zOJ-b8rCC2H$d7lLYk{&M3};BpE_z}c3^EMh5{~<%*cF6j6)_`nl}Zo=68UPuN+<9% zk(Cf~MUc)t%P@P;%fwSm)^RMoVDp3y-R9fQpHLWa+{Lve zyy=cU=|xu7oGHa~4y>mMom*tFLhG<03dP8J?vNPg3EUv3BB;*b}>Iu2MSa5}u? zk)tcRE(8k_gpx#)k;V(*nv&_x|1r61@Gt4Q5!Wz)Q>0oD9kmKF$fz)sMKs_!%L(~7@6JEhmaAprur z1q{L3e%n5PMqvpmE`h(g2cB!{8cn?>`UnYU&l5=-yC8x7$P;sz#ZeS!4wka|*yk<{= zMmfK_etuIVw83~^7R%X>6}lghNJcWjU$5YJn%k0fdx#v{_(0jz?XT~S`}i!~0QVBi zbl7^n(VUS}@|Yc)y}z;f8GuyT*v#k4dZTAxe|bB??2(0!OIV$w|8l3hkF-M(#Wsf#tsgH|Z*FUBb}VkxzB9QkF`~#PHauDrIo<1D zhIBnaQ9bXZ)!2_scC`rHup4(i#woeVJ!O4PXV@0yYwt!W|qU)9g143n81rRAZHZI_|C&aUUpnsud4j|t%oYDn+{ zznLq-DPqT*kK(bfUwrmY=lukAv&Y?0vz_-TS(EKV|C-Rj+5xZM7NhOuEaPRTL6uXb z-I_85$5qsTH`v1oPIS~05xh(DsN79*8)4r7KmHi)4U9SxPpa|!N#RS%&j=n;BXnR? z%PVvp16z~{Jm&5m4uX`2`ZIl=WUTp;UerN3eY-^_I%5^y1YZz-qSOzo>v`JK7-Cn^#6gf)9?7xeb2O87wA`*>X7cZ{67sWUAQJ?ViO_HFBm2N`c2jd2nz%0yD0^!x4)+C3WqVG-4 zrD1h8Ar3P35K%gaj7l#O|95-5!zz2nLGDZegdq5_?F(h$5G}La5Rtv#j~1#z^*C1~ z9dMV|TBH~VvbSGHBfw@s3GsWzNq2LyR&hfpP*axbP}_a{QpdlBg%fyCzEs3-5ftAg zGB5HxkATn9>%ayVGNYoCcbRBytntaBA5%L&NMFkC?88OyOo#~19>M{T=bYM)(+{Wz zVU7Cd%x7h-iUlvSKZ5Y? zRMXC2lL5>iB`mSq>C$iVYq+CNWum3`+t4~jc(+iJ!hP5oBGnZ9oukS7oDSYIp^S_& zsug*^cMp-^5E$EjiJKsF30skMlYYJvJI=$QTlm*m(W%)g#xq+lFM`9s_$reSkZ%QR zc8dtw77guzB>NatINJB3Pu#VuXWiMXF-HPszqEtl{#<90EEB^ohllZ>Pq#HKe|#qN zs;O`*(gzK-wJR)0UOrHz9Pxd_#(J;7VQW}*Av4EPK^0xtOWU}smym~*tCz>diJilg z->uwOAQGm{*aDZq&gAQWUrVmR2SyS`VcSK+vd^KO0l?qQ=Qidtbgc$(BFF~GNU{;! zws(YoG8_}pu|H8PvEStL-Xey5oAs}KR`0eDKddAdK3I#}YZZXvro{iS?fpYTO85-+Z9YT?BkH&32;;la1z`&vDtw!nHadyCH*AkiM)tabpSNDncul>=>r2;W8 z$MM4p%18gkU*p%T;KK`+)5-Vc6Om8Irz)r1kM0&*YqffeEho#glp!GxgOa!L+}yLv zuAd6qtl0@R2hWbX0Awd6k4uy0GPUnbRCBQw?RVl$Q-y9$Pn&gvJ_lF6jS5)?l0aJ* zJ|f=B#VP_PH>R4!wDXN>EpPT6xFCl)R>`luIK0$5g7}a%TF#K;=spKK$&ps3%B;j) zhbuo+%_ki;t83wy`^q;FlgYb82bzb!tRf81uK7&#kF; z4-VKAjsldda}r07t~NWPUOoukQIQ0}UvyibR&eOfR5N~;on}zW?TMmk@CW$ZhhuZI zZjTv5Ew3#SW<-TYvsY+es!mB?$(TejYwKM3*w60@)R zU?Y%Y;Hr~%gyn;Kj@;I}106L57gF%%nFydUs_0)f-zSh$U${N|6U^-DiF?orDaCxu z$XmImd0dYuh7mJLS*M=5oAwr@$A#%%?rnmC{$DE=kFOXO8FOY%H`SdyT=LArEcXcAyV8ie~ zL;j8*ch@Kg1b(_B&uh!NRf^z8b|bTRBbvhY6c@T81@M|oLXpYgg{q9HF{>TNp2puADx@gsl|y6tr_MFk!vq);9x z_6RsTYz`%woTh(3Jt?S9Y$VpTE%6A>bW__f9&xJ|n60X8H;6zSHFLPgyO1-UbJ9NxsS)j_#n@S`4o`s3NyzX1&xM%~G@wdN)|K2%Mv{ma#MYoh5Aq#C>V3RR(;AoHpy{z)QAV zs^&r)d#H((f2diD?o?_E@HV-1gY=j!4{I*{H@I_&u-bFfmfOWp zC-DnvHDT*trA2+mAg7H(uKU$fsmoLH`VBO%f%jz0rIbP2AC(WO*1a+3`Km$uX;!Bm z#k+O-%}2~8)2r;p>^lGlEFYl^0K>WCz{QrM@XvNHtHYd5ZH)`z{9~LSgi5K|KSJ@eEYb1ABFUFcs?%j`g>Xov}N` zd=d*(pE?E?=%#TiQzKSALJw2YnY1W6L}1G@F66=Oz1f(q2*(ZH3&--qcB(f_zIGCp zjZTdS&k)-<%ee}(d+wnddIevP5dt!^dsj&p6Zllj?6Ui0A=6ZEQuC&@85AUzbI|9q z$X6eKrxdV<<6^Q-fQ&ZCnzZ?0SUSsV@SuOzCSd_HCo}yBd=u@VwVE8J5%OzZI?W4x z5@2^fZ&04Q)WWZfIgMP^s9Ke5jCDXF08FwPxUDEJFw}ep}0d zA6|nu+pbyV44Lffi+XojM8ZOP-9x!RWGdO)@c-Aew*Qg(lf3MQzJkJdrrilQlt zBy$=$nN_tcf%Lzd6Lrn9O~dFQRwTg^|4UtvRAOD-t3#I2_un7cV>OvNg9w!!lKc4w zv{%Ejq#MI5pNK>FliRsH(_}htB3%ted0I>@`|cn#u!H8^${qOhU^ctBUIgW=YH#vz>S_^-5ZISsYKTJD zWQ~~i+urFr2!?PYowzA+(Gk>1F`k`yG7+UT~zbqQ#qo zJ%hKrw~+%O)BYJArwt~6n~T?FYm?XP4s|O=9QVLQ`(Aax2<6hhUZ3kIzpMuO;dP&* z;>&QzIEST8&y=>i&ou~N;*1qwH*ypGq_$F$0>+%vCI8DS!_jTzx7_o`bw6wvzY{yZ zQNRSxWC_wi)x1-CMyBBQb@3(FzwO{J7i-%3j<0yz^0qrURD)gAlg=@+fVrL9_FihM zQ>W)a1Mx+0#4O}7H<5hnmh*zZ{lOEIojZ+9bbDeJ{3D;Uo7==dQ=6UNVPg6WY2#cq zU-L)A&;?hubLFK+8RS8~id-zSJ5%R%!X5tA68XlB*;k%X|CQ~i5fyhA12<@WV#TGh zZEu#t_T!XQBR(@SKxB&=X0K#i_IZ>Z0V|v^>3>GBK6)GBQC3kH3E9@=cUgW$1m@Zs zG(sG|9RVqGU0Z&4uL+Ls^Us z!Aj=hPmv$pb$V4B`i4Kqg3;#19KnZ`x`&2T9A|hF0hKs?xkWIDsL+$v9)~?zYJ{(UCRo8D$`P0 z#-t}6&~kU>edbLXJ_)YpI#c6U@NIgG&W65mqY11|0};(HEM4$$?8uo-X1}E2c;T{d z;%t-8;~LhW_>lKYizf)UolpSqP996{EyBy~=l&5i<$T{%N87ERfp5 zi8Bybl28K9v8w4hOukNcm5eQ9N@VI#=_6j@!C)}SJOF4(^#DsHCseL_4b|@WICU?) z4A(3EIBXTOHnf1+#0^<}raOWw-?PD#D@&|@*wUe@nz`6cqjiQY56xJH77cMs2toNmZNuuUDeJ0 z_Y97!BrW`3Z>tcO;V=4ArX-VmR6eN&vZz%IB$S~#crHZdO`HD-ko&JB?f>m6hJj}D zpT06Fi)KMCRF#h9*d@FGV`ectx4BNjajNxhsNpXmpPzP1-_7$uy6!n|REmz}{HZ3r ztiGjUDAdn^d+YX2XE~toi{~(GT zhfI$M292BCb4zIei4kp;T>|5j3gwMalAixSo- z7jIpwWj#(9VcvB50XHFcsir4ZzLuD#iLda2RQTG&WazfIW`Vd|`U{EG(6nj3zEc7N zM@fL2*8b*wfsnJ3@A;hQ;?dM+(c7z17s0HLDc@hPR_F>{H@$|DsF7vw@XX|kv=l0<~M*fGFu$EFmrC84u;1JFPlvnS~NtNFlL1uWi0O?Sgjdp6{ z9^hUi`=hDr)1j(<`oAimyICJGytz2ZeD}D#dnjNPrRy_C)%4o&?BF#MNEe->w}u65+E0>km)wtPdCR0uwrcotV= z5j;h}^`W(@KW#lRIr&(*LaO!XaFD56a)<-P)h@UlsNi4^jHVYbMsu4TBU_qs6~p=m!Vu0&O&TOrTG)vfE_2bi;R=*%=1n@A`TW zILI5yC%5kY2X#W+lXC|hs!rp~q(Y#hg{E2TIXaZkZW;mm(Yzx0hIixiL8nhKn zhh2le!SP^_mh}PF5@zk!38=%cZQO7od^4YqB(N=2O0I|NlIwr`wUOb~8m0T6+ECoy z108jtWA5TS!&YAilY{MOTXx&nuF3<%w$a5?6=ujCko|vJP5-INu;PDOjo}Qia9+r0 zJm|Kz9v2JT1j2T1B_cd40(7G-TJEi)f!)zl4iFrpRvEdw`diT~UL2dm} zyD08foZ?VgC=#F)cM23J)~_gSs)h2DdSV+_9R6JAaKjdpRPH3$<>=C| zIFmy}Z*C6R1-;d4en}Iuq=d@Gg0-BW5K*|W`jIJ>hK9~~t~r zGO(|HM18A{u2*i-Sh9}tSrd{7bW`8*T#f_bi*#h%U421CK9ii~k^f1g1#A2z-?{ae z(O32UqH#RjLW@Bj@|?iZ@12@r zXgj6U5VvuCuxBOsOtQ)Oug^(odNLGf>>XeLeU?!n-N^BL&>VA*o!{kcTFhIvJ~t(r zSUx>5@QLju5}-1Ed^gD^QHd=!+oiV~5hn4EJ9pX2UB7yu!q=(+>iv)Yq*y0w*tOAK zV)NH-b5Mj-k4VaM?Bg~4EcU%8hDVp;-9I}Ws7p#_W)7V+ddQbpzuZO8;Ikp|&S>iH ziRYTy?G)!In-PFFLF*^MjpvLLa^oG9@13=z+QEFH@b=mPa^Y7#W z|7)|v&GJ0`y;cBxD}DCt>mV%4ndDfYuFjy^k-=}?2VrEhWF&;lT0UF)eAtz!KylV39i^$HQNd9m`A?%y8K&jaf!U8umjt$2he$iExqX-k6G z2FIhwbXDfw9p@f2^yCo9MmP`uW~lO!cE@>(cish~t4l$W63fdBkGb|^+g_fl$Hc8F zqtJ-#T&j*|;r^$-+dW}UFG}TH8#r=&z-!=l(TdqN;mLa9q*Yu)JI=B&VTnCSdkgxD zez-gYo&9XoGQ8YknzST6?D2AAaq`}LG!LouW8Sns&NMserZ5wKLHH)Lb@`WVnVB&V z@2fJ5g3WMPg&ODkxJS8HLJz0qc>a*s_xagM9NWm$yn%D6yLdxNsWao?LA^v`vUsz4 zoL8rkss#9+3JT0kIB(|@8TVKkQHhvUey?i@TaL2FW_t9@cfw4gBS8B1FZCa=3Y99! z;^^<{wF3)-@$G(d12N zD&@56SAcHl?guVMyiG&UTD^2&lOuhu_eb|H24Q9}tuT*6^2vuE!;624RR3A#R=haW z{_q$G;+bd0#V_GkFN7{RLcf%Vtuv^82otQwl+zQNN#Po{X61ZiT`)gH6a{uAmw2qE zeRdSUwvFsi&VoJ&LVweF*2pIr=F)L;`!{kMwy1uMC@odt;pEpa6cNQA4c+=9jc`q2 za`TtDuc1xaP$Uve9;#{n_ssfFJbCOw<$o#^m#N!8?a(0JA|BH?hl4QpnM+u!9K_8r zt_MvrORO#E;#|rqHj&A3V3^8WTLWEH^;P@~(|40t#w<7&^jG=M?qec%q6;BU{Obv7 zyNf!xzT`~h$>j#FvPcSB3(cP|O)OhKj?b@r4H@W{HRwAB56AP=M@v>OR3asOg7YndZUZy4 z=<5pp^v^ol-D4E*kLlKfCU4+%J^&M(5+TY;SK?xu-%pKT;@gYG+MDy^DYS`m`B>4O z%c%ZD!pblej{fI> z&S&Ye3zQZZ`Ptl2HHcsU!+w+9_sc2(lave>W|&M)4K|5u?N|67i0){`k29OY(s$<< z{6X($apLG^Fg^||Jr)TaH5QFvg`Nkh+9h?YCMGaXGVAizS|xwG|9XbP5iAlDa;-=o z@%M2x^&6^neaX#KU1ayqB5kn>SX$O^9fDtn#&~g{t_Wyzi1&z_O%W8- zk}gHw+ZDAkuOKJ1ZLu*c8idPt26~Z@@_K*o|af)qO{q?U_X=6MKv} zzd{{+c1&-(+W(okIwG>pFJRD3wHHRpSF;InFd->7Cuc;~#gg1|1VA`(!f9lp>3MsD z)S8t5|I3`nPVf{_F4c+GG{Eo4k_f_x6r+qq4~?JNWohGp#bGd9~ZnRZdY1)Eo5+yN#lMMV;Jka(<23~+5E(F7c1yO&i{`hEC zpOr_2J%tFji^=fEHte-y0f!xmLUKo+n0epp$cK>TuowSc8~To;_vv7Ndcph+(Sg86 zzG<3iMkAB@tI~drS;|(ST-{6ZL(JlH-O+J9EZQ~=WJ?PUivz!w&Xg^&vEcSzKF2k#PLR^FX z*MfEoxS94pNQ8K!GN}j7iQLj3iwaIYiW!!Qt#{OauFp}RZ4C@4hvOLz=O9O@L-BN6 z;$yiFL6-P-kgIK{6rSnKM*J$a=Tcc?TTLmz2T0+xbJ9&^pO|B$4)|Y+8>nX3$DS5;D-s^ zqre*+ooKj*9|>1k9tD?djHtZho7V89`I)aC$QZa7r>j$H#?m1C4D#wcCPli>w5pf3 zW`(=u-?@?mf*F+c+uYY?TN(bHkz+Ica9cx>JFadMA*po`_PAww324H5&#ynx_(2&d zV!IGn9@^2*vCBMB~>y|N^aqT5DBVx|@6#kHp>LYCXA(r|d zo9Ar2uMr;u)-1Cf7IcrXJf{)u)8lGbW(C%geWDS%ZCvsDs{hoP)|4OVfXG}Os7mRW zVPQiUQ^onxI}*aMoqPcfi1d?#2iGgp>?r9Ft}#+AhY(>Z)?{4lF5oToS$B~RIj0= zFNU6Z*GO zcWB%zmj-_8YQj&izV0ce_>93fXQk*8%Ur;o>tBpde0N10@H}V*D~gx3eEY=ek7^c; z?W>k=*4wr_JO04uJKNu_F<*r4cK*$L{zJu9?MBP6VPuM2?pd5JBpM5f@H}2^6Zix^ zQib*+Ul2W>${vWI+t&Ao46ctn68@cmns@DGr|u4q#j_%3;$Q^p60rS*Q5ave%a-=`L_=CStO!vKW0B-{c7uh4P1q0IsniNTcsU$sD|=pZQeOr^65XgLUEHxZ4v z-=1AYTI%)i>L7qa!AckW9qw_i+ci1jar}KlP33E60ybR0U+&N|vV@7hzekWfIy&X2DyFWb< z({WeVVRRhypHRPC6FA?$MO5=o{GfOAhdw-C+b^fZ*iUR=+QTwgBr?c+?~LxdiCU@N_0MM{st88CGtK?&nVyjt}uXG^P32w21`F&!8era#%MbmRG->v%T zy|3=HmLka~>ipELs@Vwi4vl~ne5$`7#A)o9yNxyM*Xv!3bV~{=vrZpky(6{P#SnT> z77Xg?&v1K|wa7qFUfpn}^L%0{a~h`^Zk3uw2jrp|f*8s53);KSX_`MnCb~D45UmSF zSG{{{X8X!chj-4)g`n0tNl=9MadyUt*ggtEZGmqO-_OOjkoYB1W&Kj*6}{VruS~%K zL0DACcOhEet8AUtC_mSHOs6Lb2k*$mZ1+zS{;iIynKmWHqb^XM`I-$bZD%k|qi@+r zYgvWV%sHl5d)vdZx(oEQ{R@+kyx7H>@3+~MW$R)F;VUNaIdZNpMuqvu8e)sTOC{WV z>`K6Wr}5}L=1k}ID&e+mPI(*Fb4AVVtPyf~`ue#ce?rh{B#toim+~szXUhG8Pie)! zGx*!`-pY>ip?oSRh#IU^n8=zaV14F=O!mp8xxe}qUFLy0a4Nt{fG8ce_^7F1pG+F% zp`zUKmsdUAfOhk{@!A<#U8_MD55$fcYTG|^^9--j`zU9Rznrd7?iqPwLz4MjPeCbE z{kw9`XcuLhumZbBvWcAgOP2KWpSoAJeIl6R1{XwjRd1D#OQ1s=sastk@y&(9t41vC z>_4U`bvC^!hO+6rd@J|LRx0X$1<+HG+VfLl}I+wVE&x2|VN zheS;hwOjdaim?Mdrh0vn^oP49+$^EoI$!^?lJ;T!?i#3wBW<)sL)!GDrJ-^|Yb9J5 z#=7!phY-4NX1KjRzrvr8hXr)KN4?CKn|9x6u->AJIh$DWFDeF5AUj(X@GHuHxjZuW zDOMLOQ3sx=&gF>-;)mK9Z-c{FLxoe!YS~M@I2r3Z=Nbr*8`G}Qpxrrk$?{eUo~1K_ zn#mWKjP`*qlmeB>O-s1b#2;+tUCpk3jf;Po ztZg5nw%v%QUqoq48;c<~jBz?p^p%vK_eOg8r#tmn{Lz}2x1fYgf&U5QOPPv&iJ`uV zgmbNFD{Ixvbx8nV0SGn>_L~#If#9e0LoqXo-;QZlg3%FlZgZ|Ic{dgf>ymq+3JfJ; zdsPGCf;TLPRSg=}W+L!l#biL<)THu*R@P%!T!O7ZH_6$23P>({9>vDR+ z5(MN*LaS+P^Beu?&n%DMpS7eh%V*=gpXM1du*<)euS#15dgG5^;J<*K$s-kn{!RYt-DD^w=D;0ztjjy9738OJhRqbZ=Wtp#wJ}4W4aBOnMQZ!n-5CRyL+?L z6|YA!j~UvuUiSz{buxG?5GD1E&{?wVf1?9d+YB4{ZZ2~Pg0z0SfbZ)N*G*tU;_&DD zMMf7(;8W%}B^nkig^a;F9{QtiyE_2Gk?tH_pD@J`p>n(JA~mc?vi`hzbjC_lK+mJF z(;8Lzn3`8}iI<^E@>QyS$mf^4PK!l|FvpSf=qniG1NkjBz>}CeJRI)lIHB&YXFzUI(R3(WwV?F1kNEjsoz`^xwfK4V`2)+;Dr^1wzHRt3Ye z{r2r!P9%M;v5$TgGwx+wrz-|q9xPQEZS#ok&JJu;3(+^Y_KT?#`0T28IK@EEu!TMv z6?WX7ZQkT&szNrwBw%;~RmdiIE$&k6RIG3P7YpI6Avg^B>u!@eUFMsg=-WLCOG%L& z_`{I*o^Gbi@^VwT#l5cM{3+kGeH{82VSQN`mK*7WKnC;Z^Q5!n0ru#dUvm?Ht@4<1 z7c?t7hRNPJVnyxD^GY(AlggGm_uJz!!=Cd>Dg7cr2w=`=*BhvdRAR)1hzV1_Ez7eva=tr`Ll_T4?qZX1_4SnE4!S~;I~T)p%{Ur~hs?%UfpESp;E5N0A` z*a4Jk%#L)Tdrr=u$TLhO9|K&L-`25ej-o@aGj0i;8xy`UG7etX3T3akzsBYuY}p+C zaL{y74qbRKJDfo(LJo|dXUKjXtt`$qS3UQREy)qv6WFemxG^Pp53WQljddFM)f+PX z+8Ahb^wo1cvJjOtLvo~fVFf;lW=C%ru02qWtOCuzyp;|_NSn-InM%LxiXFd6@(9Oy zXnZJL?@qF7&An0v^(N*gmT0dJuf8NsXjyG%(JHS8 zRc2NG*iVcD@#KccF#t^iUjo@aLmjA$*S97_>c^qDeQ8BjP(eJs*KALLXda4d@fF-#77fyU&#M_hhQ8dG1~phVs6 z)IY$X9Y+SWjyaH9oh(XbL(i47z>95S#Y9o99;qke9LM#cEFM%l8b}?)y%}5kG`&+y zXw)q{<8JqdSB+LLl;&U*spRZFL8A^zh$%779UVAl(KA?*QTRf0!Ggb-;R!KMEH0@x zM^+Gw=43&oIRXf${hHj3f99NLByY1{F=ufE#iZlizsC3G)aD$(t^D6=a(L{Q%1&q! zQQ^*LZ6r0KLg!~;*COEmP4*k zuU?oiQbcrgC#OdL{mmR6l=B;pbau@GOCo{!R!+F$|6~DdPm}5w5SCfh(iZ}RC zSy~CB;|7R!IU*nrTA*I6vr~-+h3OBUGI?U?;zagB@z5EldN(oMLXHAz%Op%d;13j_ zy_f9Mtn~@Y$&0~fq-O5B1#ZM{*k%ldPDcq0e!&80N1=_yjVG>D?RM;3ZsKK} z4a5+S)Y@r8%e>Gm4UgL4_&EkQlnlf5>i>>qB6bY{a483Ge1j+}$W!+{lQ2YQgw^wv zU&u$N^M$n$NF6%5b|d zs|eBP?&2AncKbtq={K1K+82#2V zC3EC5H;1KuzQc9@CgTBLeSS^P?FxWl!`m)}5V76|o9Y(zi>J_k?S}~tu7}od5{s%C z?FMgd9qwoSFK*P^R+hm!uJ+^6DH&G=C;!HL(ci%K%HAHG)Y@;#otUeO^=6)z&%S%A z1sd%=Z>+B7zgqu6@A-Uuq~7Wf=YlWm^`z-qgd0rWJt{PZioISAd}?}3LEI}sHs652 zBD=Mxt%%3#PTc!1^eyMmMWpT|{LSgEn&00E!%s()7cInDIvf`&zKDpEHP-$6T*q#` z**X`T4fl2WePn~33Oz_^Vo3`wmORxERr?5e)q^JPu0C=0v??-#q!>P{ry#BGO$WLa;2_qb|)Er4~>-d4Rqmm~C zIh)5_4}WCo^T)BmehIioNmg8EUAc>mjx&@u!7 zTB?r(0RuV&M^>FGy*Gi9Q6SRpGdx8uJBDFOTCRWy16T?zPv!4)T2@fh_qLW z@>?(bSwoBwyJI+O8L$tBAQQvzx&L5%9d^2DEIn$9BP@DQK4zq!lckrl@9wMj0h#5c z-Ms&X)3f_Mm{2vr>gicJA->H~L08xHAMR1--+neR&0EfD_Rb}tn zLR8ipc+4HXXa#>q9au!cFJEINn{py$EXcfj7eFz`W1RRioz0TMK{4x{@UeASa^;&o z3_(giiwPbEQPklmxnI*ozSvRY*T6~I4(=;^*%}Lug}>pYG5W7XJ_k9j{OtpXUwUNR zt!0y6C@&_Qm~v3M-a~j$IDL%7cMZaHupRO&|DKJ; z9_Rg%VLsW#KvSd73N!1b@%v@d#WMf(fkkwhp0q@au)6K|PSK%^5>-25S7&d?4SS3j zbz*d_W3w6OVgKfd-KG7Zv|w-x4>J^}kxrE>?E`jAMI4$tTcG?0aIn86hG4?2$wA#3 zNw1q_`Q%B--=9*h)E^9ZqZhbv;3vBS?%`A_Cs!)!EL#=-ba&eEjNU>naYeJ!s0 z=8x^>gU3=W``@;j0X$woU#P${K_5aaCA7;kB1@Al3AG-%#4X38sCGG|PR@|#i(}!C zCA`exZo|FeAYWM)7sL9u`G zhR}r%RJL{V)x4&M?QDXSdR3z5Gi{7-&no>NG(Om2Xcx3o8kDwQiK1&AYkOcANW1?}(#Ho7xcg%y!tz)QiSkKX zQS;)_7XpqW1*kg8KQyShi#Q_O+2c5+axj@l>4cl`io}PQ?*v3Tq^a`Xi>k&~61Q%l zDhf~tzeH0gGYqh##UTISiAx7&QV$x+69_20{7h%a$JDQlc9~~|8A}l<%wU9CZkwZR zXqXGYVAaq!EyszX$Ye9n`0hW7X-V3XB#Tw>r#r-H`n=C&c93UFhUGAqYHb_>5SoAh ziZlAV{_{*NNb>h`YX}WY?tZMA(jy@7O~-0Z%Lc}RQ@NIi7tYOJi+0etoSmP*t6o?V z2q$*ceE1K!Qvq;R(1qrft>XHEL8U9=Y?aX&RM}=U7^%bM>a(vt>g=-5&Ki6RKTJhZ z*4T`HZ)%GXjbfXrRc2|!_RRzEzTMTo=TF$z`=_fHdQGSCaFN4&ARHgbD37^CQE@wE zKlfH?OhqY`aG$s_dWz6%*Yn2#jO)d={gN(g3VG-}<6^y^?r(jkj)nc0H#^qzt8k$8 z7^abQZDYA7tcb^K8rNfPoffHwl%`wUm)=b(_WD^RYu7e;LJpW&w;w%N5vNrmjOl|yO|~{iekvMACwKNcionkKa~ca zVIZH_SgoD{xPjC~##;Ra(wc#OyEatHI-d1-x?y~|Qp~rz=+_<}YguFJUc~wnSvvT- zmAZGjHPOTdxWo_^u6@iVdFvywQn3*J_>gkM-5lo03~-t8BAsRCoDJkUu>Ze%^fTKP z-W&ATeRuHvO{eijWlPBt#AKI2n1vaSKgukAt@;aI*aSot0B#qKSn`|IpL|qAJtmg)@+v`+J2>>X zu4c9gXr%Jh?+77Tvenn$Y7d0o@jU%+{N{lI93Aeu>VBa?^rVW6e(MAcUuBd*-j?)AyK$A=7z6FbNV6 zPcFbh)PsU~uK-s@uA zubfM7p0l!d8S0JiEZo~gE^c4o{-#2VrP5_ydsyv39@(JF*njWU&oMH$l1;@i$X4gEOsK+gJ=!^h(k5 zMjl4(z3*@gOvB}R%}b>`Qlz1*=896Uee^)7iy3+S7W$F~3L!Fy1*V^7nV}Eb;lC0AovV0`)Y?hzL7h)=E?aA94CM}?r`V+(;6eSnp&>f z$2Uhl?HuDx911f`9zn>vyRYt#!i((B@8!y0f7{oTP@1gjOA+?JQVgjhL|H^V>ypFY zsj@Xp_-m14k55m!Ve4ms@|t<;f{pc}63GTy^$HkEuHnQDW)`WV7kSd{I`fh!5yd;S z>gT=Z;KdQArUIq)nImm`?JRU?Uzh4fGF|yaIyC-IF5+SYrY!5>BIdN8*k0NJDizk- zxLlq0w39f3V?EAou+HxsL5+&Y2@R3dVEb;-rAmB0vZ*VRn zM6dl^9yShrPbBa9q;{JBQTYQhFRKW~{C0k_j;UDd&;-Yr(Jq%s-YuQwna~4y;Qs*2 z*w65Gk^97=CM2fg-InXntwSX4rFnJ>cbB)2BYIBRR41*8Iv|Il?mA9BfEI=hJ@ehv zzD53)RUk&IxHA_0@A_D&&$wb`OAQ;SO-MW2mMiP1UY8WYV0PzwMySgu?wCmM=G^_} z>B_TIUxbqIfcQF1ta}(klaMNZP6A|oD0}swLj`uZ7hIGSliRb}4(AeT)a)dRaV`Ai z2EM-~&OS|pXx9qXj^eJ_T!z*#dVFfy94=n*gLrq*VPnt>%+b3_-gYxWz3mMu^kQa3 zVN@jR?0G5e+riR^b^sSB1y~(8aE z!FH}v4>JyzbE60K-{{Zpdc7Flbgc2-Chkgx>KVYO3}A606Azh(_J``mP1Om1Cl$Hz zUOA!|_&(!-`o_LCyV(d~-tqnnE8L6{!ssUv=TlMR#nF|{k0rgww=P(J3d|?FdXL77 z5&dWv*YpBk#xO^;Xvl>v^GjNamU^6-u4D^?;8?%rs7Sq=L~Lpa>QoR>2lW9f%)aEKj|8*m(@W|N5TuunHOiP>s9G5wt z*pbnC=xYM`anifDg-J3TRZ6_;m+xf9!hE;6@ue@KbIKi)O<{cTKWE%bqem$N$iq$^ zBy)8Jqa9TblU6%Z4HLCQ+x6SD8vPy)GBi+hVC1}mQvo%=44mc*$!P`2y6bHnq?e9v zfmx9%7iI-RO(YQ`W7^|0>r$6Z{&ZnsVmex`DI{u>MLVw?6|$u#JnbTcKK!rj|4lRd zpQzAr1C!SV{+YvjKCZp}G4}9QWO}dD>oT$5t@}`_N{{SG5N~>xR)9p^3K}=JS^uQjYBi6;AnDr9f6xXzV;WjVjYp#9Y zMukS)F0J?Xc<{kEb37I=H5EH$AdFS#5JsIPk5q5O?#hc1gWWr{;9~lFuG?g)&ZyDr zEZVadE!$b?%T0qdTd)*_Kcy*hDktMje}R~PBtjXEe0%&Z)BA#eY*22LK$Aox&p+oE zdg%K+Q?$*4)=C>$`9J>6troMZbi6?<-;fT!xajW|p@S_hw|*U8+zw_c3~ocRd?l9O zY4cWxqbcf1|3*=cNn|BsN-9xz{$!gNQnltI2A}Te#|8+lry4Zcf9We4g#u1 z@EN2`*u*1Ye&@c!*^GHoh^_3xoQz8aNv|D8m#Yy#r~A8QL~Nk|D8>59fe~!+Ta9KD z|MWrP+SPnhFj20nJNM1e>j1WdqO|2Grnj!gq!5o_SutP)!&DJYPJQQe2`w6;@+~;tWp7Pc)h9 zhUSfF1~gZM>i=3N|H58K$|se$>rDA$dyU{$b{Wf5;2ojeKEC_Yzsl?%wV7YeI2)4k z?Y5TLUq+&8CBFS!ZcMkH=K=X#s4DKqf}+r2)9*wgMrv}zOOFdR&|3JL7w;Lu8mT=x z_)$KIwR}$+e`}mkge3^!OraEHur-HM#QYUQ=39%W^mx(90h&*y+?~kY^ZUF;=`SJ! zOx8v&g*B+_!`KH z={LjX$Jy#*!yVy_p|>tSV!h)T`twp|cS8M`?6q^33McXV(?{zMW`h>8Ow4g4A8}q` zkfPxR1WO~|YDA*AZ!a}}BdY**YC`TfDVF-FpT*zJyw7~>^N2_$vBE&ZC*GFg-;wv1 zpEXpf+vSqhJkZr3fR&X;_{ZGW zW+e1?O&s5=?2!-y{8-`PVlOmS%|B6Acjn&PpYoK9c+vQ_@}(9u&EyLHKo$giu$Em% zn!X(cWv!!0PHp>{K_?0SU@TBG7UJFy*mjv0SH(C&k_%t3q7auC-CwN5rD-Sye{SW zip&*G?^n7I+?hY*)`a*eiKtT-%~TEmkfcf25lK8+j}=cr#24vt3x;rb?_Zr})&77h zGaok{%D7I@cD&kF%=QZBxw|;jt~Z64{c@xuo7~m`CqH`}I;d=qiJY)qrA@7}JTU?v zjUKwQJK46suAIQrPvJDGCmAf)AmbZ--0^vzl`Pl&dmz=qgR0HGTeeS4n=8gQ#4=Hl zddG8APcN*$@&Mrci2bnlHzkWxtWz3B48HG_^2zjdhu_LDBn5+5h=F?I3zn~5O5HBQ zrbfL}%`DG07*SD@COJJ7lj)BkT%8XO+^(k;Dpn6iO0Fx4>M!17fWY@~9a4A0iLFkL z&g~yW;Ct(ku9QpRvu$3oyNh&(<=22!(2kkY==P?Qz&8-&2QI1z@bN6$**9_DRn0zs zw{zbr4Bfr8`N+pFZq=S{Feu+M?yLA<03l;%(a5KO$^gLGc6<|}sOuJ2QsJ9p;215D zua%_$I`F{@dw&v?eA}cM0KnPsSoX{Olu+~wr32d@sL*+roxT^X!&4v!S=3%b;-&vr^&KCYt0$X+^#snpelw%Iff_lw_swYg`yxQXx8IA$8PudA$eu zxt9_h@N+Twr^_!PregK5H2hVu-+`Saczgd+oFCXGF)(Z+K$Hl1Y z*5r4;`$&QD{fvigFS&(iL|hk5iZ^y=3%j*MX@qR35_8+SQqzV#}&tj z{`Sn#J^|1Q+3s}m9`BejkBmw;%zfnlKhX03L7J|!7hRQ&6>Xa~yMKt%#6!?0TRQBQ zu@qbU)$SzN1aM%ZMsFQ_Z z2p8cGyDDtMqv%b&j?xO*R6L=v?ER3tnvkdLLyIpeR~=5c(X>#VlP8tXPwi!Yl;J96nCubVN-VnXC?3nZ`ORIw&d6Qs zSl-wJo+T42DV$m&mRtEaeMksS?F-;cX@`qVugoz21>OvgjsI&hhuLf4gEh0obP<0- zil_AGFzPOkmJ>gz=t#)y`mJk!UbUX7be$LLVBJ1h;gKZWD?gIl6Nn5E%Jf0abh;Ah zxf|6676PBQ!{nJ&&docAYdg=rkBJ>-y6#M6y@{6sUZFp%Fm@^++#k~SJz?!yR>IFX zFed8->lvP-Q&3^6^RlzoCYyrVeZ!W)yR*Vhn{WnbBa~9;F!{I8+4hCz4iy8JE3&=g(cHL<)BYsv;dg&%fCBdr3wk6P&`N zxQdS>8Dgm`XFn68BVx5bXd}#xaBXp;hmKH5Uol<3SfedN4$Ofc=Cofp7JJe6=g(JT>YfdftX);d0g}xD8N#QW zSmZ#LFxZlzA%TXE+{a>Q&zEDmHsK2}csMt)HeZr6;c|y^B_J3m$;yO^O3fd(&JQVl zfe=BF167?*7wG5b8% zY1TvJq0BCNS}z56Sj$BmE5$XpLbLz-YIzq;6G@M>UtvrQ*q=W0nubc{;1=>rl=oZvn!xKhX_wHKC~0{@<5(?gdJ%1;&M{{N~Bx& z{vh(&|1t9Jl-Kan+y5Vi91{hMjuH|1TNnSHDjI)qqqV*+ZCIqo+T-2HPjemJn{CLr z2$s$#;Z>w3oXE35F2F{Vurj2zFp)cy4>k9RFB1XvR?&bnK#!Opgp1kYP|JH>8`#_p znx42p9*dhwVi5_686|dx9d_iKS>!r4!>Go!+^)nk7M_pqq|?@%XEgI|Nd8jRM3*av zrUeS2SADFAS%@Ogofq>GRk@x9Gkq^21g!&bgmSs?Zlwp%aaYwT(!Qxul?&4me+#VupQ3ku z)|5QhE36MhS1x5cG70i!hVM77PNevGI{h9}1YU}Wdc^hypE4R?^kj*h$YuLn>V!0b zkNM|Qw{1=zn3?aeamB_>-n>*LTYNKdi|9R)4)DG%le{-vm~Pjcf4}`7V%TgmaksY= zzm__rC>1&@Y^X>bMNIEcugv#|Q4>sTGd4#WKa3Vn9c7LXiLZ9v0j{>>%3SR404pg{ zHCY|-2pbo$&ie4N?22}N13dr|(ee2E(0V@KMufUBgs1sxUba{L4J7rqYw%ATqRmb1 zQ$MV~t3It(zNb@BR{N|rC1$3a?VIuMGT+m=1+&KfP}kHZqy#fG*eO5|(T z9zU)PX`i_`Hj<@nx$%Te2}9N!i;F5GJMb}3nG|KK@pWs8QWCZuGPZ&t(<(7Z<3XyLST|v_DY(Y*6mM`0&>;HXV$@z*w^2Bd5O5p46 zkVi4Ba{-Bt(MzfPmtDa|RrxRY@?&a>J@@Ws=%P3pa((yhBt{2U-19+XP8)K4AoFi; z8`dKG98JA)MV4GhQfG9f*0%%f@c8dfX7;B?kFEFb8Q8zu1-*%6Qb98(2Z3eM5Bzu7 z1dOZseWr)bwv-Xm>%B3a1S;}d7y9%)&Rt3N{^_#%Snlv;2CvOwCczU1NL-k_TFxEGkdk@&ZC5m$-|kU)}|Fj{82J1B#KMSeZ6gr3Suo!25q}l@QtX z06^)}D3!0jnmGCGtGrm>Q}|UZ_J}?GoD8PeZ>Dd%lt*iyxw)4PKR#6Hq?@F~7#)g8 zZxe#SlaYZ7441b>>e(QXP89yTj!bm>tTlgHDWB(x)tqJFNs4{i&dw3c=_i{(_*E9d zGXd~+d#rui&$|1my&!totUBtGgtZM;N4ZZ)_SaP%xJS0vLw@ZwR)_TIbPB_#u>+Y>6EzmcL`yxDLz}pY>?_P?X%Zba8efQOsQmb_ zHtcwQ8GG${P~&!$8C6+Uh>uBgJf*vQj!C4RH6v5?c&5aY({~!&xrx75wU!TcuT=zT zKiI#(s6Ac3?9-ygxIlIV{bHT2c&DWZ5H`2*Rd^zt_(@yLJv5bn`DkDpyFec9{`}gX z-o+K0LWDmYU75E@+Js;SeGZO^%Jz$M&qbrfNz9rARhQ#6uxB^!ilZG{0eV5Xc$l2&k`;=9!U zJ)?*t31{Us+Yv|;%mn%9jX^ugmn1n3ZH>{>MOEk8o9#{r ztN8W}?7T@GLPNMR_mc9XNAyt5)K_IYVH#F@H(P&#D?@(s`#)gf+ev5@SOSR41Mo?GTX0 zyi-`F(IF0r=c&%>r{(s0yPjb*;LW_JpMIkSN5!fZ*dOyX<9*ZEB(pai&&}%NzozjZ z^%c(Tl!lA;;%}9kUy459XIJ?Q>PBCvSmC{yUi)%HfnxR z)5xT+699Z4wvWsTJiYTpMSZWLBc;^tqbKnA6&GA1^05^`(1NZf4=TO0@|D2e)uD4x{si zbj`%zwX_6dkDSEEN34CJ)z+jF%T(P!Kbz!D0{x)*75v>Vw?)QY8^E&dsvmrWm<0I4P`NU5mp3~ z$8LO6I(-meaIDbULMwZC&V_wm60`qhUPE~xc0-)`F5aT3b|HvSUQ zk$C0@ez|J&c?0x-t?{|kV0wGy&=wh@$8yXyk~^oEX=ble+-@_rrY(x&waemOB(b-J zuJqW7?Vsgr_{WqlPpxZ5)keM&-%Hh5j-Uz6GkGM=d2W%R9<2);rN%CcwFIsKhs02d z*bJ_=nDC&yBV6+!#ju8J2pnlCP$*Mr$LUrZklN+e;~E;C&2NCIF!Iy~{>ei>4rkY` zOzK0hvt8iuWp9G;dR3Mwqbqo+ij#l*aLa(zx_bMa^|uVK+H0 z*^w88?Z&C+sL!nlZS)UNugta4+g|`qOVx@_n zc!XaOy!jxT2FS1I7vqDJ)i{A-k$u9M+xQi&3muYkefq}BF<5i!>3q%{bIAt0{~3IW z{s@YT^Ng?BvR67jOvg}WmVE2vgFDi|_U!jyFSAC$&Ep3ULCgcVM|ijIaay6slFO2l z91$_jVkC3&sxf8ZSyg*|0ZayGSB3P!jGH!!ee+2^20)jeNzh9wtrp*DBPZmV~yoM zQsC>JNN#aLvo+_gU#eHB(+z%t{|U7~8%ObQ-3oR8t8av4))tQEKk=N2)D}+0<9zWV zgIfUheRxJ?XgnqTOt4ek8eQDH#Yo|Ia5+*|8x&%-U+V0A^!j|xZ0ziIFM8Od zpNOnh6~+IsB9-nfrOelDxhWXQ;2rm{VyeBswL+*GAbO49`a5YbLEvn!p3!l};rYPb zdk3HkK?qJ)*$NDV`skfonHd-)dqX+rHulwDx7*x=@8&37sLZ3rD4bctyFD&?%aFY_ zzW6%GxXno+qfUMmh;OWNJYCwlCmQ(79P?xYp*{6Zv*`?>i-RWP0{$T2p*S|+_~b)# z^@el#EwU>v_(DyVCb8^rSJCKdn)SBWzQ&a+yc28y@RcS*qjD!;9YgE>ax!oEHAic< z^TOi~QL8sr zZbEV6Tt5=>aHi}@VXp`uYT}D&)Q|*hN0(DOQ0Neec-X0;+m_FH9mrX()*x5ayjvM* zm-XvC8J1gjhCkxI3kMiM*5tHmtz3biyM>U%(0awW;+RP&g8b%o)`4}iuIF*))ny?J zCShOenuOx)?u!oi(Nn>|`Hld;dq%v-Ps?@UPQ;q{z&S+F8^kRSiiYI7`1&sq#C%wh ztuYnv!ve<(0s;o#UXQiCy|%(&V9V9#MIYB20tS0v)CLz}yilAs%qa-pK}jdmutuyQ z&vKKPSW{I!h^S2ubw~U)8cyQ2({MjmyKxpIzafLrfi-n0ynmgR4Gx*L-9+~FEX9|> zD#{-kweOe5LACv-=mBZcP2?e0c$y*ABS=n8uY&l&dYC4OE+m05onSPpG=CcxoX;C* zJ$ZWS3261@Z6;b)-{^^AL2*tklm58!$6Rkr5NtudB zSHbRszPEfS$_;m%$!Uy9I%$#gC~y#-XKtjMYe@#m>sXc)cksQoEg?6EOeC3OloW}D zDR`lV5+8q)XcbGQ3pVmHMFCHT4Ifv*&+ZI!bC!H)LTi;7W#^Ju9AVqNl)$BNe_hBO zZmWk$+UQKD?B?3K>C(pRIECu5VUSq!WFU%hM*RQQQ(s7`l+XkP-{@P%6J2|EBk7k* zI>PG*-drmteBV6Eo>E`&GU581J+?cRMA5wY5cJV$J_81By?%>5CR-=?o%uzL2S5Xs zSg{F^pubX@e@ZUWmr(zVf;OUmk6zBiuis?clbCQoEtd<8ElFAXU+ zADriJQWNWfy$Y}z)+6k*oY_KCVWmr*49}bg&rxM%naMDh#gE`Y`fc=wEXRaqt2g8n zuApm~}F9_I<@TxC12e;cL)B%)S0 z9F*d4<9s`Z+wOF6{zMM_%BuCY%X7?*OaM1K#ua-EeJBv&uS5}8Cd`Kolt=vp2ezY{j>G&T(I5~0U^VgY>u0&>>Z`(K*+&inlmEg*P z`fhr1e(lkf!fRBZpARY&ZGD5`~rFSm(=}hIvPK zfOOz#yh`ry)oqQ2Gf z3mDAf8#ociO?$~^Ns;6D=x2GasGnOp&;-kYU!apjc)H31BZnZ6z(-nI)w0xz^gNy> zAH2BSwlV2A-ylk@gz*F&@k>g4E{)A8!tpddaQ)$Ag}V?&>|W7$*oRtY?w8$rB%VXf zRR@p(ojZBrzgx2CkV%6CVqwOtFUe5&m}15$)&GML4d{aVQuRW_6Bd8hrUj*NST_QH z*!II((qepZ%F@~;gkGc&;vmX-f9p-#T z)Rk{P(kjFrL~4)y$v10O2i3f6Uxs(+p$t1_(kM01@&#~IE<%L0(P&6S zs)Ja>0v!BLPT`Tw4@s82KkYQH38$5CYt{7HS=u^>Fw&AE(Y86MQr`XvtFXgY>n{8^ z=H7J-_#k@ua#f0QnY!#!{oa5(_Vn}k>8Be0Z5kYp%!BbYIfsw)*-7WJ+DKR5v$LE* z6fPJX8bx_SkBe*2h`nH9fBIO+zWp?Kk&~_PHcck z&$L9myzz^OTQ~gSj3mNO=hk_U8q8jvjeqfu0Q>YxwfN40!WTjBvJESGhu`^v{&o+2Z#KN?UgU0hzcsbZeYMj_EQR3m8=)`r{nGm_bfIERBbFKpLjxFCn|6lv z;U0GOc^giv8{`aGXSj&o^|5i7$}3)eM7}O0QWy7r8~2>n511nWkh`taJ{0%^*89)9 za(MSrU0@Snu^IAHKY&?0RtHxYI8#D{XTr7483PO_H#py{*f=v_T1VF$<{|9}Vyq__ zb~y`nCpRJ=_&mhTPKW%czxc1q6Fna)*g?f!q}dT&_Aq%qi0~T~|8(-ZwhY{d1Z;pL z*K#iTvq*uq*mv9YURi^$*E|nno_i`p0=Q5-XCCLh-sl7xx#ZC27)~wCAhmc%QfcSO zudq{(gwXA^!lRS?c|iPKx-`*P$hJd6Wk62ex)q4H{C1d;ni=;c?iWQFvFk{N!%f&2 znkw$@5v3CwJjOfv+p!11wC~SV^2Qew2hhh7fum@Cn*5j%Z}_Eo!pRONZZy7282)Oz z0P?H&(l=_pp#CL`pY|OwG`;)VrFX$fzaSZV^giASc(x#nJU{I}wmg(p&0bSf%+={E zi!ISC^pvaR78RK{k^GyOC_=9@Cphu-^+7RS%YARNA`wU0R!xA!XY^v6W*t;~(jVlO zTZnqb9Ufm|>U6X!#3SOVQGjg>P7gcVZQ&I-wXXyAJX}c=(wHl(h?h$NQY+TC$8!6Yw#7HHhh+)mL z>3H>ZY(|(gnXPOYMgVFl%&ZD2(g??7z8*Ev|J$b$g^H^RCBG%*$m_U)AnDnNnXA;O zs0rcZSaE(h&lcO~BGQH8k<8)@?%Yj(VWX_FxKpj$JjO~cZtIw}m8T)MR~EkWRUdcO zmC~vVUeW}R{jCNjZ+8aumKh1jg9+(?*9p|HguvxyYXlI6#i_h;Ii8COSKG#rK35SH znik;^%dnpf$!$eQp>~zJ>Yj~#C<~~~_Ufrf+8e``p06i^AT?^(0RQd`U^<5bCm!&t zvoxPD$e`5NcJ&h6jO94@VHAnv_uxsl*{N;fB{>H|=*X{JpmyC~Y4J0&ku_*dsOT^v=^ z%ae6!ngzf_ayG6)ZNWrA@+%5Bf6;CT1;H^UpgKheSGW6u&A)ChXapEx6U&yG+AH+6 z@+s2zkH_Kwf6FW6@0QL3qzI5UQ~9ya*Oog1d1EhN=vGL8GP|-MjKAPCJy74TA0w=; zHu%V9C`EV#YE#!sSbmu>3uW*5sqfZo?~s z@Uk&3zS{NCu@UX6i`gJB1KbYe0JsQuK{++4wd&Qb=2KX>yO-@A(SXH764Tc4H2h$pNSU(`JJsV zcHK#)PYT)R+rs=;@S@XJz2ISYNf=LYwA)=vq1v;E30o26SJQ;lp1O?GI`d{cB@ek= zWT{EFi0%nTe_g$iZUZA}sRFfux4eQ{()Ol4nd(>QpC=izk8?CtMqj{I$J-QOSA@H0 z4_I1S5eM`?bhP&}2pbGQ4V^4zlErJ%p~4%^Xx~or)NsY{KjozYOUuokY*zfnzqv6r zY@RPA$^Wj76_cWIq8HHt9{?=xqjLKLy|_Za#Z8oMh0dRvp%!hrFfB-qWG=KdruA#S zGKLNA+r(^kCVA!a5AN;OnU(j|3xBJ+pB(}osMAvaHm7nZ>yyUA6QZ_iBqE|znd_?M zObIlF&*(||^sH?(S=d{#=Io*tfLlOvX4da3?Q-GMu3{te$>SPL8e}B?-<3nxlJFPk zj=6WwBQ+FO#z^GTdi8HVdX(GE!$fI9nKw{XT#mYTZgR{kbC&I~huSo;-CX`e>@765 zIR=CuNV<5)1yoGw3;~qNz+LPL;1{Ecx*IU;p>?@B=nOvitU_93$2A z!}yjS*W+_n5DyKp^IY?HjB$Y$rq&K1f5DAYfX`dAs+$6eWBJIyt%~rLYFll84~7#) zqE-8WE>}j;n7~JWD}o0#hU^^#1bipN*U(?E5bwZH(0A1}dqLelyrhP;XC(Z%6L8v9 zJGrE8h23r5_&WBpCvF_oL)L2>l7M&d3sBT)T8ErKGlbfAIUSiHd%S{{`!Hmc?UrFF zHgV-af&hw6=Qr#agWzE}WQt80XbdE#d>)1}#X_fF3;M`-kqCX{3jJxG*}`&Akt!j} ztipGto9((>3Yw#Y>bg}q>A8wTvaGH%FnzyDG)13)EJ}~XrF>C9)lEhi-@R}(JP+En z0F-Et&+;4O;OAsP_@!PsaTl!xV~0)+MicmhNQn{1KJ#`Q_q5cm*6y{mA5d3l*CbUjem5PkFbF~^$3~KN#nM|OXdUl32?ZE(}Suk3d55^+`_g@#7)vhos+zMFJ6Vr3w)(F;_U9l ziM7UfI?|BC+IC0Nd!&freb2GL*VM;kRyB6JgiM^LQm(=v)s&rqIM1*VFutx; zwK|N?Z&yRG?ALkpb}(3xtu#6k33;vER@jxOCN4;kcr{ujk^hY5@?86vznfWGN%ej# z?mT0;$gj~EeJ+vfc!26ikGn;7@N7DKek$db;Z3n6{zrqE#h)OQMzu6Sxlh?b@#wTjJ();wnAf3(8OH32)>PQ4oON%Y_}xI7kM z22ekTZy6%tze4qGNtD(EtaD0(Aw?1nz<1M0e7^GAeDZ2gy^J=_2-BPVC@QV&$cdv- zrH4C&b6TOVYw;`+)dg1UzgoETBlj7-U!qgZ`z{qsOy5BoJOB4A06lh4Zh{yuBK7ay+P?<4a3oOHGJ4ekI~F`5 z@1a>hReo97(?*p{wfYSL0f&gx+&!$KJw|#fjH9CIXraZW&DWnCo?4YD6D8b^`NuDs z97v=xI+84yPp{Ns5e2n}$2lQ!hj^~DIg3`i&K^ucxcvxK5`%$7c5ZShr^?!-_?$A2 zH<^A2OMZZHsA>sS3DUDJL-bN+83)pHrb!R@fud>l%p7w>gRnN8>Y|6<;VdNCD)Ne+ zG|X#Vm!3qs4tnmLEGogV6*;a1pG^6CQ&O`$IuyI5>-~UO&Z|JvFzcT@9aKN4H#^X} z_=;SJYZluzv=4?zvjX~+pgOnQW(W-D#Q|>lqAE+t)$Ww%c5|$smw0{I*ZmX0_lq5O zpjMuM$SJ>6%hm*UzC!Urxfr{+?J%s*HL7~E@E$1BlOF8{g6IpQb52p-=EDTajWy$J9NP+X(dc$9FlB zxWXLp%M^hf{Cw?=OXI?ypy_{>^t}ob08_@M6jN3j83^M=1VYHSFoN@8)D2 z5I`&PyCgjQTvLh?2@N%S%!lBs@Oe&ef#0RAn%D3C3z>efP=T;JlrTU~Cm70fB4yL#Kg9ZHx!Ivx`(W=Hn^7(UwkA<$Upc(Jd3l9fsFja1uDLaK zUv_~d>9^B6S+vEp26u$>DsS_&Lo8_be2+qW@>S_4IrJ-3&~6igf01bsr!DZlW-e!rtudN&TOLj5U3hDvUg?!v-c>yI$%az>9~4= z{L!xT@G#Kr1CWSiW-Oeog%}Y!Lk^a(3v8nhGn`#6NN;iA9k#Z#his;VFZ%5dS{$ev&a^TQ#AUf&bcZ9UZ$GybpYNO zFu$z5CNiT`9cZYZwmuLiy!3*-7FfIR-AGHrq65fIA39vTET^)BCOHY1_DF7y_Y8}_ zlKazsRqP0?EY4Xa|9X=-e8ru_3ddh_M*Wfx?j+;!vwN$14gN6)zKutkWdQj~zYONA z1s>w=i+@)#W7mi-dN(_C2d9HP$^X^X7!Ob-d>P1YkGJtF6SuBv%I${mtHkNZ3`!>a5RFo%%knGHZXM z9p1^>^Fq)_D6zx=(G`izEitcNS%}wz#G+fHwIW~7fjJWSAR&>&$6WE_X;I~3BRX`| zd_^O&qm5EtEzS7~Go^O(>*uo+LHueEVJazJcR;)>n_fE`Eskb_UMvRHqKr5*qdww< zS2R5Y7nTlug*-YkK98?mX)liSvRg)~yNhPyax060;Lt0Yla&I_1C(OEt~_259;a~- zCHq4}j{o*}Giv!Dma@N7yhhy`?l#ys&o8zQS>RugDJ9-GW2&cOfh#_G73CTVi-ZgE zJB+=FTeQQFQ0@vdXwym17jFUxVqaB{`mqi~;=`%o?&+H_P6|yy#BgC#!)4Gm{rVC@ z&;PCEG|%FnyXSZA@fgPKxWW+u7Qu~mis=kco(ik3YlS9A>y{9T7gjC88a&nSct2&&6VF&GOvSmhgGtj3KLkYDJ9;Is@D4CK^;tK z`#&8n{}cD{L2-|{X49vm^UuD?aOTfrwV0pys@5^})c`?Upk9J6a2B)Av-Z6|GpTeH zIk_5=1ivT;!*ycaO|=^)Or8JWMwCl@7#l`skz)T(#gxp8%|g7>`rEI2xqC4t@!8~F z)!rYA1O#o;VgeDT@-V7%5fRS}(n|~!`h#@}dupEu1m&3~kf^JMmELZmjEC}>VYSr_7|Mb3u%S=eXDwYRo}b8B+?kdm|{TO^EA zd?G(z>w{t3-Zsg9>d;_4^19FyzTRmTx92K3MZ4^DE8ShKkD9)nRHX2(xKQ)Bg5 z%TzWA!d6?8j9v7?npAu{D8qEZKQ;2o1d#!D@~xi&j{2 zh)A&aZmYg-(CHvDtI_BC7NE4mk8DX;6*8M((KaArc^P_g@PPBzZCN;dQo0UEPXH_N zLe3J_qKlWDTdUN7G+eL~uEMHE>xcYf@~f-# zsJBxPENo|NEzN{&MOBg*TYMQ>(Dzyn)21g}py;1(3Tivjw92MzZ5UDc`DzOr6xFzb z0D)M+B#CtMpNbvlnOxflufjoPmY&76=+|aleZDz(*0YgF%KmXd3h`(P$9M@BfF*f3 zAzX#pQxm+0E{OH*=shZ!1l3hpnBZ%_?tx^qEhp7tzlsde8s@4D$M|%Z$N6lSk?wCR z7@V(1eYYZuzP~*b%hc^MowIhoZaWUi-UkR``jWi+zmap?{hEB<3N%#YM*FY)LnjY4 zsmqou7G;l&S1rh7oJ_OsU|QuDu@MYKb8~2U>!2G}l!t+zmPc%PIp=#wy5aBVmzObH zvNjsX3`ZNN(2JAp)1iO@=5E_wFD|jNsBW}fY!m2J+bL!c@J=8qm9iMdbk0Wx1!wVr#h5wlurTEx-Fx?!`fF=_BEc9ru$&lE9YZ zGAA{jGMrMlxmVq@ryVf#tL20}^KUQ-KBe+7XC5!Ety|k+G)vW+YDN)Ks-k=KSl83T zhv(l1mz|hTvg?nzP07pCmaq2_(PVuYkn}&>O*30G)h_TUQx}m#61#C*^$GpP&D7vj z?<3SlPEzbQ8HxAsgf(K+VGd;zAS2EbNeC7C(}WaC{{HSxd1@hA1GBhUK$dNRX>bhd zERNHyoU41vcV(OhgG?1}9ZzyKqAp)$aRz2U_NR5G222vZqw}uH1RZW#!}PE}OJ1Cl zNAbS;|D&mCS`P8&^Hz^_&RSWl4nHr6f8jYfLLmUw1gHDn@@im{RH5e3 z=w=-wu20P7R~V+Q(uXC8+c~mRUn=)A2PkcR%i$y0?yajN*qZ>Lw!;JrzE-0F?P49k`!(ta=5$pdl9Uyf_Dd>#m@K46=tzs z86V0JPx0HO)yv$K;-@AIY3U{Ve@Rcr>5~1n!)h>s%EtrAk$>MhGelFT z$ri%b>nO$;lurr=4YPh2F1iWUWSS_pU}Gt-5j+Qke%c507E(N&eO;2Q!C+2qu4cBM z+-!aFg#X0};)+7486(Oa5_ymv7+>c*TV++Sc?z8_UwT?;>E*BOw#_nQvY^=YWo?-c z*D-Fr*awA^pWlj$yYmp!&HUutffGXXY>(aw96KNL84GMHp&NKsij&`#myMIFI(OzP zK)dImFfmo;2k3=rwOe*cL#N|PwW=O@he`=6lWS8LtsN%DjlV81dJ=PUyPPd`;XujW z-v{olAN6T~4>lTpE%i)L9XUO|YtQk_R83v>AXEQ!n_AI7M%DT|Oo~+D(q`rodgR=) zd~S7-Ara!jny($sBQ*b64b+&ygor`+A2}=g-<&n#jmY7g>hJjx3w?sB!L!qyC8ESol$#p??7%3e@j5ep?_iBo=g$TPy>|22>j6utFR!Nv|?yq`=W z`D!a2RR%rbV5y4DlBtwF`QwkH zwCm7m9m*4~SI4kMv(`(A#@{Gzh5cOl(4&Fn;Wkz^$v_Q>!iHnsnGUH9^JMZFDr^ws z9N=IjuEiQLxM!wGhWf$%MpsYBY{rsmoj0MjWFYN{xfa64V^&v_y*S{@;0fmeE`ccQ zx+QgFmMlt^2%#<9CeQaDr|b03>C!vA4Yke6@_-Kb{Mxwvu86GFg~VKsS)60AT)(|% zs!8YDa!YdK*0w=XSX^rTp#{RKr%sz5-C!Al1j%kSmI&`rk`rRJ6@;A_(-pZnKaHwL zz*eHr6t~@1d!}zjPqM}cYNVlT=t>ytHIdRoOZr?CcqQON2zbNza?q<$#-aOH_o{zJ znc>;Ka^O)OUpG@}r`_mT3a+v3x+ceBeQ)5>*XAz|hw4b{6DPFgI|u6N{!j%qj6*bK zv)c{gutr+8KXSXmo+M3p>$bZ>ShhrN#?9N5d18c(FBQfYoG-+z6WeuCC~+q)ts+Bg zSogJvznG4{dA>rJtsZNgNdEJ(IpD5{xujPT{lzJesc631YD%7aElY}yXo+#CKQ+1CqpC2Fvxa`ETgfwc6@?BqvMIqiEzZs z)dxP42Ntl|K;MnYD>DxOF*a4LYzIbcf?}@wW^4P>0P`I3vR(COb?r`H2?qX=Kkz$Zvo*?ObtuWq-NQA&meT1yCK5iF z=T8up0XAUG6n@I@;(=ebUZ}B2lwO|aX4H+2y1a|UUV_{rU7X@s_K!kl>$*`eFF{Ac zs|#}4&bY%V<1>sOaIx-Q&WPWyGerrcK4ptp{lJa?^``Nn5uFQwA?4{1d1Yn!Tpzd3 zm5Rru^=Bm_%ulU~&}sd5`D}yq)Kn0*hq~cD2#3=@aWf@2RZl%KXDW6d4kEt1&eX`2 z<)1TNl@GZ+QR1m?ou9GfEM=>K7NQU0qrv0?*lkc!bRYd^308?;BmVS={oyyBPQJ~?N% zZ0Y?D?jsMUBRh6A!4Wr*8JF2_$6~j>78xj@Pf}5>9%e0et635D;{E>ZvKvHQ#aJt* zm!=)M|3R2`7??7YlR^Sh*(U1}3H7>YBu?<;%0(flMbH)+9fgltNf=6H=nhOYVM*gr z>kgQ#9w^gV=#Yzfx1E-7tyw6jH2`OHJWYC=2{bx~q{0FAuw!p}1=q*b`~_Kbh$a*^ zw?Q0B@0&ArwX5*t0J3Yh1Xj7pnH7I+om_immhq+1KyIVC!ou@H4-e9*cB7~T-ld79OBAdwF~FhIl9VA4{R^SYU^K zUU_&?=of9|&HPzb6)DQIUksl>jwf=AYqs1+fXW_xj$=cO+o6ESE>o-0Twp4iGgaRY zJ2E`S`ElPM*I${$b*`6v32mH|)x*zVGzY>~U&yifxr+K|=nm;9LVq{++G=gkrY!Lr zz{#tC*&^it<8W$8>p|*cJpNRiwO1;=`BvD*VNF+}N~07^J@TiYB~*5+hF%iBVMBz@EGg8M9)SPx5Y~;8haC}cuT)IL!Z3_@+iA@Cb7+su zfg+jSKwfW1ea|-p@r$lRzl)(E$YBUcfrSpiM&|PpwxJk}f_#HOciB?9{42t5*7-b7 zGcto>W<8Qk;qu2?>xtA7xY5n4Q3`KmvKqxgrM9-Yq?`GdsZQ4rc6$7*2r1Yij`OP; zwhq6!e@1c)kxa3hhj2TwfrpG-Rn4U1h)f)YaJr)$1 z9u<@DtJp*sXuz3Cal-n#tLd=Uw%K4Zap7E1KNiCJ(r6mA zL(U-=D)y-*#2~d{l^(w zeEECEFMLO8=o|XkYeSE!5$BRM8*orRK(E#h_Gk4QTMayr##1%7&i>Npl3}hWBb@8B z3ACP)hM7N~&PFCT$mq8QuWPotx~h@qH2Z+VmXsCSsKZp$Sl}@?Ro|BZveW9{%s$jM z6pu?<)vrB`?7W*dH4kAvqaaFcT^X3FRsOI`rK2Tr_i-k}YXs3VeUT$HDHwsy)C z&>e7j$7CeGa3Gp4j{po*9NbsX6XPr9q~|V6ip_-%0@EVxqrsj2QmcCuCrQg9 zP#e$Z71SAp)Q0eX$Vug8{EmBEl#80F`13yi*7GmG>UTnF{sc`uiRgE2Q=0^EKSN%E z${mOAgVOwGfvRo4b`ny~azb-m!l;~-hSgzf<+IYqNI~<+*g?7Tnusn`_~XlT+){Q4RgXjLA)NVSC4+F zA7}3lDSfX`Uf`3{ou2SN6X=E~Y7#}z7omA4i zj?RM)WDX(JPH`FhvT@zdb3#>tekw>&JbM_v6F;{+Lctq2BFc6s6%l2+Y4Cltnx8eN zTPImpB!v-_-SWc7WO?uB0?e%KZn~uZ7Weh~319z1{K*acOH1osjW+xlTt1-`G-FNK7cr(PGRS%}}YVR4wlq8DJ%sAtvsa*uoo<tXQsX|dJ#^t#R61KqANtxH#$HXPwa6fWo|$E1zBGX0?R z)6jCg23o>sKfmoWPWu(+>7VW0Sr0bl4I|W%;}C`wF|CDRRlHfBLWUjXkpz-h=nho6 zjyGf_kbVssQv?partL6@69U>~*}196$Sl1OzRqoWNLB#a&A9QTe+zZumKO@sY6C0z z-*m)ZlCC^dP~i~O@q%As9OJ3kXID#kqcfD9cOJu*`lB_XIXtti*oPedPx91LjMwtw z4MhwWLPr~Qu;t;`B+$sz?Jj7LAcpaYpz-bxdwRvE;D8&q?uyO*Uvw90RPpoW9%#+d zUw@Y@^2bRz=oy@=WlwTZw*C1=MQx<$ie;axV&95o;posX+tu}jt(u9zac+@#^_twF z&E(g?a`iho+dj)8(2iRjfD9`<*r1x+0 zn*L$48}R;lh9fpIrga;}Yz@DMpFty85ImA=1$XETNTe3@+vb@wa#KGm%Oo8ynBOpi zMEx6P;YVzaH0*$K$stb5$&MLOO&rU#a%sG8xmCMT3t6^h89(RewFG~oRT;K9AQx>J zNH+hNb_swiL)caI}H!PBiY7P7S*PH7Rx#+%2W(DNi&2ck7cC z>SGG*34k}amq5E9!4?fmOJF|^tui?z&h4LqlSVx?{p(&cBIasI9&(70n^jZO zC5&Vbh*kqFsJ0zVen02RBG!d##q;_(@Pa3tm3zJG$>V-4)FN&%r!|?8(rfcL%ipPsO#OuyS zt%Tq_Om}u!)z$n6we`fuZW^=^k${f)gxW&cPh7mrJY;0$|ccx201Iam>8K{+P zSE85hAf7PIGkJLZ-+t4-$m1@?zjbCWSh*}#y1oz{$hiW)!A_q6I>6R0+HzL}OsjE3 z)%e3u|Hu$u1;9W-*F5{LM!SFf15!NawK#kyMBpiC)Ccg4CSv6M5JYAf-^z(Ldq?{eK=ux3h zg09%#D^G~G?-d(LpyUq)tK)*kUe18`=#~>-x+W)d{3@6SqKZHPv~&6I>6y#WVVJy= zD3}EEQQRO!>1(+GD@igfayr;iS6_QfuIT*KAEx7*T?vkfPQ;n9;#13xM7xO=dd;ixrVo6>Sw`%_{AX zYaCG)b1C3RPJpjr@{=CN)$3M5a3V2pl7$gVq7Wxc@AG9C1O4}S2D8S(S)U=ArccL- zo=h%*J1-oj%J}CFONu8+8>9vV-gC8iq0fuSscj6YBma(ph!AwMoLh$C_GM_a4;BPj z@hBEK8TW>*ZGzukEF0{3P&G&R3K8ai-6i+Jw+L%}-@D0sb?83nUvZ*%gFqOuWqX6P zQ;b-?&Yw)Q*-x<)CiCw;PQ?1;;Mq7z-oR(fQ!g#i5_M=tl$a>7@(@UG1 zCx&LOqC%>dx^8oxrNCAH8E^*QtffU(8=(UjpwgKhI0C(i__eW1aX;uslkN+-9;gp- z2)cu@ypYn#K;z9Ozbo;XN$T^z{gQtI==4AJ;8*5D!rZQOf`EC^ZE4bi&Q1Ip=nOc3)L=sdCu#!SJ-`m9%? z?k4tSLEY-(&BSiHDPF0B+BVl_HsSPHPnr`WRi%>WW}240H4KT@`IxLae1=Hs=-Mn8 zPhg)Dm_9}y;gCA%j{Seaub>|jjMrKn1N6dq%;oEuYj#H^LAu}KEPz3f4aBxPLfK?4 zukdsLwRRRb^&e$Z+_x~z&i7cbIgu<<1lwsi!GfH9@P3GYd9um3`=8Jm6xapz9%{Kw zsI_8b-!=O6)`xG3MWU4WIOl#8*iRdKm8y}!Y(#ZPw3uF#9e@CueFm*PDnpnaGO47u zQ~~N+fZ8a|O?URd+sXx`JQa~aJwH5PLu#K?C(G#Q(;b*Xw^kz;|9~l%|8_{LEmGzO zI>f=U{xOrrPj3-;zjQNkSWa&JnV*qZ*y?eP4oZ|(96?0Y_i>LoIc;sGE78JQXze)E zQ|pP)n?EVPLg^UuDa=NCoy_GwJ7#~=*6Plj7M^5HgV6q@ElB#G@aOsu{Oz2rHz%W< zyxb2oq?ASCK)rS)auERa&?B*)v=^htmbweeXz&V7bINLU<)Fg&oNPrF*diE5U1@B) zcO)r{4bnc91=qAxkn_F`nTCsPNp%P{$#Fg1c;TsOIDdt#)GIq*~#Cf=yUx1$A@*Jjtz@5wK%~Bl_Q;qYIq03Ax$+x~5uzZPh5|#*f-%Mp(CClXHE7tD3yvOvo{NM@E#} zvaBNe$Q}>6G(wejo7IUf4cXCDPVVzx8*?--N5@sIE(6nDiP*><-2eu4Okj-A78@o5 z_A4uDBHZ9`zT(~Z3;&P(IJw}>9C=b=GIP*z&NsYi1jb{7LhH;L)%=`RF_O{TR0F)n zwth`Y%9)(_^7kTHUj#2Ik~4F1ZHSDNUpLrE@)%gRRqcOz$VSSxrEsSog3Qa_twHP! zBF<@E;{T1LxSeo$U5Nu;&gd#zY-rw(=kR$uPJvxLfx!}I{W<0zT|6CU(b^obfhbyq zas6Mk!m38mtSn_DHa_;ae7Q&UeK)chdl`gDNFwb;Q{P+@E3C$^QkA2{Jdf3x6HhxGGz zAE>mF%=$AN?iy)L_&`;V`3pn$T|`KOHIR0yUlO-;aun@4|7!2WOmhI?hT)pqR;1eI1a+*aU-dr$7aK7X};q@_~PXFhW2TEB`+a zwgCqUb%;6JF(d_eh%Q9$)$B?-yZSVUF}cd_Sb18AB;{_hd!w}>N9W!!;E~H~IF_Vw z@uU%s`-k5g^ZbB~(H2obtH(y)GT2SN@nFiUzAMqqQfw6=1Uj{PqDZ#-bR_hUmbjOO zer!&6DRTKwvQXnE&j{+lXJQuI+4?#Q+ibsIbYFm^*qbF8I*oc z>!!%v|8ZSX7Tu=PTL5>OcM|&?J@A|W-H`;izr%D!C|TJL5#&Chg7`s7{{PPw{U=u) zfcqCtYKt@t#DU0wut%5Lj;kqu!)UWnTnJ-sSlEItTqFcMMf&kV3yTKPeREUB z+U$+*Mu}(y~6)K4j{k{Zg$w;Qr0#h9n2X^YYsK6LUwbTmoNeDH?l}7!M z_x@tsB32vL_51s{QdY8TMS;Wzx-EXb-wzOqH4k5+mz8*eQl|4OO1+CDMu1{J>6i#< zt@?^oxQ1&)o%MU>A_SBtzwt<}RxDpb`!ZmFI3J%x5HUNC)`jFk3!=4e+bs21WRe%@ zKPV=2iK$-a}{e0#99(+1gC}0o&_Wt<0<+(v|DdSn~*xmhjR7=|0brxTAkFC->eJ_&t zPJ}$Z51#^Jn>+Ty$}@=~c7;8_hrqEsq_(rhC; z8PL=zEz~!ZFut6oM>$7-G8)d|sF*n|H05j`mVExvQka;|fjb?4{!16%yG94@I2%A@ zdd+dQ$FERuD42`0)H|^6-zf7FQ9};^L;eSGElxq*n1)%-QP1wI#C47!+n&_r|Hso? zaJAWXO~a+d-CYV4DHfbUkYdH%HBh{`TY%#3#T|;fdnj(DSaAq}Zu6%>x=H@$Q9T9$(T-%QN9ojLIx9<6 z*Hrq9f=jEcYN>JWD(B7fue8)uVo}ENm1ao<)JI)wVP#c!r*IoOhsB}?d#@dKwt4hD z)Y}R!D$`Awso_mJiA{w7P)}!z&q*9$J!-fP5`F>MRX>%23jQ+UO z8eYWU+xcKUHxqlk_*`i{*AOe(d3qU#VL4Uv2+f2ZMb=iv{o!A(OO3DJIYMhWgIJ)k z`@y?DAWQ)6)tETHmYZ^~RvQmS`f&j0JTGfcG2J_(Oows6vqIlfNO*^@ zPn64c#N|v{SAyt8WV}$k*vm!q!OF(Hn9fEjy1|Ujs=>PZ77#}Eo#at)3ljbaD!yLb z&sCD4^iRjzs=sOnfFtLtjdbKJG`&a+&-r~;3^wTOb9_1kGw9$rjr>3en;|u9C92#j zD}slN*x}rs#(iL%)WHue=VqSNT+!6#7l->u2L%iq-}@~0l~8kiti4%KL7=7kGx20< znd};V@khjg@9%WDJ8=Kvo&OhSqqq1}^km~}uv~FQE|fTGJB4A!O!e0!MO~wB}AH5#Lwd)4m*ei+X(f z4r;>I1cJuaTPtsh&Lt<&`6`H&a18LoM!wb{oD;3tnbY$v*VtyySvM}K6*3MrS2t^U z7+UW+^K$Zj_IoB8QXbVwccs;dY}OBLL3&tns-Bh2fgXs@ryj=ROmO}l6fd7nh)E;2 zFp_j1*?;^-$mLOID-#ev16R~Z$q$&0yWaounvAXKmZf!EAVJN>sDPO3a1WgxxQ3jCA4>z4S>u)jugG{%_iLBCw6B7Rz1s25p}256ROhToyP24 zLEk@XYsEtb!3PWizGkhjMI15o{BUQj7s1=o!QoqpX!qG?{$r4o*oRO*varZ0^8)G? zHQcgj)$ug`7~`0#WcM5E=#U#m!(coDSl{F)VhJp8WO>*TD;HUD>^?jy(baWOEi?Pu zJGlv1e6Q}W_Ijei=F*E<9AuUr_&wL-CH!-^($Vl8M%R}-ov-z09_=7K`iW z=+}S$>ifnw{4h@fc9i4X?@?+zda2IZpV%^miuy19eSH5J5kaqC31lk9>CrE$)qrxp z;cr`y*sGa@;q7H9d>HyT%LA&Tc~#bi=+y3fZg326Nkr@q@lf}(d+)TKWvp`MJK34d zvvGg=Iz24vkqAG_7yvM^`{qdiIMZM;egGp-c6RUKbX+%l7%vn9&itFRJ+K+hR=p4j zB)COKp==X-{+A|p!z_hD>7^_BKE0hl@R#M~PdR)i$hVt{Y;X}P!0#~nfPm)p%v9iN zb-z2}6mpbndK4c5ogZ-g@KkHLJ)Y*5t1Kqcxsf)y?fp1R`TNEj`-^_RnTK!*I~p>X z2k{5<>rMt(v)gx-zBX^w1e)NE4xmHm8qT(p&(! z;bnxVRA=jGygi}v)5$VM|KGbXv{tR~L?NkWg8LRstu3-JLB6cXBhDWpKlYV=%x(5O z7%*w z(_Wv^F3LZhAJs)0C{ElR`W*MY;@^|%^<+tiy`wCAjw8doad9tFZLZE%RxR(GD1^WR zetyG<&n+&$sLq)4KO;g@D*VO53XDga&cTmbp{(ed@2auSS{KWOmMa!Z^)u!kj0fWa zk}cIpU|;84I+3(^v`iCXhkvCp<^r;v{y^O5dVUTkx;FoG@46Z)K7$2Q@@Ypu>HhFu z>WurZwp`8d@p#2QEeKm4@{?26+!q6kz=j(4Fh5*VDsyI}7o?sDKJAPzevaeat{j=r z=n%M>9^8LTeehv@>J>L;nEOH&D2Xi^;s0_))2@Biy)P>C*bZ=V?|CCQ@_4vpl_Pn# z@tUua#O?6~w#ty_;YQhfdFyG8z#pepJT=yt{_H-@$LqR>nFzj496tCl`-jci@BR`n zb6A@3KARxd8J*pzqw4)Eb6*QCtby;s_U|2Zr5Y}Wx}OGYiu>HR*HRO7dY7p*?-}4@ zs@qbSNjoS!WWEIrjkSJ)JfSXR4NW{&T_9bx-SA_A>sb{XPR6UNFMN=^blpd+4_c~C zMS}NXmNG2#Db;y`Shny%>wU5TigPuEAXgE*&+mnnVm5!NWfQ%$ni7`eIn?$u50BcI zv)|^B;vLlL`JppHMHQ5naRhiEtqr@_PLU1wjK$*-x(z3)vuQZ6No%Rg*z)cS$;V#a2xXkv&PViY zEAY?=aE|~AeIM^p(atisHVVM(jtl!1_I4Sy5T%~qx512<3!*DNg%4TTiI?2Vb6`;6 z(4dqtM`Hy;v#}mWBh6SjWSOU3%yiuKN1oc6wad@+i8}Z=Ld>lrg5BDCy{aYy-ch4D zqtw)hT8^TGk<#%g4-R+{i~?#uMvMim|uyW2|#@tY4lG*PA^4=Lt;D=9lHS6zR;AlaUGILLgf zBfGJv!mTv5e6rh53-SB(PZpV1t(Xc_aq}CbMiw6k7#6dl@tJQ&A?av$HWE0SsaM|1 zx6fhc&5Qrm%kfb*;9=Ux?HSPe0y-nku1TC)UYB@%X>LT50n!>h{1KbV+|By-cO5eD zMd*Cjf`nRf)+)=)h*0jBS1>Ie;c_-9Jh~IL%FBg*Vttfy7drkYQ*1C+X-c5_sKC8a z;F0c9_91xk+30O{pXkjE*3>q*N^N*RTQJJ{A9l{)nM|Cw2IJe?4R;`=?zOo9t6Nbw zj_!XO@srIxruOm2=06pKn)M_jfcb>}bDR#bh}?ux>5l ze5jhFa=&(Na#(xFE}FGcEX{Jz{V>TOx~-A-!shpUv~ek?{xUH9nuUv7cqmEp;`p$I z<6kw`aVd!{nEq#TJKe{p<1h;J5=QNPJ)P}uWyQ4SHVZ0i>_2XEgN~NY62yxoCfk_r zwr%GspZQH9g)-hQnt85AGOpOz&HbBeavPn=ru4U(6no7nA}>pJ{myDY(KD6zS(3@HJ|i1{rb7{V+HBgDMn87VXgo;D(vd zntd5-L0d_!)T6L$#+jtm`;PTD2CH89L59kL%0O$T@B7w{xqGPlNKk$?NkiU!t)_Iy&I&1tY^VZZ@z&qd5-=ME%`=Q zJatIO&Pfqu-S~*6p#lm}BABYHX%P z$X*IO_;z-!eijFSzv9yFJ-&6Hv#wk(e=V&Pv5LZGh9`9G`~jhrVtqRQoySSgX=v;xEm>{Wu4@H-}<9SHi>aT|o4H7e+cA zKFxhL0I>-81_FrkF%zgG^7LtC8$S0{+@K+RWXf)&q4Jzx7o4MU*@W*A0*p?7P2mB# zGgCbtcT-{j2cLQ-Ut&AFtVooUx;kg5QT~+p#iy$X7~SAjdvVizE^zrs14IoO_Ut;G za4dpfDQ4W?)U(Qw1HqoGTzNHLZto}#=4$=@0$+wJ{S`2Xk53Oub03Z+enpu%m?DUC zrTHDITUj){0~z*q$9hfRc@`OrK+Ec9UgBsUmz{V;FHTFgFJo6679EJohN zdA@r;8GyESKiO$GD?{au_`DF{7je7dNh2e9zJMn~ee^Gu%|!Wh-E3}2HR3fDF;Lyp?)g_SPN#Sz*zj#eGs^c&>w#CAJ{+$g02FfnwXJp`#fu;tbYjywr>t5UX^G zW^yQjKY3$FMrBIH(=U+6!pNpMz{q&VVzC?ZMpRIbnj3Gz+{Eas;6N%W&|A;U;z4`; zLOKWis%kbYSSaZ*+xQ2v>(zEtgIJ=ra7^xNc?(z{Qgy53%jKO%{L&Uo()8y8K?HPq zNpC}b4`DWAUv3XL6eOr*wW5Fine$fqbJP38n+f>4^$^~+b^w>x%HrNQ96#iL7lvPF z9ky#?xGr^HJb@yweh)!;AvTun$CIJ=`I~sp_1l;7HE?uX%C=wg8f=XV_I9LLl8tRS zBDdmO{_V+KIoGwV5Lye^m#9f<*3huQaO*bhQ<^g^!&W-E4wr z3X&r4_9`lN8;q1)?tMwYIUQfG3YnSxsF<4Kt}qIPu{~jcDXD2^t`{V|{o5fK0$l4K z|9-s4H4_LxqA{aVbL46Lp`L57M5>Kc>~k#9E+zWGRtMdW?b9zrB5h;%6j=O!XE8mt zV+A7y@gd4r1|^8kcH?63PAueub$v~RV=IR=6Q$eKbfuSG^A^iPP0mT}CXGAdwXaY2 zuQc2^Arnf+K!8<`2QAfem55P%C;#oVfT#;Qd+j!ZaFA@As5?&m#fS*&;d0)FB+tHb zp@uQ|{Yk^5;<{FG=(0CcY@Yu;W5?qVlaYbfMZm9V;0zwqiE^VyCd(DcF5Syuw`I83^#Hyaq+|)GTwv447hLK`mfp1fn$$v0(F2% zN-bj#e2rBrM$To@JFkUAyKsbKj-YKz-sk5#oEg8?T~Er-d2vwx({88S0%P zu+4Cr(PV{#l-f^exmVddHmz$O#d66^v;D6=>A9|dFm~7X;4}JN_jS375nD^0C|qC4 zmL@TVVL!Yc8=>TD4Ng;og`>IyvG9(`F+6^d)_--ZA6x_y%MOt8k&in%s+q-iXXzHI z9n*cS)%^-6BSq*9qdQ;k53uyKT3OOK>#RMX-aS1%{w=V3EO@sna^*o{@H=K)fU97u zvs|P3<;ZC_ZkR^kR#j#L65S7%;E*Zo&TVz=rlmKB4|&d87LbNwDNycKeZ^M2hmAP> zhA?B*iq-ipidk#8h0I4v>aP9(`?wVVp_ROR&@ryY{gR_WpQAnr48Vt$h|I8k%b5W=&X=o6)4$s)zk+c@F$tLbJ|g{iRoGwtWPa25?S+QMG`RfWjR8S?&86?I-A~VADmEP?NGiNLoqU%nBxkji>N*P zb!s9jY5cC5edB9)pAvFIeeQxzJQj)P^=#R7t0oKU4hp0Du4zi6H=@tF??i=f{_;3Y zG%o-b2uGKOQwPG0If5C5whv109aBI46k<%U5y|<1VRThp*bA6Bv zJ)f02a&!ugzKKwZ88~($v9+5A9L!pAWe4P7?Mbhyh&~gp`|XP~ogsVO%+;eYzdneb z0+{-)ZDvh3{BA?A1gJ5ii+W~Do+DmM`on4bnYE(}xpLh9jxYEyK>p&3MM-AZrf(Ay zfIi{h0BmAb!k=>&ONJi+Ja4xKNGN%}EuI_3zejC2okAd}teujo;+qf2w$vg@s`HXc zCX94=$ftRbr@!z{FH|{~m&?_qN6V!vbA?9pCj4FS=Oj+s0X&EPl=#AZ(-yv!;?|?2 zsUly$NCLr3A7+wDEP--dhzN&Dvt*kSS$=uMswj_iD8>2c=2DKES5ZPi90w(!)GUQD zi%t}KL8Aad>Gk;Zs-NCoCw#^Ux_p_9#0SBQ^%iIUjF&-(D}kz|y3=hRb76&!=lA{x z0Ey`4kT!PPp@ylMCj z!zWA?7|w(|01Ed$8M(}{ZRn2v_KtfA5NJv4D4 ze}WJx8uKFt_XJCPU8=@4GwCbc2hgSSfi+G{EkcFJxpC?SR2Cr}JPeSj7U^N*=GeA7 zbep72{~l}dvTs8$E<$gHY%lc@yPc@r&6bj{Xyls9JMd0=%8n| z{gO*O`}3r-MtBPiwl@x45qgHN*PLInvswJMq2>Mt zoc&X7)d#$_M78o=^7>)vdA|Ewg*+gdyxB1Lt*6n0`V`A@;kUtNCGOdS&W)kRL4%-H zcDv>?8u524-`lQd6#9d4R*U%5pd+_!bYXtN&wsbmcj^+}tI-V}w{_#vpiqI!l69fA z*sl9VuVG@ZdW`c^*?)Y`Aiag0b}&@M!bOC6(8ij?QLMm52$jd8)^DoiCr2|V2E)LV zGaBO*X77iXuI*#j$#B-%HvLBX){}Xs<-^j5eK)0RmLi$>K*=y_2Z&1d3*7`uB;aa7 zjK=Wt4#VW6c|lQ2oVA_GYpUS-=%!%rZIWVIY#=rdgiK0w2_|#j~>= zFY*Qh&{Y>q_RaA6PGPe!n!~;0>FAM0#|WeI_{kvMDz}|Vw9|PvMW=shKie@`s(T$W zPk&K74@>C|vvF4y`U;IkmCOReTvcu#&-l6Cvm8$0)e(Sv08%{$e^*h7U%)s@Qsu@X zAB#VJbC9~V<-mx0!!Be~$p5T4YaYoc8&m>x!;}l#n3OLZ*VrE*v6uNWcso*)95FYv zWb5&Ru|b;ctwk7JWpu($ukK%HN7une)i4#8N|kU6i}2WIUBG|0`24ypYb0h2haB&>(b_&-8O{=mICA z0H@tz8`H|a3wo?8VXDKQrrV|?0a!-o3{VxAis%88(wxAVd74TAK0BYU{;iicEnXy`X>OX$&>LY`4WnjxIs`z4FEe)Ns^~ss0j9Kyf9#!?Ag_}8&Cp63cZtYIbGwg|`IXwI1xm9&D zXmn}6ZHKsvK~1$oo(-)DZt`UQ;NhE&=YMKCoIpF%^EY|Z{e1JAP-j3&&6X(5I7Q_A z26SY>#?6~=L38d9AFWa*{*-R3SQQ%0dis%fA|!V7m+tS9OaqOF8@@CK)hTVP#J;oS zrIe6(a#^kP>5@kik31bF8Z-fN35RamrFft z!633!3zqQ&*K;#^!oW;?5cui;?J8VE)khllkpUQLIn-on zxW#ZUanWE#6Al>ii|ujl{Pn`L1>yzp^w5k-`R>J7w!Ji!;XddlZzcXt;C06Js_RR<(BOmrOx=m_?CIZY_ZM(lbIVXB3 zt^03b)E%8SH-FQ|Iyja*RjD%k+igWp={Kk?bP>H*#__Z*+14?G!v~s_w%>gW=Woej znH04(hRsrrliSvyYy`Y^*I8y*qz0jUS+8X8+?g5QnkqmUPh*qqJ}fcV{F$sW`^=Q* z7IgL1e;`6^n}y{r(*Jd^jrfu!UW6ardYmC|LmAwDlS=WurEC;wAI4|a z{b_MDiFe3V!L0kEDFNRE#f~5I#gBS#7M_E%G8h;@Cjq}`u_w2}aYDr~#a0V;`Nlp# zaOcGwd(gB&e$B$V^*)a^ohRkP@6lijwj8M3Q^3F+&wG)s+vOu{-)_HZ87PLJDxber zjVZRSB6v&oZx7)pQYyKRLxfDs8yS;d6|B+!(wV5kjJqEz?-{dM)n*xdPKPrwxOnlk z*emnucNgj3^Wn%#PC}Den&@c1SZ6BfkgD0v-i}h+1e=_#IBK!1oSV3hCFWb2W-ge` za-tz-5pw$9v&sL!HAEKzpWvfVRpqTD$>-s-CRBaZjlg)N4O9QBN@#S=%CAO>Z6l0- zxKkjkS2*Kit~4e5oXX>Y9-~RWO&b_P-CLR^Kh`(R3du(>8}0y2nHvdzMf{4GgqQz_ zErNN~&BO@#VD>kc@Hy0A4)x_*8A~3m%y!8f0jMe*v08uQj<49HxZ%AYEe4f4X5K|X zt~~nJ|FN6k(adC6QVUdJ=>PCS&M4ytx%paw{@XG{)|JzLNh)?7@vP0MNGJGkw5a7T zN9;MO1TYhTIxe(jkO)AAiuNfLUP4_ZlM^R)ihF(BDbrM&FE}1|Y)8YcI2>z>n$2Up z^SKjN=YFE80=e??GdO!r3{SpsE92Z`TRdzHmWo;;Xh9J^Aaex{@?DkL zR*-GRIT|}+#|F}v8vFD-jv=<)XG78O?3!PpnTJh53osl=kRzi~u;AVywx{6}onn^I zJ7fn4pV#neWDk((shJ^kCUyagX zOP-v!qbi#LH2$$GRJ^@Othe|E0@E#0VBx!|aL!AijH)`>o_iCBv54umQ2R0ll-QpFPbQBiA&5;_cOMM{Rr3yLt2cfpoIj%>1)UjJ`eJD$F0GzlPV+ zH_us?HLuJ5VQhte6~lNv*z#7Kf<5)u=3_9DRk!YPf0k3ebv`Y)dv~w1b4~!Vw#eYR z%b0VLAPsIYB;ErpW(WUio5Ra_3|3x49SIOU?X+a;Iv)vNRb=wfJK zBW^|MxHE#m>^BJmI^j+Qg0^CoL;ve}s=T zbxrSg5l@nx^ZJIe910#~;<`{$jVx`}sCljHjN9ps24Nv+1e;if_9bYoDn8G#0)za_ zqCGjV%Ss}h0roiJKzbR>@ZvOm`6J*-6VI0Gs%RvRPk}P4)s%cp{MI+(E*Gqup7TBh zr}?G*-aCz+aJ~h7syN`S3g zeqc-g62apMk^aaq7P2D?taZbI;?vzKPxCPe2#ipg=Nz}FY+2L3*XPVRX~Rl17!dFSm|foS{K5@?IM-@|p_#%6^`6FZiD`&H-K-3*wjASn$d z(eqK|>BzZmn7Y%})q9SX@vnV>M;?m> z0f>Li+^p@mA$oJ|Zauv741%)m^{fOteJrm#6|yx0`=7-GQaE8|yF@K%kMuJb!`W#1fYZ*ugghprQCz%9^KPzU460-S5x0 zfe;0@nojGRj~z@)GIKDk_Aoui|AF%Le%`^FHXPnQy}gYBbUO`_Tr^efeYQRgZ@}=v zmW^XL^490>oV8*ee_AbA`S~{sbTM3-zC~|HULp!W_$T^yyB`<$D+*wzssB+}Bd0={ zgh9v_l)VE4RUR9Y7ZwmuQ|F?u5vE7UxKyYN2BIf-v)SL6@D0czQ*dZBM$}}xs4Af0 zt#Ko$a>xz4^_zU8Y=@5T1(_b(Ix=s3#iPfiPas0*K%4D%QUs4isXyKbg7UR~=K~Ui zsCXSZJc>`~{QIIdu z*5J*o4xQR{6rfFBbs?;#4XW^>EyGbW%@m-eYY!@(+tr!nvR6jL{K`lVeR=QlIA>P# z#^VOL_Z_%JX%F0{%Mowy6*1YIU=E!52H0xb{3`BJNe>p6XNCM^goF$}zlrpq;~)Jc z+m4?uY>B>>Holp}@bO7BV@(#u)XkOmdxVfC;;@{-M^FDtpjL{R0oy%YeG42)nm+<< z#&F(MGHYnZNuK{K(fv{WLAoS{0Djd4;Xz?{kFlAKF0Kj(_^vJMy`3@13wrkwxAZ#DJ7r~a#r=|9 zaM%CWQLzx&Pi%6*7u(QTqNXW7w7vnxjqxk66m$M3&PF=wLf*>{2Mvq6qWR$61zoAx z7yc)47&(E^Q!u`hweJT}=IOo5ZEE)x9_Rqkp7&vW{MLG<@s_27UNoR!al>c5@%&a{ z&w`)93A4wqR)07dbQy>K9Q;E-b3&1 zo>%|{ygR})q} zyKq3w&F%Naen54`Vav)3(r}&=zJNjs95CR@oP(}^yG3)H7_~QV4b-K_VRjzSy5>V) z)e-d+?eb68vAdV^a2(L9qI^k!MjDdD2zhj15s=p7^*00gQSW8Xen481Bg0&T>uCh! z9lcF9j9W>M%Z=CYe-vwp=Z3e6U2o$#9Y%Br6;LnQPUQKzaWm7_amsSR#h({d+u9eaRpe}$v-6rr~3vclwI@}hOa9|d@F4TO2Ee!{9>{`Sr(W_8o9 zSQE}-YuX375)YGA#OB%zX`cd~uPhzw6n->Bwc zPwiPn#U!nZN`FIjH6Zz(0JPJX5P_%$0Cld7Q zFD#5q@WciebNLoX2bfM0KiG}GB54&IaFB$ne19tm{xa*L_&GJif6(z4S-4^XYEa=l zp%Nj!?$yT)Dd>1uIxJ|-teatp(1-0mX4!>0CHYnab%sy=rVScRlJDUl1OjW>)jM8j z?eLgeuM!$uNU!zq)VZa-7RypG4DiL3X~KuoGBeoE@*8c{H$8tzS-M%AJcJWE!LJ(!qv|Co@7|JO#(VZ}lQjr3$bw7>(e*D;U z_q#zVUJ$xK8pb?H%Wa)Yj6Uqh`Q!>An52pH@k#J@zBB9h zuCH;oJJDe69Ai5aBbLMs`}LK95n>l`PG0x0=`XYszxu!!(>upJM*X62n=zZU1uddM z(k~wrW7gY^Cz+v<9u01hZ{NhhanVS#wOgfW0h+k4-6jjV$>eiWFskJ`J$uk)Bz5#W zJpo~lYVn`4rQt^?1w;QNC>{v##xwS1xlcMOQ)r!uWFQc|C*}~@QzI@f|9v$WFT!A< z>Jk<()dFmK#-{OrzMY*J14%$JCfXIB>{xztd3vVXuAla*c3lp9g541TP#z_uI%Kex zee~)(a2amHu=NFZH*_E$S}>t6^KJi)wC+l`*+qCSZuj$09IKJAy%IgA+o?yB2b{}C zw?E!Kztqy~&>FXh$J`=L62js_7*`?X)%HZlO;^KT{fL9%s`8L@hsp?*y|RvuIE~y(>9il?Mt$<5SBy7eX5j8WDgd;$U@g$&0}~`lgr5Hd<7mk zA**NrdnCXr&o8sFa7ayt>fI}3U#vw)EnqK$Dc`f!xKNo@%dYz*uF&|lND-=#H~9Dq z9&z}o1;RyZOl0UcN`W=E>XO;!fUAktzTLFf zcZ`adOod#o(*tP+4iM^jf+^de51v~|@3x>%d-?MHS9eg4E#yKB< zUR7m_#X3pTMZ9pE8qew`Y~KbJ+5;2U@+ z{2&QCY1tHbB+IdjZBM%FF&IZIWI|v=+w}pCRg~a!)APk`6>I7W)wlDkfGjB~eS3@Z zuq>P0mh)!gNWgOBX9iaPX2X823kKX{p~NS_vVq5ap~Kj^9QwC^v}L-W(GN<>V!w9@ zN-w1+vKBQ(AeuD3)rV{>oOrQ}+`^P&poAxWZgih?Q@dda>un;Cb>9fz_t@VYdVhWh zameCp#t|Wyz8_GqsZ!4qY_nMT#T%`V>^A6Dk@<^>)Ev$AW5wxRTgW@+qeQHHWeqvb zNb0272XyCQMX>%j=vFf;k=ynA~u-ZN!G1psfy!<{Ji;I_g^12`BBT^7cg!5F#{UhtW^nmFcuW5@3P4u+ zhpX2n#JyPEHo-mI1}z`I%C5CiL0HRKrpA;N~4>~|{ zBdEEiBLFq%fd3QjwJzMel=4;_O3j1}FWcuCBYj+)I>jsdn|BC}a*HJQzAH zMJK|{rnANu3YKTw{bXhM1Kmwahc!(2 zSN7^>ag?hJ%(nSWND6cU^xdt#3duqXC#$&|BMxOP z=T+BT*7M70+S#~S zibszquO}6b3Xbgv^ZK?}vC5GYd9ebOF3!XGH}ks{x~5)pS_?skJeJn_)AAVuX@Tz+ z0<#?4TJ^jiGOP$HQVl%xbe(#UcysU#teYtxCN7}SD&mv5jYpytQ{G_2Z528Erd^E# z=1iCi%v3VaxbATn4tLlB>ux+#|2|RK7n8I!D?-OJta32mRI#WLU$uHa{AAN*PD>|{ zZ^4l2fvu%%aVSb#{@+qJ%JsjsalxJ+=3hoF-C&iyPs9YX68ml{t8oVd1o38CDfpnh z3@e94>;B%UfKmS`$4G{$5~Ko|N$O94nRl&32I{{LlY_d5a;!s7LDfwiq~Xi&wd!?n zGe0@gVLse^$t-3EV=+K>p4SVth)(F6pcpqgks$W}2vhx}yx-BSFyWj{91}IyTS|n0 zO8UZR@ArJwh5I2+$5R1}a-n!1ieQ>OyUj6gT=gU6IJiV@(7(JjLE29??=RHjw=tfd zEdEj93RTFw#TAjFH_Q0LFuRzzV~#r*)~1&VW#d_t`s-F3lMWr|yLPcmWM{fZta{;W zNE#3xdt3SOhE+VbTcUqp-1UQj4abb#M3lh$!|(Z=KP@GK6hpW~2AK7$hLf5Oxi6$G zO@@g;QVCF*n9mM~2aKzSaAR>V^~h-7Y6=vgWmxW-{pkW};~m1pU5TUn&ibT=QNbDV zD>L)I=)M`9ImdZ)vK*7*{qvIq2za7b5&>A7I3Iw%d~bV7-V!dA`X6icv!x zviqCyKCKYq%3)c!zyM=eGhQ1T`fGQox9}~q;v&@g7RP;b`}V4+wo+hCH*L~-m%OO- zitHE{XPk$6%{Eyy-T2P9N+!`#7HScqtWX}s#TWbjU>RrUEOHcs*JH=eidZ>c-;616 zpY?}*?C=^bQ(Nu(5)+wq^AOSzRt2cfOw}LS|JV{GhaD&V?D%4#f6g8pzB<{8hlvL| zn6hZBCgph3;eKM;Z{GF8bsouT7}RFWKJ{*m$JqM(*sNOooX|Km(qfGsPLwluKMl-s zxmwl}C8GO|JhB0EJNby2l*ENq+ZDDwj_wa-50cIYGqmd~DE19XqEruG^O zYx7%tg5!VAH6r-olyKSs$Do<^L|5=c(^ERK+ZiKSJa|4d7<*O4;O6K?AP9|sG3r+9 zwG9&)=Owo66}HW*>lf?3^(SBrne|0}J>W2OQ{NWn?Q&8mj#%O@JXaRhyuh^|ao=`* zZz~7(zD`V>s@=fHG-~@T|9kZ9$7J}6pv9nf;|~ys!LexNI4C72@1|_c7dv&adIjh^ zw8}y`F;tT<2wk?h}h965eh0CcPW?nKO3jwF=_Z`~>0Ix5IR z$r|qGBdtp3KZ)%KRsV4NJx$L^W0Wt{b8cI4FLh{Y5W||?A>E_?o#`(kRHl+ zz$XvioWCVR$SmG)2Mdd2iA*Rr;8af61R-N!mkH7oTI&xTFH!YFqfQA^ZGOc467FlAeDQ@KJck zWOm$*qa0-o_adnzS|~BJZGbtT9^d~m;gh;bgO1wuZ=sfyjHDgYugNOZDSHVo>HKr% zVuz&~JLmMVJ}GyuoK= zQr$B`1FBI2^AeC)xbn+P<*`D}w$%2QT3C<*e(NR%t-QG`^{uCLgN{ZO0IbByTygJS zT$pbmnbXh2UR|0Lv=}<9Cob%V&dtK>(ZL7h=d&@OD$W)iMl4M%V5_eDzZt9jzZr{v zX>M1PMeDnnZYvw=haov}sR-~ zcDh%R40ti9cfk<2Z|zEsZOP3X){4lO0ZQ|Aj>3X#Nlsv%+;nmt?m?8VK6O$!3Ks_N zwRTbak|yHo&)$zJypabN*f%iW$F&HJJz_|W`>3&>by~C`E3~RKM#z7kw1}wYkNGZp zJs1LX-n7Z#dQMA&HQbi`r=(=0P+Hp-!redJ2R0aB$r1Rf=XEsrisY<4Y@Tw0!^Mh* znDKUigytUg#dV^x&}w!~JLsm>fTMSA=7|7&H^-aKRgFe`Do}gcnv9;V>o%B%7qIbm zPjAYI>^oP(SR+n54dm6shdBD6axSf~K0Xp~T7IrmpYbq(X^5~--^+V*MAmjQbqC!L zNDdg-8PltAimh&ky9Yq3`Z!(o!7!n-2$ap0(R9LT^aa^z=iZ0Ij0;)vBa9I(IctXI zD;yd$tXQl+^XAFUH$S7R=8~8DwOiUn#;aS`@i|~wOG3MS(Hvp1{N$LdwM|K!;~Vql zXWjnstX=6T47W>n@7o?K#-;iM(7NvT0!$yNJn$Nx#CxibtK-)F_l*`Uv#zT{@ShyJ z-(5E>iAFIx2n#-_85)`488oT-ZT`YCx%@F2>SbTT9SHzFd!Veg>}eWwsXoJFNZ~!X zUQv5SU5+%QJ|n$#&mJogVo%dl72NjAI8Gx|Tjw#&nTpdeJVYZ6pj{6;C3pm(?r)O9 z!+GKJIemN|&8rhHqkS5PfeCdHT}tf20);ZoaTE44CHl+yt79EOAxGzv{HL=n465pC zXMbc&T_T5HC%s-N9}Id0HozDlmFxm3}eI02HZvQac{XF`R!sR!W zf0M113HJn_YzAls+u;qyhw%c8is^_ODmmz^Rc*q_t~y}v{k1!jqiWBoCl3bJ3pgQx zyMhYU7jS0L9tJnOMH>DYwC)#{QR{%q9lL-O9g5(4v?1XOI1z@ACY$Xi1FN`kG*9Im zpS-XmKMFH_=s*hJG4J?x*iN5R^cz_xch8y-$vqU?S9sjNU#3~876#24NR}T$?WfJ* zvaeWrTAgIrb#xL76?aMQ=U>|-Gaj7~Nm5o73e(lm92_`cqaUxM{+B!xq@b1af%qdw zr&_(#orN&kZsnjf!e=FHX*yfuaP6~B-U z>%)U@yLt(#`i8$2bL2JEcDU@$pLjl#&@q}g_~$A_j8YP0^QNDG2bby{t~ zM@{ITRKLX#{bK$0i5*QPnf&V@38f5sW2W;FIp0#2^FKPe!D%WcX!QN8>#C3&_G;}T#oMsY{d03vb2NOhd$ z7RL9bfu9k|#ue9RzZ*i4G%DeWBCu>$iF zgW!0&J4-K@W?R7Q%lnJszQZF$RtQ_mU$E18x#cMMVNDLuTnfJME1y=~V|Z++WXJTS z6p`HyxLqggwvS>&X4&w&qM!Olp}^Mq{@4@hn0@w7M<(Fyvj_60tuU&A zGuogEhKt?JS^l8G)NB<4wfMJ20l$t^0+5@H>CH35I2w|s7n5T>pHmi-B3JG}kL0`_ zd06}_ein?q^sNvyvr|8v)|GK>`_Div;`9InxC=G?AbS0~ak5w6wgw?K*2OpesHO+6 zRY_38V4(*jw)$n?f6aeqde~%EiGTitwYH1=kLW<wf$Ku^0<3{6Zc*at0(@FsXzv zMXB%5v^3%^!CPXd$#%KCTX6KCaA-q#+8$Hj`^#Dz2VcJdRBN4ONoG_EIfGXoxLjIPH&zM1pn`};!_HE;WA=Xj-qN) zcpd^qD|~`MKeT$2TzDO<;jWfsbxd_!moFH9NOdPI-$tW4#H$jOh2kHjkj=OMf28Ty zr=60>UgG?-=G4al_ov1LJ^un@zsCuyV_jONr@r~vJ61v=qR5pdiS+5+*9G*qhtBE= zpfcuOTQC+{`@5i1AY39r1MzN=_N9O%45-KyS4=B>|H~QtkCTL;FC9II^IjBviH7Hq z@D`uD8NB+D_m_qa{!f1~^S0+$&o+8gimzJ2_d&E_>`aStFo0a^N$3+wg47cOH z7+m?s%$BQpbQPNY{$m~>&>Sy8fQ+hgqb7BrS-SmHvJN9sxBgAq?-6^r+hr^VNwnsG zFfnB!xra!dxF*nmCIyFeXBXbJjTcZwRl2*SyOEUcP66o#>5wiL z-Cfd+bazXKbeDj@qMHS%i%{+#-@VVdd!KRdSi=u|1Drhb`Q?O*yN&7@lx;hBo+-`Z z=lB|9zdnDP^Up;31eM&<1kIq)_dpAoob`n?0q*y+m{BYKq<|Xc`SH+9PY6pw0BM$0 zxOU8X9#85nBK&jP6 zd;k1_>4r>NR~(jp!8Q3>&-Tk0A22jDw?b4&4eEAQD}Rtsi3b?sDS!%VGX6LRZ4~9b z7WHs1^sH#8!P|fK=<(Np`AjfSJ!FHGT7=2u<5+^ZQfvx zCe9=J@%r}IqV>sKFtr(GQd6yCJ!0-dm2Vxiac(4guq>axE@gt_LC7I^j0ChOBmj`G zsE(K(m%W#!3)|0%f2mY!r4MhAz(EFVIJywp&#ez1;#5+%(7xmS`PHFJ4=6hQH~CKkQ=S}6I3{2Dd!K&1`5v0<_1)-k2k*yE!s}=;ZBu2DsH9KU2>>oDZchM^cO~vBx}fti$oTey5KQ z(Jk$l&6y++H#oY;E80rETn*pXdnFh{;4JzY1}8&tjKhmT|~0)!m)`OMn&0S z*vTWs(rF^M6?iexq10xBGOX_H?P)M`5x>c3Aau6v_22JI$(i^2Qxva@hKn(l=wL?B zt(NH~-1_$RKDmizz+1X&M5VPcr(w`Y@`kWYM-3FFP(ko8$CU(V*k)_!-Rj*+QSFPU zm>QW+Lw6S4VdrQ+zx}KOlDKH7`$A;{p^>GOr4)j34=9ZIlL1X8EBkr0U$>>$xp_IN zh~*>6<8-Sn*HQ}wgKYJ(egJ&VzBUW8!aGa3SD`b$S7RRK!cr25ig69W866|kfK_=1 z--Lw38Rj#S*D#^nmxZrO8Sl#(FEJMWdJ=VY(tndKMoX0y7+nm$F~~4ZK9{MJTv6Mi z#DveZJ;T$33=g+B{s6ew?1kF0-8Dm9OfFx4BtDY{V4v7y&*89e?*fIZ^2$zw8{|@F zMz0aHH1;m>rFeOD26|`Ozi5oF*w%OJQ^O$#V7$CT?%#V-5wU1bDR2Cg$RKANX%%8*WB zFeBkuEhk3@{Bd*a+H80YL%1!hQa)$BA_+$BD6wwtF=y+CvzZr-=_+Ne06(ayh^y<$ z6=;BC(zH|im@bv0IQGJxu5)c}uXBwD2t~%b-{+&J+$40qM`c($5Yy>J;SgnR%N$$i zxXY{R^EJpypPCW5rHbu#s-|h3Q)L<0-pbm`cnh9zlB-2!skOw>=RfXyIWW>Ul|Dd( zKD+mU{`ZT3rv;i4oRH>v9b0sO-vDkU;=P}$pu43$QSo&cmB(9y%jyZMm65gWz!XFw zmY&C(qQjjj>rtti6(rlMQ5nFRm%M&i_e#7MpP<+d?0va}?7XmM>?#|#!p&4+XFt%# zM^75?$XP%0{Ud$zd}UZw9Vb?)+8boaq1%A69Hicd+^$^gxdrHH64Z69gs?wR`_mkaQxwXD258h`<$C(xDi)$`eW9^pctMP$H1Xcb24NTh9}v{{z#OG=MLLI}3hADPSakRGJ@Y4I9*m@8kKsj{nM8uj;rdM_Htv!m0PsfaF ztoz{!LLcP5qoYoW^&T|gn#jfy#jop<6+e8xzg(~1Rqcvm%gmGyaOd>BrJ3eu28P3i zi`=09!^PBF=fSu)gG^;Pwd?PQMIT@DgRi7`YyO!Iq&9!2Lq3K>L9z$1BBYD=ok$mL z9o#118n;)cbRw;fQJdnJcn=f0ick0Q-(>Q{4?U(DUP(0|Wo682;L;j7uiFa@GIP@A zXL(4X$(H3`be8BwNosADLBp^hng(7tT2xq>N7A-kLxioNN*W(lDyAYDr#%vc8a}yR z4>!5X-m`NU65~;1uN&f!E~UuL#e82@V~jVBuBRs^+ zg3R6-{Bo00Uhd`q^}l_~gRHGS+gNz9Q`Hs>11%ZRdD*?^BVS0V4MZva(PWB`6lhi` z?a{HNIbOaCPMz}ffZ(Q{)w~$3FJ(n48dZ?+FD&@Wb!L!axo?db0Mmenonbn&ZrbX{ z$#DiB4GaROkys9euH?q~p`3w^HI}Y?7pPUFaT-_!aKwfNuMs++b{zMk**L1^WATZ` zpVgLvspN4q8xofk0Cb0IqLEDKu!-Ew!ywOS8;@>z60K%pQp%vm60MNT)GeB6BoDQ+ zx27+>qg2LBOBTQtV~iNm@MXnPVi&8;bBixD&ex#AHL;Q)>_!Z06?CO!ZJMu2>kl4V zcm;RsJ>PGkh8X>VO>Ap%v6?MQz^$}ar?T8^b`8hGcX|yyJhzSbSzH}GpAow!F$V3? zK(B8uU#m8ms-Bsc?sS-rr4okzVYvYZzhH&gksooXxIS8?1pnE z~D1~&<0Zhy!a!9N3h=Ok++;s0wrPP*c9zALKJ_*$eVDnG` zK}L&XOCP(>Kg{$SaDbcu^ZyqI6{7i((6~1wXgY>23X-QyGoqLuFIr53dx+_C45OnM z{y+v$Ir=Ypx7HbAI{KE4A^VF@Ldc%$j@C7&Eh}4ryK4N%I%z%>X$Jm!8N#+)%Ja2axGvkwUyL@%W zhdtP<9Yl%~>!AHK1B8qAUA{*nY8?rh4c-+Jxb82ib5N1{ukujnt_yX=(Xn-2SY7YE z{_1QbM0kI%cVJrRoblVO%P_vqpul10y5aG(XZapoPoe@MS+^Le-(u3YPFt}*NCr+V zBC$^n-33do{z!c$WKq-Sbc81CICa{(E|&QE?%1S?qF zb12HzIW8En6k_DK0%<`hs-jdu>O7FJk=ZrtZ0U3+&C$V zM%pqm(r?cMvD;PX$e1f+WWwn?;ufgCC&%$yK6(g!8CcaY&cUQrs6HkB_KQ=y$hztO*2QOte^`v|*}+0fBbiW)(19R_Y3PHP$&;XsR8AhD=j~wB z{8U|lnUxE?5CRl(A=z`lZ%t{heg-;ShWW&PO53w&F-+)_t@ehprL3sn1}g>SyCB&Q zVKMjyAcz6%I{oVW6@Y~LDgqZc58hfP&fUQ3ZBlSK_4*d$2eKP>Hn8X0 z<9@b=d_{C-I=pG7PiQbO~9?5i$Ni+p(#q|M(-c}UOw1`SL(|LhQ`?a@kh$*=m5x<6z4V=CRMCMLFZUI!p zcR_OpQy$WJnb89N7SlgHxIB{1L*FrIhQxExb4KU=V@yq2Z7uyw&xovJ}85Vy>kOlk4`{gv7&nV{Bbf8m{SJ=o1LLH*?eE*i5 z@Y(FjMzNSf*V75clv8&o%j`zX7@K=_%=(-|(E23~zqy>&JcZ)^@ohZ%4uqy&XYQ}UvCxGm=ZnG~WZA2h zT}GP84Zvaw@6AT@jnnr`iu^Kkz7+97Xp7Gh{P7XeRfOI4;b8YSrf48r>#8abCcmi( z|G|u$OS(Mx4jh9_9pwTUCUo=16#cb%--*U_xVWy;GY@#iXJ1k&#;GEkCcAA%@mp6=nHBem@1?^4JTA!8uP0SodM9f0&pp zDn4iIee$ntl8l)$W$3~BU4%M=tDwiHX8gqlJOOUkS}Gq+w(uL*F?s3OCe^F*_>75) z%kp|~{O$jWHTtzX8Bj^XJD#E4e^B>nvg{ijLZtSVX zD-H<~rN$b@B5`(mf7$W!J-oc4e*fXhfq_V#l_(DbWLHHJ95zFocZ@iL;z*s^OP(w} zj3&}M-lkq~CzDkwvg8W8F`7f6U9d<_V%!?i?X^^4JSs&>#A`DQV-W{K_(iX1HB(HX z3Wt+HaXoeOTvD6K8-vH==C30$#HD z*Mulk=T`-zsNuvDkh>YIK0FEUU49V z3J5|CH={!!4IJW)bnSWZW2En>b+KlC4E~v;E!p( z5HhR}84g1F+D<#8d!wY?NY{7m=n4rCty#P|il}cfQbq3IJ$jkQvh*b8Bj$Be-Cl6Fr8Tj5f>Gz*Jp3MiZBu2rS6n_tR8FV@qMFn9gW!?^AwglP zTslbDfq8zG|3kq}HxSaY#RM(?^olKZ%B2e00o&O193Ou%;VbdmVL2-+R4;%q68lsRferfw=XH z2nrWk;cT8)U;f<%aJQ$~*<|zhI7EoPtu+$sgMuM^^x7JgJfUPNTL$1Y$~{)dkluXX zruQcEyLEA1+5Cl+U6n_HL;l)StNmvd3$B7BjILiS39o+j(Vzl7Af!Iq>g;QKHWa2C z_ACDUG`M_GLpdlnH$({Ty$W_StEy==os+)XO<33lW>?VGGd+f`ctQ;DW zT$@V|hYdGQF8ND$Qlj<8gGYoqg68&XEcnDzK92c}>RUxsnPSPPQq?~N4QPe^pK?-e zB?&0&8iwWzmFMM|Uo_UBX%4E+HXDg$*2H63oY~j06zdKl4I#ak33TcN?sgW*^M!Q5 zW0OVF&i>^)tSFA|C3V2De-oEz9}N|~ZC8x!N`Cf|IbsQ(z8q`m*3yS3W#sKa*~V`* zFcSb0n&?o%w<_j74?LvLIxBsWWSzt^SrJ{JVtwOME&Fe2%e<=020Oi3dJ$EWYg9MI zD-tm&$z>1a*b|>w+8&-A6D~fmNhsf-@?(s+C>p(H`z^q499&Ph3ny@YwYe);&85&; z*5vkJA%rhOCFEP)S4XK1Zn3^0cF0fIM=!pgK#;n!YYinA$r`<|EUHU6R<%`b{;FV( zT}>|171K-2o(xUyLlqDwpi^l$yRH119UD6;HI2;!wIM{9Ww`Fs zyCf=g0L+x;S$un&Fzt`1_#AKqF*T~Bg*Kq!!>N_EhNb%cR{ler8g;WDQU3YiB$ry` zLz1}{a10Q_TYui!0v7uCJr{t@+>KqsxCO}Fs!Y|7IFS({>m z!gt#CPi6jXx0olju7o`@l<78e?c(O$5q9CRxLl+XQJ{bQGI*;C`HldWuj*7YNb~N>;rW|9%!K3 zEd}IU*yT%9A@a_&(nGp%8`o6_E%TS`)bs)Aa=cf95bd0U1 z-Y|oKXkE{E!LV81y;2`|f;CZ|{aGmnY?W)|>_bObCoyzB;5Jq2>WU9Yn zQouYyyh=Lh4Wsf9TTf&B&wAd8yw;;voaX#!B72lI(XGP7?H35(KcAzt_krB!V3Hih z0-i5t*GSgsagC=tqW01Et8exk17{*1QLX_g2c_$*Ghzz7==TS3RSWT*X^8E$L$%*bLH=K7> zUc1bvE3<0>Mvu2pSSPWe(f$Zh3?Nn-on1j!Q|mG-@zCG8?f~1Y9}_UkO+}afmTN=` zb4+W{zXcra{Mu=W+xzPN^~2fNWk(b)L$q`;_p~sg4IR-FBTnxih6r5isw)y}??z(} z|0BPjAm|#x(9X7?a#bgEp?KT&W+%r@b#zI4?}XpI?wk3<`3|fhCxbh54E2+I)39n9eiE29WV4@;qbV9_Yca`<4P`{v|X-);QbM{`8qQR?oWv^ zjl-N@Z(JzaFO7ZTx4dsuR?Q-ecn#)GQ{iMq{?wCiHHR&iW;>R+v}>rDJp42wwRvC{ z#ROjSqu>L2bvbYJyTmtA z#m}A=pkHMW@5Wu{<#ga`OR%_k4&EM}cjK2M{G(Me3~x>GQuPqJZRv^67nZs88Cb!MND|4wS2`_Gv_UDU}k*7rQ&JX?L}sFb6O$Ay+5DI@qj|UhvXg)6rOT=ISFW%c=5$ zT=>Lx(%B}Jm2Uw4n02m6;}NAe8ZAoS^^UWJ)GfC8NFv{mny#mLdxGTdOp_Ke%%vgj zb5Cjz*?;P_xG-{LKDr`2{LF@T}`eaP3_k!*3++vg|!0lgQSP!qv&}F_KMZ z1Nv`y#~+)2$i=F&$=O3SV*W6$-(wdvh|C1L^_{ty1uv^z!_R&~7JDCGmx$kDNJG`_ zJ1>}0^CMPDZnX5Uj4s_+W0HFw^al!g3Zd|aQZ1e3Wdt@IQO9imZpHTfd4#O#@{q>? z{QJ;5rW&aT?=XyUPuBeQ(s;JZ>q7=7Zrd08GlUeE^-QLeGE+%+XwSxK4K{&EH70BQ z_T$y&V#Vz0EE0v^Bd2mUUrnN=4EW6x%#BpO4B;?b_L|wajwVofBsM_!^iX6mb4qaC zL#mm2Gf2Yd8N=2ZN#y3P%AlITILgY6$9Vik^2z`AP}A@vvC4B5kby@knIhWpS`(sZ zxO>o(-ygAp^VV;t(z~hYxkZn_sRV$3~EzwZW)F9{;OS269#MU_1 z57-Q44TNaPKGEI{N((VY5@F!O?i&{%@Pk52)&G$nn{;xE3rWSdU?)_kOsnW(_5RJF*@7d7U zXqaQE@N7vHw3hW6hx&dhXFd{Fi)Ex?Js<hN`qZ+Y^HXhNWFQ)<9$`JGAzHau#lK@nH+>Q5r%(iqjIJ|d16joB&Y51)j>zkkz~32B_)*=xE01HaI_*ff5Guq6Y6RG7nDa2| zj@{gZUTM0O5XJTn1qa^&hGjWAZq6x0 zGr)LQrwCz5B(c1tO## zi>MoJU*^HAD(rW53$$!E<*lS2Sm_>+W0-^mWF0GHelUWh7;u|EHIHU`S*o5njMvsKg6+kV1D8MqZP_mo;bSJN(UIPXLH_^F!_FTFA)iXKAeuiA@!&Px*rfw$M?`j2Hlvik^Ye zOC>|-vdxmF!pk#_-KrPHJBhlwxo;rDuGBLSoNBav6O^AewSP68m((K)$o@CQ9~MiN z48{EDT2~Z8ucJ7~dsdX~67g0>c-V`}0K-_j*w;Shr_N#biYGA1&cFMPb zG8Ty5emL2AR|+AfVgI5rz-#Qob>eoPAfp-fS%--h1uKUr2d%&@6cp9N)=q}%bdwyNzsT0$28#QJ8ojc1pd4Z)JiEolM*~)LbPBl9_dqWA&3RpnlgYop9gOmUH z`Njmp2`T9bD)Zrc_~HZo?c?Vdc|`UGMis1d`N!@L%AwQHZ5(ft^sYRXZEg6&7)QFC z#$s6>Ofvq*X&oi?^k7=1Jb4~XX|!ORNtV?Nr_iW*1i+yi_Fk?d#Ij;<5P}jyRVL)X z>^7dvnK6Ejr@X|*u;fUd_Div3>#Y&7YO#Xyc)8xk5_SRG5HfvPNF#;{L+}*Cw?!qE zIn(Qev-h0+tks&{zEw16-&Y&z3_uMe&jELWmz|t|MA>}QjA;}gp{=E6Lh0xnIh0=8 zYy?N&Q=qDUSKS$6v4<9TK6*0~yA4 zBMEEnRL0-0*$MLgdpi`?vfqKKAKEpPo*}X<0FhJv7b1V>wis0eNjylh&)!set%?P2 zaN8U5xKQm-){A@G3Cpa~p05c5AuA>QywqFCPDf-B*K#RRPmTp(L-SI!D57RS3N}WH z;aAVWy4D7{TuF|g*5D*mWtPkWWfMs(eMNV$-J(${UXODxw8My__Cjjnj-Z1JLp&R1+Shrb52G`3Wm?4-2L}{(kI?5JxIM*Qo7YjN#fL`;+>udWqkFjs%gD%k)_FCW)>|ImN-3l3fd6kmzSy^bqJ^7woxS5*nI6(7V-LUtKA65(ZUYXC2)cR?kNI8aT6sFUt< zU-@D<(Mb>Mt8h*i*p{ua>uBll{^-@G1Rz~)Yp41#>S*WV6l=izJ!$7@?9%>yVL&$$ zMw^-lMhrP2yF>MaMa4Uoq|B1WQ=@jLeF00s4*ANL$2VAkH}p=MPT1w7_uP2AhX9p%!&z-k-mO-{uU zTYm7Mt?@b#SbB`h@z+Rs%crum_F*a_bx1fh&4M(ItD8q??}!lB?+*o8a`!gg3%KVPOoTf#opa;eqkUU3Bn$VR3A2boXDW z3^k!H*gK4R$LubOgN;pPb}>{5(IQP~+`|wcxL91sIy& z2h*b`5p&Nc^P+avgfE?`+@J)xP{eUC60QB`_3_VF-Rpp{FX~hY0v4PQn zhLC**qMMHsD%!YS0-C^Fo_!$Q9KsuLBsuWs;QN@Ii0#3PC_RTcU`j^kk<~le;18# zUq)B6${=guwvr&d2}1DMdjbn5ht?=TO*Ms$g4YZ6j-qRsa11|3m4dMWH)*?o04eYd z6^zix0uNdo^#{^J?((ECk>6b=Mzl+K%1`JoG5&_vgKzoQc_G}``MQ2mJ_Lo36NFCC z4Q*m+;l1N)RyaDTD1PBt(V+EWCN4mBVvso*3XbHDLldzz!r$NA(Ss?5W63@{Y0NLG zwtjC_t3lALkdPGoIPfXByEdUG(d##k+jdvvh0rE&|7HUI3^TBj<~Jp2wTKmE)X(5y*F}KoQ9hB<9Fqh9|5^a}0~WI6pWG2_g>vX#2mvloLEa`KPI_j$ zV9KMg`p5;GvdV1eHLjBmcS=AuiXp_T%c>kBO$B3FU5|_TrRqeFcpX*A)!ln8kvDv; z0iuC(MCFBYCD5^q7s}*g$z$<_=Sauq5(#-_b*8-=CpHA4++ONY9Nclm%TvYot9?f; zY1Fl(wfg-j;B|^}F zHHJ39fgwU+pqiB$ z?b%@X2F4xN$;Jjtui;jbvlg2Cs6&W>z4(OfeG$Cvld?+HMrW=Zj zR+O9$k=>NiQGV*#-^Q>1dqB=lk`s&;bzVkO zZ8iektTgaGVZk`h2gJ0&zTF!f6LHDAxt)<_|GBV>7Y-Fn=eJFvuJQf+aMbGANEF!x zs+Eb&8Mb(J{w%al>7Nhp|GZ>zs*}F`K`dg-w&NeX{Umz(q8e}(Pi+jPCqmGUcQ^&q zsq-mP;4rbH!6jGs;P<{xIet$dta*Il+0O&rCf!oVTQNBR;nU9Q#r4QR8w6 zlrho)T_J;~1m~jJX`m+I&ou!9owRTblwLrPzof>YZjcGUxnv**nVbJRBTlfM;YLJ( ze&SEit0lm$rR{8v4i7z!HWKO9ihy)yduM?y`)~fiVQ$t%AcsxUsBIasT^- zYwR2s1{)qiYe?lPD#;Xw_i8ZSHUp>5h^a;mIv_Q{iLy=%OQ&;&3(PB~BnIzj;Ii)N zX2c)L-(+;=7+T~y#F#f{ab<==-;Wq$d6~4t{wLi8?8yK69O+^MzwRF*6g<{4Pe-`~WQNN+_R^QE*hKXw9{`{LAeDyTnV_K9>|Q_G9wPiEiMu6ZaV-fHMxgnL%%}ix)B=E`rFEXx zFRI>wmBhb?&(!FADm#4b#*Z$Au>>$x?Nu@Psqa6)^M~_VN?>sUV8re!`0@D;@x@py zIK~%)l)$$M7MRjX1jenh$X;+>>;$Q%`+u7T zC#n6^m>YLOjeiFcfOJgYQ+1>Y2nv` zTGK`YE?3@b&3XrqqFN}*roEE+w@#2cpAa|S1(gH4>uV#i0a{4|4rxLx8e;UoV z*D-1Jy@LI1g9@PIZ%ftCqPo75PJK;{b;sdmUI>eY2hT@lp=25&qIf{^WUy)w`ahS) zwl&dTo+9OBx?@h*V0%>8PX)lI{4nNKG&vD~F5147l*dAqom9JS=cLeTixxF4-kYI?cqAC}p6P(T1Q@4S>Pb{yQ#g{-*^joDFX~NcaA5+YCOoW<$%FME8q!!X9(N<4+ z1aXe9j-T;#saEgx#0`01GzBhDrL-@Ot_bYdicq&B^rzCvtd`+*8m>|Y4i-2-_z-6NxkiT*F}W+LvX z__ldAy*j;4>9u_ofQx8hhZnYfK35X-6>qNzB+df~8CKu>d9zy`h02K-betq`W4h-q z3cGz%U#(8br0|eAD33(G(47C6DX`)>SZ-fw?r=c9$4zG zr#2~ka6lGDq*|0m0**rQGr2ogDYWS@Ws%vY=}_1 zZg3c`u9@NRtJI(xA^mVT{lGcuGVE2Btg+`R@L-!lu#zd_edg30$NATRVo??mnflH* zgi7g^ivA9|MmQ0D8S-@K!e9%MnDSQkc4{S{XNkUN8ynX|n&@AJ4gOLbIQt^yunaws z9ASoDf+8V*8mqwyuSVr*d)xucZaqxM-H?A8{KK@+XUWm14Hf9^JBdghh_2*ZzS($g zY-j}<8xUyVBY>rH%5LOAZ3O^H@fkp>;fQMyxMQsU-ZACRcZ~c$low!Qmix!X3|Sy- z6p?)gAeX0Dnnu}QWI!==M+tH#Uudh~_0^Zsgi%Ke3Qdi1%FlT$7OK<@S#tmJRg*@6b8L^fImL>RQwG7?_)$1wDF92H?Wq5#NBjmXZ*{w za82?4=*fszLxai3hSL8Gyve)4-VHwxv( zHpSit-kx~|q2mRCSf>H(;Ld!;^BicABl0^#3p&_^a-Ikgsu7n4TLK2{b8%gM0v?9) zuPIXV1oLPqT!v|0;p({*T>}J{zPY%Tj^K(SEI+ zp>SODo0PQ=i_oV~pyM|jKBbfy?KlHEU#RNFL;rs+q`oMi>&azc?gTyHV%+Fc;nI>! zpDMvipkq(fa=R>R;q?u3qpa8%dR&ecTUNwCl%YOEX8Mu@ZHi_sHC7Su%Ib7#R?`2L z%;X96&}a<-+Hs>ohv%lFIJkrzVhs@PUz?7|O{;Qi2y;3y5-Hy5%{vNLMqq+dxtN3} z#lc0YB}2*Zew9E%HnXsJLG7(}6lWXUJXfhnk>;B@o{(iF{2-a1Q-n3Xqo$&Smj= zcn4a+yjRwvQ?BB#EaynOs@`xp)`ND3(h<55r^07M`}e|5tniZYTJ`zxaqQ4bf6lIv zczR)>0h_v{K!|q0m>>$q4Ujj(A6g~+FV+-`X13?=+8Wm@@=Nvy#+_(Y4^`w5F*ZOR ze2oOxx$_=Uq2z8$-Z*_a1Cv`B%Oab#k;dFg8PC&V_+NkcNSdEz;MrNQs`P$5`ZY2i z3Lz()>z02NR}O<=UFq9w7^h!jg1v@(#!BiRsW<8t3@H|pqaDZ=l^pfHijO6Z$G#yJ z9or6|eiKda!33JKb@sD$QW9B|6rf|)KMO1i)pf|WRMM~{bYsk7JQ`H>P4ZXytFC!R zV#OGcMZF#ZwAT%!*|;@TP+vI38cxVe+xRseE{eTPWjK4m`X)55L=efDhTN7^eRpRAZ+-kLp5OeW|&5`?*C@qn78jRh4Fg_XMBnLWA4$#;_uzXrKoq_KRPMA$qt*ws%+e4NWI69I@ z2gT6|9CPVBJ`0E~{srd$cbP5N{f7xLoPB)td-s>_zhMm$P^Ge5B|!gCR6dsG1gCdZ zW_WSTjKuz({_i3t##^a;-{S}&w=s>Yqso)dlJzGTg-Uy_iQV*WGVJ2>)4=zn14A)l zyEfKDIPcxVXgN7G&LJ$I$~82mffFJ&`0k=48M2`6facbeNVIrpD~FSd6cIo2jZq^_ zl&LUWHQuuKJY$bi*2l)d>D4fyYyUMp5t56CdN}(sl!QPPZ>JeL$qrYR8keX=)k&QpiIW zLMIiFcYf^?+x~Yv{FY59&S1#X$RcLfd)`+Qg1aRZkd0U5OlGe$h-$1mi@B4jfoC{? zmqp?;0Wkfnz74uND(@&-HiE>}?^Sst)<-V{ScBKnIOi2a7e>G83IAlgzSA|P9#6CH znj4AEGzKfZWDSZ0joHvHB0Qp9 zVKEh~Ft}86?+z$4Wtg37Xwuhm9KAaH_23xu&sm_1IoQ>Um1g}!4<=xTnC8VOYWZ*JwYT~oO8rCDZehS9dCb2l zb>M}f9Ozp&3M*szdH40KSJ=P{Mel3#vZ*0h2(rWALLy>Om|}`+McBXZ6P;T6Gxck} z@K6OMAtdj#P{aI(sR)gYJ3 zcjxS^K1qiN$OoaIi(1e}H3hS%08`dQXHt#WL`^|$G{!?nGztons^@DfS^|Kh+<6KVh^ zT~!HzfT8DYkr6)`nWF_LZ_$o{X4N5J9+dh@X_P=Hs~v%!JDA_Cw`!@J0|KXM*0apS;A{BnH5XV6k#K1^BV?vyh` zs2rFnumCW;lmz*$8z1czgtu%Aa%K#ylry4&9A1>tDUN-LI-S59XbENgbC#ipVH3id z1+UkVRk_v38CnA@*(ozqymTC)c)HE=zuqggzT+J|)X?>?blT)h{9t#AKo4M>O)t9@ z&WBi^FqU0WlKe}Jz5nJsp1-zP_T_su#5lNquiw_ zszi~Yp=hZm#qHv?Xg`VHYb}Hw@1#>E2j_PxX%>Gj*Q$jA)RhNtVodP>+2t)QjJswD z970b6z?MZz*N6(=qqd-QKN#u47d9)8%7f-iQ1;KtIE*|pNHq03s>_050PRidWw+$q zSU=!8$jUZ&4<>W+;c2P}%O@|6CXF=|Vjj;fREH@5-g$7mm5&xlX8C6UJ%XqwnlLhc zJ-t6dT_b`)+_v&WA8u6Po9tU^= zM(N#}t7F@bwGH298-%X($R75oBOM$k1|(k7yYbap_F3FELAw!Jm4+pC03QIe;Ya72 z7ICqZFArsYhCN)8%=8pl|Kp`nSeY1It4neCr5A;*>lt6!7!d?wH{foe|T4kb!R z*knr`geO+Gv%W5n&4<6^w__pA3Q~3<*k^fnXoOk44m3Xw|2hW>Uf07&DF((Z#o%iE zf01F4*hl>T&|!o;2{KQ6T_5gMj3Hi@ep9hW=XgOct7=(!5`4gBM@wD3S!#n@nDHE-BA^bk%Ztdf2L-o&`JxqMMS}!p%4Uv-E*5T#7`^^jcQx zpt6}c@L|I7}gUS$<`_n&q!ZqMPqDwBG{l?>2paWUq7u{kwS*zwF!sM&cw^ zi$d8wb4@MFDNDJaU1>1@|Cb1@cKkXPqdAsC0<{Y+&$Be@HU3AVeLg4Jz&T-{M~u*U zHmFzui6y1@Kdcm!vy9IRg~uzAWb=eQpqkl!JeblPgtv#k{m-sBVF3Wy!&uz0EP2rJ zGFcWto+yI~3FlmwFrH-=>Nz*BNRk40Vz!6W$j6<*YbUX;L&=g?+t-|>ti%GjquciY zEWrw3s``>R3Zzdm>NBrG?Y`<9_2|RQ=A8Jh>bSn!Frk@&gixcyWEvf8yYE$ZbPWtS&%JJH&xKZkN@yATu3rkf&Klw18Q$m~M`_UaCb6pwF99sk$h>!cNoyhlzRMrRK5O&ls*w=*lM(QPcG+myX%q$WvlD=e(DnH5^b_=qsI7D z#bH;{b;!Qg_|<0q(}~{%t4JdG>h%kHPlO)IQI&!0F7-ZIXjs{Sq)%yG-8Kz6sG~pQ z4g_mrJmi?J!4>t<#zDpW0%MMiv}3t9y*FbtrT`Jy+vkbA%X4F_mh3wH7Q4M-C_L&~ zLGQ~;wkt$&jC!1&C9Ml*eTu|8Wl>wrj*h$~&M4IOZ==SH8#Kvtm;0@gFTM+PsP1UW zd0kh0Hn>~F_5|s52VN}I1ZqEM6MaG}`TVmL^JgO7o!!SX{VF#k(nkV_9r0H-RmUcc z;q$vnt?lM-^PXUti+yDr1FE@G>T&A21D}Q9*AXpv2IVk?-YJ#V;S$+d zw#37IRbB1HzFT~|{|;_pjE^2n;DHFo1M764KHzq##Il zNr!ZUN_Tg6x0EypLpRbL@6W&c>~o&I->>kA;hy`-wbm7=)(qwioj$5-DT}ge6ohX~ zY}1joU-t7vbadl~N6L)N_zgdaGwMle*D1ndtEmkh_6#Smw zMW^nWC{nxLm4zV-+VhQK+O1g~-QCW*pKbdsvi|G)E2WN(>dxd7y|VFbg8|++MI!>5 z@^NAU$qg$vC<3j3CgYpT{w@6JS7-(?QaDA{CErSaSbKg2K}InwXSS6#C0@$5DJ#Cc z{?0W7o_!agp|m*Fs2zHvp}{;DI(+&COSonrGtcJv^^A&~T6hn<;SaV{3#ljsBkf(+ zCsakU6vG#Cj9!XAM}5&K_?cwkA)jCSfmI)m$D207`DuNo;04G#G2jSKa1Q-B&iZbf z1ME+?dEe>lEgUddu-cg`xFJ%QK}UN1nm6sg_NJ5T#=GIQ+1Rppz&1&5^Z_qCQJA(j zCEv=xL5_dZo@`|~2+t(NpB)J;z{bFr?wXbiG+VoJER~mFE;7DbRO|15)nS>oX?;JB zR@ETzxcklTB|M~ZBiws`w|(nyrmie+c2R54+Gw!0mSS%F+oDUyyQ3)2&5Ae%E@f-A zCJBR`qDCPlD+1pJ7tfDPBU<*JiyAancd2zhirp0<*xdK4zARGTKd9?`7l(!;-!0mR z8R~^bp>)sP8+WkA=@Nqis4Q^Q>G7mf?8&aM6zfdUIOK=4QkL2~m)tHj6KRH40@Tqv&zQ)kX#EtiS%Vii@$TWj z&RS2Rz`R8|@D`gcicQ~$I$p>YT@d*8;_%vMp;&WO5n5BS*b%5QPD_Is+g}qq^1bJH z?X0&5E6~ouizt^e>@TYeqj`b+2`X3oLlu?t_4iERztHho8L7Q+>5N{e@&Hz$(0+iZ zRnp6m2h~1o>1c9iXhQ!f%5|N<>tX?^J@9*Yc*{{7DqSU3WC==ZkzZ2?P4X%6O*aT~ zY&MV_cg2Rfk$Hl!z|V>4OJM^WIn+M$t6z z3PFGk!e63p_fg=K+EpOFm(bz5`7LB~M)0F0Q;;*N6|)YTmPM5~6b%qYAP8NRq0Iq` z<=z>*Tbk(x&Rx@y1icttT!E83IREAa(=ES3>F<3OZh(L6{t%RIeOqeqbVdE7-mof~N(~qlak~dj-O2_{V}M(TD?f9Sv%^b~QBeP5HCS7dw;8 ztWib}1O|+p)mMiQf0Bfn&pJa0U%-4}T9_YUP;5L{$!@Ciy(K9o4Vm{wWldy~!X*!R z%+@44+21L_pfTE^7S(f9GYqTrzdD+;aApq?j3O=m5pItfYQ#VJLhFSidyW1NdTq9d z*G7TN3gVTbDT{C_Wh&9e+Mc<(&=HZ3R>1g>{vDrX%FQTni%m1HglmytesugJdl9{( z6%@^Yd{~m%2ZlueENCD!Xb$6|=1PDZexS&lUfNF!g$BUR;+@p$RK&w0Ll8c%RD zV#@0@TdmKSN<2u{6w9wrbOxoW7`jtFV9;(s?9rN5|43w4`;8xw<(-C|(;}^;jAKt& z?%boAOoteBqy?Dnogbz7$g_f-h+Yp{Z{S`!3?y?Y=_ie$Ei;X#^=K>LN_jJ@Pw?G_v|>Rzljof@DF& zmWhzXn~z&(z!jk>hBtMTL~k!RFrSp3WrT;#fk)eT0Rp_IK)!wVns7P6Z_jbMw zSN5;)J<$8@DCS&pXPMG(-j)M*P(HXh(}QtDmJR1J@9&CoVw+LbINrWGsY{gc7GsBnUSK2R3H7Hyr0pBbD8 z&11zDnMmED=v7OT&UzC>M)f;gzh@P zaMJl~WiU{qQu0#ROipl*2&{XSoKf5q(VW6#u3AFT_&cWsA}(Ugq4IXpgg^iA-~S6( zwxjSbZyXlj{he7JHawZPlV`r|W`rYio=A~*c06wU<~r${jc_tkpcow?!6hVmwE#xV z%T+HUAh$(hu0O_m@t(<_+X{qa&Oz4Gtaz}EBAF~Xa&UYzwO}G2p?FwUFC|?1F*9d$ zEz*&`XiW+YU+qP?Y)sYe!g&@ZJx~ISrB5oe4&C68R1vDn_9&9FW`1B19%bMrB-bg7 zWU>*lJ{j?OxPNZE8(4i%{QBmEwvjP>&kqC3P<5*y3RpB4GWwOW;25Q@hJ#HtY{j7u z(2=MmR(HLBah$XjopbUi$l1#qf1-(->B#^Du%JAYyQYNxf9?VpNq>q|yb&t3BZJ}V zl$!xK&$|8u3UBwU7p~;Mz^e*>rL+3SgCJwuk|EE$&;{gnL-a%?(B-~{FU<;SIC=oi z{M2V}HbzQo0owxILY(8UW`8T!y~27eKdOkO^nyB6jv7Dk5p#9#LN)z-{qC86=4jh5 z*et?<>^glpG%^xajCatH(I{|v#ieA<7!#fg;v8?9o`KV^(dSQ_q}ISSIXXWflgh6LHm5HzlZc3#l32 ze-fgL3J9=t8>2a+)663fQXlFXo1tU;*vFtz%fa?dwdln+_Tq2V8{u|7*E=0dEP!&_ z^Rvb>{A>h88*bVdsqbK&EG8N(fJqKtR}+mI`J4nm)ViB}gT87P!c~?%mmd$8_?6wm zU1Vo+G=<3E7}_<*^YU&v=o&yBU~Cc<1C6N2{wQu$=aQ0@)l^?<(;xJIQ3?@2sb`NY z2Y7m$qMqmp^F5`fAn`Tv)BGmh*La$4pTu%6^cdv@_faOG=xDF3<#ogFCXHu3 zGJMyz=lZ@fj8i6b(?xz5SMFHaB+D%bfH%><-CvWN%uE#Li^oh%{H+-V?XWliiFG?Sn}D<;7XHtp*I; zIyG?zzv8jtJQg7(i;OEsJaacc{MpLMN#+# zy;R0%im>UzFl-z#`b50m^qBmRB`!6dkI*BsiG6~n`uIJ z6gx@e&LtSF+jn=Z#SKAV0sN}#nYJ=|HoM#}7s!iij8+Si;L$U|ne78sP-a+oaf zlHELxtO!*c?+~KNrdwC{Z%_v=Cd30(0Uc*i;}Yln6q0pGfz7l~wR2NDUAj z<}>@;IZw74&WdP?cA~(2_u2p}@_@m!Ts}qIu}5nE)O@%=IwEy}&awSNQ!WG^(v8@b z@=49TXpBe^wHX7vUN6u1wO5FT z#DW2&{T={w{___F~JdgF0I+BduAB@@ez9Iqp)xMVNxiL zkMpCvqw9)Y2Im($yof(8JW+DH>v&$Yiho@W|)W3XwDrDIt zDBCzzM@k?RMC+DK)xfZdeAhNPRp@qX`L&n$fo(qgM&4(0RSOQu8#-~ahBEU>B5D{sC6de109W(Zpa_V z`9~lZ*ge9SRG#o4#z)Eps?C{Hg|4|seo6{g5zkBud*Js2zrzZP+<%frXPT%)zcMtFUJTE z;U@DL+Tif>worHnwZ5q3K3Yo%ze+sD4kQwLVbEC+MZOg;bDF1&D5Sjjvjg`1Zyu~a zKGA;h0E5#I3WGR6nQ|i{Wk0`X8(O-mATqW^#EJO)TSI`2wJwF4$qx+idD!1q^v{!n zh9{V-Msp?MEP4D)WS<8+duuVmSd+HQ?vwg6iH~TC)`@O9r-v;8_(vV}pkIaDHX=jP zu~JF{4brxoQqs4}nksZjQ~~_=#0RmqWn{N1($p*86mmCmsXJunJbLEVk~)bB4p_|) zcw?6KLnxGE0g44bCO`ZCkn%qsHJaxiDR*$v$Qp9?-6O+!p`89M5IHG>zq^K$klA!A z0PCdlv|8xneZ@os9(p=z#tHFv&cK->-=Z5BQ3r#G%A~BBPAdg*TMMWqi(8fws7~(V zvdhXk{(ybEJ{WCHF@Z{9P!xNosHkI*?~n(G6^ zu-v0fozA34Ozoq|oKE2i{egFchwt)wuSUXan@uYgxD1s=WX6fF#gZaE(}ZWo3!7du zwOrkbs~Ua9RHl2*WyFt{O2WgeVlNtdqQDvb8T<~VD_HV*Xu~NJ3$yQ!RPyPibKAkX ztx}4m8S9RI@vR5KsM16daAouEt!&foy-$T_zGU!_m7&Xn?QNa@D6i&iUoZ6*1|?`` zq`i$%(||aP{Lk$tilKNSVKV_oXw-0~(S-Pbj=*J&z8NLbOE1FjTVfdu@Z?FP?$qX!<9fy?{?1>*7=73oP#6^i8ym^)NRWCC(N~${zIpp`tJyzPTSs` zk66CD81I8$eYn$XE<8D+@PW8`bphX}=y^EK2CR+d6@<8Q*Ff$Fu3N0}^@01&*8AM)7^x8%RkjQsv|RQE&wyR)ls@N+vlzmK%mxS(cqbBy~DH;#nTew zjbJ=~vFE;DF0zPt^CA5+2rD6pf(>LD}nYwdaLw=`U_i_5F;wRc*^)s zD%K?hO+w#hNY;|JWWPIo0({3f*_C>qHf0`|q**LRmi#KpldTdg+*V4*AF&{awAN3# zBb%Da1}tjIxu?FRX$|w=cmY=KVW=$F&S?e4e_$^3MPbE5VwCEp!5DcJ!Ey6b>!A(3J1 zz53l8J^y-A6&@~zw=_brG*n>3C{=&mKgDFC$SG6>Ay2b2=6P4-tHa5lA9TSy%Y76 zKeG&9x)A%5`B-L7@6*rLn%sPqhddwsPB^WDhdfn0-}_{|;cfaGj}fi=J)b|{__W8Q zoAUhgBfwgU`y=_}J&4BBweBmg_XZsYl1J|D9VH--(>Sx-m6&*hq^o<7T{n3C#k%Am zOzUbXJdh_eF*l)+7nWon^@~OiH_31uT*p)-$>(=iD7FG8dD@Xxm?TB%nTt3OMzQ*| zQ6s0+Et4;oL<>m=!j3K}+bLaLYjWeL(W0lAP`xkMBXHAdH=F zVsQz1&IB!e<_qm}cuIb5%#)>Gp6}~4EP zAWS;BsCl{=H$VHm9KGvvQ3KYif8kuedFm{B1x{06SSdlnPFAVCZdskcy87|w<3g6i zj=A@`;zi%Kdl8Kqo|zi)(d0@SE6q)7D=ncTnlHXB&YwzMTncM3AQ*L*<0yfV)QGNR zf~vr6cAKxwOcr~YTUArKo&11kB*)N>oq8hsIAAMl%ijpJ5zB!z3E z-H13BejvIj^y>bsiy;b9N~EVdo0|}+?l`=G`@XqqJU~P&Aon>!`ducl^}m_N{W17* zky#J^c-o~tcz?|VFUG$Pf^4b%8pW#Fn~u_1$!ER421515$ZE-gvwp3vQMZ=yKxGVN zk#egI=X2R8-Q0;A4M%CT#S9anA$){c@!kA3uYq?~XR>isNm`i<@I|mhc5|2_vR?}{ z@W;~SXA8ATvA}AdjTcdbiy@}f=Zy~z(~u7ey;^}`N?2yGfD&k;TW-Qh$4uCRc7X|jb z3*R=&S^1zgH-Sp!57K-kTpRTbE<61UtpF2?EYFh6_7bD;vDFn(LB-IF-E8QffIl*L`E?h zYJTPC2QK}`1pZez|39j&RS2u~3NzAnoMzkvXV&c``giTh^nK~h9$=ey!E>Di0Zd4O zi@e*KDo4=xTufiLG!l(uIKaidvZ2mU?$#e=*4QFvBhyBw)l4iTn>tVD9h~XJ7fLCp z{QEhg&rjhH3T<)Ui=cP`wYpx87ay3=&6z;4aPa(YaPbA(_z`1;Wej^?u*{1B3Nsuw zfhJW64b{kp9}@4vs08~OTk$YemPo6#svI8jy8S_*oU6vx4`W+q#47NR^78ikbI54< z!#iMPxP^Rgg9O^`%H7p?P*Yagq4=!P1D?0T?O*)BbGU**9odjyr-(!i!nX-4@xTLY zKrrG*d(RYYr}vKu#SWNIGnYcC$1#bWM8DkEw)e$^9i6U$VLIA_>`4kR|6$-k`x;7~ zKF-*d%klrBNfvPpM-cEd=)oR~aGJ1&d!RG<`@#1TnFR++TOgb%4GW8#{{?KMvd1fI z@uB+2hO)ADszSJ0uio0!!2`iR3+a=jhxJ!vcqbCOa%Z&wVJri$_O@=+0$v;PY4W zVs-OxprDxv{AVXIZLCcJV7HXhAMa2Jn=#a#vIh^D&`-Zto|z+E6!jS&=RcPwClF@y zl-P8PV+m`;d-mZ7f{KN?WE<>8&)BT9+uqo{MGUu=GT4np5-J66>Vw@U#?BZ-sId%k z$p;D($=!{ck|jWlSMkng*}yMk?g2BLGTnEpH4&%p?YzFHM`}MjzEQ2%uPgZBWiWJ~7w>P=^KZ^H zjj-}`iXFw0+O?*G&@Q;F|Ld0!&;$Ztj$b)s3)UCDR9*j)n6`Nnfy~HC7$w`pBu=x7 z-hJumQar1{@bDPcir%uQufz$Rb5sC;xP}JY-pc2q9OqVFAyd?Pf!F0W64a6qcj>! zXYwkcVm`(JNAecLNH|C#oPM;Us2U+%JrNNK%NY#)?ERSliYe^7Ezqko^;@Nuj5ly# zT;ca$B)_A!$Buxb=-g2!(E!;-vq}OItYS&(cy)_KAv`EF=6!0ka7ydKkwmYQQPJ@% zkT@K4vD?aA@Ly9CjC`ghlPrYkrZLa~q?py8pY$fbcP2ky$?K+Jpplxjp>USh*!ZD@#$)a)5u*x%e`QepE#OPU(1@kPZl|G<jTT&Q`r=VnB80Q0> zys(Gty^#o00r6O~D83+?S64w)<%ay{{kNc4zyttcLA^fL2(<4K7!|;0xH~%H2rVXS zUMT_O;9Q_RkTm$;J&_`yCt}nTq*lH}fZ_)RJ{0-h0YI#o&P9dXmr!ixP3!@2EqpCz zI6MrpR#EdlJF30|Tv!ZO20{_f@_VNm&M#;Yiya1`LeB31#n!>{i=bl1<5y?$8Mf+Z z@niTe%cI}k#@#GRu+wlVbM8zZ#w8ZQc!_SN#!2N<-BMrQWvjnC&qt(+NDgwMW&X2u zXvPN(fo#ftRs$;kJ0Pzc(M%zfKaD2N(9&m_By&EQVV-RU^>C%H^sr2c+FKp-Zr}-} zKS>dB@r7d?_cYPr*Fe76RhZ(tfOg^=|N9SzguSc-=OUsO0&TD>>EPj-G(J1ampkm~ zz@6y60UWq?IK%-UgF6>1G_Nr%xz|c$BlgGGR=o|cf8U@1!N2Pr)?g1|E|-4Wqi1WU zm`C}O($S4EQ*sBH=txoty4OoyTG{^y-1hu<*8hq3{W?kXy_9}b6zFMKW&5y_-)zry zOoiOpJ`;;Lo6hnaw6q%pT^l#Oa?#4__nQw;W&JXI$(FZ z!?_>dRPR*nSnVMG=FHZ=R}2?<&j!>OW7bYj;~!`r|ul5?L#&eZ~Z7k`_6uzwIl+ zq&@pkNf_qItniii;okfOmu24pUlekCsfpC5sumvo@4EL(Au#}Gl>nf%Yo{P-^;hU) zH0*q2frC6l5lGa4HA7NGfZN8J&3T*M^2dObmM`K2bXolCZeE%B24!y zI_Y3+MZML~W&D0pSYUGK9=0`1B=(U{-Kth9j*e9QU0<&YUVh<=!`zOevkhocVMo`B9_fW6+pOKQNZk?eyfIxUE*=3}z5kqtNDZ z_eiyBmr^~}3N@bcfM)_jr)+ec+v}ZFWp`Hy4brvG`>aF{pBa~){??of{y26=&zgTQ zDy)_F?IQjs*V*J3URkrwEhW*O&yf8GdOZHoF2@aI#mtsT`=8n=0h{k z2z2tb&9J?8jm`Fb`56_(Ds*g_t8=}p`M;prVjX;+(c6#iChf)iD zI0|bb%y+J-efe=sW9JQq<;p}pftz^BhF!fG9rQ&C{f-I;IF`QFM7k@(Yv=;C zH3rfx&vdQmt%AWfCy0&+%T4!1IR*=btWV>e$+0GJN&nSlB>gM8LK>w*9DoAs>}m$7 z2fEkoSA=%0>JW$0dqc(`lNaNAIy(}cYe*drXyNcoCZnPg=3Zty*{EjkF`4_-BqvtR zr^u~0lxR+I{lI17DOG9IKFktw`$4A1d04UId2ohqX)#D?jWkP8Tn;36m1gw=d~-EH zkyNx}!`eD~<&=*!Pr-Eja&3;1c|UD--k*<3-%rOPw7(q&s8U9C!awb3pp*s;TJPxz z7~OJFv>s}EOPb#Y<_(hHXfkN8_Q7toqgi@%Y!C8b5nzN zL^I#AGddJpDu@ESAg9a~6LJ{dzv+IqykaNL?3t`D2kVF1An@V>leJZy56y`$T>lp< z`97;ls1e-WTj&VCMu?CpdOex|MR2jHwRwY1O00-N^HxbH0}fyV{nILvEMYmyZy(n0 z58;_1JY!8CvV@nPVJ=_>s%IeDB`?O=dOV@CNOUB~=HwmkN#5^{l0xlhHQmK2UvQk^ z2cJM!Y#1KF+DaiUfVrWMEY5AOMVzDv`?>W>U#M*L(3Jhv1 zCNc!aEL>C*r`VrLphsz8=T|_IG0JlLoqYZrW*gM{wwLd#AJ}unW97<$T?kFUXNa%F zNG-|_{K8Gl-FYB+vQN+eo4f8J@{jfkZ#n$ij|F(o%6-or;n?t6a}wW9&j1#{b}L#o zMl_I{$teu;Ohq2{{(m+5%<@;&zJn%==UaFPLIaQf`-ZE79vSu`>+>bOwn$cHlZmJT zhaAaiAqrnWWic-@*I}9DR+r5#X`6hhnSO63@o}vO(a6X#ro1mt%lcgP=XGoslyoiB z5C{UVh34I}E<4445to>g?*0WT_WuE@m;VN;mha)HX&rnO4{_xFKkv#i+& zNv+8;@l(yd$vBWT=a!=QRts}#UV5 zQTteG4n=E=bN|ojf)4x{uBOAP{x^b8M%Kt*{$0KQ{PbSnZVenMe3X3Wv=(SM;qyPOl0Smp zS*zYo19R@^$B&u12T!loxd%D_f~Tv;Yqfone3oArCb}pR;v|1M*g^doSik*7lLD0K zrk@r4cNX>W;^qvDP=8DBIJY;{WJ~*G>G?6>lJd+VpM+pF(11MLQcMN>D55tQlEc|vwfMB z#p1ieUQ*^ELV8A_I;%{3(yoW?Q}d-N+SGpzRa?X&OlN{jJG&6v?WoS5@!eA*pKgR; zX^K2hX7tBBt)Hv=+%Ju_N-U%ax&k{(nft%#)8s$V|IUUGVO)Df(oQMQx$r^tFU1R4 zETHnT`BD!avZ*Gcr>SC}mE6qI>ITBPUF5ZB$P-A!OY(=BF>f1!l12~`mAIJFa|FZ? z36KYygLQ+_Y)Wsu{W_D2OOr_A)0VZgwd+hD(DB(YahF*oC#RZfL32Vq4EC1*T-g5Q z9h?%U1$4v~SUUdk0__PBv4G|;1{jsEEWz_Jt>K!qf#gPO#Ir^aBpdd8k|^~8&aK|3 zVwW_6sMRaURpeXc&yl)TNy)p5z0-Yz{nld!9HMOD#M^e;`H~E5^gHCFLq@^b&y0xi zjXzBQm$Kp9llRwJcUEItQ<7n_Zcuwiy!+0T^hn05n`6c8ED0^9-}#8yAEj4q zdbqq7WhT#7NHrb>v32Hrx2?Tpim&jv6MI7dit7GrS|TdMkeExb0rgRz_u zb@O8t2MdouO{7g9e(8Jd;1#V!o|LS8VU;a6o)ZgKiEamjX&a*1TX70HyqKGwL5GAbdeNPYg5rB%H zr91glF3)apd01?;I11nHdM(j5$w{n#YcD=4^_tmEYK2OR#+D5JB~=ljN<+}XenVd+i$d+1 z=)m-P2sfCdLtQ+64JJZzlh_SP6G?3Veud3@i9KLo!8dd1HHnGw z%r<10ZGq+3O5hpy$2~1u{471<@%d}Hrz$BgwJ6abr3}*%pQ7Pl(6R4CPM(8hLk1T90iZO+{*hMjuO zjTC&gE_1Uo5^j+zgYvm4o=Dv4T+L)I{VBLfV?XAf)aF|;klKL$No@dglqkLx^)t`` z2HFWqB~5Sg!sZ+{Xx}`wC5NE5TC{tZcTHe%AZPhlNO;8X4fq!vrZ-EyoasGYaWbI=THh{xI> zGTE&y5qS6zDy4CiM?sWGPh1Q_y&QHb4{!yY6ZAy#W#E2%S|NU)ejUVT9M;~M{_=ZwL zgusC1Q(dfMxOvHu*%mu1oAAU8E|hv8UQEGaV6Cr>qg?j|rARzrj7H3<(*0K%hU1T_ z*tvc)>(VIQP;XOuAaX|8I{WmXLA$Pd;d^{T9jpx<0nbR5i|rA|BD?4kb?f-&H7ZIP zupVbdxfzN}!B?3*MMyfC?iZ^~zo|HdPm|5mO)8Z}8;*#M{o823nLam^CTN*Le~ z7N+bbzctZy?u4O_;S7}wJcNq!GZY#I2~Q(tyUo853neaBAZeSf=W)_}K}pDU-E4|c ze@?JTP1KkQbSJW9tj4~yt5#o_T*34Qu+$Grvg}|y`OQYhr$<4Pi8{0=zC4Wx>3r4} zTE%+rkYq2`G3SrrsL1(Dhd_5_f2FCjKT~Ch}zt|za7+L zxQKPoUvO4~21A;o<`wkmP1Uc%$i_f=HI+4JxUO3a=TQ?-I0Vk!d7Kq1D#5`(Uy#u{ z`v94kYt^Ugc}(h;J2)pr0d3ZqvV7er!C}%mZSLm@P8G(!iN7a&HW_ zI;q1WXg%l5^zboo>m{>akW>C-9!p{E!TS_M^~0f6cVnK5Z4OcGRht7;-YVj2@2VK7 zqA>B1Q2!U=N2(bq2N5)(bqr#CTw=PKZV99ltA#9iX`whCsjBx+HRLJGT$utIQ5->P zIznHBuYIvoHNU44UAZy26FnHwBKRWV{7g?J$kR&C3 z&EF~tWrlVCK5)1TPzm4QbNWREj9Cq+t?r(y#&S zR2iI1e#|!sp(nt*-eUsdElF03btgvY-OlJ6$c_Z%Ci6}3Eo>Hs5>I)Sh zRWhR|{w4Hwo7qcFo}??_G%%3QpLOH0W_HV*&u6~oQfJj3O^W#p{~_@y=J!XwPR*$6 zgcXe2{>t=d=WUGh%&GILF)zxg7!TpuuRNpSsO3t;uSrfK*(s5co%NzmB7*Gw*kOc6 z-@Lt1piulQ?CBRWCtx;zJJgvBLN;^!FNsDV1XKf+T!m*FX6G7DMpi5*+J6EALU!T|;%KT2ST3&;-hJK4rS(xB+NdJT|L+uz5H&Q5P z2fyviM!8yWb@tmMO2k5*)MV-;(&|(rtu?m4Xn9(zI()WN^>NyI`=lhj$H&H2$W~9VWc!3Kx5)F-=#`P^xY9M-UI{rkH?g zX}pVy`C9FhzgpvR+QAmu%>d!f4?(2XLA$BIaWTQ&k?uRymnJ*Xgtzv7($5!QouJ_4 zpTzEW)H-mal@dKoPO6wh+_L}L_)5`5D5XUkHGb!?u;BLlV8mDRm|$M~n^7Et!(G93 zVq$@Ym{=n5w>Qf;m|9&i$r4u_RZ$H!$kQPKuJ$>2V=C3~r7<5b=UH&7FvV3$fpY{- zdZTBktB2Ye_j3WRFAP7~GB16018OYp5r%}X(A?q-84+F$w)%r0#EnqnZ(>LSJ(NO& z^ReK{y%DR3*AXHQGmmG@veG!wpym1UP4(4$TysEJ{dZwKlN)}C&l_Er|D0IE3;lFpS+)x=`Zh>06 z$#1eDa-OL;VP_U@TY{=OyQnS-8>ulWZSZ^uaz@OCCx+#nLW-o4^p04zfym+zHoX+Igq%I4Jvb=gU8`Ffa7Z!!sYAD`2CpDT3JIAugw~f zHgNceB=;vch5I-WHY|zN7*NRQsT8Z%pbGBG_~{;RCul6yjfZ?VVGxS zZ>|YBag1t?Wk)&oL|9qFNPX^5#RSw6Mh9 zG-6U45l^N~e6iZJbZ~9pVC|r)4{KP2sdW3)a#vm+1wrOI@$lfJtncG+(=sRD(u%UK zdf+(o=;+>vqU398H)L%}I)$-vT8VKl_{w9^yhH3sED}=#BY-w5@#Z*-5Vj-D3#r`+ zbI9_)Z~(&{C?Jo4&;=>hC~z|hjMHklF1T(Ph(@e2&+-y` zjqM|0XdF|xb4g4{B%$W(iC9j$6e^e}&M9F!y+gLmjjE17O34aMIaRu+C3F;s4fhF* zNaB8PkaO*P3Gv!tDWQ)|{D$W@z zmSozyw*-N^Fq)mt=?z{fM{O9Zv5|_9VnG|vXxStB*|+UwqNKbZzQ60FCa(+~IE60_ zkI3Oz7}vRTKjk9o&&h`j^6-w$ovkYmgpUqz8TR2D&!3n%q*Q8_btLJN3`54QVL7Su zmbxk)X&xL5^2;fs!Luj!e3?~Xe|m{oxJ`%f&UdZ`YsM|V5}Ah%4L54?aWIK z^!+_%=zS10uO^0&vzqgMV=3-wtL1R23x?=$AFk!{M*jb!>n#JK;J3D4x*MdsL15?_ zS{iAjyCtN%Q*r=F=`QIKDG3Q_q~wzZ>!Bu2F2vq%Qy)u?{Q3V}A~Q(a6x!G=Az zcX>lFEB*3y3o(3y>4g#Jg1n)m8Hbzh+8elC*s+2O&5A@Jflh5|dYK?$-Z6v5WyvGt z;|_a4(Pie0@B1|rV3FT@7J+U5GHJX|JA6#OmkB(fC-jW?PsP57odG&o%QS%FEswWV zcl~8y$c_G)AGI}O(D9nvjR zgZ#v&c1r~wO7#S)gx5$SN0Wf2&h@uVjrIjfT7I~Y-DZ+~p6)y9UYKDq;bSVxKNPO$ zUxjNGJbaD!=W_kk@mt^X?Fa7nMk0;=WYbBO&PPAnz8-~N^9u@ zs;pbfwh^=r%YI@!oOC!3|4l@joI@=Y%x^PUw5&;IECVt&+fZGfAh?)im)oijGohJ1 zUwilHIb0<4Kla$+hQ2@ey^%ZB^C7b{b=}u?(>!5q#B7{F!9RJ>pF+i!26XWpL<81g zwz4vOL~e6}PYOjYT*cvqdJ-QmX`&Qx^+A^hRvpcFdLM7bxs2HV6Ki{q;IiBYFXvi# zr#m#+ic}5ON(dz~Uf-#3I4w*5DO8;^3TLLcgp5>xC)LD5Z$;>lLaF!Yi7xSmz&lxU z@{ERtpr79Yt_Y_=ru3LQRM;O^W+q&);NROujDK$%VV0zufR;8yNXprCILUx85mxnV z2lw?LU%gQC?-{|a$Xy&>QTZPrpNA#_+;*sA;3>i{)G(A)Il2Sc=5ClusGRbZf6)h_ z?l@~2<&J3b1msWBzjAP9R@*g(H3*o2fV!C9PhjllzZ?Ydy5s@oHFyo3NoOPBjWAnC zg9_?{Eg;{kA~N^`9${wp#SMB=BGtY1r?kuWf=HZQ0|#x4b-3__xTHXnY1`B8oF({= z4xYY5SRBrpHTm0wRfK_71xO6>S5l7Hxz*UW<0~rI3in%|EWd}DgDgVh&tQ+$fBm$B zxoOeUXRLFsBzVjDToe`{aXdG$h7UDw!~VUkPbt~OCpGGQ$3REVQ696MYbj=teBm~<@PV~Z zJ38!#^!RX;s+(&ZFf)NGzs9H!N|Pf^{)u_!ga=wrJZ#rjEcAaviH4Df@eMlJ<^j~HL*m;M|3hUkdv8!JLR==OliexRFS&h2v5#1eQfqTvx>tR&~w(FV-1O&>@=jb1fdu^@a9 zoTd?-T`FtX$34@U(wpnhu?N5a6)P7#kC<4ap1p`RYxlxpwAnTFr|=vZ+cc8`F9X}a zQN^iOY2iG@m|dc8D7YYr(Jre-a9H;0YPrAiv2Fz6M+Z+6{H9?0cfvpy56?ss zPxGf5nps{lm%H9!jG;;FKQg*?n1NM9i00=P&QBnCmfPF@xy{*v&Xw)+F}i!L6hc0)T6T5Al#pk1ini^s!eGk&lXkEx z!WzI%!+&A(*nx}6qD~HXj#x9gaXCD*D)5aHwF!3XW@f%mx@ml9L`@PmxgZ2ppeX#L zjK~w%Wj$W%YaEKVJY8!-1jxEXT|+FUeS3^2kBH)|07_OGiK~di7ezapV-&s7BClZy|WT+Slr{zljP? z5&ya~`)DwwRb|<2BB`S^CV^}yEzz2XB7`w~M?-;|62xLE0r-@qKN%}mLfG+PZDS)& zBFBz@TJC12S^1E{)8kZ@=fR`(k9FuMYr8EWtZ;G$J>)>&&IyHDSd*gb$vaoL=lE6u z#ngKw-+ZZ8K@v;pZ@h0(JWLU@OUEDW5^`)emgl~n;U;L0dkFV&e+LI+Jm8xnW>#|* zk=!A-3~2lh3!pg3D0#GfP>Q8??{GZ3tL5hbt0Va($Ug0G^+6QM?kqy=kVDrr*_AGo z52d)LcPSlqPfL6%P0jqaz6yr^47;H+X{Sh=!sYdD$XW7W#LRD6x8nW)+xb(?fMw>q zHZBV%V5fAPBo_I93|s%&p$2_-cP7d8-H_hq6Fn|{KR_5#iJ7JUI!2_hKzor;RrS&i zA_a37Ry6Hk=0m=rMR=jt;Ccl0FM!ep_$iuyP7{;y?b^MmLOmU&hNQ8s(OP6VhUNOM zWk&zfJxYP1cn8KtCyuW0xj=Z;93+=n!+IXSnLdoS-BS8~5`9%xoiz!2{Q874>n*t` zdm0X>7NuK1c=Vl0*wUyUYJ6H;nxR*ykwshD|03G4`<091x=Lpe2AFN8PW@iIh2vU! z=CPv65ZCKf*;F|!{E$Gk!Kxv2v%Q&0!2Af{7a$qr3kpQpwC}~FH-74X9HmlfgSQLD z2XULGH@e^qm&o>^az?bCB<@bwAteRcpQJeNaWNk*cB3#&W%~fW()@w%(Mu*77n44i z@c%2Rf0LEnyK+rv+6#`NmV6W0i`=_Sh}%wC-{VW1FCV16Jj)KqWrEqo38n*>?-_CM zEKms$EQ1eU$PFp_)q#{O*jd(?4(6t*!u~+_0X`F$0gVS{K!siNk|mJD={;=Y?F?&uTz?n4d{7&-5O?y*b7zq0ZGS~OxWMsG4Z5TS z;kne{QziF}3hi=jbQ#t9U`<9va;wywSH8oWsW<<})P9O|KKqnx5P5P!Il`P!Fn!eBXS7S5EHwRR5 z|02bB8;g0O_oni?zY0xO6_Z4w>=DB(^WqgXan5#;<##Vm8WY{e`{IfG9{hK0K7Yfw z7`5^d=~P>)u=E;!C0Qpm4OTk!WVvf9A*yF9`OQgQpGm49>ixqxD=FFaB7x`eGUVCC z@Xun%z0kzh1{_4TjSL!l0ir|t;CK|p z^%uSBk}P?_DJF{97xT-_$6Taum{qmzW zZGDI^0fSZ@I zJg+}~(cILLCm-eyB8&W9IxL(=B?j+j|8v(;vz5tYP~LNu_1(chaD;y zaQET}+-x0PoHZ3P9e~;#Zl?{eez(d9s0e4rDa#ry(xO;m>Vj!me|ZNsoeV~Vc-IH+ zkNBMRacO@+7Y@M4T(<|iPW0n&TY^wFXnipd!Ta5T`>HRqV73HDr7zD(IGZzeql3q= z6NfWseDi@%0a5N6D5Cg8KSPBISGwJ>4g2jtryc?(e+0d} zy1Ks&+O=*Oo;CDRj8jd=??e@np29^)<-QOK&JJtO_ksmFbyt*W3}UV{ZEMG06niS*F&~uda5~b)KJb_F-FaIZT@4DQS@m#+FbtzCa)?WiuSJ^#II$3mZJLYS zcCJ*hy_U3Dw=4^im2V*SZs~uD5HY=&8hnSwFYkZ%C%D${Kft&D4-oTTOqcS%nf9@P zumkcJitf(s$Fj2BYpwR^=v?m~yzi&J2+WxNLY$}oweQ5&@$|-hC>vdLr%$&kHOqSK zd66(GMU5#zg|h&kAW8p5e1R#WYVd=fsqZie*DsF5wQ`NR{Xu|?7JCpfts9b>py#W< zxWhatLoj=(R%N28R-hjDzI(N`?s0nyqIaN?D@NoVH6*%}llIkf(Yl{wa~i_LD6@Tm z=)(m@S{R_O4>eBsn-fO@%QK?JPk(q^F!V=Ag3MlNjFrL)@?59VW4}zBq@V_!{P*wZ2kq>US2)(+*z4MR)`*F&KADK%s0in%5EqR z1LP-$EP%Eb0Ue$j+7%f@Tt%n@$}1=gG5-mI^zEy#W%Y{l=QBed@&^)O|0~h7k_R9$ znVs$<8)KMeEf#BF!2VgP0DZT6<==U2QCO4Y9+%+h%JfvGpRy$RN|ziE*N}=f1nObL zaP?B8MUcT>OEIfbJw-<+CH?GglYu;`dULoRvoH$04I7 z-NmKe43;IZT;Ydn(hpPGwRFrhrTR&Jd*=snD_ZvfCar@i@pW8iz#zi`1N%=N#u5Ua zjt9aBrpc$lh=5Q|duc?CjABl?x2KOAyo%1tiO86~{17z+V(vDWJ^Tc=3k_Ge{LF>q z<))W~EaeHUlW6qK92OYA3S0LZenCSa-V19xoR+YtJc#M;+YfRcg3lurBG+eO6j$TD zFh4zXdovww+@kK}X{ojRuZt1hkl#1T%~r6DK=K>1sw=}hvGJ(t9tN|tSeq6Ge3Cu!&m(*+ zE@8{Rzv*||ZoSA1fg~2uknDHz(2E=;qS8}L=vG@5VXA7DOYpEcAA0)m=P`B^#*?bU zO#LSSV*797Id&I|-=QJglpGSZ2jtlkx*sRm{4!mso4fPGy(thyD6TVua<{Z%;c0%_ z0sL_j%ks9GGo$I0lkdyUu6N8T6^LhyZh=>Xzod#bc;8pvZ^Tn$twn+pXfP{LoMg|P z?zvxTAk-3Fo(#re_>A@B#F7UbHJXT@WHWHCMXenrGtnyhxQFqboN%*^U2cGO(m&Ju>+ozNdVSqoS1Z2={5HRHu>40b7dg=+uI!-JC zwcQ+-m6GCV7FlChg3|a3OHd9iA<4d^Cx)1OnDDqmgCc5SG`DMEMbg9n+eqHou=F3W z4JPqb3ODNT6uAW@o&NiWCDOQ;^B42Fi&WKh>{nL1`zQs5SF|WJn-BMdTe4E)-G9^v$~b0* z_k8>IidvxNcfH;;wJ%ZzZ7(wVbv!Z}ZNr3whqsSU#jpYyu_TqZo=F3+Xr*n4&eLui zNB)5flZOhx$D?@PM7cvQcpT&ynp#v^H7@|$qM_4jm403LS3Ctaw~^PkT5%R~*~Jl8 zw3kO6I?i(pp5|y?oS8uQN#k{~k=mbW`!xISSQjhQ-LZXH7Ey!u(K=O*;t!}O<%sib zrhs{=!f6PP*x~NnQzIdFXeenv)@j=#P!TMY<0dy|P~SFOJfwhuzSe~LswXe54Ds9c zp3_#H(k|5nyexz-iOAz zJ0VICoQwyMA3I(pOUIp65<1RJ3Sw3_PibxSEQOcgVO0&wX>g2?+!6LtmI^$Cwz3?p zD5z7;c?B{+)Xsy zr2?+MUW7?N20=|v3j>^TI^4w0Oz_=Jmv9~RC-x-?nh6GbdiV_v)%=db*Fj~R?L-PB z#M|v2#_8`mj`UWM5bQ>x5Y6ll4eOY($YHILm}9rNU;&*oB7q&~4=qJ~;a!eZvg2G$ zmoc$UT~nkg*YSfSFIqoWd8O4*J-9Vc1Q!*}&#~FRR{pT^Zf324Ug=Fej3e@2yk+w{ zwI_cpo0_2~4%<rQewA8!ofDr)4_gu_l!izmQE`L<;HH!@zBvTa)tXP zaCR86r?0(ljL0~P3=(eQce6B-+&G1fZ3=g`A|SGH^RN)+9AjC5vlO4H(=KEFFq|IY zwH^x(sIW^tkpwpx>}Fj2+l^d-F6OBwc|x~(;usqLWFu+@KE`?NZVV~*anOqZSIK*6 zqrc@F4C63;yB^nlvCC)rka=^}Pv+D>vdD?_141ZRZVAWxOZ+FX+@r-5T?hhuKQ+Hm z3zeoY4AfFf(v-j5jPzhgS4tgtZRU!k&zU=YOtAW#RaBt7+A(&UOg!;DJo)9 zMtZ0m;#r`R6=*J$G-XBSK;K^6<*&JFV|3Uzcscv${u_6)KNN~a(d3S z1cf6eo6+!qA8{KO8pUwS@lg`Ikt@~*CVgc@&{u+nNl_gJJi>5&Ra`k2N1hbQJpi~20=FP0qn;YwAUFj$|GBjDWGvtip6%^18E zkwdjIcKPG6SrCE~{rh+FP;Ok8c04U%ivrd`iT-;As;+3~J}#EsG2ghXUJEK4=9Qtg z>hF6jdG6y$V^*MVDYRxcxM2%Eyi>Gc(UD-_+Qq3vC#w&%h%Jm?yXDmL3B0K^N;x|Ywe6emr_8`{|WH)tX0mS zAa>Lh{yn)BHOk=3lah+*Q#OA;4LW$pm|EaY`#QiNIAogRKvf27C0j}wiIqbJcCfET zro8umk*l%OI>dVl|9VZ`C>8sVh*P=!nhiKV7;8GCL4GomF={Ureh{@%%w$gLZ@*~C zvK54F%x#`v?g&@E-IfY)d{dciO(~-Rd zZ;O|0Kf8UqH=2$ICZZ(;MW4Heu^-u@; zk^-N`Jd90gXqcp=ukL(PUNVZyrHX^lwlIrTQy3 zUI;RatD?ACJxjxaB_`bsvPFsdt8$Wo`#6%9uLPkms|W0PyZp<~3{*fjP3tN{n{1k` z> zED;NZ*}8EA+80T(b1~7VWs|Gc>-#hi8pgZy7(KCl;b9ZhqWupz8m)PoG}DcCcAArZ z1+>9JN)N~@6gE9^-Sbse1yQI0%EIif-}i`Kh6F<60@t_PEJX>|8CDo8`DymYjEY~~ zo09vVu3$=@r0k#qM0~C!^N%{1ht&agVBa;-OD&U_<6vu_K+j@vlG6bny^}wT)0i=} zQEZAGm|_8iQEXt;iZ z$Ll@Af{tO&`by*}svo{XP~*C3Xe^bOD+tW=aAW48ei--r1NMD{27X({-zxZPI@x{C z_EN%DR)`e15ChMJ#__-iFcE-LGCYf-H`~zKxQZh=;{1K?>oLQl`y>4-x$5j0HLzd) zAtI6_Kg;o0#S1fcdy;yz#S*NMj!qO(f2~7vBUan0JJ4=gKC(PX&=}?Z22GIHWsd*V zo-oKFOw;#gl2u8c1Ml$Cw>UpEAm<26<8H1=Y1soZCXVXrHPhJWmLnO^1P1hFc>uW; zOJmU|x+MiroT5bRlmIit>u$1+mBE+3i@m@bOi9HS!eVER9iXWoR zcklSEUb>gu;i-iPA<=V~w#d?_YTo3`e}vDARU$cX(2DNzHsmGm7mSIymCg8n_z+7` zP1g}6+j>cAf*>@T@PoJPzf7Nd-;y^hkW5Q{?Ro2cA8+{urh@Iz17UKFX{MFHWU8?h z-l#Fz?9uGu!jaU_ZrS4wROg4RRfSm!N(`6r>v(m5Itt}^cH*g?Hen=6L*5l4fHv`q zdH0X*N}m$}Rw6@@#Y(QN>CJMq^Kl5jqW{c2%(YHAUg?i@*DAXD<|KlKqt!$Thgf_# zTwDULx#XTH9YuL+?ELAIZi1!U>zrI^Hf_3D1$kCr58AX($jfVF-Vk|QSB{}vNEU=o zd;$^jnz$py7v6@7AE_%46fFO}p?Ca;MBx{#nD^eaY^h>QJvGLF7`x7vZ3?I!qOm7+ zTOmC(v$N;z#V1~y#occk#xY2~S{&J-wA8^bXr5hbpUf~vk_pVJOPo`T|HO?EpH`q} zYH^1J*mKl^k1&OD3%2Xkd53$4AC^g=>Z42Vi~RiB!%JR_M1~R-VGZFHu_+7K7=a|g z7AA5C-zWCz!>%^FqVMwHcZhEP;X$ZG%wzIv#ThEpA`E%9w+Lwz=k)E`S%c2dns6!+ zu=?STc-yCeT*S?tVBF3gNHc!-tL}P-fD%O)fa7X=3+UB7^4EyA1>ZDRtTLgi3ta?r zQvS+5F?TN5!1Nf2J(>AxdQd+mLu037-PV3n?OPnv-L^O^Ftzq9rfGz6UEV#~3Rw?t zNP?#&8R)9BQrP!Bt>gKx+vIiD=yIECuIMksFnNOY+`QMkPvgU2novaWRc*) z`<(Q4#YKvs{0tA^$ch83v=-g>Ejgl{q{HrvAxNlSt~AURdscYocpP7Au=u)}9^(Kl z0YexP>eo0{3PS`#@xgIZ&pj504zs?~$iMrf4Fv)w@(|&3$4FTYDb7;`AZl~&dITkx zsX#cm_5*C{ReO(`<~10Jdbr-jib{+_r3aco0Hp9OPOL_7e%tpF9^aNCcDSoR7JDn9 zKyhH(M#fyHy0^BA<9hA`?mOtbLkkfF|e%(N1AnyK!5lZuO6LFrd3gb<@=MN!%dS1h@I}=#dDS86K1C`sjTqLU5qn_ zo29Vxqaql;VNh=fRgMzy2@D%BWp;B1H`-9GCi ze(4N-eNuWzK-{UIZ;t!)@ip8FJ^4lZwEDs&Z)0iUcMk&#zqWpuI}1!ru1=NTBNpfq zM%TWuO-QA95fyzy3*=m*T7Pe`M+&>Y$5m(l5uuCEj1g9VWUj#^18fVk)-?e4>4tU( zr4toLDP1!SKta1YK`Hqx;>ptTWGo=@fwq>wHa*){>7K65=AqDNZTy_2E)VD4TS{ z6y+A7!BZ(LCGw`Ksxj&Z7YVEss1z0} z?LAyk;>QOdzqV~1wn|hw1PT3?b9L3Ew5Mn&DK7#ozu>t>Y@Yix@R1dl&uJvxSke^~Q)C>hqq~|=GQO@*Io0dFXs|p?{<5jHvIeZ3fkEvS` z#%T0Xq73pLE0!Achh1co-2(<~q<|VYiJ`YiXg>nc7D5SKp z=P{w@Xz=UINUPBA=C8*phgO>vQ{6oeRSaftX1wsyY{rk>(s3wMF?vch7L<)qB-q4y zq_i@WT4o&5QDs#Gy-$t9CfhR*gT)R!ay3y_%&}I?xFKcL^-Om$1eRn-3n>hK8u0-` z5A3fv^=$+95tHws-+-0 ztr3anKk!A$LH_KO)T?;}*n38>P`>{;bo)bxIkCE|+Bw4tvMThnXbbT2#;yTEeggS| z5+3+l+!+{3LHqP3G}_ZZn-U03KpNJ0eSg2`TI8?g?gmvMx!gmRARsw81LWiXFbCKa zlsd9HU7t0u5e#5U)2YW1zi3s4KWq=XRA1`BW)?*R^KrI^_lSPd)_vOZQ>{911@*2< zkiP)tpO@U;kWXX)+bz*`bUEWEQ;Dk3$SKP8pDKpmTeyN+ZS=%-5{(&t>5#WQk1845 zT<`0e1}f3u-xL? zki3y~ksPrr#iL|W@{viA9x(BARkQSA8{c8VPUNgTK^Ce%^Be9tl^Ld;hgWCp>zWA0 zL<}#*JB*M5Vs@pjD_O6ZZ}iPhb|a}R*Ku1qBbga$v!UKEJcDt#;uLV|9qyDd#hbke ze4}XgEkKR5$O%*w3^l7y;zAb*Ah!AI<)(#BtxLkA-%b;TsY%A)etnnc(%}c|)z71K zH3v`_H@o6&ttr5LOr&Cu2-im;Jr>X7Z>jkzZMcW}Y?@E`!}`OocakTLA|N(r>B+gB zl#PR3t4Z(AR@SHHbwiV0OWl~kZ@_@SSUYSe#1HXD)nlwkM^kFg!_=Q*N|@57QuzNf zwTnTRV9%#~PW!VBq^#4nIOF(b*7r=J`SV52b$Ur}zfpXweh2=4A$&Wwd!vMEqG0Jw z@o3BP+7$af2Mh5Z)`6TEQzyc>)7?!8ni&4U{K}y?VjP92#)S3muf|TdcsvuM8Zn|ipc66H`!kZfm9`uMV_pqsXOnOK-Av&}HxLuG&B z6A&9q&B@w4O$a$U+7j!P0uL2t9y=!}{V#aj^yy=2z<3G%gj*7}U zOuE?Yub(4wi3Vj8IS*#Ykg}jX^x5$wL&>P0Y{XX}Ke13gVAa@f6&U`<%%udugIG#q zqWLz0iEnedBIQiXum-_N84;7g6)#z z=Hbfq+v88tiF1`q=e#Wwub(by8y6}P@Z^@Q-NR3s+N&sVNZe~NG`)l7$m7Fk+b!zW zBX)hePybUOR)RNYXHp(12f!2QSsU;56WRx9aQNGG_Ybj)5G9VHtrz?|k*tB7&_QvV z*Z$si{exjWPSYx<(J0R&B9W0i#UAxH1!0o7?o-2$w5hWx@8!0JmNkx8x9r1)V4wOO z-i~SitMCxjeBmH9Bi4`Jzx+2egMI*uKXVMB1tQ@fK`nE;GQ&zcRnf7nhW9U1>V#z9 zpz3P<-(MC2@Ia7HY@bj`u7hwEXCb)~t!OtJB1;w zj8PkTj87rA)J6!GW<{L36#v2uOD!G8S^5D-MX8}27hQ!vHF#!vzci&;$bB=!G_@bj z)P3J**F62ZB_B^7kcSd23eS?jfvQ>42YPsPAF!X)p+xALtu96uy-7UwQK=<@M@50yFoxwB2CwderRo>GcvSCJMRYG`XH zi5tk20dl1=M6fUUT^~HSwHLH^eVf1DP^F$)T)Whf+&u^RzLFjf|8h+6BISzs(m@T6 zg=XDuPwsiWe4}bU1!6g^c4c5mKNl?om<+009s+aic{h9YpkH%-I~j@?C+cf2&oA-j zrqvG2z(HlOI(f_|XG~mvF!=VxcqXaejzbyr^}I-VI<`xf;Z5QQX+^1-p%@S(K=}Bv z*|P&|~cFf@+1al1-5(u83ABUjwL~s%3PK+~q-Y}qw!=1}6W(gzK6jw95 zD;qhs96enC3-+S~czn6W8N%>B>aUQ8erD+M0}d{1clg8@wuaRl$w@*ok#8x1!c_wtCN8&@m2Po3X#+E{T;d2fYx%>}6c{}vwB8+q0KdJ7sIhkz!_npSH zxEKR583R4|0_Gw()RW#xR9;IGax6J+bV#Dslsa|8cMTXpGk>DdT{ExfgR9+Dq|{tTjwL?U~|_{L!!BGfuhE}G?Yh4xUZ3;l7*N*=XAJ`!%gyA zh>nkiT10A3q4cF#fo>Jut_%6O??i^Vhpn9NFVnz?FY&>JQ^7StXq5168i@v!6)h8f z`+(1cr8s|#B`PBpjJW_L!-(vM6i`GyM(+XX&z)W1di}=aKfG0wKXV>_^vJ=Q!QSsE z4q7x|?+A<2Zhhb0b5@tWoJR6`py`}s#D})u1vRSM=ZP#7z~2ODi^@;$gmJLFjimg2 zrKS-ic(^~eof?Yhz*P3)1VlFX~PL-okisiALoP#Meg)k zMWX6i(7SJ<5giVDU&_2{MoS_jbZVDy^iAVm8#&u$7IR^nx8G}gNV$xaFh7ja`c1A4I9oU zRlyug@n>#Zsh(7SJ~SzN?MMwr9m{-S6UdgFLw&gESX-wSW{M23P6t{6>)cL0GY zc;GNb$NOxJkM%1eqbm}bW~P*Or-Q=M8Xtd~?Mw6o57#lbXP947!vg>(N!;izUNWaf zrAjlpA52HQ%Nh=^KdM8&_+1tVC&BZOEaTfvPb|EowxX}qHbypjFdX~}*faoZz8sT1 zL1mFX1>+o#n~AwBx5C^VDdq0dLM%3`MZze32T8C+5~Jc$k}V(oJKxiIAL^WM&kMNb(5nFO4*lFxC(*8zu!;Tm(H-= zQoK7X{?whq!;S5`Ji$ET1guxD z7nz->ysoyr{2M!V){{%RHC7>}#s_|a4*e%vK_1`MR66Bkk0dAq?cErmFAWh%lun0hI7&pt#=kzs|ciFS+ZX?F6J1RaGrH0>E5L%HP zFz1LXIW>$5+oYVs%9attVH97-S5J9yqBG~>aG<6a&WRwW)w+|orXj++KXcyxt^8g+ zCmeW5q8(xMJqZ@lD+>CZ)AN{S_+!DGtmav*bVWr|Qm2gslxDFi`uoY@!b?P7MMh^I zXk~Sb`9T0_t9rTlrolJVY=Tm#l5Y+p_Hk1qi3Q(oNon@Tg!)@K=0|$U@M3uwjC?#D z;oL{SyEQ=8p*877L3i0#!C>-?Rw&#`xH6XxOOopLjwVJMz3cX2`R3e4gNh~>=*K&~ z@OjVmB(Afkn8PNg1a_w`uPM$Piv8=CQ_P6|4&8X_p}Y?sOIY6h{sIIbAVF4I zE;z?KmD05qhbNZNLH`bHB$y#8+OW)UHoT8ZAc*@D zu8B=nNMrR*ouON~gPl$ZgOj{Y)zG0$ovtKwchm|MhkL1oMMt7Pnj7zP*oBCDObWJu zo26n*72cj=Vs=U697pCScR6M;=IU*N{NqZkW%!ttBoa4S?jnl8sX?tFTTg#R-HZr# z_V2c5L_B9mbw^00HUSajH2uhXkMxwk5 zEox2rlcRWp+yudd^y4pq9JZowmdFPuM>T!jTWxuqbt(74Dlyu93NuCB%y-CA-g0mD z!=p`pv{AZu4JvA~NkdWVD6bXt%2r(|=^Yn{NM&>1WPUJo{}PZfy{&0_zUX;+h%Xp( z8s;xs*L$hp9;q5FtvNHs@ijt^o4=Rc_(ub!E^CQW4&evt%sk=4Z-du3xn+2M@%ywQ z`)K&#U9&Q;yWVNAsiu0PKC+e&=b9?pu-6mUsroiHS= z$_|r=AERMn2Ad%57?f$5628$a4=w=_QkrE1>ljz5>(YtSn8y$$ia-yXN2SuVjEqV`4xE$V5uqfp zf0Lqo-O(|@6qL))#I}T@H}X}9;-i%SiaQp%NdC+a-w*~6cP1zXTfWP0yn+?WW2CXK zob^rN0?~Y_;RodVxVN79tl(r+viv1s*+=d_h22+ypC;Zk!MRXR?g>)R@7o(8G@4sE6k$98Obi2v|l zBI=r`SX1srb9RI;Jv|S37BG=Q{cR+3l_k9f|Q@&!~ScWBg!+ywz4+xwr;)@ zH;?8YZNuYS=Yr+D`s~kava5E!6`P#uAC9mQ4xi6FheZaUDKWGvS@WWJO@0*Y_Gsti z&s@2*DN@zv`+xhye@kTAhWIcR1b_zDZO&X$5rnWZyf^4E^8UP>K|173g(x_dk(m|k zJsZsk0x-xwmf;zCg1u0itL08GwXPf~EllVKrTNN~{YVw{?chOnp(;&I+f_lW?p7Fs zHW_hvvG7Opw;+Hf?TtMr8)seiCtV8^^xqBoae0lzVL6bS`5y~A@@i2c0Lg_iLx`$! z9*dzo$6?~`;H$Zk$?L0jWh!vKw4uBbF(p}k9V_gdH&D1_~p*iT*G{oQmFV+~T){S{hdhFKN9(%YWtfraj)rt_hE@(7&g8MXp8 zFAYe9pdzYVi-LiFwyN|CK~w3pzHwcf>WVO>p}ABgmG!KRzt42HlGVo&yy>n1GdQN= z!QtzJPbN&^a%psiM%pd30*lrtI@Y~AMf7!7gG+rgq+QEuy?z@ z=zF$=Q20eg8|POud|iBlF(e*)UGzAckaE^#9rd6OB=hf6wG0MF+0JP|JFGgi^o~q*_P}YRr%}md3iFTcAznVt zXKL{UOaF=UZM-Iu`@HRkI$0m%tKflm{*G~}WiDl8jH4|=lZ(H%H!I*aDK~-ntTor| z`{mN5rpS+P$dggqknn>hS@xOxR^)y5%Cu6YoCxPM{N;j|JuUnkgceGZS5i5FzNg8E zSV^ybspn0*sv`&%45i8wRTs-sS5(gU)r=;$t;D+h$|*45RkNoqQ!<48-kJ?o&<^(H zGDMd-Y7b3-JuQ~Ci?* zQB&P&uPHVr5a4xUMmkmVKH-8tT*<|))*cD_A;IyCwK_{{rK}n;BI(qk(Fs~^EZKNV z?`u>0{eUF=KEVOpmiXSwsKKw7edL6B#$G!aV?{hmKjb=#t)#r9&9_ryk`eaGhUPqk zR(Y>}8E_ORw=HDoT&yJ?0Xcrj<(o$jLKvB#J(D}J%+<1`R@6mVTZ&IVE|C?e=(bgY z=I|+sDT0Yqp%?@0qlvX2mZIs?J+%>>`^MnvptHZ>bSp53dyzCgK``CF-@Oqm_lp{e z_lh|>$Kn2oIQtdfN_IsKyW%%kpW!`;U}!1j%6zXN6Z46+YgQ=5b(!FvmfWwjI?iH< zyLoGGeW(DX1PDmKNV3r$B__Mjhfm45S)wad4eiflheTiFfXa{L@J*75A^W1)02`+^ zE33*Ye6op_52e}>br{xkvu`z|gK}DqG@Qa>rO)D3+dw$F7z#_mlzCCCqCdo5s>Sj) zYelfWgh#)FduNSjR+)1hc`i(Vsfmz$plaKJD+=|+THziPmj;n7i6sb*vs)T18<$(k z24nOI3;?xTvINb>U-ykPW~}J=EYX&?fXXe@(3N$~)N{8rZs6l=!(xcRbl34TK>qHK zw>a2K5R&0eR>`ry*jT3RfEmxmtfSeX1=e6)Q2&4c3q8WaujlEHL%8F;cSz_`k&Hbo zhjfCO#q?44{GX5)1XB++OIee1Am+i5sckFDm-n`T7{{D{)rGCx|8xsy#N3-h*72R| zdy}w?;>wCWD8u*#9hvE%H)IsKNO!rnOso8FtB66*A8cny?ss#rJslCpUma{>zrt}> zxy)%1S&|pI#j4133IXR4;3T%YxYBIr5!|tW?dgY9dA(b{MJ+N5zAj~h&-kr^9*lzZ z9Pn5fbebG{Kp4apy2HFOGU+XGr4sEqLkyg;o*=5HGRrootgHVY74hFHXn=A|!-k&* zP)SGwQI8Sbk?7~(3TyM{nKtCPd~-MoyD?|JI&>9IZtoKHYx)i7>Y1iO_=mG8OeUlZ zCd}`yTZzW6^&;PjHU350vzy04x}fdD!@TbH8S@rGYJO>a?#U*T#RUsmAicYEtSzXKfB zr~#(QLYCdtVcgjFji%2YMQ>4;jEFC6Pzs9%&~bQtLpe4|LPuMO+a}jAXg#n}0flJvQMwzx2L`R|>{|;&IMC zWTup}KpTeVR^Caf2_0IRcYF=8QJ`*#Sm_8Al)coKJq*F-fmeubXnYrD##uebedVy=1ee(C@MLGf`fbg6f*QuGi_*#U&0YrOeO0VXKE z>-5U$M1gSPv)@S!HJ@&0eo=i{bsTN3~ z68*C*Zi$DKR5=-qSwYZH+m8}i&@1d)f}mQsFP%(H!Vv^3XK1#WC_yjaZFf8Y85V~Sn zyRk=*SdqxAI%#K+$l@^{lC& zYd_!BHf`4U2?y~geJS!MGDnpfYL78;t1&s$L9545ccUTu|6%K$qAQKIuHD$E*tTt} zVmlSPV%z45QL*i$V%xTDqvGUW-~QWa`#bHN`*rcIi#cZ>Pw!)lq3EZqg(Y9)e;KHu zGxaqIp^ow>#Q74q%p%gLErAW7i3yPOwmqezdr+PUu!T-@4+jxUe3ww>u7g-CrY+x# zKs6NuigV+V`ObF=rB+C&btJLS5Hzzz>fvPXg$)0d zv>cQ!PI*ry0d|H7(P8K{2+((XK!`$~$G2-apB!qj!V+4sPTA%I&InW1+6Kv~1YYl$#6 zRINa?nr9lq)GUG#&*jj`Jz9{`EUw>*jdcQ=3wuE)QckTP$gaHs*Uo25X;Jbic@*vO z1revrRw?S68I?7A$8*@9>6ef9MVgx%NjpYsu=SWy3e8hG7&RC!^|nyi6v}v%Z&1g{ z$|3amL$IFw4`TWJ2aciJU!W~ortnlq?=KP#X+IYja{73cLZmYVJJSoxm70j zZJOf_t$g_3+f~;f+V=kyRKm~o!tSm<37_ayvJt`X%bp-&qWa(MaTICv@|QZ$ zHn9-c_g;DpI-MRmCcp)V@dwf5I!(LZtFWjY;DBNTMp+8sERQQl>z}7ox-^d8u&gq2 z7j!QLL@0_5V6Z>2> znM)OcRuaAe^%9D~DuTcQFMoLMdgyb(QK^$Sk&FG(tq^3rG*uP zo#jDO+#h7ns5ylm{L*cFp41by8e`fcGx={~zqVnDS%RI!!lN;5RhPn+?q~rQlLMKr zn&k4XzoShTTWWA2gYL!Y>l*Gi%=`_1^ znc>{$(T_(w32xJ4{QuI)+*+wKyy0H{mL=qI?W@kK!%C}IDhG4^J^<=05y(ZP^_YvT z(%{@*@Rnjo56GNn%x(^HKS=uxo!h}GkHgA(Lr#)W`C|z1y#wiT)c17*<((s4AOu)$ zEC*34m70k1v_VT20=3xx(X%;>Ho!cU^qY#gij-ufi7<+@dZE$UpsMPW%F8G@x&1gt zr*aZU()~-A*-XIhX33ORSVC;P!0N(}^9JqlVCjsNxgdpOi=BEtk%v$sXjH^_M8doz zQSPj1k2)Guhy_p+%iz*{Y#71s+bez~n9AU!B43A4uN&)o$3Ioz{s-Ku8j-N4J#AVv zGI&DOZt(fFa$Uk_Cw)|2L-9%a__6jkTgFYf zr(mUh+O9@xzTFXa}`oQDxX{mV3w2c5FfgCRy{J(6Y^#jE;%Y3_e@ z7_b`I(9Y}N={{{I?groYCi#kAaq24lYZ?CIvPSwH%xvmFr}Q6ChFykr*71G;@Tm7E zu=V5MH&_3)e~EqWc92$ivrzv--XixCP`t)D0;l#G`)5`bj8KCfanCpajrjn}t}N&j z&Al%>8zjELzi5-?0urn+Qm4RbObt&(UspQ#@BUS-Wc)d$Bmxnqph(C7`lmE0cVQkI z^#M~*KSuJ<64f}IBINAfc!j&rWd~vx1p1?Kgs!OG{(!sH?!5$HosWPb>fy6E_s?Y! zrFi{LVsd^#&^2+^TjU8i0W0VBF31q=ac_#YowTR*sj>ZOm7g*U6Kxp!O{61y`GIHc ze&5Ga_0wY@d>EFrotWg1pVIY1C&eF9-nFC9@7qP?QC!cq5Vh^N#CAMkxB zYvWg&fJ&GVhhy(g&$*A%fZ(~=mR7V28-vqkZEk(fLPv@Gon94aapUTm@zohsX+NrWN7spcU zx?U7v>`10w6~{b9GeVEV2dM;+u76k;$pa;+U_=j!>=~Vo2RH4Gm@FQ5O zX-znBi9*dXOsme1dpY9%!4U#~>8=yzAA8ZsRB64KR~lu%b!ru%#rFo&mL1>qIQj3~ z9}yd3MB=xV&R^jKhG6!Ig$9J+^qJ*(vTjvcs2rtBTqyZ4AUgdJ((pyLs#(K6gZbhG zU8lZN)2ffU@i2rBayuSJK}wZX=W16Ojn2}1%z%6{RD94q{MF1X=Usdl-#yC}%geef z)a~MoRG?I|uZwgVTKF5Fj1mpTex&lc4izW*sb&c2=YecC!eK=fM{thJoj!UeiJAa? zD^niS8Ri3b2_z7^qeIRJ0z$t5eGf8)@_js1H=9dJGS9X2bz0k7VrJrj-Mu@t>HNFVT2wLyFX1nV`KSNzV|MPzXb z>+yUuR!~NE{0i{|jhm{55~}NmVSa54HdBGrwmA@Vm%#&u8Z4vhgJdmwj zzZ-g%R_t7b4WuI2>46*Jo{0NfV@qRt0UtCjsr{s+wPH2*&^BORS;Jf5DCQAlA5-wx zgC>*5xg=B27pf;OKex^jU=kefaz%(lna-r7z=fKkx}xWaLWIPa%ub59&GD38I4;Th z*D$TdI(GFhjX!^{O@)-XH2DrxenR#f>CCn;Gw1v4aU7xhpd`#(`W_5j2y}RQo8UTV z(%=5g(cj5eJ3T#kEItza{oGF_u>*n;x1zTD5$vV_GwK;OC}4`6FB=@KwdkI5rRS%!o&%8UKW0W)_lr8Xo2MsfS=}Q=XSjyRM)*nSt#&^4bmY zbM4NXe@tUQ&Wp$6NPHc4Zh$M^h z+kVWba_{aEAdZyxok0>r!7w2ft|#Eqmj<|tAS2+;aaTc z&8+RnSSAq7qVT}nluEtn$J7VIh`!;|@r#y8XwwS|McJHPybw&zc+W}#OcPm<8eT7N zgHBb(ZD6~aSG(8miceyLLBUg<`L3IZ=)P8i-8;DS{o9Uy+BA)6*e!7^JF!{Fxw~)Q zr=^}*2d#tY83h`77!cJ*WePqCJRe`wx`jq$Sp1jQojPJFjijyU`$n(S+!AO%Ct|9b z-0I1$bgOY1O3gz1yPgwb&iVy$u4@MT?)J7^b8gx#1Xv;l6BwM96`JaW?&e>vgcrpy z9qDQ-Fj7a zMq?nOJ%KQQu3puEs-FVKm}<#luQfM!>oe`ga&2dZ@DoA8<8qSvO%ie5*^3@61LC1S zFAWuZ)~ccvgn{-#S_s!|dX|Ka)&()0PGVi=D+XfJw$3~wbV~+x`O*MR;40n=1Q{*9 z$la%=_Ea8I7wRK!njC0Ox2*9g;N0{39!6&s&5Ur}d{?d69WOybbDxUOYygURM8?h0 z)q0YS1~VGjrN=-xnYxyl=ri9xaGPA{EM~Y2UwxqF=gGhA&YQ~Z)|<{;vX2RUFCE=y zx}G~$^!?>M<}A!Cl7#2Hpbkp7Y|+nsBA=xM69e#IB;g|ORsJ-VR>tg{MRYS|+@&DN z)YB%Gh*SR+u{>-sVYPwS!O^|z&OARt3`v>7Zd%0x{pQX+=`@!jFr$FaZWyW0eI$} zo&{b4I&44muK(S+x327XkWuGxgGp^1O5A@E!N?3Ndv5I0YXHcQG9xa@Z}2<>M_IJn zSrDPac-Z|^eAVeHx#A$IZ&P6;rjyS=*H&N5sUZ8&PcXS%J*n`WJ_fME^u|3Pq%nr8 zj~wrAX52IFI?J`vUbr&989V;LJzwSeFdcDOLAg}lB&6>%nR?&+k`9ki$=UhvNArHV5@e*{S^^(u{ z4;pjG5A|>l`DW@ZoHa4k`<(A7Q84Fr3))xJO>cf>woC{E!yKVDv6ji@=Jp{D(EoMZe>^p|E4O)A@6_dpfXwsm<@7b722#oA9a6$blHBAf0mz$X(Um zE4r(i$JGP=8pF1Qp{a*<3(p2`4P&+*p{OL2aFhWAH0ZUz%jMTy zs5MMgP^Qka#{0qu@L_zKFxvO-kbNT&t?=JTddzE2eN>c*xXs7vf1T@{gDF0+9A?I$SVZH&oU*)OOvqgS;*@MUDflVSBPgr4sHEFrU-fPQiO{B*|N1 zDyTy<5{Lw^Iu?dEVx6CY>oSXYwiw`%NcEKG$qS(%1Ox>9c7dT&_WW4+@D6*_aHWuZ zJ4YVk{}RdC&ByLNc1ygu6XSddxz4{ObJKT`Ug!7tp#oNzIm#JHTgVaLXK+_hF{sI} zezRjDD5L3vE*u1M6;vA{1r*{*{>u0E!|9Cvfv=o18;-k1Hmf;#XjAoObV)24@9wZy zFU>h;LB*#K-B_s;)-stWt|z4SsZ%g$~a!* zXoh;Cbb6Qhk&rmk3AkTc;95Mp#mHE_3AOD3J#}96k&ovuiA{(?S3jGuWNv+i9fj8* zA`Dk?g{UCn=Z{$aylN8%>zcyyJ2;8?8elz(xc=XlFNI5u&s6b;U3;n~3 zQd!t9<*b!xm=@EV;MgleW{B2ESWHBJ^3X9*xxeQd&}}`bFSm%}3tHTsn5|uv1_Aoh z+6y?&$OQsE2NxEts*1cME6hz4_Wh98hYK?m1O`saQ32fOzpxP*@qoLu=JTy+DVtAC;(vi-l zdXc?YG-&0&uvu4j7d_mK_^xF?rqs5BqHh&f9{XDcdoNCZ!*!elzHb$4>R;P+USV=s zOiPM5Ze*3YClK755Hknr8bt8hFx)3t^pgA_^)OTjAmnws^#MhC!$#rQUsa~r#e5C) zt`ecCrQ^(DQ4lGap>j*j3&p06-gMA**Av17N)Ti(!=2Zd`ZPYZ|Zmq36&rvS6OVEKQ~JsH$`)& zC3og9rkM=srXid?^+(|u!%Sb<$V4%y7$O})Jj!-xBnDgexOQ3j?7>BtR8b?3!bo|<8xNj(mz27WlpE1mn8RVPHbT|}Wq;d-A zV~frzgHuhIf3-y`d-|^6}Jw*uif5{_R5*k1Asp4(fpnvz1QL_&d@ctO2Xgm3Dy^cC08A&UzjJIxv98-4K;OMx?sd@(fA zRiS}ErQ-N$u_aDMgBHHDvT3PY8&hVpw3=+osh(^-YFHo3s#Ps;+27%G?^aT9q`7T+ z`y&GtUm^fx+IxAg!09x@bV!V*HTOrg%xt$wkTBW>Nfg=w1jHT_MnC-93ptO$F}$GZ zkNRyjI1~e^Kv=XKrTMpZ2yJ01FLoNfKI^tEX`;tBXu_9?)QzJq2-iMQ4hr7x(a&Gg z^wXpAfWQpaOD=Ho;XVw=0t*XV-C_WddTKmfR!20Zf+W_)Dg z^s566>HbXrs*|=SFg~8AG~k2HT=Qu{9ecr*@aDNnMvFv5Uhh>nA%#3;7JOxodU0|k zxRba_>>AEr?YFc9#kem(NU)P+(0VE{s5QCVjcUnzB_f-L_mhr`73U3ukVKx!FC>Uk zLDQ@2BN(Q*8&1>e47p&Dd^nyq8>zy-p!C5IYG#l%{8hd>Rhy9Oyy0ty_ndU|-CJG1 zehwKDk7bq|>z{Y}!NmQBP5d_bG4qVB<)kV~IqLWC^<>lT{RU&)Ba2u&TcBPoeFl9* zO=-Dt?6#iUc!M5!HlN7z@>VNyBz~8gv@_Fi`j4!yO_3C^DIz6X3eC|cOBuQVRT;-N zG#Cs&xDE&L*S;kM59$OOHl?sXo7p*f z%TQ}I8uz)=*yz|24RNqZbiDfdcA4?otP*UMg_u4l8klXq$o7Hu1~um}^bGPLKV)zu zFp6?__WuYvfccY8s`>uU0yh*k0$o5l-gazPpor^vS2tb_)|jCs9D0%*H6aQ3bmB=jwp;Hhn_-eo=kS%aTn9TAAij`eQCG? zc(=PQ6HPoX4f%f*zuyiZXFPeR^zidU5xxy2d3O7J%)M_0KW}F&u7m<}jSFC88ako) zi>a=vC7l=MiNQ|U{~LILo-E!S9bp+9+|0fx6paw{3BCzn?^M^9Xddx-CFu2G`AeOP z7j}XUJlFCv;9v^(7-w02H}jdNB3QHANi-G$NI86Go(-N}QSo&h;>LY390My}aw2Gp zg>FOj4Ew_cpZNHne)XoxOeCIx9COTyci$RLM{nOza8egCR93{MXsid8S7XxZc@Jjj za@rfkn&mA&6h~u6F`Q8;uo&co&x+XTW4?G6^Ygr<7JD?-gXO=1=Ae*f@%K2~;b_RR zh*F3ov?wqYta{%lIBnPn0o4EJ;bo%-KD=@bXq~BZmN6~N#~E6E_bO_$`=KJQYDdM7 zPk&dz9DI0)Bnk2}>`b#S>DH7^nm#!AUHS@+fLU4HKW!hfY}#x;M?moM4Yj zanHk`h(zW5nq4`!Ts>~6x7C)YaEhQOV>)qLbEJCi_!i8}qIaN=&d%)P8n@#7niKTA zE`8|fe}ZF3Zq#qAi>_^5^nI7yflf!OKQ?^=PCvIr0aV{PnIz52EG(-jtV{Zi=I0?x z1oS14&B8k)+_LzeIuftahxutF+l!JW#j)qZFr9-09@zIHj5w3@MS@PVJ6>u5`e`dG zg{LfX2GuZci6w4296NtGQggDAITn8TAKpoBLaNKrqZYqI=aB)P%ahelE&pMI@ zdyoij5qY5H4@lz<9z%?_NtctGV>I?k!&@k2l)oPm#~=;r%a45`#tlUkCX=$+Y%bNZ`wA75QZNK~kO+ zm3k*ojscxcs{aBA?a}Zo_j~$lp(XsTRVyHNAyH}OIEXdhSBt#%gw;$|;c^$+eICxg zIP4o*S$;w)77(N3qpV5a#;P#-#;c3Xp;lK_hlJakk?>SGgnt*Bsd9^g$B^Rpw;xXw z3wG$3m4!snSx?Hcga*n3XOVbNLMl~raHwD0uSinwCvV^^3T#&LUtM~E^)!b%M6$sU z*4uyh2sO7B5G7z?>qxIZ?n3YX9>CK#98$^2yok-$8&1H{H9|PtC4%sO&{XeVz(=HB zT=Z)Pkad5&;(s%PFm>h9$Zo-$U}OZEGK%at=@Zg#3gv;|KY+b$>Gvs6;Z}fSm5A?n z>0kZ^zt)8UeIw8`dfu0U?1mi^IGMh5g?DgIy3YB`wQT z{X^T<*Gt=W&J8YsON~w6G*h=iDr5ey1UZ3p3|y1c8k0DzWPEP|DC`J4 zl0qDbG^EjG$Uzddkbk%M`>A|pk^$e9Dew8I2MLH!j3UmEBRvX!Fs6@J%)vyz%g@Xv zW>q<9lAvfOhP)vDlwceQ6`ag&2VP*=`AAR1Ag1|MAj22b`5HcDvK2DTJXa6yMLskz z%y!OvVo27p=S(-C+BD@~ay5?nn=TS5f;aLQSUTKqI5kdfd7gaaUhE)CVirBr;ya&s zqKP!#)y~*tTWCX#(iFNQt$6CEf8$I?C^3xhoYaADp(%cX3oEP_1&q&D5kPPaphE7j&ts0^lvwW+NZeIf@onuuwkRRVANqpeeUXe^}MDquDylc z19J(`{?*TlBmbP-T`kaz4fim$a*6_pr(ma62~BlKV&#Awg7QJNiG!v)O46ivSq5_- z-G*)>%6SE!7aLBT9lZN4uJv8pdasLZ52lpZ_61I|%0W4yeuUn3_t?${ns1A{>?uW3 zIRTB3sj4Vkv#I+V3b3n*u>XV;E)CbQm>Um^oxmgx&3!3vkEf9@$K7w4NWisu$|7_gkfqQJ`>$z{am3HjeuXM0j$2uDD-c@cc<{ZBS zN&OG6a{2s=)wV*_HTqgXlx~l51*vSX?dP2MK9S;IBhxRCC500QVjJpC*NVM@jWwb2D8x@y(j~+*SBjy}VfSCI zb_&3xcJc|#@qpUT2GbI5IuAC+u#@ z-k57nDRUYmtx*MUcpQ=r}b~*El(rjg;YH5zRgv|1T(Zu_NV6Q!1#5T^5?Y z&aF`Yu-p?!6fOQKit{>{Se{|obC{s%p->@TMsx(CxDo8p3vMGF#a+kq2&TStSv@E; z7q_4mGrlh){6+0>tWZ!S-Opd=2x~)#sS!*kqcrIHm|Zi<1z!u^1W9?vvX7v#Ii`Wq z5CDeOVM!74$3_T6f&eHTiMxCCW7Qe{3naluDK6V}7dOi>##0k;ke(2UpkVmnCwX$!cs zG>p^ba+3^+?XXGM3um^RHS zN+uWzx3AAmLxb&+Vw2fqP92{dB}ZGJ{a2Nzz6ZB{zh2DfU2G8%m#%l@Cn+i?=$fZY zTq1Eg?_{3-G5MQ{>`uhf3q!Gp@4%uIi&%OyovbM@L4^FVbsgk7)J63PBj1f^%ZJm1 zg!Clu{j3G^!fbd#^1Kq{g_LIYw`?7m9*QdJ=VIeby8!Y!*Y4V}IA2`>s3cpxKFM80 zd)k3`4yNQ8J=LlN8o;MlH^>w000I_?9vdFt6?|IpFeJ~1w{roEvwSbB&Jfg=e}Nw| z)$)R$h=kfdQ~VF@Mp=H|V+NJ48+8bt^Pm{n`n?5e8e#s*^%Cp*U%FBRQI9HG(Qm*}Ba*0lqmtr<{d_E_LXDP= z>SzW1r))^B9(MV)uVtL9^jYjD2Lv=Y@iMkG(mSx75=)4U!)yI0rbIBYWAIiTG7HpJ z(yl&hu5nwN|M;$Y5xe&6{i#OM__%kH2n_xS?pn6Yk5}HKFsEgG3w#X=>>+^Y2Mmg^u3DbjW`#Jt#bj^HCxbP3oLP@)I?MvY= zKo$k(x+&efJvyJlu7JhA7@X^hiD|RNt$)0e)!fEK@27>xTPawdHH#uwm7hph zSn`7=svMf9dogf-@+^KT6W+0Hy-T&bdg62e{$b?S)uK$nE8pko4g1#co1Q{js>HpOtIb;*aI)bGxn{D92fN;S-n#R*BmCZc~!c|3thIoEUKV*=diUfb!I=5`4T?@BT z+5c2=OYvj{jH6YtXJnl96fRJ-Km~hCA&PhwfxwytIu(zx=8VkouBNB)k*XfYxk8H| zV#xGA*G+?h$vL*K0HTSMUku1&6 z=HcJW;{g1ye00JgOubrF#9KqMEuF&-=G-qwCLSu6DmlGd2L=JQiYeJ9*HEH3JyP>W z;a@n|;|y`5Cwe0TYgUVfvVstaV`0Q3{1oUANqvdEM!35DcqM%!IpebcEQ}(Yr)N9T zrCdDcqo;q4)>PV1aue-jq=12�BXB$a!vbogdp^6&0vQFyd3np%}wR-?%y5bL05? z+1N4Q2=_^MS&}33lTUa{6{-W)7()>vHkzrzzgCrGYMgF&MXov5 zJ9QjS>vXe0h)dJm*Iv>}LzNB)7hZ{GU?#r<@o?;>GuWNiE11E%v?$jdX@ zDnGw}{%y{TFW@tQJjZZld6LbtjpX!#@M>Q_Z|I36A~kXQ%zQ{yY+6Dwjs%!Cv0e`` z;K8t310U%=J8HXNV8q-8DeIlkly zFzBcd7~D>7IPY|A{j%>qB5eN-G(5{We_=H}b#UL^LoGi}fWC2xn>VQZUApzp-9)fn za7)#B6Vm^MLg3`2X}o~K$Gb{}tY1^#YdW^)%Imogn$6jg4#{BcO3tg6*;1-T0d%2M z-jVD36V8oL8M`Ke-{~-|+fIZ;C>EdW%k2r$bfK190Zlla!=%0Abf(96)3$kMp!&UB zo_mLSeEKbSd(pOQ%PxlN>t9csMXp!O!&{(%r=9dPU+%i4GvrZ?$BdU#KlpW^x1IDk zZy^Ef04IFMjc@BO*C&?H#fZTtL5Ug>|FsZKz1#5b8Q+&a8z?3rhdREP0wfOE2u$ar zp&mMk;Drf6Xu_#!reY~I(C}jKoA$mgW|p6(HX#NpOaE=)zP1cB2QXEzb$dsnA$0r0 ztE~ij2!sbvKe)S8EZ?Z=XyEH!G`VQ^0?=%E46)(8)L-V^2s-9U+r|!VTE`HHSk`N& z=G>jXpZKeW$gNTG6DY|0_QXhoXK>t zj8q&Wf8xAW>40N1sG>z74LeZ4l{{8OpVUY>9-*=6}7T|ARWF( z4}Ew~Nt%}!zjE#PWb&Q29-I{?!cdDKnGY12QCl)5aX69TK30zz`i1P?g?bzK7Qice} zDtaYSRl{D-TYijX8@oGNOuAB9qU{c=m!mjTsKUx~`7hmUU<-sG(*vSQ|PzX;Z#zrw`ccNmWIQAZ|ckhsW2H45U%f#LV~P>b|hNF{-5xjtA&Z z7$P6;3ETREX1n3ZR-*$0Jl4-&Maq5%0X>wM+Hyas>q*yjs8!)dEOPE+H666G`xiWby8@P$=|yf@4I)aNRLf~#?y#qpdWM13DXcqt82mm zOc0nz7$MW_d*B|r;)<$QqPY>UV|upV`TBjT!uRD_Lo!mJ+T+eE;nNoFk`l^(#57Vq z*C~b)7SB8kvLL}(>*-ZKk5piYgW(t)AnLPl9dOEqbD&AdBtFT?MAIT%={D_X6(|X4 zM#)QhAsr{lkw~|;6g_ebtPd_@zDI&M;ma^7Lqf`Nm|Z9Y9B&*f`h2@2>cr}7Q@9!( zo{1GUBu`u4C7!>in2!T*oghoR2)jV<{rv|&`DvVm@eC~($;G6BIKkMPQj1)_7<~CJ zjffTP-hA}A!+?SA{>$Tq_mf6+z2hq`g98&^Uf#F1gu-Qq3;VkIU^0mLLgZNYIDQAJ zlPB=!FOhH}qAdMwpHKB?WG93_EY7%+eruLV)imv+Rxto-a!oxag?k&3qGX_5FSmAw z!HF+Cvfq0L$!-nM58ngkPFxykf)I`i-FG|}wtP=^Z~&(i-dEoe(`2GZq(|r!yC7Hq zZ>+>ZXnaN+owW7#DWqJBAKN2D-lulY$9T04{x$qo@-1V>8xD`?#G7slOV_zG0vMxw zg#>|XqNY^`6BA5=7dhU?uu&k5`FLH+?SU5yiu`ht4qbtz!uQP3~KQ$5L?D1Je%WsEJc8^rc z2Pb1$ae_`j&3bWbLY|^-VEy0O6pHo2>LXZ9R6azdH_~0FBSJ5M42irg#BtBkp9;u6 zhj*X&E4;vq&={0}OWnbn7ZCfxnnl`u%XL?WMDp&_&IsNS63WJ|8^5q5xtR&K=hf3( z9CqJnGDk)OvIw&0HnksQUj`2$tOmA%NZPG66m`GJYOwc^o>f-wmI!RknVvt!aFjLL zm82mfMgLPef+F{Q#v*0dtx+zIXcoes~l>-Ca!ZMX&K!Ys7koRG&X@%0Mm=lfi3{~H>Tq62>#DxLW?lkOs{I-x0R zCVNuPN;h;zIFY=Vv?kAT*{IrHpO)Ghf;on5*apQ@ooQ&YrzM+ɧqCrsA|BbO#P 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%0Dn@xXT_Mbd$ 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

    DHs`1 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

    PL$|N>eHh;6)99m@yS3929gBr-YcSFW0TwF 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 z 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

    EHt#6cLXL;+g~%6RjGAMah>3ee<=GK^5Ym7lb_( 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ௐ`a;2WfhLvV&^i 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 literal 0 HcmV?d00001 diff --git a/apps/docs/scripts/export-markdown-aliases.mjs b/apps/docs/scripts/export-markdown-aliases.mjs new file mode 100644 index 0000000..4cd2486 --- /dev/null +++ b/apps/docs/scripts/export-markdown-aliases.mjs @@ -0,0 +1,37 @@ +import { copyFile, mkdir, readdir } from 'node:fs/promises'; +import { dirname, join, relative, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appDirectory = dirname(dirname(fileURLToPath(import.meta.url))); +const outputDirectory = join(appDirectory, 'out'); +const markdownDirectory = join(outputDirectory, 'llms.mdx', 'docs'); +let pageCount = 0; + +async function copyMarkdownPages(directory) { + for (const entry of await readdir(directory, { withFileTypes: true })) { + const path = join(directory, entry.name); + if (entry.isDirectory()) { + await copyMarkdownPages(path); + continue; + } + + if (entry.name !== 'content.md') continue; + + const slug = relative(markdownDirectory, path).split(sep).slice(0, -1); + const target = + slug.length === 0 + ? join(outputDirectory, 'index.md') + : join(outputDirectory, ...slug.slice(0, -1), `${slug.at(-1)}.md`); + + await mkdir(dirname(target), { recursive: true }); + await copyFile(path, target); + pageCount += 1; + } +} + +await copyMarkdownPages(markdownDirectory); +if (pageCount === 0) { + throw new Error(`No Fumadocs Markdown routes were exported from ${markdownDirectory}`); +} + +console.log(`Exported ${pageCount} per-page Markdown aliases.`); diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json new file mode 100644 index 0000000..a09f8ab --- /dev/null +++ b/apps/docs/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "paths": { + "@/*": ["./*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/examples/application-events.mjs b/apps/examples/application-events.mjs similarity index 95% rename from examples/application-events.mjs rename to apps/examples/application-events.mjs index 2625d5b..11b99e1 100644 --- a/examples/application-events.mjs +++ b/apps/examples/application-events.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow({ diff --git a/examples/assets/custom-protocol/index.html b/apps/examples/assets/custom-protocol/index.html similarity index 100% rename from examples/assets/custom-protocol/index.html rename to apps/examples/assets/custom-protocol/index.html diff --git a/examples/assets/expose/index.html b/apps/examples/assets/expose/index.html similarity index 100% rename from examples/assets/expose/index.html rename to apps/examples/assets/expose/index.html diff --git a/examples/close-example.mjs b/apps/examples/close-example.mjs similarity index 97% rename from examples/close-example.mjs rename to apps/examples/close-example.mjs index d602bcf..5ed023a 100644 --- a/examples/close-example.mjs +++ b/apps/examples/close-example.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); diff --git a/examples/custom-protocol-hono.mjs b/apps/examples/custom-protocol-hono.mjs similarity index 97% rename from examples/custom-protocol-hono.mjs rename to apps/examples/custom-protocol-hono.mjs index b8f1598..670547c 100644 --- a/examples/custom-protocol-hono.mjs +++ b/apps/examples/custom-protocol-hono.mjs @@ -1,6 +1,6 @@ import { Hono } from 'hono'; -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const router = new Hono(); diff --git a/examples/custom-protocol.mjs b/apps/examples/custom-protocol.mjs similarity index 96% rename from examples/custom-protocol.mjs rename to apps/examples/custom-protocol.mjs index de7e7ef..78f2170 100644 --- a/examples/custom-protocol.mjs +++ b/apps/examples/custom-protocol.mjs @@ -2,7 +2,7 @@ import { readFile } from 'node:fs/promises'; import { extname, relative, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const directory = fileURLToPath(new URL('./assets/custom-protocol/', import.meta.url)); const root = resolve(directory); diff --git a/examples/expose.mjs b/apps/examples/expose.mjs similarity index 96% rename from examples/expose.mjs rename to apps/examples/expose.mjs index a25f286..df88491 100644 --- a/examples/expose.mjs +++ b/apps/examples/expose.mjs @@ -2,7 +2,7 @@ import { readFile } from 'node:fs/promises'; import { extname, relative, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const directory = fileURLToPath(new URL('./assets/expose/', import.meta.url)); const root = resolve(directory); diff --git a/examples/html.js b/apps/examples/html.js similarity index 85% rename from examples/html.js rename to apps/examples/html.js index dece648..fe89590 100644 --- a/examples/html.js +++ b/apps/examples/html.js @@ -1,6 +1,4 @@ -// const requireScript = require('node:module').createRequire(__filename); -// const { Application } = requireScript('../index.js'); -const { Application } = require('../index.js'); +const { Application } = require('@webviewjs/webview'); const app = new Application(); const window = app.createBrowserWindow(); diff --git a/examples/http/server.mjs b/apps/examples/http/server.mjs similarity index 100% rename from examples/http/server.mjs rename to apps/examples/http/server.mjs diff --git a/examples/http/webview.mjs b/apps/examples/http/webview.mjs similarity index 87% rename from examples/http/webview.mjs rename to apps/examples/http/webview.mjs index 5adb58d..8f0a772 100644 --- a/examples/http/webview.mjs +++ b/apps/examples/http/webview.mjs @@ -1,4 +1,4 @@ -import { Application, getWebviewVersion } from '../../index.js'; +import { Application, getWebviewVersion } from '@webviewjs/webview'; import { createServer } from './server.mjs'; async function createWindow() { diff --git a/examples/issue-47.mts b/apps/examples/issue-47.mts similarity index 77% rename from examples/issue-47.mts rename to apps/examples/issue-47.mts index bb1c49e..656437d 100644 --- a/examples/issue-47.mts +++ b/apps/examples/issue-47.mts @@ -1,9 +1,9 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow(); -const webview = window.createWebview({ +const _webview = window.createWebview({ html: ` diff --git a/examples/issue-50.mts b/apps/examples/issue-50.mts similarity index 96% rename from examples/issue-50.mts rename to apps/examples/issue-50.mts index e44906d..9cac9e5 100644 --- a/examples/issue-50.mts +++ b/apps/examples/issue-50.mts @@ -3,7 +3,7 @@ import { extname, join } from 'node:path'; // import fs from 'node:fs'; // import os from 'node:os'; // import path from 'node:path'; -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const MIME = { '.html': 'text/html; charset=utf-8', diff --git a/examples/issue-52.mts b/apps/examples/issue-52.mts similarity index 95% rename from examples/issue-52.mts rename to apps/examples/issue-52.mts index 94583e2..592213a 100644 --- a/examples/issue-52.mts +++ b/apps/examples/issue-52.mts @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow({ diff --git a/examples/issue-53.mjs b/apps/examples/issue-53.mjs similarity index 98% rename from examples/issue-53.mjs rename to apps/examples/issue-53.mjs index 5a80eff..b5d909c 100644 --- a/examples/issue-53.mjs +++ b/apps/examples/issue-53.mjs @@ -5,7 +5,7 @@ // // Run: node repro-close-quit.mjs (xdotool is used to press the WM close // button; close it by hand if missing) -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; import { execFileSync } from 'node:child_process'; import { mkdtempSync } from 'node:fs'; import { tmpdir } from 'node:os'; diff --git a/examples/linux_close.rs b/apps/examples/linux_close.rs similarity index 100% rename from examples/linux_close.rs rename to apps/examples/linux_close.rs diff --git a/examples/menu-system.mjs b/apps/examples/menu-system.mjs similarity index 99% rename from examples/menu-system.mjs rename to apps/examples/menu-system.mjs index 4c48d33..f8306c4 100644 --- a/examples/menu-system.mjs +++ b/apps/examples/menu-system.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); diff --git a/examples/multi-webview.mjs b/apps/examples/multi-webview.mjs similarity index 95% rename from examples/multi-webview.mjs rename to apps/examples/multi-webview.mjs index 591757e..6078822 100644 --- a/examples/multi-webview.mjs +++ b/apps/examples/multi-webview.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const width = 800; const height = 600; diff --git a/examples/multiple.mjs b/apps/examples/multiple.mjs similarity index 85% rename from examples/multiple.mjs rename to apps/examples/multiple.mjs index ad5f796..89694ea 100644 --- a/examples/multiple.mjs +++ b/apps/examples/multiple.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const webview1 = new Application(); diff --git a/examples/navigation-handler.mjs b/apps/examples/navigation-handler.mjs similarity index 95% rename from examples/navigation-handler.mjs rename to apps/examples/navigation-handler.mjs index de07f72..d705140 100644 --- a/examples/navigation-handler.mjs +++ b/apps/examples/navigation-handler.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow({ diff --git a/examples/notification.mjs b/apps/examples/notification.mjs similarity index 96% rename from examples/notification.mjs rename to apps/examples/notification.mjs index 6618ad2..dfee08f 100644 --- a/examples/notification.mjs +++ b/apps/examples/notification.mjs @@ -1,6 +1,6 @@ import { readFile } from 'node:fs/promises'; -import { Application, Notification } from '../index.js'; +import { Application, Notification } from '@webviewjs/webview'; const notificationImage = await readFile(new URL('../assets/preview.png', import.meta.url)); diff --git a/apps/examples/package.json b/apps/examples/package.json new file mode 100644 index 0000000..ee1eaef --- /dev/null +++ b/apps/examples/package.json @@ -0,0 +1,9 @@ +{ + "name": "@webviewjs/examples", + "private": true, + "dependencies": { + "@webviewjs/webview": "workspace:*", + "hono": "^4.12.32", + "nodeia": "^0.0.1" + } +} diff --git a/examples/simple.mjs b/apps/examples/simple.mjs similarity index 95% rename from examples/simple.mjs rename to apps/examples/simple.mjs index ca6c2b8..3bb1233 100644 --- a/examples/simple.mjs +++ b/apps/examples/simple.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow({ diff --git a/examples/transparent.mjs b/apps/examples/transparent.mjs similarity index 88% rename from examples/transparent.mjs rename to apps/examples/transparent.mjs index caf1c59..609b9cf 100644 --- a/examples/transparent.mjs +++ b/apps/examples/transparent.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow({ diff --git a/examples/tray.mjs b/apps/examples/tray.mjs similarity index 97% rename from examples/tray.mjs rename to apps/examples/tray.mjs index b828d43..9ddf7f9 100644 --- a/examples/tray.mjs +++ b/apps/examples/tray.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); diff --git a/examples/undecorated.mjs b/apps/examples/undecorated.mjs similarity index 90% rename from examples/undecorated.mjs rename to apps/examples/undecorated.mjs index 0f92f1e..6c8c7a7 100644 --- a/examples/undecorated.mjs +++ b/apps/examples/undecorated.mjs @@ -1,4 +1,4 @@ -import { Application, Theme } from '../index.js'; +import { Application, Theme } from '@webviewjs/webview'; let app = new Application(); let window = app.createBrowserWindow({ diff --git a/examples/url-sync.mjs b/apps/examples/url-sync.mjs similarity index 87% rename from examples/url-sync.mjs rename to apps/examples/url-sync.mjs index f91e86d..69f2e2f 100644 --- a/examples/url-sync.mjs +++ b/apps/examples/url-sync.mjs @@ -1,4 +1,4 @@ -import { Application, Theme } from '../index.js'; +import { Application, Theme } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow(); diff --git a/examples/url.mjs b/apps/examples/url.mjs similarity index 87% rename from examples/url.mjs rename to apps/examples/url.mjs index 6941ed7..2a1e9f5 100644 --- a/examples/url.mjs +++ b/apps/examples/url.mjs @@ -1,4 +1,4 @@ -import { Application, Theme } from '../index.js'; +import { Application, Theme } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow(); diff --git a/examples/web-context.mjs b/apps/examples/web-context.mjs similarity index 93% rename from examples/web-context.mjs rename to apps/examples/web-context.mjs index c81bfd5..cf75224 100644 --- a/examples/web-context.mjs +++ b/apps/examples/web-context.mjs @@ -1,5 +1,5 @@ import { resolve } from 'node:path'; -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const context = app.createWebContext({ diff --git a/examples/webview-events.mjs b/apps/examples/webview-events.mjs similarity index 93% rename from examples/webview-events.mjs rename to apps/examples/webview-events.mjs index 41e3800..238b58c 100644 --- a/examples/webview-events.mjs +++ b/apps/examples/webview-events.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); const window = app.createBrowserWindow({ diff --git a/examples/window-menus.mjs b/apps/examples/window-menus.mjs similarity index 99% rename from examples/window-menus.mjs rename to apps/examples/window-menus.mjs index 8298b34..2e5e974 100644 --- a/examples/window-menus.mjs +++ b/apps/examples/window-menus.mjs @@ -1,4 +1,4 @@ -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; const app = new Application(); diff --git a/examples/windows-leak.mjs b/apps/examples/windows-leak.mjs similarity index 93% rename from examples/windows-leak.mjs rename to apps/examples/windows-leak.mjs index 3e6c800..c1faae3 100644 --- a/examples/windows-leak.mjs +++ b/apps/examples/windows-leak.mjs @@ -1,7 +1,7 @@ -//node --expose-gc .\examples\windows-leak.mjs 2>&1 | Tee-Object -FilePath ./examples/windows-leak.txt +//node --expose-gc .\apps\examples\windows-leak.mjs 2>&1 | Tee-Object -FilePath ./apps/examples/windows-leak.txt import { execFileSync } from 'node:child_process'; import { setTimeout as sleep } from 'node:timers/promises'; -import { Application } from '../index.js'; +import { Application } from '@webviewjs/webview'; if (!global.gc) { throw new Error('Run with node --expose-gc'); @@ -54,7 +54,7 @@ snapshot('after Application ready'); // Keep one window alive so disposing all test windows does not cause // WebviewJS to finalize the entire Application between cycles. -const anchor = app.createBrowserWindow({ +const _anchor = app.createBrowserWindow({ title: 'leak-test-anchor', width: 1, height: 1, diff --git a/examples/windows-leak.txt b/apps/examples/windows-leak.txt similarity index 100% rename from examples/windows-leak.txt rename to apps/examples/windows-leak.txt diff --git a/bun.lock b/bun.lock index 799e2d5..120f056 100644 --- a/bun.lock +++ b/bun.lock @@ -5,30 +5,194 @@ "": { "name": "@webviewjs/webview", "devDependencies": { - "@napi-rs/cli": "^3.7.4", - "@swc-node/register": "^1.12.1", - "@swc/core": "^1.15.46", - "@types/node": "^26.1.1", - "ava": "^6.4.1", - "chalk": "^5.6.2", - "hono": "^4.12.32", "husky": "^9.1.7", "lint-staged": "^15.5.2", - "nodeia": "^0.0.1", - "npm-run-all2": "^7.0.2", "oxlint": "^0.13.2", "prettier": "^3.9.6", - "tinybench": "^2.9.0", + "turbo": "^2.11.6", + }, + }, + "apps/docs": { + "name": "@webviewjs/docs", + "dependencies": { + "cn": "^0.3.0", + "fumadocs-core": "16.15.17", + "fumadocs-mdx": "15.4.5", + "fumadocs-ui": "npm:@fumadocs/base-ui@16.15.17", + "lucide-react": "^1.47.0", + "next": "16.3.5", + "react": "^19.3.0", + "react-dom": "^19.3.0", + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.3.3", + "@types/mdx": "^2.0.14", + "@types/node": "^26.6.1", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "postcss": "^8.5.28", + "serve": "^14.2.6", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2", + }, + }, + "apps/examples": { + "name": "@webviewjs/examples", + "dependencies": { + "@webviewjs/webview": "workspace:*", + "hono": "^4.12.32", + "nodeia": "^0.0.1", + }, + }, + "packages/webview": { + "name": "@webviewjs/webview", + "version": "0.4.7", + "bin": { + "webview": "./cli/index.mjs", + "webviewjs": "./cli/index.mjs", + }, + "devDependencies": { + "@napi-rs/cli": "^3.7.4", + "@types/node": "^26.1.1", + "npm-run-all2": "^7.0.2", "typescript": "^5.9.3", }, }, }, "packages": { - "@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="], + "@alloc/quick-lru": ["@alloc/quick-lru@5.3.0", "", {}, "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA=="], + + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@base-ui/react": ["@base-ui/react@1.8.0", "", { "dependencies": { "@babel/runtime": "^7.29.7", "@base-ui/utils": "0.4.0", "@floating-ui/react-dom": "^2.1.9", "@floating-ui/utils": "^0.2.12", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@date-fns/tz", "@types/react", "date-fns"] }, "sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q=="], + + "@base-ui/utils": ["@base-ui/utils@0.4.0", "", { "dependencies": { "@babel/runtime": "^7.29.7", "@floating-ui/utils": "^0.2.12", "reselect": "^5.2.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw=="], + + "@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], "@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.2", "", { "os": "android", "cpu": "arm" }, "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.2", "", { "os": "android", "cpu": "x64" }, "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.2", "", { "os": "linux", "cpu": "arm" }, "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.2", "", { "os": "none", "cpu": "x64" }, "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="], + + "@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.9", "", { "dependencies": { "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + + "@fuma-translate/react": ["@fuma-translate/react@1.0.2", "", { "peerDependencies": { "@types/react": "*", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@types/react"] }, "sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw=="], + + "@fumadocs/tailwind": ["@fumadocs/tailwind@0.1.2", "", { "peerDependencies": { "tailwindcss": "^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-VppeXgIRXjZMgpf2qijj1hcfxyeYl1s0ok8k6N3jyjiX64M7sDwnt2zGPd6dbfDybgbBvDw6C6J1e42gB5NzsA=="], + + "@fumari/image-size": ["@fumari/image-size@0.1.1", "", {}, "sha512-iaiV2wyzJ4mW358NX4CX3yGit+WjKYzpaQ+rldK9BjL/5jFpeV6ruWnZVq7MEyMn3Gd0DLi8g/79NZAAQaGscw=="], + + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.4" }, "os": "darwin", "cpu": "x64" }, "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw=="], + + "@img/sharp-freebsd-wasm32": ["@img/sharp-freebsd-wasm32@0.35.5", "", { "dependencies": { "@img/sharp-wasm32": "0.35.5" }, "os": "freebsd" }, "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.4", "", { "os": "linux", "cpu": "arm" }, "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.4", "", { "os": "linux", "cpu": "none" }, "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.4" }, "os": "linux", "cpu": "arm" }, "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.4" }, "os": "linux", "cpu": "arm64" }, "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.4" }, "os": "linux", "cpu": "none" }, "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.4" }, "os": "linux", "cpu": "s390x" }, "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.4" }, "os": "linux", "cpu": "x64" }, "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" }, "os": "linux", "cpu": "arm64" }, "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.4" }, "os": "linux", "cpu": "x64" }, "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.5", "", { "dependencies": { "@emnapi/runtime": "^1.11.3" } }, "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ=="], + + "@img/sharp-webcontainers-wasm32": ["@img/sharp-webcontainers-wasm32@0.35.5", "", { "dependencies": { "@img/sharp-wasm32": "0.35.5" }, "cpu": "none" }, "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.5", "", { "os": "win32", "cpu": "x64" }, "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg=="], "@inquirer/ansi": ["@inquirer/ansi@2.0.7", "", {}, "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="], @@ -62,11 +226,17 @@ "@inquirer/type": ["@inquirer/type@4.0.7", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g=="], - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@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/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], - "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.3", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg=="], + "@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=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], "@napi-rs/cli": ["@napi-rs/cli@3.7.4", "", { "dependencies": { "@inquirer/prompts": "^8.5.2", "@napi-rs/cross-toolchain": "^1.0.3", "@napi-rs/wasm-tools": "^1.0.1", "@octokit/rest": "^22.0.1", "clipanion": "^4.0.0-rc.4", "colorette": "^2.0.20", "emnapi": "^1.11.1", "es-toolkit": "^1.47.0", "js-yaml": "^4.2.0", "obug": "^2.1.2", "semver": "^7.8.2", "typanion": "^3.14.0" }, "peerDependencies": { "@emnapi/runtime": "^1.7.1" }, "optionalPeers": ["@emnapi/runtime"], "bin": { "napi": "dist/cli.js", "napi-raw": "cli.mjs" } }, "sha512-idELIUceJ9zPgx/shcMt1fSSsteFG68v56RIXi4qUm7OYuJOt7CoMj2KnHVmbOqXgUHWQU1lCULrtQdZDG4F5A=="], @@ -172,41 +342,23 @@ "@napi-rs/wasm-tools-win32-x64-msvc": ["@napi-rs/wasm-tools-win32-x64-msvc@1.0.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rEAf05nol3e3eei2sRButmgXP+6ATgm0/38MKhz9Isne82T4rPIMYsCIFj0kOisaGeVwoi2fnm7O9oWp5YVnYQ=="], - "@node-rs/xxhash": ["@node-rs/xxhash@1.7.6", "", { "optionalDependencies": { "@node-rs/xxhash-android-arm-eabi": "1.7.6", "@node-rs/xxhash-android-arm64": "1.7.6", "@node-rs/xxhash-darwin-arm64": "1.7.6", "@node-rs/xxhash-darwin-x64": "1.7.6", "@node-rs/xxhash-freebsd-x64": "1.7.6", "@node-rs/xxhash-linux-arm-gnueabihf": "1.7.6", "@node-rs/xxhash-linux-arm64-gnu": "1.7.6", "@node-rs/xxhash-linux-arm64-musl": "1.7.6", "@node-rs/xxhash-linux-x64-gnu": "1.7.6", "@node-rs/xxhash-linux-x64-musl": "1.7.6", "@node-rs/xxhash-wasm32-wasi": "1.7.6", "@node-rs/xxhash-win32-arm64-msvc": "1.7.6", "@node-rs/xxhash-win32-ia32-msvc": "1.7.6", "@node-rs/xxhash-win32-x64-msvc": "1.7.6" } }, "sha512-XMisO+aQHsVpxRp/85EszTtOQTOlhPbd149P/Xa9F55wafA6UM3h2UhOgOs7aAzItnHU/Aw1WQ1FVTEg7WB43Q=="], - - "@node-rs/xxhash-android-arm-eabi": ["@node-rs/xxhash-android-arm-eabi@1.7.6", "", { "os": "android", "cpu": "arm" }, "sha512-ptmfpFZ8SgTef58Us+0HsZ9BKhyX/gZYbhLkuzPt7qUoMqMSJK85NC7LEgzDgjUiG+S5GahEEQ9/tfh9BVvKhw=="], + "@next/env": ["@next/env@16.3.5", "", {}, "sha512-NWEXVDMqoEo0ktmU6u0sE2Vg0LOcsD7NnOTJNo3/fEaTfsg+F1bMIxuDmQbda4e3yTIQwVdUREF2yIuMOusKtg=="], - "@node-rs/xxhash-android-arm64": ["@node-rs/xxhash-android-arm64@1.7.6", "", { "os": "android", "cpu": "arm64" }, "sha512-n4MyZvqifuoARfBvrZ2IBqmsGzwlVI3kb2mB0gVvoHtMsPbl/q94zoDBZ7WgeP3t4Wtli+QS3zgeTCOWUbqqUQ=="], + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.3.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pMmGgETfKvElucLHtVaeiMRbp2zUbvKx7b1yGko0liBz3cw1mKSggWN/Rp/wPz8z+E1O82u3r4L1Co+ZS5hokQ=="], - "@node-rs/xxhash-darwin-arm64": ["@node-rs/xxhash-darwin-arm64@1.7.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6xGuE07CiCIry/KT3IiwQd/kykTOmjKzO/ZnHlE5ibGMx64NFE0qDuwJbxQ4rGyUzgJ0KuN9ZdOhUDJmepnpcw=="], + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.3.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-76VaGYvf6HPa5/w12yLkE3dXTn9AfdEviI79oEL3aZoAmRLc9rWitjWqyjViVysK/ht/y9YKzFkBrUdi/wGkow=="], - "@node-rs/xxhash-darwin-x64": ["@node-rs/xxhash-darwin-x64@1.7.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z4oNnhyznDvHhxv+s0ka+5KG8mdfLVucZMZMejj9BL+CPmamClygPiHIRiifRcPAoX9uPZykaCsULngIfLeF3Q=="], + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-zKDELJ5jSQMHeO/hmXUQsAzagX4bQD4OiMi3pQ5FbUj+yK506oLVHnKA2YXMlbg1EHHqJYtyePOgByIDXD1lqw=="], - "@node-rs/xxhash-freebsd-x64": ["@node-rs/xxhash-freebsd-x64@1.7.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-arCDOf3xZ5NfBL5fk5J52sNPjXL2cVWN6nXNB3nrtRFFdPBLsr6YXtshAc6wMVxnIW4VGaEv/5K6IpTA8AFyWw=="], + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-7Vql0pgzCoHagv6+FNOZoqmJqA52c6zeVbhtS/47qFozO1MSx4ms7x7GHiciY8R5CDsSMKMQjJEryoJLcsBIbA=="], - "@node-rs/xxhash-linux-arm-gnueabihf": ["@node-rs/xxhash-linux-arm-gnueabihf@1.7.6", "", { "os": "linux", "cpu": "arm" }, "sha512-ndLLEW+MwLH3lFS0ahlHCcmkf2ykOv/pbP8OBBeAOlz/Xc3jKztg5IJ9HpkjKOkHk470yYxgHVaw1QMoMzU00A=="], + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-NH/xzehyHEFWE2nlcZon7TB/0+H4shfWCi7S1zka815XCOhJDYZhoeJtOYy0dh0WVRWACVXSyGNFFytoMxUhRg=="], - "@node-rs/xxhash-linux-arm64-gnu": ["@node-rs/xxhash-linux-arm64-gnu@1.7.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-VX7VkTG87mAdrF2vw4aroiRpFIIN8Lj6NgtGHF+IUVbzQxPudl4kG+FPEjsNH8y04yQxRbPE7naQNgHcTKMrNw=="], + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-lV4+EhWMfS8jcC+EH2nn/Cm5cn6XsgbE07bU9tMH8fCo0tNAqhyzi1b5wQ/Tn6NGFTvKDY65w3ZH95EjwBRAnQ=="], - "@node-rs/xxhash-linux-arm64-musl": ["@node-rs/xxhash-linux-arm64-musl@1.7.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-AB5m6crGYSllM9F/xZNOQSPImotR5lOa9e4arW99Bv82S+gcpphI8fGMDOVTTCXY/RLRhvvhwzLDxmLB2O8VDg=="], + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.3.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-/wKzAREX2RF++MhicjDbg8tGn2AiBIM0+EFeTFKoUEUbW5D6amCJehd5Z5G1H5/gxNdgnwoXMcHz24H/c2tGkQ=="], - "@node-rs/xxhash-linux-x64-gnu": ["@node-rs/xxhash-linux-x64-gnu@1.7.6", "", { "os": "linux", "cpu": "x64" }, "sha512-a2A6M+5tc0PVlJlE/nl0XsLEzMpKkwg7Y1lR5urFUbW9uVQnKjJYQDrUojhlXk0Uv3VnYQPa6ThmwlacZA5mvQ=="], - - "@node-rs/xxhash-linux-x64-musl": ["@node-rs/xxhash-linux-x64-musl@1.7.6", "", { "os": "linux", "cpu": "x64" }, "sha512-WioGJSC1GoxQpmdQrG5l/uddSBAS4XCWczHNwXe895J5xadGQzyvmr0r17BNfihvbBUDH1H9jwouNYzDDeA6+A=="], - - "@node-rs/xxhash-wasm32-wasi": ["@node-rs/xxhash-wasm32-wasi@1.7.6", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.5" }, "cpu": "none" }, "sha512-WDXXKMMFMrez+esm2DzMPHFNPFYf+wQUtaXrXwtxXeQMFEzleOLwEaqV0+bbXGJTwhPouL3zY1Qo2xmIH4kkTg=="], - - "@node-rs/xxhash-win32-arm64-msvc": ["@node-rs/xxhash-win32-arm64-msvc@1.7.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-qjDFUZJT/Zq0yFS+0TApkD86p0NBdPXlOoHur9yNeO9YX2/9/b1sC2P7N27PgOu13h61TUOvTUC00e/82jAZRQ=="], - - "@node-rs/xxhash-win32-ia32-msvc": ["@node-rs/xxhash-win32-ia32-msvc@1.7.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-s7a+mQWOTnU4NiiypRq/vbNGot/il0HheXuy9oxJ0SW2q/e4BJ8j0pnP6UBlAjsk+005A76vOwsEj01qbQw8+A=="], - - "@node-rs/xxhash-win32-x64-msvc": ["@node-rs/xxhash-win32-x64-msvc@1.7.6", "", { "os": "win32", "cpu": "x64" }, "sha512-zHOHm2UaIahRhgRPJll+4Xy4Z18aAT/7KNeQW+QJupGvFz+GzOFXMGs3R/3B1Ktob/F5ui3i1MrW9GEob3CWTg=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.3.5", "", { "os": "win32", "cpu": "x64" }, "sha512-LNdCHzgLFc+UeqMS84LzXPaeBRKyqDN9OMyFAr1OrB0XrNw78IRrEVtZvvA7245W/HsaoeVOQX9jPjPk8jojwA=="], "@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], @@ -232,119 +384,191 @@ "@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], - "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg=="], + "@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@0.13.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jbi2UX1xTFTpH/D6n15RzDSG/44oJ0FwrHWl96TsdD3PAOGxmm8LgcrsCU4d22TSN7ShDFB8y34MYplduRzhfA=="], - "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.21.3", "", { "os": "android", "cpu": "arm64" }, "sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw=="], + "@oxlint/darwin-x64": ["@oxlint/darwin-x64@0.13.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ulA2vpNIM14VWJua6BjgX6l8nrjY8Un0uLqBLgELyDHMfpnC0HfrB2mR9PC9tRhb7+BEbgDLWTRs2aTV64eprw=="], - "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.21.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg=="], + "@oxlint/linux-arm64-gnu": ["@oxlint/linux-arm64-gnu@0.13.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-iwguvPnIx/yIMc2IrwLeRflEFwyn+gcsNR8le5aX5DvQfHiB3/3x5JxOVl7Nd93lLsOg8RyVr2E11CxV10rKWw=="], - "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.21.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg=="], + "@oxlint/linux-arm64-musl": ["@oxlint/linux-arm64-musl@0.13.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-YJVvVyuvUobgCmiE47kBwN6dymLcQBG5/NsEaCbVyYw5HQJN7Ywp/x4suaF4c6M9ItPCnLxEZ4Lwu5TkrkU3vQ=="], - "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.21.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw=="], + "@oxlint/linux-x64-gnu": ["@oxlint/linux-x64-gnu@0.13.2", "", { "os": "linux", "cpu": "x64" }, "sha512-w78gjd3ZJ+ahByS5gmN0jxFn/+G3W/oBJbyGFOuteXYcJwLj6JIyS0VhpMKxuAdFNCnsjJeDHSbdWaCV6VkA3A=="], - "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ=="], + "@oxlint/linux-x64-musl": ["@oxlint/linux-x64-musl@0.13.2", "", { "os": "linux", "cpu": "x64" }, "sha512-yedk6KQT3jtBzpzExo3Ib7NwfuugaaFKvk/EzXEojMQ5aYh6CNhmVmm+adzwBp4YyOeXQZxSPHQ1LcNwDCUJIA=="], - "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ=="], + "@oxlint/win32-arm64": ["@oxlint/win32-arm64@0.13.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-KZvJ3uMWSCwkZtvOcO+K4mLmYU/jIcHUb00s8aPasG1taflbjINsq9ZUUj5LNigcDwJRZGUwNcvY5KuQ+E9WtQ=="], - "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ=="], + "@oxlint/win32-x64": ["@oxlint/win32-x64@0.13.2", "", { "os": "win32", "cpu": "x64" }, "sha512-G8FM8RTJRMt2dPRJ/TXhqIEu9k00vRAoh3DSV2r3o+jD8FZDBZXOgoDn2D0F9HqgFLEOVTxpfalmWntyk2hmyw=="], - "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw=="], + "@shikijs/core": ["@shikijs/core@4.5.0", "", { "dependencies": { "@shikijs/primitive": "4.5.0", "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw=="], - "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.21.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A=="], + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA=="], - "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og=="], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw=="], - "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw=="], + "@shikijs/langs": ["@shikijs/langs@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0" } }, "sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA=="], - "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.21.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q=="], + "@shikijs/primitive": ["@shikijs/primitive@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg=="], - "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q=="], + "@shikijs/themes": ["@shikijs/themes@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0" } }, "sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q=="], - "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA=="], + "@shikijs/types": ["@shikijs/types@4.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw=="], - "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.21.3", "", { "os": "none", "cpu": "arm64" }, "sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg=="], + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], - "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.21.3", "", { "dependencies": { "@emnapi/core": "1.11.0", "@emnapi/runtime": "1.11.0", "@napi-rs/wasm-runtime": "^1.1.5" }, "cpu": "none" }, "sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.21.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg=="], + "@swc/helpers": ["@swc/helpers@0.5.23", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw=="], - "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.21.3", "", { "os": "win32", "cpu": "x64" }, "sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q=="], + "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], - "@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@0.13.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jbi2UX1xTFTpH/D6n15RzDSG/44oJ0FwrHWl96TsdD3PAOGxmm8LgcrsCU4d22TSN7ShDFB8y34MYplduRzhfA=="], + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], - "@oxlint/darwin-x64": ["@oxlint/darwin-x64@0.13.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ulA2vpNIM14VWJua6BjgX6l8nrjY8Un0uLqBLgELyDHMfpnC0HfrB2mR9PC9tRhb7+BEbgDLWTRs2aTV64eprw=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], - "@oxlint/linux-arm64-gnu": ["@oxlint/linux-arm64-gnu@0.13.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-iwguvPnIx/yIMc2IrwLeRflEFwyn+gcsNR8le5aX5DvQfHiB3/3x5JxOVl7Nd93lLsOg8RyVr2E11CxV10rKWw=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], - "@oxlint/linux-arm64-musl": ["@oxlint/linux-arm64-musl@0.13.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-YJVvVyuvUobgCmiE47kBwN6dymLcQBG5/NsEaCbVyYw5HQJN7Ywp/x4suaF4c6M9ItPCnLxEZ4Lwu5TkrkU3vQ=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], - "@oxlint/linux-x64-gnu": ["@oxlint/linux-x64-gnu@0.13.2", "", { "os": "linux", "cpu": "x64" }, "sha512-w78gjd3ZJ+ahByS5gmN0jxFn/+G3W/oBJbyGFOuteXYcJwLj6JIyS0VhpMKxuAdFNCnsjJeDHSbdWaCV6VkA3A=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], - "@oxlint/linux-x64-musl": ["@oxlint/linux-x64-musl@0.13.2", "", { "os": "linux", "cpu": "x64" }, "sha512-yedk6KQT3jtBzpzExo3Ib7NwfuugaaFKvk/EzXEojMQ5aYh6CNhmVmm+adzwBp4YyOeXQZxSPHQ1LcNwDCUJIA=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], - "@oxlint/win32-arm64": ["@oxlint/win32-arm64@0.13.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-KZvJ3uMWSCwkZtvOcO+K4mLmYU/jIcHUb00s8aPasG1taflbjINsq9ZUUj5LNigcDwJRZGUwNcvY5KuQ+E9WtQ=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], - "@oxlint/win32-x64": ["@oxlint/win32-x64@0.13.2", "", { "os": "win32", "cpu": "x64" }, "sha512-G8FM8RTJRMt2dPRJ/TXhqIEu9k00vRAoh3DSV2r3o+jD8FZDBZXOgoDn2D0F9HqgFLEOVTxpfalmWntyk2hmyw=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="], - "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="], - "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="], + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="], - "@swc-node/core": ["@swc-node/core@1.15.0", "", { "peerDependencies": { "@swc/core": ">= 1.13.3", "@swc/types": ">= 0.1" } }, "sha512-WAerrrl087WgenB92XG4Th2t0NQFfMNLYSe0sW2cEMMqM/LQmP4rozsDJl0vuzTrbewjpKQryxFXI+aYig/dBg=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], - "@swc-node/register": ["@swc-node/register@1.12.1", "", { "dependencies": { "@node-rs/xxhash": "^1.7.6", "@swc-node/core": "1.15.0", "@swc-node/sourcemap-support": "^0.6.1", "colorette": "^2.0.20", "debug": "^4.4.1", "fast-json-stable-stringify": "^2.1.0", "oxc-resolver": "^11.6.1", "pirates": "^4.0.7", "tslib": "^2.8.1" }, "peerDependencies": { "@swc/core": ">= 1.4.13", "typescript": ">= 4.3 < 7" } }, "sha512-t6t+0bDos+bj0+jcSqKl7+ys/i1an5cEViC0LuIskJFSHONX871nXN8j+gxdKVOgCCpjs0buXUPNnp/0DaV4EQ=="], + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.3.3", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "postcss": "^8.5.16", "tailwindcss": "4.3.3" } }, "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg=="], - "@swc-node/sourcemap-support": ["@swc-node/sourcemap-support@0.6.1", "", { "dependencies": { "source-map-support": "^0.5.21", "tslib": "^2.8.1" } }, "sha512-ovltDVH5QpdHXZkW138vG4+dgcNsxfwxHVoV6BtmTbz2KKl1A8ZSlbdtxzzfNjCjbpayda8Us9eMtcHobm38dA=="], + "@turbo/darwin-64": ["@turbo/darwin-64@2.11.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-nAvJwDBgz/cKoSPhB7YOGPFmDEwCRavFjy0jUsrGqR97cLyJqXU2rZC/zTnw+9J3DkB2gfjpolX7mKsBatMcCQ=="], - "@swc/core": ["@swc/core@1.15.46", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.27" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.46", "@swc/core-darwin-x64": "1.15.46", "@swc/core-linux-arm-gnueabihf": "1.15.46", "@swc/core-linux-arm64-gnu": "1.15.46", "@swc/core-linux-arm64-musl": "1.15.46", "@swc/core-linux-ppc64-gnu": "1.15.46", "@swc/core-linux-s390x-gnu": "1.15.46", "@swc/core-linux-x64-gnu": "1.15.46", "@swc/core-linux-x64-musl": "1.15.46", "@swc/core-win32-arm64-msvc": "1.15.46", "@swc/core-win32-ia32-msvc": "1.15.46", "@swc/core-win32-x64-msvc": "1.15.46" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-Ri3em2mBpq3h2zSPliCYl63otDGqek8PPEfv2nWgRQEbZ/VBCNyypVTVQ6cEbTCXBhy+WE2T3fQb08moIyuYaw=="], + "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.11.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-odk6UHW9hympllPlezz7oJhPmO40+oU8BUh4zvNuSIqQ1QQll4zo1DN4IrD/3jUzkLefvMJ8UHEHlGq9WdR7tw=="], - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.46", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IsISIT22EfktVJrlvIpnAxG2u/A9aob9l99HMlx80x72WlFmFPk1V3UhkEzx86eJP8hw049KTFv/RISho2cq2Q=="], + "@turbo/linux-64": ["@turbo/linux-64@2.11.6", "", { "os": [ "linux", "android", ], "cpu": "x64" }, "sha512-PvXbwMqZPEWdWnJSIJ5D/tugnSOrRvLYKkH7iC8TLGVI+4J5znSLn3Tx1YkH5OUzFEFhxJQyHjtiRqBPbCoVlg=="], - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.46", "", { "os": "darwin", "cpu": "x64" }, "sha512-4Tj4ppVIPCmUMpmGFiGtyEriwLyJ+yi/US4WfBrP/ok8COGddDZXLEzQETnKyK46mjvr1v0jevrS23zjoff7vA=="], + "@turbo/linux-arm64": ["@turbo/linux-arm64@2.11.6", "", { "os": [ "linux", "android", ], "cpu": "arm64" }, "sha512-8FKA3SqJk6fTv7Hqrmv2JnJfqiXslTRJYBwiI6eU3QXokVMYFLh1wUywF+w3MPtDfx1O/1otbps5AnijbzY1Kg=="], - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.46", "", { "os": "linux", "cpu": "arm" }, "sha512-i8tUGnNjyOgMmfmgFSg4aeJLQoFyfpIHK5FjpQAwpRyQIqEUB2w1e8zIDQzY1WhOxx8NoS1S5iUL813Un4Sf5A=="], + "@turbo/windows-64": ["@turbo/windows-64@2.11.6", "", { "os": "win32", "cpu": "x64" }, "sha512-XPSgTg494cV31u0Uch8zRq/Jnpe8h4muwNpg9IRPrJqADrjjzxzFMtJCtBZTKVaSEDUU/ol8Gr4SYxtiHt2Tzg=="], - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.46", "", { "os": "linux", "cpu": "arm64" }, "sha512-c0OnhqzdhfOvv6qhNCcByepB+sNYOGZyhtr2Qa6ZCHvAWTYhSRw4j/u92Stue9PbZ/6q74b9nHzi76+kVzqQHQ=="], + "@turbo/windows-arm64": ["@turbo/windows-arm64@2.11.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-dZ0/ZFH2AU/l1KdqISVkWUSnm0ufWZyiYRLDYCL+rJAhkUDMFhTZkSnYEL2O/m0tOu/Jy/EKAnZfocuyMX3LMQ=="], - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.46", "", { "os": "linux", "cpu": "arm64" }, "sha512-imyRpNEcUzFQFV2LE4jL68ErvmKEuZCbvZru77iQREunJ+bR4i658cupTgtG1mLYM3F1Tzy3Sb9xYb02KghWTg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], - "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.15.46", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ctEfcl/HcUeomK33cbySiHZm98GEDIxTm1EkpBsYCiHxElYBzvTXVeuQT2YwbUXn9XCrjiw4ipyUNk33k26qRg=="], + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], - "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.15.46", "", { "os": "linux", "cpu": "s390x" }, "sha512-DxlMdnt84TtRVTv7WL/thWyz9+QU8QZNNoAP9rrk0P68LziuhfePp8MjQ44zIprpTHTsEwyziIuGUUN5iSC1bQ=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.46", "", { "os": "linux", "cpu": "x64" }, "sha512-SKxI7J6t90XPl8hRUqtJi9NfGdunN/E/vZMc7Bc0figeRdOPDBT+Tm8g7cx9xM0T0mewh2l+8dewa3Am27/P+A=="], + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.46", "", { "os": "linux", "cpu": "x64" }, "sha512-qj9T6B7bosI0VEsrWOVXZN1OXxS8Tp63ywyrLxNdOycnUtLdkgYcoBsN5y8ImnDDsnwrEWZOy1e+J4xSe7mA3Q=="], + "@types/hast": ["@types/hast@3.0.5", "", { "dependencies": { "@types/unist": "*" } }, "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g=="], - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.46", "", { "os": "win32", "cpu": "arm64" }, "sha512-8p7l4c3LU+eA5g9Et1JPhNeMC1oQwXTGU+uah8DPIBX7YXzqswvaBtyKVmXefVGi/DJU1x3YJsc3mbAp9aWzSQ=="], + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.46", "", { "os": "win32", "cpu": "ia32" }, "sha512-tUEnfr3Bn9u6FOjUb3PN9p+09qZC2j+wNDLKHzXXZn22rqGcUqR/ohCRSS+nG9B9+X+U+3FewNEHJkTmdIvMjQ=="], + "@types/mdx": ["@types/mdx@2.0.14", "", {}, "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg=="], - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.46", "", { "os": "win32", "cpu": "x64" }, "sha512-Vux7UDzBJYQggSuPfcl2w9iu+IJpgpRCxHzgCaVkELnAXAE4XZMOTX9HNcaNiwfeIDqdu2rkr69RuDm6wY8neA=="], + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + "@types/node": ["@types/node@26.6.3", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg=="], - "@swc/types": ["@swc/types@0.1.27", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg=="], + "@types/react": ["@types/react@19.3.0", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@types/react-dom": ["@types/react-dom@19.3.0", "", { "peerDependencies": { "@types/react": "^19.3.0" } }, "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@typescript/typescript-aix-ppc64": ["@typescript/typescript-aix-ppc64@7.0.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="], + + "@typescript/typescript-darwin-arm64": ["@typescript/typescript-darwin-arm64@7.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="], + + "@typescript/typescript-darwin-x64": ["@typescript/typescript-darwin-x64@7.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="], + + "@typescript/typescript-freebsd-arm64": ["@typescript/typescript-freebsd-arm64@7.0.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="], + + "@typescript/typescript-freebsd-x64": ["@typescript/typescript-freebsd-x64@7.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="], + + "@typescript/typescript-linux-arm": ["@typescript/typescript-linux-arm@7.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="], + + "@typescript/typescript-linux-arm64": ["@typescript/typescript-linux-arm64@7.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="], + + "@typescript/typescript-linux-loong64": ["@typescript/typescript-linux-loong64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="], + + "@typescript/typescript-linux-mips64el": ["@typescript/typescript-linux-mips64el@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="], + + "@typescript/typescript-linux-ppc64": ["@typescript/typescript-linux-ppc64@7.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="], + + "@typescript/typescript-linux-riscv64": ["@typescript/typescript-linux-riscv64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="], + + "@typescript/typescript-linux-s390x": ["@typescript/typescript-linux-s390x@7.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="], + + "@typescript/typescript-linux-x64": ["@typescript/typescript-linux-x64@7.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="], + + "@typescript/typescript-netbsd-arm64": ["@typescript/typescript-netbsd-arm64@7.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="], + + "@typescript/typescript-netbsd-x64": ["@typescript/typescript-netbsd-x64@7.0.2", "", { "os": "none", "cpu": "x64" }, "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="], + + "@typescript/typescript-openbsd-arm64": ["@typescript/typescript-openbsd-arm64@7.0.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="], - "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + "@typescript/typescript-openbsd-x64": ["@typescript/typescript-openbsd-x64@7.0.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="], - "@vercel/nft": ["@vercel/nft@0.29.4", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^10.4.5", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA=="], + "@typescript/typescript-sunos-x64": ["@typescript/typescript-sunos-x64@7.0.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="], - "abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], + "@typescript/typescript-win32-arm64": ["@typescript/typescript-win32-arm64@7.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="], + + "@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.4.0", "", {}, "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ=="], + + "@webviewjs/docs": ["@webviewjs/docs@workspace:apps/docs"], + + "@webviewjs/examples": ["@webviewjs/examples@workspace:apps/examples"], + + "@webviewjs/webview": ["@webviewjs/webview@workspace:packages/webview"], + + "@yuku-analyzer/binding-android-arm64": ["@yuku-analyzer/binding-android-arm64@0.10.2", "", { "os": "android", "cpu": "arm64" }, "sha512-xt4Vy3RTBw1NfszBlf4A0Rr6ZjA/th2Pj9XlWFLQHW9A1qOCtxNCoIWSzn/INtnZLMB4jO2gWdEtSaHUtK73wA=="], + + "@yuku-analyzer/binding-darwin-arm64": ["@yuku-analyzer/binding-darwin-arm64@0.10.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ftokSqvYXZxfmA/bfIbp8c1BJ8QxNax371kUOQNFyvR5hmtKqQyTqSKtMk+WaixHM3w4tKj/JdyY+ud1bGamXA=="], + + "@yuku-analyzer/binding-darwin-x64": ["@yuku-analyzer/binding-darwin-x64@0.10.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-yUrmmhmF5R4Xmbfo8gUxJKr3YbvbLcE2JvLhDLzFJkMN29/fGm6K3dZX6YpNecfgBDnQ+VywGp8K9xjRaBFZ3Q=="], + + "@yuku-analyzer/binding-freebsd-x64": ["@yuku-analyzer/binding-freebsd-x64@0.10.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-cy9+KvVoK5Xad3Vs5pLwAeZf3JC/1y0XJElgv1q6g7W7g/n52FRjedpYmQiJeMZdnhJiAshq7Vz/Xj3jC5Ns2Q=="], + + "@yuku-analyzer/binding-linux-arm-gnu": ["@yuku-analyzer/binding-linux-arm-gnu@0.10.2", "", { "os": "linux", "cpu": "arm" }, "sha512-AgVZ6VCV2XP4yHCwyv78KLV76gcu2neiEF2+RBTPQN7sqYY+bLvMxphGPmfG+9qk5Uf1PJAhZYIUnMGVbbRCZw=="], + + "@yuku-analyzer/binding-linux-arm-musl": ["@yuku-analyzer/binding-linux-arm-musl@0.10.2", "", { "os": "linux", "cpu": "arm" }, "sha512-5qAj2GjoSN6+HuH75+g5r40CFhWmMvH0K8VKWmPfQyOgA/LonoDMr5H5O5feJwzdnfdCytPDAh1RAf7/SSg7dg=="], + + "@yuku-analyzer/binding-linux-arm64-gnu": ["@yuku-analyzer/binding-linux-arm64-gnu@0.10.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-eJvQ4Ja5oPf/HOjmBkCLYyhOHUkL7U+iMAN8sX44x8exBBpPRyqnhEgTsuU73HzxPLrGPdRhybFnAE63Omib/Q=="], + + "@yuku-analyzer/binding-linux-arm64-musl": ["@yuku-analyzer/binding-linux-arm64-musl@0.10.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-TppF2j194mOQ/kBXvNr9u5TYO+eR9r8ieg4lTIEyJIVYHAR9GWeB0oFHLcJiLXVa3qUJGzE4bmzSntCW5ylA7A=="], + + "@yuku-analyzer/binding-linux-x64-gnu": ["@yuku-analyzer/binding-linux-x64-gnu@0.10.2", "", { "os": "linux", "cpu": "x64" }, "sha512-03xu6ocJuwhm1a/JKmrHiaJUO1Oj86rABsm4FAl8AvfewfW/9idIUmPiFxZfb6RfiIONegebsTGJhFx0NbBNpA=="], + + "@yuku-analyzer/binding-linux-x64-musl": ["@yuku-analyzer/binding-linux-x64-musl@0.10.2", "", { "os": "linux", "cpu": "x64" }, "sha512-f7W2sAWWQN8x8YB0RRxIche7mLImH7lDgzUy9+B69cM2I6VFJ4a5+0pgAuMLROPOqimaxFPdXqLdDE/vpgGltg=="], + + "@yuku-analyzer/binding-win32-arm64": ["@yuku-analyzer/binding-win32-arm64@0.10.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-f534qNc5YaJI29e1oryxEnxPkp7WCYJ1j7ChSec8pQNlYqTm8Tao7hij7NxRF+9BuxzeZCZ+WsbaAfLlklR0Eg=="], + + "@yuku-analyzer/binding-win32-x64": ["@yuku-analyzer/binding-win32-x64@0.10.2", "", { "os": "win32", "cpu": "x64" }, "sha512-sKHkmLK8BsindMfyIThoN0bWC5uqSJEVNaLRD/ifA99mtb0UDin1ZCg4WYSVQAmM4k2iOTl4UZx/p3zcBiBgYw=="], + + "@yuku-toolchain/types": ["@yuku-toolchain/types@0.10.2", "", {}, "sha512-sSeo4SSSToiS+sSD+bwn/s94EEcaLJ7tG5LCp8gFYC1G5VzxzX7fqB6m9RU1yMD8KTpu6zdU/I1NlQf8hVBJ9Q=="], + + "@zeit/schemas": ["@zeit/schemas@2.36.0", "", {}, "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg=="], "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], - "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "acorn-walk": ["acorn-walk@8.3.5", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw=="], + "ajv": ["ajv@8.18.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-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], @@ -352,47 +576,55 @@ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "arch": ["arch@2.2.0", "", {}, "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ=="], - "array-find-index": ["array-find-index@1.0.2", "", {}, "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw=="], + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], - "arrgv": ["arrgv@1.0.2", "", {}, "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw=="], - - "arrify": ["arrify@3.0.0", "", {}, "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], - "ava": ["ava@6.4.1", "", { "dependencies": { "@vercel/nft": "^0.29.4", "acorn": "^8.15.0", "acorn-walk": "^8.3.4", "ansi-styles": "^6.2.1", "arrgv": "^1.0.2", "arrify": "^3.0.0", "callsites": "^4.2.0", "cbor": "^10.0.9", "chalk": "^5.4.1", "chunkd": "^2.0.1", "ci-info": "^4.3.0", "ci-parallel-vars": "^1.0.1", "cli-truncate": "^4.0.0", "code-excerpt": "^4.0.0", "common-path-prefix": "^3.0.0", "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", "debug": "^4.4.1", "emittery": "^1.2.0", "figures": "^6.1.0", "globby": "^14.1.0", "ignore-by-default": "^2.1.0", "indent-string": "^5.0.0", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", "matcher": "^5.0.0", "memoize": "^10.1.0", "ms": "^2.1.3", "p-map": "^7.0.3", "package-config": "^5.0.0", "picomatch": "^4.0.2", "plur": "^5.1.0", "pretty-ms": "^9.2.0", "resolve-cwd": "^3.0.0", "stack-utils": "^2.0.6", "strip-ansi": "^7.1.0", "supertap": "^3.0.1", "temp-dir": "^3.0.0", "write-file-atomic": "^6.0.0", "yargs": "^17.7.2" }, "peerDependencies": { "@ava/typescript": "*" }, "optionalPeers": ["@ava/typescript"], "bin": { "ava": "entrypoints/cli.mjs" } }, "sha512-vxmPbi1gZx9zhAjHBgw81w/iEDKcrokeRk/fqDTyA2DQygZ0o+dUGRHFOtX8RA5N0heGJTTsIk7+xYxitDb61Q=="], + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.26", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ=="], - "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], - "blueimp-md5": ["blueimp-md5@2.19.0", "", {}, "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w=="], + "boxen": ["boxen@7.0.0", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.0", "chalk": "^5.0.1", "cli-boxes": "^3.0.0", "string-width": "^5.1.2", "type-fest": "^2.13.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.0.1" } }, "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg=="], "brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "camelcase": ["camelcase@7.0.1", "", {}, "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="], - "callsites": ["callsites@4.2.0", "", {}, "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001814", "", {}, "sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA=="], - "cbor": ["cbor@10.0.12", "", { "dependencies": { "nofilter": "^3.0.2" } }, "sha512-exQDevYd7ZQLP4moMQcZkKCVZsXLAtUSflObr3xTh4xzFIv/xBCdvCd6L259kQOUP2kcTC0jvC6PpZIf/WmRXA=="], + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], + "chalk-template": ["chalk-template@0.4.0", "", { "dependencies": { "chalk": "^4.1.2" } }, "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], - "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], - "chunkd": ["chunkd@2.0.1", "", {}, "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ=="], + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], - "ci-parallel-vars": ["ci-parallel-vars@1.0.1", "", {}, "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg=="], + "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], @@ -400,11 +632,17 @@ "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + "clipanion": ["clipanion@4.0.0-rc.4", "", { "dependencies": { "typanion": "^3.8.0" } }, "sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q=="], - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "clipboardy": ["clipboardy@3.0.0", "", { "dependencies": { "arch": "^2.2.0", "execa": "^5.1.1", "is-wsl": "^2.2.0" } }, "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - "code-excerpt": ["code-excerpt@4.0.0", "", { "dependencies": { "convert-to-spaces": "^2.0.1" } }, "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA=="], + "cn": ["cn@0.3.3", "", { "bin": { "cn": "bin/cn.mjs" } }, "sha512-OEiyJkSpYm2kOuNOKQ+c2wmzZRG8orrb9fnObtHTbCGNx/E9KLnGcmcocItOzREKk5KzQN5I2e3BUCj563KEpw=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -412,95 +650,139 @@ "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], - "common-path-prefix": ["common-path-prefix@3.0.0", "", {}, "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="], + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], - "concordance": ["concordance@5.0.4", "", { "dependencies": { "date-time": "^3.1.0", "esutils": "^2.0.3", "fast-diff": "^1.2.0", "js-string-escape": "^1.0.1", "lodash": "^4.17.15", "md5-hex": "^3.0.1", "semver": "^7.3.2", "well-known-symbols": "^2.0.0" } }, "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw=="], + "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], - "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], - "content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "convert-to-spaces": ["convert-to-spaces@2.0.1", "", {}, "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ=="], + "content-disposition": ["content-disposition@0.5.2", "", {}, "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA=="], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], - "currently-unhandled": ["currently-unhandled@0.4.1", "", { "dependencies": { "array-find-index": "^1.0.1" } }, "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "date-time": ["date-time@3.1.0", "", { "dependencies": { "time-zone": "^1.0.0" } }, "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - "emittery": ["emittery@1.2.1", "", {}, "sha512-sFz64DCRjirhwHLxofFqxYQm6DCp6o0Ix7jwKQvuCHPn4GMRZNuBZyLPu9Ccmk/QSCAMZt6FOUqA8JZCQvA9fw=="], + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], "emnapi": ["emnapi@1.11.1", "", { "peerDependencies": { "node-addon-api": ">= 6.1.0" }, "optionalPeers": ["node-addon-api"] }, "sha512-kSRjhIcxjMFsBqk7ORvoc9aA5SBKDmecrtF5RMcmOTao0kD/zamaxsuTxMI8C1//wGUuvE7a+19pCE7AEhGVnA=="], - "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "enhanced-resolve": ["enhanced-resolve@5.26.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], "es-toolkit": ["es-toolkit@1.47.1", "", {}, "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q=="], - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "esbuild": ["esbuild@0.28.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="], "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], - "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + "estree-util-scope": ["estree-util-scope@1.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-value-to-estree": ["estree-util-value-to-estree@3.5.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], - "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], - - "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], - "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], + "fast-uri": ["fast-uri@3.1.8", "", {}, "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg=="], - "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], - - "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], - "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], + "framer-motion": ["framer-motion@13.5.0", "", { "dependencies": { "motion-dom": "^13.5.0", "motion-utils": "^13.5.0", "tslib": "^2.4.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-5KDKvhGTKKEQPWl8xg2mZRC+pGsenooz9v+ar6BpoXcD1mae4wdhvjxLaK+3jvFbge0jk4C8JeIjIC8m98z7hg=="], + + "fumadocs-core": ["fumadocs-core@16.15.17", "", { "dependencies": { "@fumari/image-size": "^0.1.1", "estree-util-value-to-estree": "^3.5.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "npm-to-yarn": "3.2.0", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.4.3", "tinyglobby": "^0.2.17", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3", "yaml": "^2.9.1", "zbsearch": "^4.0.0" }, "peerDependencies": { "@mdx-js/mdx": "*", "@mixedbread/sdk": "0.x.x", "@modelcontextprotocol/server": "2.x.x", "@orama/core": "1.x.x", "@oramacloud/client": "2.x.x", "@tanstack/react-router": "1.x.x", "@types/estree-jsx": "*", "@types/hast": "*", "@types/mdast": "*", "@types/react": "*", "algoliasearch": "5.x.x", "flexsearch": "*", "lucide-react": "*", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "react-router": "7.x.x || 8.x.x", "waku": "*", "zod": "4.x.x" }, "optionalPeers": ["@mdx-js/mdx", "@mixedbread/sdk", "@modelcontextprotocol/server", "@orama/core", "@oramacloud/client", "@tanstack/react-router", "@types/estree-jsx", "@types/hast", "@types/mdast", "@types/react", "algoliasearch", "flexsearch", "lucide-react", "next", "react", "react-dom", "react-router", "waku", "zod"] }, "sha512-Pexn60R+S5F33UccW9WoLN+LHAOIraA/VvQt1xAXmfLxitx5rIPR7B9M+5mrqECnuSPltoX843NZ//Z5j/HAOg=="], - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + "fumadocs-mdx": ["fumadocs-mdx@15.4.5", "", { "dependencies": { "@mdx-js/mdx": "^3.1.1", "@standard-schema/spec": "^1.1.0", "chokidar": "^5.0.0", "esbuild": "^0.28.2", "estree-util-value-to-estree": "^3.5.0", "github-slugger": "^2.0.0", "magic-string": "^1.4.1", "mdast-util-mdx": "^3.0.0", "picocolors": "^1.1.1", "picomatch": "^4.0.7", "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3", "yaml": "^2.9.1", "yuku-analyzer": "^0.10.2", "zod": "^4.6.5" }, "peerDependencies": { "@fumadocs/satteri": "0.x.x", "@types/mdast": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "^16.15.3", "mdast-util-directive": "*", "next": "^15.3.0 || ^16.0.0", "react": "^19.2.0", "rolldown": "*", "satteri": "^0.10.5", "vite": "7.x.x || 8.x.x" }, "optionalPeers": ["@fumadocs/satteri", "@types/mdast", "@types/mdx", "@types/react", "mdast-util-directive", "next", "react", "rolldown", "satteri", "vite"], "bin": { "fumadocs-mdx": "./bin.js" } }, "sha512-r8gzaqleN+YXgPIbkYSZ05zr89dsr67/64Ar/00Uu7dRWTIHzbgmN1nC0lB8RFNeWnrL41bOTJilhLM4PAsrbw=="], - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + "fumadocs-ui": ["@fumadocs/base-ui@16.15.17", "", { "dependencies": { "@base-ui/react": "^1.8.0", "@fuma-translate/react": "^1.0.2", "@fumadocs/tailwind": "0.1.2", "class-variance-authority": "^0.7.1", "cn": "^0.3.0", "lucide-react": "^1.47.0", "motion": "^13.4.0", "next-themes": "^0.4.6", "react-remove-scroll": "^2.7.2", "rehype-raw": "^7.0.0", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.4.3", "unist-util-visit": "^5.1.0" }, "peerDependencies": { "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "16.15.17", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "takumi-js": "*" }, "optionalPeers": ["@types/mdx", "@types/react", "next", "takumi-js"] }, "sha512-pNhs0dSjeCT0Zdjmni3y1F9qzpuSqq7u/haM43QCptD3T7xdJlCl3ZK+XgdZImfQqo0ONWzSAHiNH4ofIvKyHA=="], "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], - "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], - "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "globby": ["globby@14.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", "ignore": "^7.0.3", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], "hono": ["hono@4.12.32", "", {}, "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg=="], - "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], @@ -508,95 +790,227 @@ "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], - "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - "ignore-by-default": ["ignore-by-default@2.1.0", "", {}, "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], - "indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], - "irregular-plurals": ["irregular-plurals@3.5.0", "", {}, "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ=="], + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], - "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + "is-port-reachable": ["is-port-reachable@4.0.0", "", {}, "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig=="], "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], - "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - - "js-string-escape": ["js-string-escape@1.0.1", "", {}, "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg=="], + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], "js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "json-parse-even-better-errors": ["json-parse-even-better-errors@4.0.0", "", {}, "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "json-with-bigint": ["json-with-bigint@3.5.8", "", {}, "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lint-staged": ["lint-staged@15.5.2", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^13.1.0", "debug": "^4.4.0", "execa": "^8.0.1", "lilconfig": "^3.1.3", "listr2": "^8.2.5", "micromatch": "^4.0.8", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.7.0" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w=="], "listr2": ["listr2@8.3.3", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ=="], - "load-json-file": ["load-json-file@7.0.1", "", {}, "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ=="], + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], - "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + "lucide-react": ["lucide-react@1.49.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-ApfaNM4/7jBrVopqLJ84Jz8TMQ1Q1JeZ1PmKh25aeS3E1FTVcMkSh1bEQB7dfzdIrwXRP8p3z4AJjTIHHb5IIA=="], + + "magic-string": ["magic-string@1.4.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" } }, "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], - "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], - "matcher": ["matcher@5.0.0", "", { "dependencies": { "escape-string-regexp": "^5.0.0" } }, "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw=="], + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], - "md5-hex": ["md5-hex@3.0.1", "", { "dependencies": { "blueimp-md5": "^2.10.0" } }, "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw=="], + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], - "memoize": ["memoize@10.2.0", "", { "dependencies": { "mimic-function": "^5.0.1" } }, "sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA=="], + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-character": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-wgyJtgUkUcdU7zci7uuwc/tzoAhm0TswWhaXuvnWolqug+8jY7bgNkBBL0dYBnHgc/tHL7lCzRdPsdUxUKKBqw=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], "memorystream": ["memorystream@0.3.1", "", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="], "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + "micromark": ["micromark@4.0.3", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-edit-map": "^1.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.4", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.1.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-edit-map": "^1.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.3" } }, "sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.2", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-edit-map": ["micromark-util-edit-map@1.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.3", "", {}, "sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@2.1.18", "", { "dependencies": { "mime-db": "~1.33.0" } }, "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ=="], + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], - "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "motion": ["motion@13.5.0", "", { "dependencies": { "framer-motion": "^13.5.0", "tslib": "^2.4.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-W/Vj6RDg9f9yJoaS+ohRYtl1j3Rb86fOCCjzn3M3M10Dg7ap3M7sMUeQs9wTsLQwHHmhioYsJLRRRTXxvhtHDA=="], - "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + "motion-dom": ["motion-dom@13.5.0", "", { "dependencies": { "motion-utils": "^13.5.0" } }, "sha512-mSdelbdqc1LDi3m7RkYgnMgdys0qSDsNFpdf0Hjyf8U5Ln0AcjSeApKD4Q4Er3sBPFDzdLehDj4SLgwBf39poQ=="], + + "motion-utils": ["motion-utils@13.5.0", "", {}, "sha512-Hqe/sqjIKliPZg8sVjWAkdySDPJNIeKH+euVkDOG8ri3DUUU7ZjndmHsGqEPz2iHpiyVaV5I22iguCMHU2he+Q=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], - "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "nanoid": ["nanoid@3.3.19", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug=="], - "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], - "nodeia": ["nodeia@0.0.1", "", { "dependencies": { "ws": "^8.17.0" } }, "sha512-af5FSiymYMQtl08oWx1eCc6Yt2Of681+YOBEIhZ+2sPNzKS8Hpe/cDpMKJCHx+Smit0yJux4YUcIKpOLdwwiMw=="], + "next": ["next@16.3.5", "", { "dependencies": { "@next/env": "16.3.5", "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.5.23", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.3.5", "@next/swc-darwin-x64": "16.3.5", "@next/swc-linux-arm64-gnu": "16.3.5", "@next/swc-linux-arm64-musl": "16.3.5", "@next/swc-linux-x64-gnu": "16.3.5", "@next/swc-linux-x64-musl": "16.3.5", "@next/swc-win32-arm64-msvc": "16.3.5", "@next/swc-win32-x64-msvc": "16.3.5", "sharp": "^0.35.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-MdtsTgzyfCPRLC6uJ1mN8ao7lyJ4BB0U6Inhnx3gta1UcCIdHK3yxLG0E8OWQteWD8/Q0qb8A5o7wJaL8M9y2w=="], - "nofilter": ["nofilter@3.1.0", "", {}, "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g=="], + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], - "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], + "nodeia": ["nodeia@0.0.1", "", { "dependencies": { "ws": "^8.17.0" } }, "sha512-af5FSiymYMQtl08oWx1eCc6Yt2Of681+YOBEIhZ+2sPNzKS8Hpe/cDpMKJCHx+Smit0yJux4YUcIKpOLdwwiMw=="], "npm-normalize-package-bin": ["npm-normalize-package-bin@4.0.0", "", {}, "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w=="], @@ -604,63 +1018,117 @@ "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + "npm-to-yarn": ["npm-to-yarn@3.2.0", "", {}, "sha512-K1HmQeZT2HrjpsR6KgqbN2FAXL2NrJJmNUSD9ck7HGTVu1JKXox8n9SB+tjbU8m8JGLF4OscrroPepew/L7/Xw=="], + "obug": ["obug@2.1.3", "", {}, "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg=="], + "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], - "oxc-resolver": ["oxc-resolver@11.21.3", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.21.3", "@oxc-resolver/binding-android-arm64": "11.21.3", "@oxc-resolver/binding-darwin-arm64": "11.21.3", "@oxc-resolver/binding-darwin-x64": "11.21.3", "@oxc-resolver/binding-freebsd-x64": "11.21.3", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.21.3", "@oxc-resolver/binding-linux-arm-musleabihf": "11.21.3", "@oxc-resolver/binding-linux-arm64-gnu": "11.21.3", "@oxc-resolver/binding-linux-arm64-musl": "11.21.3", "@oxc-resolver/binding-linux-ppc64-gnu": "11.21.3", "@oxc-resolver/binding-linux-riscv64-gnu": "11.21.3", "@oxc-resolver/binding-linux-riscv64-musl": "11.21.3", "@oxc-resolver/binding-linux-s390x-gnu": "11.21.3", "@oxc-resolver/binding-linux-x64-gnu": "11.21.3", "@oxc-resolver/binding-linux-x64-musl": "11.21.3", "@oxc-resolver/binding-openharmony-arm64": "11.21.3", "@oxc-resolver/binding-wasm32-wasi": "11.21.3", "@oxc-resolver/binding-win32-arm64-msvc": "11.21.3", "@oxc-resolver/binding-win32-x64-msvc": "11.21.3" } }, "sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA=="], + "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], - "oxlint": ["oxlint@0.13.2", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "0.13.2", "@oxlint/darwin-x64": "0.13.2", "@oxlint/linux-arm64-gnu": "0.13.2", "@oxlint/linux-arm64-musl": "0.13.2", "@oxlint/linux-x64-gnu": "0.13.2", "@oxlint/linux-x64-musl": "0.13.2", "@oxlint/win32-arm64": "0.13.2", "@oxlint/win32-x64": "0.13.2" }, "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-R7wXUspM75TeEXaAFLmuPH0W3h5B5r6BNtOvkcnVddD3BWbBiEOWe9bCqt4+te0l8wQ4a0/XLCGrJroxFFeajg=="], + "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], - "p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="], + "oxlint": ["oxlint@0.13.2", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "0.13.2", "@oxlint/darwin-x64": "0.13.2", "@oxlint/linux-arm64-gnu": "0.13.2", "@oxlint/linux-arm64-musl": "0.13.2", "@oxlint/linux-x64-gnu": "0.13.2", "@oxlint/linux-x64-musl": "0.13.2", "@oxlint/win32-arm64": "0.13.2", "@oxlint/win32-x64": "0.13.2" }, "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-R7wXUspM75TeEXaAFLmuPH0W3h5B5r6BNtOvkcnVddD3BWbBiEOWe9bCqt4+te0l8wQ4a0/XLCGrJroxFFeajg=="], - "package-config": ["package-config@5.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "load-json-file": "^7.0.1" } }, "sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], - "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + "path-is-inside": ["path-is-inside@1.0.2", "", {}, "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "path-to-regexp": ["path-to-regexp@3.3.0", "", {}, "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw=="], - "path-type": ["path-type@6.0.0", "", {}, "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pidtree": ["pidtree@0.6.1", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-e0F9AOF1JMrCfBsyJOwU9lNvQ0WtXTq0j/4jk0BQ5JSI9VAybPXmDpPRw/2FQ3e5d3ZFN1mLh7jW99m/jjaptw=="], - "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - - "plur": ["plur@5.1.0", "", { "dependencies": { "irregular-plurals": "^3.3.0" } }, "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg=="], + "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=="], "prettier": ["prettier@3.9.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="], - "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], + "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], + + "range-parser": ["range-parser@1.2.0", "", {}, "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "react": ["react@19.3.0", "", {}, "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog=="], - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "react-dom": ["react-dom@19.3.0", "", { "dependencies": { "scheduler": "^0.28.0" }, "peerDependencies": { "react": "^19.3.0" } }, "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], "read-package-json-fast": ["read-package-json-fast@4.0.0", "", { "dependencies": { "json-parse-even-better-errors": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" } }, "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], - "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], - "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], - "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "registry-auth-token": ["registry-auth-token@3.3.2", "", { "dependencies": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" } }, "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ=="], + + "registry-url": ["registry-url@3.1.0", "", { "dependencies": { "rc": "^1.0.1" } }, "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "reselect": ["reselect@5.3.0", "", {}, "sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "scheduler": ["scheduler@0.28.0", "", {}, "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw=="], + + "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="], + "semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="], - "serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], + "serve": ["serve@14.2.6", "", { "dependencies": { "@zeit/schemas": "2.36.0", "ajv": "8.18.0", "arg": "5.0.2", "boxen": "7.0.0", "chalk": "5.0.1", "chalk-template": "0.4.0", "clipboardy": "3.0.0", "compression": "1.8.1", "is-port-reachable": "4.0.0", "serve-handler": "6.1.7", "update-check": "1.5.4" }, "bin": { "serve": "build/main.js" } }, "sha512-QEjUSA+sD4Rotm1znR8s50YqA3kYpRGPmtd5GlFxbaL9n/FdUNbqMhxClqdditSk0LlZyA/dhud6XNRTOC9x2Q=="], + + "serve-handler": ["serve-handler@6.1.7", "", { "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "mime-types": "2.1.18", "minimatch": "3.1.5", "path-is-inside": "1.0.2", "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg=="], + + "sharp": ["sharp@0.35.5", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.5", "@img/sharp-darwin-x64": "0.35.5", "@img/sharp-freebsd-wasm32": "0.35.5", "@img/sharp-libvips-darwin-arm64": "1.3.4", "@img/sharp-libvips-darwin-x64": "1.3.4", "@img/sharp-libvips-linux-arm": "1.3.4", "@img/sharp-libvips-linux-arm64": "1.3.4", "@img/sharp-libvips-linux-ppc64": "1.3.4", "@img/sharp-libvips-linux-riscv64": "1.3.4", "@img/sharp-libvips-linux-s390x": "1.3.4", "@img/sharp-libvips-linux-x64": "1.3.4", "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", "@img/sharp-libvips-linuxmusl-x64": "1.3.4", "@img/sharp-linux-arm": "0.35.5", "@img/sharp-linux-arm64": "0.35.5", "@img/sharp-linux-ppc64": "0.35.5", "@img/sharp-linux-riscv64": "0.35.5", "@img/sharp-linux-s390x": "0.35.5", "@img/sharp-linux-x64": "0.35.5", "@img/sharp-linuxmusl-arm64": "0.35.5", "@img/sharp-linuxmusl-x64": "0.35.5", "@img/sharp-webcontainers-wasm32": "0.35.5", "@img/sharp-win32-arm64": "0.35.5", "@img/sharp-win32-ia32": "0.35.5", "@img/sharp-win32-x64": "0.35.5" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -668,158 +1136,218 @@ "shell-quote": ["shell-quote@1.8.4", "", {}, "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ=="], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "shiki": ["shiki@4.5.0", "", { "dependencies": { "@shikijs/core": "4.5.0", "@shikijs/engine-javascript": "4.5.0", "@shikijs/engine-oniguruma": "4.5.0", "@shikijs/langs": "4.5.0", "@shikijs/themes": "4.5.0", "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ=="], - "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "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=="], + "source-map-js": ["source-map-js@1.2.2", "", {}, "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="], - "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - - "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], - "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], - "supertap": ["supertap@3.0.1", "", { "dependencies": { "indent-string": "^5.0.0", "js-yaml": "^3.14.1", "serialize-error": "^7.0.1", "strip-ansi": "^7.0.1" } }, "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "@babel/core": "*", "babel-plugin-macros": "*", "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "optionalPeers": ["@babel/core", "babel-plugin-macros"] }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "tar": ["tar@7.5.16", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w=="], + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], - "temp-dir": ["temp-dir@3.0.0", "", {}, "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw=="], + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], - "time-zone": ["time-zone@1.0.0", "", {}, "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA=="], + "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "turbo": ["turbo@2.11.6", "", { "optionalDependencies": { "@turbo/darwin-64": "2.11.6", "@turbo/darwin-arm64": "2.11.6", "@turbo/linux-64": "2.11.6", "@turbo/linux-arm64": "2.11.6", "@turbo/windows-64": "2.11.6", "@turbo/windows-arm64": "2.11.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-UppAr5XEHLfVdVp75nd+tzPp/wVEwS7Ken9aYjMlBnHqXynKn9IcQHd6GDOXBxDViSjpS+SzJcOF86v9Hf8GfQ=="], + "typanion": ["typanion@3.14.0", "", {}, "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug=="], - "type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="], + + "undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], - "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], - "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], "universal-user-agent": ["universal-user-agent@7.0.3", "", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="], - "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "update-check": ["update-check@1.5.4", "", { "dependencies": { "registry-auth-token": "3.3.2", "registry-url": "3.1.0" } }, "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], - "well-known-symbols": ["well-known-symbols@2.0.0", "", {}, "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q=="], + "use-sync-external-store": ["use-sync-external-store@1.7.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A=="], - "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], "which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + "widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="], + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], - "write-file-atomic": ["write-file-atomic@6.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ=="], + "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + "yuku-analyzer": ["yuku-analyzer@0.10.2", "", { "dependencies": { "@yuku-toolchain/types": "^0.10.2", "yuku-ast": "^0.10.2" }, "optionalDependencies": { "@yuku-analyzer/binding-android-arm64": "0.10.2", "@yuku-analyzer/binding-darwin-arm64": "0.10.2", "@yuku-analyzer/binding-darwin-x64": "0.10.2", "@yuku-analyzer/binding-freebsd-x64": "0.10.2", "@yuku-analyzer/binding-linux-arm-gnu": "0.10.2", "@yuku-analyzer/binding-linux-arm-musl": "0.10.2", "@yuku-analyzer/binding-linux-arm64-gnu": "0.10.2", "@yuku-analyzer/binding-linux-arm64-musl": "0.10.2", "@yuku-analyzer/binding-linux-x64-gnu": "0.10.2", "@yuku-analyzer/binding-linux-x64-musl": "0.10.2", "@yuku-analyzer/binding-win32-arm64": "0.10.2", "@yuku-analyzer/binding-win32-x64": "0.10.2" } }, "sha512-UBRcDcZtIn14g88loZUZ123d6MOkc2hMTawUle5MkuWboowM90KbWHN3Zz+HfuS06sw935ygecBpcJlXHB/pOA=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + "yuku-ast": ["yuku-ast@0.10.2", "", { "dependencies": { "@yuku-toolchain/types": "^0.10.2" } }, "sha512-UnG9mA6giglCvSErft2/40TVFX750Sj1xgwddPLpG7J7rlr/P1wPADg9G2RK+d/1tNLtRVoLdMMOMVBB9561TQ=="], - "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + "zbsearch": ["zbsearch@4.0.1", "", {}, "sha512-lmnEEnb93QQcNv7qARDr7jBVPxYdZbZ9XdZ0dbZ0qaOvGne4jJMW4fjwPfVaUKQXv3FNWvGbDwRDgyaSb1pc8w=="], - "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + "zod": ["zod@4.6.5", "", {}, "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + + "@tailwindcss/node/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], - "yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "@webviewjs/webview/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "@node-rs/xxhash-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + "boxen/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "chalk-template/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "cli-truncate/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "clipboardy/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "fumadocs-core/yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], + + "fumadocs-mdx/yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], + "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + "mime-types/mime-db": ["mime-db@1.33.0", "", {}, "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="], + + "next/postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], - "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], - "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "serve/chalk": ["chalk@5.0.1", "", {}, "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w=="], - "string-width-cjs/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "serve-handler/bytes": ["bytes@3.0.0", "", {}, "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="], - "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "serve-handler/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "sharp/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], - "supertap/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], - "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "ansi-align/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "chalk-template/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "cli-truncate/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "cliui/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "clipboardy/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "clipboardy/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "clipboardy/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "clipboardy/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], - "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + "clipboardy/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "clipboardy/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "supertap/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "clipboardy/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "wrap-ansi-cjs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], - "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "serve-handler/minimatch/brace-expansion": ["brace-expansion@1.1.21", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw=="], - "yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "clipboardy/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], } } diff --git a/lib/augmentations.ts b/lib/augmentations.ts deleted file mode 100644 index ba13538..0000000 --- a/lib/augmentations.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { EventEmitter } from 'node:events'; -import type { ApplicationRunOptions } from '../js-bindings'; -import type { ApplicationEventMap, ApplicationWhenReadyOptions } from './types/application'; -import type { BrowserWindowEventMap, BrowserWindowProtocolHandler } from './types/browser-window'; -import type { NodeEventMap } from './internal/events/event-emitter'; -import type { TrayEventMap } from './types/tray-icon'; -import type { ExposedTarget, WebviewEventMap, WebviewOptions as PublicWebviewOptions } from './types/webview'; -import type { ApplicationEvent, IpcMessage } from '../js-bindings'; - -declare module '../js-bindings' { - interface Application extends EventEmitter> { - run(options?: ApplicationRunOptions | null): void; - stop(): void; - whenReady(options?: ApplicationWhenReadyOptions): Promise; - onEvent(handler?: ((event: ApplicationEvent) => void) | null): void; - bind(handler?: ((event: ApplicationEvent) => void) | null): void; - [Symbol.dispose](): void; - } - - interface BrowserWindow extends EventEmitter> { - registerProtocol(name: string, handler: BrowserWindowProtocolHandler): void; - createWebview(options?: PublicWebviewOptions | null): Webview; - [Symbol.dispose](): void; - } - - interface Webview extends EventEmitter> { - onIpcMessage(handler?: ((message: IpcMessage) => void) | null): void; - expose(name: string, target: ExposedTarget): void; - [Symbol.dispose](): void; - } - - interface TrayIcon extends EventEmitter> { - [Symbol.dispose](): void; - } - - interface WebContext { - [Symbol.dispose](): void; - } -} - -export {}; diff --git a/lib/errors/serialization-error.ts b/lib/errors/serialization-error.ts deleted file mode 100644 index 856cf99..0000000 --- a/lib/errors/serialization-error.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class SerializationError extends Error { - constructor(message: string) { - super(message); - this.name = 'SerializationError'; - } -} diff --git a/lib/types/application.ts b/lib/types/application.ts deleted file mode 100644 index 49478ff..0000000 --- a/lib/types/application.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { ApplicationEvent as NativeApplicationEvent } from '../../js-bindings'; - -export type { ApplicationOptions, ApplicationRunOptions, MenuOptions } from '../../js-bindings'; - -export interface ApplicationEventMap { - 'window-close-requested': NativeApplicationEvent; - 'application-close-requested': NativeApplicationEvent; - 'custom-menu-click': NativeApplicationEvent; - ready: NativeApplicationEvent; -} - -export type ApplicationWhenReadyOptions = - | { - autoRun?: true; - interval?: number; - ref?: boolean; - } - | { - autoRun: false; - interval?: never; - ref?: never; - }; diff --git a/lib/types/browser-window.ts b/lib/types/browser-window.ts deleted file mode 100644 index 85aeb7e..0000000 --- a/lib/types/browser-window.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type { CustomProtocolResponse, WebviewEventPayload, WebviewNewWindowFeatures } from '../../js-bindings'; - -export type { BrowserWindowOptions, CustomProtocolResponse, FileDialogOptions } from '../../js-bindings'; - -export interface WindowMoveEvent { - event: string; - x: number; - y: number; -} - -export interface WindowResizeEvent { - event: string; - width: number; - height: number; -} - -export interface WindowMouseEvent { - event: string; - x: number; - y: number; - button?: number; - modifiers?: number; -} - -export interface WindowScrollEvent { - event: string; - deltaX: number; - deltaY: number; -} - -export interface WindowBaseEvent { - event: string; -} - -export interface BrowserWindowCloseEvent extends WindowBaseEvent { - readonly event: 'close'; - readonly defaultPrevented: boolean; - preventDefault(): void; -} - -export interface WindowKeyEvent { - event: string; - key?: string; - code?: string; - modifiers?: number; - isRepeat?: boolean; -} - -export interface WindowFileEvent { - event: string; - files?: string[]; -} - -export interface WindowScaleEvent { - event: string; - scaleFactor: number; -} - -export interface WindowThemeEvent { - event: string; - text: 'light' | 'dark'; -} - -export interface WindowImeEvent { - event: string; - text?: string; - phase: 'enabled' | 'preedit' | 'commit' | 'disabled'; -} - -export interface WindowTouchEvent { - event: string; - x: number; - y: number; - touchId: number; - phase: 'started' | 'moved' | 'ended' | 'cancelled'; -} - -export interface BrowserWindowEventMap { - move: WindowMoveEvent; - resize: WindowResizeEvent; - close: BrowserWindowCloseEvent; - focus: WindowBaseEvent; - blur: WindowBaseEvent; - 'mouse-enter': WindowMouseEvent; - 'mouse-leave': WindowBaseEvent; - 'mouse-move': WindowMouseEvent; - 'mouse-down': WindowMouseEvent; - 'mouse-up': WindowMouseEvent; - scroll: WindowScrollEvent; - 'key-down': WindowKeyEvent; - 'key-up': WindowKeyEvent; - 'file-drop': WindowFileEvent; - 'file-hover': WindowFileEvent; - 'file-hover-cancelled': WindowBaseEvent; - 'scale-factor-changed': WindowScaleEvent; - 'theme-changed': WindowThemeEvent; - ime: WindowImeEvent; - touch: WindowTouchEvent; -} - -export type BrowserWindowProtocolHandler = ( - request: Request, -) => Response | CustomProtocolResponse | Promise; - -export interface PublicNewWindowEvent extends WebviewEventPayload { - event: 'new-window'; - target?: 'new-window'; - windowFeatures?: WebviewNewWindowFeatures; -} diff --git a/lib/types/tray-icon.ts b/lib/types/tray-icon.ts deleted file mode 100644 index 8b8670c..0000000 --- a/lib/types/tray-icon.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { TrayEventPayload } from '../../js-bindings'; - -export type TrayEventMap = { - click: TrayEventPayload; - 'double-click': TrayEventPayload; - enter: TrayEventPayload; - move: TrayEventPayload; - leave: TrayEventPayload; -}; diff --git a/package.json b/package.json index 9763a2e..5d26b84 100644 --- a/package.json +++ b/package.json @@ -1,117 +1,37 @@ { - "name": "@webviewjs/webview", - "version": "0.4.7", - "bin": { - "webview": "./cli/index.mjs", - "webviewjs": "./cli/index.mjs" - }, - "description": "Robust cross-platform webview library for Node.js written in Rust. It also works with deno and bun.", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "repository": "git@github.com:webviewjs/webview.git", - "license": "MIT", - "type": "commonjs", - "keywords": [ - "webview", - "node", - "rust", - "cross-platform", - "gui" - ], - "files": [ - "cli", - "dist", - "js-bindings.js", - "js-bindings.d.ts", - "docs" + "name": "webviewjs", + "private": true, + "packageManager": "bun@1.3.14", + "workspaces": [ + "apps/*", + "packages/*" ], - "napi": { - "binaryName": "webview", - "targets": [ - "x86_64-pc-windows-msvc", - "i686-pc-windows-msvc", - "aarch64-pc-windows-msvc", - "x86_64-apple-darwin", - "aarch64-apple-darwin", - "x86_64-unknown-linux-gnu", - "i686-unknown-linux-gnu", - "aarch64-unknown-linux-gnu", - "armv7-unknown-linux-gnueabihf", - "aarch64-linux-android", - "armv7-linux-androideabi", - "x86_64-unknown-freebsd" - ], - "constEnum": false - }, - "engines": { - "node": ">= 24" - }, - "publishConfig": { - "registry": "https://registry.npmjs.org/", - "access": "public" - }, "scripts": { - "artifacts": "napi artifacts", - "build": "run-s build:native build:lib", - "build:native": "node ./scripts/build.js --release", - "build:lib": "run-s build:lib:clean build:lib:tsc", - "build:lib:clean": "node ./scripts/clean-lib.js", - "build:lib:tsc": "tsc -p tsconfig.json", - "build:debug": "run-s build:native:debug build:lib", - "build:native:debug": "node ./scripts/build.js", - "clean": "napi clean && cargo clean", - "format": "run-p format:prettier format:rs", - "format:prettier": "prettier . -w", - "format:rs": "cargo fmt", + "dev": "turbo run dev", + "build": "turbo run build", + "test": "turbo run test", "lint": "oxlint .", "lint:fix": "oxlint --fix .", - "test": "run-s build:lib test:node", - "test:node": "node --test __test__/*.test.*", - "test:watch": "run-s build:lib test:watch:node", - "test:watch:node": "node --test --watch __test__/*.test.*", - "prepublishOnly": "run-s build prepublish:napi", - "prepublish:napi": "napi prepublish -t npm", - "version": "napi version", - "check": "cargo check", - "clippy": "cargo clippy -- -D warnings", - "docs": "cargo doc --no-deps --open", - "update": "bun update", - "setup": "bash ./scripts/install-linux-deps.sh" - }, - "devDependencies": { - "@napi-rs/cli": "^3.7.4", - "@swc-node/register": "^1.12.1", - "@swc/core": "^1.15.46", - "@types/node": "^26.1.1", - "ava": "^6.4.1", - "chalk": "^5.6.2", - "hono": "^4.12.32", - "husky": "^9.1.7", - "lint-staged": "^15.5.2", - "nodeia": "^0.0.1", - "npm-run-all2": "^7.0.2", - "oxlint": "^0.13.2", - "prettier": "^3.9.6", - "tinybench": "^2.9.0", - "typescript": "^5.9.3" + "format": "prettier --write . && cargo fmt --manifest-path packages/webview/Cargo.toml", + "format:check": "prettier --check . && cargo fmt --manifest-path packages/webview/Cargo.toml -- --check", + "check": "turbo run check", + "clippy": "turbo run clippy", + "prepare": "husky" }, "lint-staged": { - "*.@(js|ts|tsx)": [ - "oxlint --fix" + "*.{js,mjs,cjs,ts,tsx}": [ + "oxlint --fix", + "prettier --write" ], - "*.@(js|ts|tsx|yml|yaml|md|json)": [ + "*.{json,yml,yaml,md,mdx,css}": [ "prettier --write" ] }, - "prettier": { - "printWidth": 120, - "semi": true, - "trailingComma": "all", - "singleQuote": true, - "arrowParens": "always", - "endOfLine": "lf", - "tabWidth": 2, - "useTabs": false - }, - "packageManager": "bun@1.3.14" + "devDependencies": { + "husky": "^9.1.7", + "lint-staged": "^15.5.2", + "oxlint": "^0.13.2", + "prettier": "^3.9.6", + "turbo": "^2.11.6" + } } diff --git a/Cargo.toml b/packages/webview/Cargo.toml similarity index 100% rename from Cargo.toml rename to packages/webview/Cargo.toml diff --git a/packages/webview/LICENSE b/packages/webview/LICENSE new file mode 100644 index 0000000..4703bdb --- /dev/null +++ b/packages/webview/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Twilight + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/webview/README.md b/packages/webview/README.md new file mode 100644 index 0000000..9f1a799 --- /dev/null +++ b/packages/webview/README.md @@ -0,0 +1,597 @@ +# `@webviewjs/webview` + +[![CI](https://github.com/webviewjs/webview/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/webviewjs/webview/actions/workflows/CI.yml) +[![npm](https://img.shields.io/npm/v/%40webviewjs%2Fwebview?logo=npm)](https://www.npmjs.com/package/@webviewjs/webview) +[![License](https://img.shields.io/github/license/webviewjs/webview)](https://github.com/webviewjs/webview/blob/main/LICENSE) + +Build lightweight native desktop applications with JavaScript and the webview +engine already provided by the operating system. WebviewJS is a typed N-API +binding to [tao](https://github.com/tauri-apps/tao) and +[wry](https://github.com/tauri-apps/wry), with a small JavaScript surface and +first-class support for Node.js, Bun, and Deno. + +It is a good fit for utilities, internal tools, desktop companions, and +existing web applications that need a native window without bundling a second +browser engine. + +[Get started](https://webview.js.org/getting-started/quick-start) · +[API reference](https://webview.js.org/api/application) · +[Examples](https://github.com/webviewjs/webview/tree/main/apps/examples) · +[Platform notes](https://webview.js.org/platform/linux) + +![WebviewJS preview](https://github.com/webviewjs/webview/raw/main/assets/preview.png) + +## Highlights + +- Native windows backed by WebView2, WebKit, or WebKitGTK instead of a bundled browser runtime. +- Non-blocking event pumping that keeps ordinary JavaScript timers and I/O responsive. +- Typed APIs for windows, webviews, menus, dialogs, cookies, DevTools, and window controls. +- Shared browser contexts for profiles, cookies, cache, storage, and automation. +- System tray icons, native notifications, and platform-specific window extensions. +- IPC through `window.ipc.postMessage()` plus Promise-based `webview.expose()` namespaces. +- Fetch-compatible asynchronous custom protocols, including Hono routing without an HTTP server. +- A CLI for compiling Node.js, Deno, or Bun applications into standalone executables. + +> [!NOTE] +> WebviewJS provides the native window and webview layer. It is intentionally +> smaller than an application framework such as Electron or Tauri, so you can +> choose your own frontend, routing, state management, and build tools. + +## Documentation + +The complete documentation is available at [webview.js.org](https://webview.js.org). Documentation tools and assistants can use [`llms.txt`](https://webview.js.org/llms.txt), the full [`llms-full.txt`](https://webview.js.org/llms-full.txt), or per-page Markdown such as [`/api/application.md`](https://webview.js.org/api/application.md). + +### Getting started + +| | | +| ------------------------------------------------------------------- | ------------------------------- | +| [Installation](https://webview.js.org/getting-started/installation) | System requirements and setup | +| [Quick Start](https://webview.js.org/getting-started/quick-start) | Your first window in minutes | +| [Event Loop](https://webview.js.org/getting-started/event-loop) | How the non-blocking pump works | + +### API reference + +| | | +| ---------------------------------------------------------- | ----------------------------------------------------- | +| [Application](https://webview.js.org/api/application) | Root object, event loop, windows, menus | +| [BrowserWindow](https://webview.js.org/api/browser-window) | OS window, size, position, cursor, decorations | +| [Webview](https://webview.js.org/api/webview) | Embedded browser, navigation, cookies, script, bounds | +| [WebContext](https://webview.js.org/api/web-context) | Shared browser data, profiles, and automation | +| [System Tray](https://webview.js.org/api/tray) | Tray icons, menus, updates, and pointer events | +| [Notification](https://webview.js.org/api/notification) | Native desktop notifications and lifecycle events | +| [Menu](https://webview.js.org/api/menu) | Native menu bar construction | +| [Types](https://webview.js.org/api/types) | Shared interfaces and enums | + +### Guides + +| | | +| -------------------------------------------------------------------------- | ----------------------------------------------- | +| [Building Executables](https://webview.js.org/guides/building-executables) | Compile to `.exe` / binary with node, deno, bun | +| [IPC Messaging](https://webview.js.org/guides/ipc-messaging) | Page ↔ Node communication | +| [Menus](https://webview.js.org/guides/menus) | Building menu bars with roles and accelerators | +| [Multiple Windows](https://webview.js.org/guides/multiple-windows) | Managing several windows | +| [Cookies & Storage](https://webview.js.org/guides/cookies-and-storage) | Reading, writing, and clearing cookies | +| [Custom Protocols](https://webview.js.org/guides/custom-protocols) | Serving local content to the webview | + +### Platform notes + +| | | +| -------------------------------------------------- | ----------------------------------------- | +| [Windows](https://webview.js.org/platform/windows) | WebView2, taskbar, DPI | +| [macOS](https://webview.js.org/platform/macos) | WebKit, main-thread requirement, app menu | +| [Linux](https://webview.js.org/platform/linux) | WebKitGTK, Wayland/X11, menu limitations | +| [iOS](https://webview.js.org/platform/ios) | Orientation, status bar, and gestures | +| [Android](https://webview.js.org/platform/android) | Content rectangle and configuration | + +## Installation + +Install the package with your preferred JavaScript package manager. The native +platform package is resolved automatically through optional dependencies. + +```bash +npm install @webviewjs/webview +# or +bun add @webviewjs/webview +# or +pnpm add @webviewjs/webview +``` + +Keep optional dependencies enabled when installing. They contain the native +addon selected for the current operating system and architecture. + +### System requirements + +| Platform | Requirements | +| --------------- | ----------------------------------------------------------------------------------------------------------- | +| Windows | WebView2. It ships with Windows 11 and current Edge installations; Windows 10 can install it automatically. | +| macOS | macOS 10.15 Catalina or later. WebKit is built in. | +| Linux | WebKitGTK 4.1 and `libxdo`. See the [Linux platform guide](https://webview.js.org/platform/linux). | +| Android and iOS | Native project setup and platform SDKs. See the [hosted documentation](https://webview.js.org). | + +For distribution and platform-specific behavior, review the complete +[installation guide](https://webview.js.org/getting-started/installation) before shipping. + +## Supported platforms + +| Target | Platform | Architecture | Status | Notes | +| ------------------------------- | -------- | ------------ | ------------ | ---------------------------------------------- | +| `x86_64-pc-windows-msvc` | Windows | x64 | Supported | WebView2 | +| `i686-pc-windows-msvc` | Windows | x86 | Supported | WebView2 | +| `aarch64-pc-windows-msvc` | Windows | arm64 | Supported | WebView2 | +| `x86_64-apple-darwin` | macOS | x64 | Supported | WebKit | +| `aarch64-apple-darwin` | macOS | arm64 | Supported | WebKit | +| `x86_64-unknown-linux-gnu` | Linux | x64 | Supported | WebKitGTK 4.1, X11, and Wayland | +| `i686-unknown-linux-gnu` | Linux | x86 | Supported | WebKitGTK 4.1, X11, and Wayland | +| `aarch64-unknown-linux-gnu` | Linux | arm64 | Supported | WebKitGTK 4.1, X11, and Wayland | +| `armv7-unknown-linux-gnueabihf` | Linux | armv7 | Supported | WebKitGTK 4.1, X11, and Wayland | +| `aarch64-linux-android` | Android | arm64 | Experimental | Platform APIs are still evolving | +| `armv7-linux-androideabi` | Android | armv7 | Experimental | Platform APIs are still evolving | +| `x86_64-unknown-freebsd` | FreeBSD | x64 | Stub | Package resolution only; no GUI implementation | + +## Examples + +### Quick start + +```js +import { Application } from '@webviewjs/webview'; + +const app = new Application(); +const window = app.createBrowserWindow({ + title: 'WebviewJS', + width: 1024, + height: 768, +}); + +window.createWebview({ url: 'https://example.com' }); +app.run(); +``` + +For CommonJS projects, use the same API through `require()`: + +```js +const { Application } = require('@webviewjs/webview'); + +const app = new Application(); +const window = app.createBrowserWindow({ title: 'WebviewJS' }); +window.createWebview({ html: '

    Hello from WebviewJS

    ' }); +app.run(); +``` + +The application owns native resources created through it. Call `app.exit()` +when your application needs to shut down explicitly: + +```js +process.on('SIGINT', () => { + app.exit(); +}); +``` + +### Event pumping + +`app.whenReady()` starts the non-blocking event pump by default: + +```js +await app.whenReady({ interval: 16, ref: true }); +``` + +For manual startup, disable auto-run: + +```js +const ready = app.whenReady({ autoRun: false }); +app.run({ interval: 16, ref: true }); +await ready; +``` + +`interval` defaults to `16` milliseconds and `ref` defaults to `true`. Use `app.pumpEvents()` for manual pumping. + +### System tray + +Keep a strong JavaScript reference when you need to call tray methods or keep +its listeners reachable: + +```js +let tray = null; + +app.whenReady().then(() => { + tray = app.createTrayIcon({ + id: 'main', + icon: { data: rgba, width: 16, height: 16 }, + tooltip: 'My application', + menu: { items: [{ id: 'quit', label: 'Quit' }] }, + }); + + tray.on('click', (event) => console.log(event)); +}); +``` + +See the [system tray reference](https://webview.js.org/api/tray) and +[runnable tray example](https://github.com/webviewjs/webview/blob/main/apps/examples/tray.mjs). + +### Notifications + +```js +import { Notification } from '@webviewjs/webview'; + +const notification = new Notification('Build complete', { + body: 'The release executable is ready.', +}); + +notification.on('click', () => console.log('notification clicked')); +notification.on('error', ({ error }) => console.error(error)); +``` + +Notification permission is always `"granted"` for native applications. See the +[notification reference](https://webview.js.org/api/notification) and +[runnable notification example](https://github.com/webviewjs/webview/blob/main/apps/examples/notification.mjs). + +### IPC and exposed functions + +The webview page can send messages to Node through `window.ipc.postMessage()`: + +```js +const webview = window.createWebview({ ipcName: 'bindings' }); +webview.onIpcMessage((message) => console.log(message.body.toString())); +``` + +`ipcName` adds an alias, so the page can use `window.bindings.postMessage(...)`; `window.ipc` remains available. + +For typed request/response style calls, expose a namespace: + +```js +webview.expose('native', { + version: '0.1.4', + readConfig: async () => JSON.parse(await readFile('./config.json', 'utf8')), +}); +``` + +In the page: + +```js +console.log(window.native.version); +const config = await window.native.readConfig(); +``` + +Every exposed function returns a Promise in the page. Values, arguments, and results must be JSON-serializable. Violations use `SerializationError`. + +### Asynchronous custom protocols + +Register a protocol before creating its webview: + +```js +window.registerProtocol('app', async (request) => { + const filePath = join(process.cwd(), 'dist', new URL(request.url).pathname); + try { + return new Response(await readFile(filePath), { + headers: { 'Content-Type': 'text/html; charset=utf-8' }, + }); + } catch { + return new Response('Not found', { + status: 404, + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }); + } +}); + +window.createWebview({ url: 'app://localhost/index.html' }); +``` + +See [Custom Protocols](https://webview.js.org/guides/custom-protocols), [IPC](https://webview.js.org/guides/ipc-messaging), and the runnable [custom protocol](https://github.com/webviewjs/webview/blob/main/apps/examples/custom-protocol.mjs) and [expose](https://github.com/webviewjs/webview/blob/main/apps/examples/expose.mjs) examples. + +### Menu system + +WebviewJS provides a cross-platform menu system that works on macOS, Windows, and Linux. + +#### Basic menu setup + +```js +import { Application } from '@webviewjs/webview'; + +const app = new Application(); + +// Set global application menu +app.setMenu({ + items: [ + { + label: 'File', + submenu: { + items: [ + { id: 'new', label: 'New', accelerator: 'CmdOrCtrl+N' }, + { id: 'open', label: 'Open', accelerator: 'CmdOrCtrl+O' }, + { role: 'separator' }, + { id: 'quit', label: 'Quit', accelerator: 'CmdOrCtrl+Q' }, + ], + }, + }, + { + label: 'Edit', + submenu: { + items: [{ role: 'copy' }, { role: 'paste' }, { role: 'cut' }, { role: 'selectall' }], + }, + }, + ], +}); + +const window = app.createBrowserWindow(); +const webview = window.createWebview({ url: 'https://nodejs.org' }); + +app.run(); +``` + +#### Menu event handling + +```js +import { Application } from '@webviewjs/webview'; + +const app = new Application(); + +// Handle menu events +app.on('custom-menu-click', ({ customMenuEvent: menuEvent }) => { + console.log(`Menu item clicked: ${menuEvent.id}`); + console.log(`From window: ${menuEvent.windowId}`); + + // Handle specific menu items + switch (menuEvent.id) { + case 'new': + console.log('Creating new document...'); + break; + case 'open': + console.log('Opening file...'); + break; + case 'quit': + app.exit(); + break; + } +}); + +// Set up menu... +app.setMenu({/* ... */}); +``` + +#### Window-specific menus + +```js +const app = new Application(); + +// Create window with custom menu +const window = app.createBrowserWindow({ + title: 'Custom Window', + menu: { + items: [ + { + id: 'window-action', + label: 'Window Action', + accelerator: 'Ctrl+W', + }, + ], + }, +}); + +// Or check if window has a menu +if (window.hasMenu()) { + console.log('This window has a menu'); +} +``` + +#### Menu item options + +- **`id`**: Unique identifier for the menu item (used in events) +- **`label`**: Display text for the menu item +- **`enabled`**: Whether the item is clickable (default: true) +- **`accelerator`**: Keyboard shortcut (e.g., "CmdOrCtrl+N", "Alt+F4") +- **`submenu`**: Nested menu items +- **`role`**: Predefined menu items with built-in behavior + +#### Predefined menu roles + +- **`"copy"`**: Standard copy action +- **`"paste"`**: Standard paste action +- **`"cut"`**: Standard cut action +- **`"selectall"`**: Select all text action +- **`"separator"`**: Visual separator line + +### IPC + +```js +const app = new Application(); +const window = app.createBrowserWindow(); + +const webview = window.createWebview({ + html: ` + + + Webview + + +

    Hello world!

    + + + + + `, + preload: `window.onIpcMessage = function(data) { + const output = document.getElementById('output'); + output.innerText = \`Server Sent A Message: \${data}\`; + }`, +}); + +if (!webview.isDevtoolsOpen()) webview.openDevtools(); + +webview.onIpcMessage((data) => { + const reply = `You sent ${data.body.toString('utf-8')}`; + webview.evaluateScript(`onIpcMessage("${reply}")`); +}); + +app.run(); +``` + +### Closing the application + +You can close the application, windows, and webviews gracefully to ensure all resources (including temporary folders) are cleaned up properly. + +```js +const app = new Application(); +const window = app.createBrowserWindow(); +const webview = window.createWebview({ url: 'https://nodejs.org' }); + +app.on('application-close-requested', () => { + console.log('Application is closing, cleaning up resources...'); +}); + +app.on('window-close-requested', () => { + console.log('Window close requested'); +}); + +// Close the application gracefully (cleans up temp folders) +app.exit(); + +// Or hide/show the window +window.hide(); // Hide the window +window.show(); // Show the window again + +// Or reload the webview +webview.reload(); +``` + +For more details on application lifecycle and disposal, see the +[Application API reference](https://webview.js.org/api/application) and the +[closing example](https://github.com/webviewjs/webview/blob/main/apps/examples/close-example.mjs). + +### Keep strong references + +Retain `BrowserWindow`, `Webview`, `WebContext`, and `TrayIcon` wrappers for as +long as you need to call their methods or retain their JavaScript listeners. +Avoid discarded temporary handles: + +```js +const windows = []; + +app.whenReady().then(() => { + const window = app.createBrowserWindow(); + const webview = window.createWebview({ url: 'https://example.com' }); + windows.push({ window, webview }); +}); +``` + +The root `Application` owns native resources created through it. `app.exit()`, +`app[Symbol.dispose]()`, and application garbage collection dispose those +resources in shutdown order. Retained wrappers then report `isDisposed() === +true`, and method calls fail with a disposed error. Individual windows, +webviews, contexts, and tray icons also support `dispose()` and +`Symbol.dispose`. + +Check out [examples](https://github.com/webviewjs/webview/tree/main/apps/examples) directory for more examples: + +- **[menu-system.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features +- **[window-menus.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/window-menus.mjs)** - Window-specific vs global menu examples +- **[http/](https://github.com/webviewjs/webview/tree/main/apps/examples)** - Serving content from a web server to webview +- **[transparent.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/transparent.mjs)** - Transparent window example +- **[close-example.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/close-example.mjs)** - Graceful application closing + +Run an example after building the package with: `node apps/examples/menu-system.mjs`. + +## Building executables + +The `webview` CLI creates a standalone executable by delegating to the +selected runtime's compiler: + +- Node.js uses Node's Single Executable Application (SEA) workflow. +- Deno uses `deno compile`. +- Bun uses `bun build --compile`. + +It is not a desktop application installer builder, package manager, or full +application bundler. It does not create platform installers or perform +cross-compilation. The WebviewJS `.node` addon is platform-specific, so build +on the target operating system and architecture, or prepare the matching +native addon and runtime toolchain manually before packaging. Use platform +distribution tools alongside this CLI for installers, release metadata, +signing, and notarization. + +> [!NOTE] +> The CLI is evolving. Review the runtime and platform requirements before +> distributing an executable. + +The `webview` CLI compiles your app into a single self-contained executable. The runtime is auto-detected (`Bun` → bun, `Deno` → deno, otherwise Node.js), or you can override it: + +```bash +# Auto-detected runtime +webview --build --input ./path/to/your/script.js --output ./dist --name my-app + +# Explicit runtime +webview --build --runtime node --input ./src/index.js --name my-app +webview --build --runtime deno --input ./src/index.ts --name my-app +webview --build --runtime bun --input ./src/index.ts --name my-app +``` + +| Flag | Default | Description | +| -------------------- | ------------- | ----------------------------- | +| `--runtime` / `-R` | auto-detected | `node`, `deno`, or `bun` | +| `--input` / `-i` | `./index.js` | Entry file | +| `--output` / `-o` | `./dist` | Output directory | +| `--name` / `-n` | `webviewjs` | Executable name | +| `--resources` / `-r` | none | JSON asset map (Node.js only) | + +For runtime-specific details, asset embedding, code signing, and release +guidance, see [Building Executables](https://webview.js.org/guides/building-executables). + +## Agent skill + +This repository includes a reusable WebviewJS skill for coding agents. Install +it with: + +```bash +npx skills add webviewjs/webview +``` + +It covers application structure, native prerequisites, platform constraints, +API patterns, and executable builds. + +## Development + +The published library is in `packages/webview`, runnable examples are in +`apps/examples`, and the documentation website is in `apps/docs`. + +### Prerequisites + +- [Bun](https://bun.sh/) 1.3.14 +- [Rust](https://www.rust-lang.org/) stable toolchain +- [Node.js](https://nodejs.org/) >= 24 (for testing) + +### Setup + +```bash +bun install +``` + +### Build and run an example + +```bash +bun --filter @webviewjs/webview build +node apps/examples/simple.mjs +``` + +The native build requires the platform's Rust and GUI development dependencies. +To build only the TypeScript layer, run `bun --filter @webviewjs/webview build:lib`. + +### Repository commands + +```bash +bun run dev # Start the documentation app +bun run build # Build the native package and static docs +bun run test # Run Node's built-in test runner +bun run lint # Run Oxlint across the repository +bun run lint:fix +bun run format # Format JS/TS/MD and Rust source +bun run format:check +bun run check # Cargo check and docs type check +bun run clippy +``` + +The docs workspace can also be run on its own with `bun --filter @webviewjs/docs dev` or built with `bun --filter @webviewjs/docs build`. + +``` + +``` diff --git a/__test__/bridge.test.mjs b/packages/webview/__test__/bridge.test.mjs similarity index 99% rename from __test__/bridge.test.mjs rename to packages/webview/__test__/bridge.test.mjs index 4651ba6..2da47ed 100644 --- a/__test__/bridge.test.mjs +++ b/packages/webview/__test__/bridge.test.mjs @@ -848,7 +848,7 @@ test('native resource classes expose explicit Symbol.dispose integration', () => }); test('tray example retains its icon and demonstrates close-to-tray behavior', async () => { - const source = await readFile(new URL('../examples/tray.mjs', import.meta.url), 'utf8'); + const source = await readFile(new URL('../../../apps/examples/tray.mjs', import.meta.url), 'utf8'); assert.match(source, /let tray;/); assert.match(source, /await app\.whenReady\(\);[\s\S]*tray = app\.createTrayIcon/); @@ -1242,7 +1242,7 @@ test('expose sends a SerializationError name to the page for non-serializable re }); test('expose example uses an app protocol instead of a file origin for IPC', async () => { - const source = await readFile(new URL('../examples/expose.mjs', import.meta.url), 'utf8'); + const source = await readFile(new URL('../../../apps/examples/expose.mjs', import.meta.url), 'utf8'); assert.match(source, /window\.registerProtocol\('app', async/); assert.match(source, /url:\s*'app:\/\/localhost\/index\.html'/); @@ -1250,7 +1250,7 @@ test('expose example uses an app protocol instead of a file origin for IPC', asy }); test('Hono custom protocol example forwards Fetch requests to dynamic routes', async () => { - const source = await readFile(new URL('../examples/custom-protocol-hono.mjs', import.meta.url), 'utf8'); + const source = await readFile(new URL('../../../apps/examples/custom-protocol-hono.mjs', import.meta.url), 'utf8'); assert.match(source, /import\s+\{\s*Hono\s*\}\s+from\s+'hono'/); assert.match(source, /router\.get\(['"]\/\*['"]/); diff --git a/__test__/webview.test.mjs b/packages/webview/__test__/webview.test.mjs similarity index 100% rename from __test__/webview.test.mjs rename to packages/webview/__test__/webview.test.mjs diff --git a/build.rs b/packages/webview/build.rs similarity index 100% rename from build.rs rename to packages/webview/build.rs diff --git a/cli/build.mjs b/packages/webview/cli/build.mjs similarity index 100% rename from cli/build.mjs rename to packages/webview/cli/build.mjs diff --git a/cli/index.mjs b/packages/webview/cli/index.mjs old mode 100644 new mode 100755 similarity index 100% rename from cli/index.mjs rename to packages/webview/cli/index.mjs diff --git a/cli/utils.mjs b/packages/webview/cli/utils.mjs similarity index 100% rename from cli/utils.mjs rename to packages/webview/cli/utils.mjs diff --git a/js-bindings.d.ts b/packages/webview/js-bindings.d.ts similarity index 100% rename from js-bindings.d.ts rename to packages/webview/js-bindings.d.ts diff --git a/js-bindings.js b/packages/webview/js-bindings.js similarity index 100% rename from js-bindings.js rename to packages/webview/js-bindings.js diff --git a/lib/application/lifecycle.ts b/packages/webview/lib/application/lifecycle.ts similarity index 69% rename from lib/application/lifecycle.ts rename to packages/webview/lib/application/lifecycle.ts index ba250c3..a8b3f1e 100644 --- a/lib/application/lifecycle.ts +++ b/packages/webview/lib/application/lifecycle.ts @@ -5,14 +5,20 @@ import { emitEvent, eventEmitterFor } from '../internal/events/event-emitter'; import type { ApplicationWhenReadyOptions } from '../types/application'; interface ApplicationState { + /** JavaScript timer responsible for pumping the native event queue. */ eventLoop: ApplicationEventLoop; + /** Callback registered through the legacy `onEvent` API. */ legacyEventHandler: ((event: ApplicationEvent) => void) | null; + /** Whether the native callback has been connected to the shared event emitter. */ nativeEventsInstalled: boolean; } +/** Per-instance JavaScript state kept outside native N-API objects. */ const states = new WeakMap(); +/** Original binding method, retained before the public compatibility method is installed. */ const nativeOnEvent = NativeApplication.prototype.onEvent; +/** Returns or lazily creates the JavaScript lifecycle state for an application. */ function stateFor(application: Application): ApplicationState { let state = states.get(application); if (state === undefined) { @@ -26,6 +32,7 @@ function stateFor(application: Application): ApplicationState { return state; } +/** Installs the native event callback and event-emitter state once per application. */ export function ensureApplicationEvents(target: object): void { const application = target as Application; const state = stateFor(application); @@ -42,24 +49,41 @@ export function ensureApplicationEvents(target: object): void { eventEmitterFor(application); } +/** + * Sets or clears the legacy single-callback application event handler. + * @param handler Callback invoked after the matching EventEmitter event, or `null` to clear it. + */ export function onEvent(this: Application, handler?: ((event: ApplicationEvent) => void) | null): void { stateFor(this).legacyEventHandler = handler ?? null; ensureApplicationEvents(this); } +/** + * Compatibility alias that delegates to {@link onEvent}. + * @param handler Callback invoked for native application events, or `null` to clear it. + */ export function bind(this: Application, handler?: ((event: ApplicationEvent) => void) | null): void { onEvent.call(this, handler); } +/** + * Starts the JavaScript timer that pumps native application events. + * @param options Polling interval and Node.js timer reference behavior. + */ export function run(this: Application, options?: ApplicationRunOptions | null): void { ensureApplicationEvents(this); stateFor(this).eventLoop.start(options ?? undefined); } +/** Stops the timer that pumps native application events. */ export function stop(this: Application): void { stateFor(this).eventLoop.stop(); } +/** + * Resolves when the native application emits its `ready` event. + * @param options Controls automatic event-pump startup and timer behavior. + */ export function whenReady(this: Application, options: ApplicationWhenReadyOptions = {}): Promise { const { autoRun = true, interval, ref } = options; if (!autoRun) { @@ -91,6 +115,7 @@ export function whenReady(this: Application, options: ApplicationWhenReadyOption return ready; } +/** Exits the native application when disposed with `using` or `Symbol.dispose`. */ export function disposeApplication(this: Application): void { this.exit(); } diff --git a/packages/webview/lib/augmentations.ts b/packages/webview/lib/augmentations.ts new file mode 100644 index 0000000..989e490 --- /dev/null +++ b/packages/webview/lib/augmentations.ts @@ -0,0 +1,91 @@ +import type { EventEmitter } from 'node:events'; +import type { ApplicationRunOptions } from '../js-bindings'; +import type { ApplicationEventMap, ApplicationWhenReadyOptions } from './types/application'; +import type { BrowserWindowEventMap, BrowserWindowProtocolHandler } from './types/browser-window'; +import type { NodeEventMap } from './internal/events/event-emitter'; +import type { TrayEventMap } from './types/tray-icon'; +import type { ExposedTarget, WebviewEventMap, WebviewOptions as PublicWebviewOptions } from './types/webview'; +import type { ApplicationEvent, IpcMessage } from '../js-bindings'; + +declare module '../js-bindings' { + interface Application extends EventEmitter> { + /** + * Starts polling native application events. Calls made while the event pump + * is already running do not create another timer. + * @param options Polling interval in milliseconds (default `16`) and whether + * the timer keeps Node.js alive (default `true`). + */ + run(options?: ApplicationRunOptions | null): void; + /** Stops the JavaScript timer that pumps native application events. */ + stop(): void; + /** + * Resolves when the native application is ready. By default, starts the + * event pump while waiting. + * @param options Set `autoRun: false` to wait without starting the event + * pump; `interval` and `ref` are only accepted when the pump is started. + * @returns A promise that resolves when the native `ready` event is emitted. + */ + whenReady(options?: ApplicationWhenReadyOptions): Promise; + /** + * Sets or clears the legacy single native-event callback. Events are also + * emitted through this instance's Node.js `EventEmitter` methods. + * @param handler Callback for native application events, or `null` to clear it. + */ + onEvent(handler?: ((event: ApplicationEvent) => void) | null): void; + /** + * Compatibility alias for {@link Application.onEvent}. + * @param handler Callback for native application events, or `null` to clear it. + */ + bind(handler?: ((event: ApplicationEvent) => void) | null): void; + /** Exits the application when used with JavaScript's explicit resource management. */ + [Symbol.dispose](): void; + } + + interface BrowserWindow extends EventEmitter> { + /** + * Registers a handler for requests to a custom URL protocol. + * @param name Protocol scheme name to register. + * @param handler Callback that receives a Fetch API `Request` and returns a + * Fetch API `Response` or a native custom-protocol response. + */ + registerProtocol(name: string, handler: BrowserWindowProtocolHandler): void; + /** + * Creates a webview attached to this window and forwards its typed events. + * @param options Native webview options and optional JavaScript callbacks. + * @returns The newly created native webview with WebviewJS event and IPC methods. + */ + createWebview(options?: PublicWebviewOptions | null): Webview; + /** Disposes the window when used with JavaScript's explicit resource management. */ + [Symbol.dispose](): void; + } + + interface Webview extends EventEmitter> { + /** + * Sets or clears the callback for messages sent from the page with `ipc.postMessage`. + * @param handler Callback invoked for each page message, or `null` to clear it. + */ + onIpcMessage(handler?: ((message: IpcMessage) => void) | null): void; + /** + * Exposes an object's enumerable properties and methods to page-side IPC calls. + * Enumerable data properties must be JSON-serializable; enumerable functions + * are callable from the page and their results must also be JSON-serializable. + * @param name JavaScript identifier used as the page-side namespace. + * @param target Object whose enumerable values and functions are exposed. + */ + expose(name: string, target: ExposedTarget): void; + /** Disposes the webview when used with JavaScript's explicit resource management. */ + [Symbol.dispose](): void; + } + + interface TrayIcon extends EventEmitter> { + /** Disposes the tray icon when used with JavaScript's explicit resource management. */ + [Symbol.dispose](): void; + } + + interface WebContext { + /** Disposes the web context when used with JavaScript's explicit resource management. */ + [Symbol.dispose](): void; + } +} + +export {}; diff --git a/lib/browser-window/create-webview.ts b/packages/webview/lib/browser-window/create-webview.ts similarity index 82% rename from lib/browser-window/create-webview.ts rename to packages/webview/lib/browser-window/create-webview.ts index 27a977f..6dfa8b6 100644 --- a/lib/browser-window/create-webview.ts +++ b/packages/webview/lib/browser-window/create-webview.ts @@ -3,7 +3,9 @@ import { BrowserWindow as NativeBrowserWindow, WebContext as NativeWebContext } import type { WebviewNewWindowEvent, WebviewOptions } from '../types/webview'; import { emitEvent } from '../internal/events/event-emitter'; +/** Callback shape accepted by the native webview creation binding. */ type NativeEventHandler = (error: Error | null, payload: WebviewEventPayload) => void; +/** Native `createWebview` signature before JavaScript option adaptation. */ type NativeCreateWebview = ( this: BrowserWindow, options?: import('../../js-bindings').WebviewOptions | null, @@ -13,8 +15,13 @@ type NativeCreateWebview = ( newWindowHandler?: ((payload: WebviewEventPayload) => boolean) | null, ) => NativeWebview; +/** Unmodified native constructor method, saved before prototype augmentation. */ const nativeCreateWebview = NativeBrowserWindow.prototype.createWebview as NativeCreateWebview; +/** + * Creates a native webview and forwards its events through the typed emitter. + * @param options Native creation options and JavaScript navigation callbacks. + */ export function createWebview(this: BrowserWindow, options?: WebviewOptions | null): NativeWebview { const { webContext, navigationHandler, newWindowHandler, ...nativeOptions } = options ?? {}; let webview: NativeWebview | undefined; diff --git a/lib/browser-window/events.ts b/packages/webview/lib/browser-window/events.ts similarity index 72% rename from lib/browser-window/events.ts rename to packages/webview/lib/browser-window/events.ts index 84d5660..d886ec3 100644 --- a/lib/browser-window/events.ts +++ b/packages/webview/lib/browser-window/events.ts @@ -2,8 +2,10 @@ import type { BrowserWindow, WindowEventPayload } from '../../js-bindings'; import { BrowserWindowCloseEvent } from '../internal/events/browser-window-close-event'; import { emitEvent, eventEmitterFor } from '../internal/events/event-emitter'; +/** Tracks windows whose native event callback has already been subscribed. */ const subscribedWindows = new WeakSet(); +/** Installs the native window-event listener once and initializes its emitter. */ export function ensureBrowserWindowEvents(target: object): void { const window = target as BrowserWindow; if (subscribedWindows.has(window)) { @@ -15,6 +17,11 @@ export function ensureBrowserWindowEvents(target: object): void { window._onWindowEvent((payload) => dispatchWindowEvent(window, payload)); } +/** + * Emits a window event, wrapping close requests with a dispatch-scoped cancel event. + * @param window Window that received the native event. + * @param payload Event payload received from the native binding. + */ function dispatchWindowEvent(window: BrowserWindow, payload: WindowEventPayload): void { if (payload.event !== 'close') { emitEvent(window, payload.event, payload); diff --git a/lib/browser-window/protocol.ts b/packages/webview/lib/browser-window/protocol.ts similarity index 62% rename from lib/browser-window/protocol.ts rename to packages/webview/lib/browser-window/protocol.ts index ba91d73..f488d76 100644 --- a/lib/browser-window/protocol.ts +++ b/packages/webview/lib/browser-window/protocol.ts @@ -2,6 +2,11 @@ import type { BrowserWindow } from '../../js-bindings'; import type { BrowserWindowProtocolHandler } from '../types/browser-window'; import { ProtocolBridge } from '../internal/protocol/protocol-bridge'; +/** + * Registers a JavaScript handler for requests to a custom URL protocol. + * @param name Protocol name used in the webview URL scheme. + * @param handler Callback that returns a Fetch `Response` or native response value. + */ export function registerProtocol(this: BrowserWindow, name: string, handler: BrowserWindowProtocolHandler): void { new ProtocolBridge(this).register(name, handler); } diff --git a/packages/webview/lib/errors/serialization-error.ts b/packages/webview/lib/errors/serialization-error.ts new file mode 100644 index 0000000..c5556ff --- /dev/null +++ b/packages/webview/lib/errors/serialization-error.ts @@ -0,0 +1,11 @@ +/** Error raised when a value cannot be encoded for WebviewJS IPC. */ +export class SerializationError extends Error { + /** + * Creates an IPC serialization error with a contextual message. + * @param message Description of the value that failed serialization. + */ + constructor(message: string) { + super(message); + this.name = 'SerializationError'; + } +} diff --git a/lib/index.ts b/packages/webview/lib/index.ts similarity index 100% rename from lib/index.ts rename to packages/webview/lib/index.ts diff --git a/lib/install.ts b/packages/webview/lib/install.ts similarity index 100% rename from lib/install.ts rename to packages/webview/lib/install.ts diff --git a/lib/internal/application/event-loop.ts b/packages/webview/lib/internal/application/event-loop.ts similarity index 59% rename from lib/internal/application/event-loop.ts rename to packages/webview/lib/internal/application/event-loop.ts index 722d1fa..32bb09a 100644 --- a/lib/internal/application/event-loop.ts +++ b/packages/webview/lib/internal/application/event-loop.ts @@ -1,13 +1,23 @@ import type { ApplicationRunOptions } from '../../../js-bindings'; export class ApplicationEventLoop { + /** Active interval timer, absent while the loop is stopped. */ #timer?: NodeJS.Timeout; + /** Callback that pumps native events and reports whether the application remains active. */ readonly #pumpEvents: () => boolean; + /** + * Creates an event loop around the native application event pump. + * @param pumpEvents Polls the native event queue and returns whether to keep running. + */ constructor(pumpEvents: () => boolean) { this.#pumpEvents = pumpEvents; } + /** + * Starts polling unless a timer is already active. + * @param options Poll interval and whether the timer keeps Node.js alive. + */ start(options: ApplicationRunOptions = {}): void { if (this.#timer !== undefined) { return; @@ -27,6 +37,7 @@ export class ApplicationEventLoop { this.#timer = timer; } + /** Stops polling and clears the active interval timer. */ stop(): void { if (this.#timer === undefined) { return; diff --git a/lib/internal/events/browser-window-close-event.ts b/packages/webview/lib/internal/events/browser-window-close-event.ts similarity index 51% rename from lib/internal/events/browser-window-close-event.ts rename to packages/webview/lib/internal/events/browser-window-close-event.ts index 8fa2a0a..3a92c3b 100644 --- a/lib/internal/events/browser-window-close-event.ts +++ b/packages/webview/lib/internal/events/browser-window-close-event.ts @@ -2,20 +2,31 @@ import type { WindowEventPayload } from '../../../js-bindings'; import type { BrowserWindowCloseEvent as BrowserWindowCloseEventShape } from '../../types/browser-window'; export class BrowserWindowCloseEvent implements BrowserWindowCloseEventShape { + /** Close-event discriminator exposed to listeners. */ readonly event = 'close' as const; + /** Whether `preventDefault` is still valid for the current dispatch. */ #active = true; + /** Whether the native close request was successfully prevented. */ #prevented = false; + /** Native callback that cancels the pending close request. */ readonly #preventClose: () => boolean; + /** + * Creates the event wrapper used while dispatching a native close request. + * @param payload Native event fields copied onto this instance. + * @param preventClose Native cancellation callback. + */ constructor(payload: WindowEventPayload, preventClose: () => boolean) { Object.assign(this, payload); this.#preventClose = preventClose; } + /** Whether a listener successfully cancelled the native close request. */ get defaultPrevented(): boolean { return this.#prevented; } + /** Requests cancellation of the pending close while listeners are running. */ preventDefault(): void { if (!this.#active || this.#prevented) { return; @@ -25,7 +36,10 @@ export class BrowserWindowCloseEvent implements BrowserWindowCloseEventShape { } } - /** @internal */ + /** + * Marks the end of event dispatch so later calls to `preventDefault` have no effect. + * @internal + */ finishDispatch(): void { this.#active = false; } diff --git a/lib/internal/events/event-emitter.ts b/packages/webview/lib/internal/events/event-emitter.ts similarity index 56% rename from lib/internal/events/event-emitter.ts rename to packages/webview/lib/internal/events/event-emitter.ts index 57bd904..0da35e2 100644 --- a/lib/internal/events/event-emitter.ts +++ b/packages/webview/lib/internal/events/event-emitter.ts @@ -1,5 +1,6 @@ import { EventEmitter } from 'node:events'; +/** Listener type for one typed WebviewJS event payload. */ export type EventListener = (payload: TPayload) => void; /** Converts payload maps into the listener-signature event maps Node expects. */ @@ -7,11 +8,18 @@ export type NodeEventMap = { [TEvent in keyof TEventMap]: [payload: TEventMap[TEvent]]; }; +/** A runtime listener signature accepted by Node's event emitter. */ type RuntimeListener = (...args: any[]) => void; +/** Hook that prepares an object before its lazily-created event emitter is used. */ type PrepareEvents = (target: object) => void; +/** Lazily allocated emitters associated with native object instances. */ const emitters = new WeakMap(); +/** + * Returns the event emitter associated with an object, creating it on first use. + * @param target Native object that owns the JavaScript event listeners. + */ export function eventEmitterFor(target: object): EventEmitter { let emitter = emitters.get(target); if (emitter === undefined) { @@ -21,52 +29,108 @@ export function eventEmitterFor(target: object): EventEmitter { return emitter; } +/** + * Adds Node.js EventEmitter methods to a native prototype without changing its class. + * @param prototype Prototype that receives the event methods. + * @param prepare Optional initializer called before each method accesses the emitter. + */ export function installEventEmitterMethods(prototype: object, prepare?: PrepareEvents): void { + /** Prepares the receiver before returning its typed emitter. */ const get = (target: object): EventEmitter> => { prepare?.(target); return eventEmitterFor(target) as EventEmitter>; }; + /** + * Adds a listener and returns the receiver for chaining. + * @param event Event name or symbol. + * @param listener Listener to invoke for the event. + */ const on = function (this: object, event: string | symbol, listener: RuntimeListener): object { get(this).on(event, listener); return this; }; + /** + * Adds a listener that is removed after its first invocation. + * @param event Event name or symbol. + * @param listener One-time listener to invoke for the event. + */ const once = function (this: object, event: string | symbol, listener: RuntimeListener): object { get(this).once(event, listener); return this; }; + /** + * Removes a previously registered listener and returns the receiver. + * @param event Event name or symbol. + * @param listener Listener to remove. + */ const off = function (this: object, event: string | symbol, listener: RuntimeListener): object { get(this).off(event, listener); return this; }; + /** + * Node.js alias for {@link on}. + * @param event Event name or symbol. + * @param listener Listener to invoke for the event. + */ const addListener = function (this: object, event: string | symbol, listener: RuntimeListener): object { get(this).addListener(event, listener); return this; }; + /** + * Node.js alias for {@link off}. + * @param event Event name or symbol. + * @param listener Listener to remove. + */ const removeListener = function (this: object, event: string | symbol, listener: RuntimeListener): object { get(this).removeListener(event, listener); return this; }; + /** + * Removes all listeners, or only listeners registered for one event. + * @param event Optional event name or symbol to limit removal. + */ const removeAllListeners = function (this: object, event?: string | symbol): object { get(this).removeAllListeners(event); return this; }; + /** + * Returns the number of listeners registered for an event. + * @param event Event name or symbol. + * @param listener Optional listener whose registrations should be counted. + */ const listenerCount = function (this: object, event: string | symbol, listener?: RuntimeListener): number { return get(this).listenerCount(event, listener); }; + /** + * Returns the listeners registered for an event. + * @param event Event name or symbol. + */ const listeners = function (this: object, event: string | symbol): Function[] { return get(this).listeners(event); }; + /** + * Returns the raw listeners, including one-time listener wrappers. + * @param event Event name or symbol. + */ const rawListeners = function (this: object, event: string | symbol): Function[] { return get(this).rawListeners(event); }; + /** + * Emits an event with the supplied arguments. + * @param event Event name or symbol. + * @param args Arguments passed to each listener. + * @returns `true` if the event had at least one listener. + */ const emit = function (this: object, event: string | symbol, ...args: any[]): boolean { return (get(this) as EventEmitter).emit(event, ...args); }; + /** Returns event names that currently have registered listeners. */ const eventNames = function (this: object): Array { return get(this).eventNames(); }; + /** Event methods installed on the target prototype. */ const methods = { on, once, @@ -95,6 +159,12 @@ export function installEventEmitterMethods(prototype: target.eventNames = methods.eventNames; } +/** + * Emits one event payload on the emitter associated with an object. + * @param target Object whose listeners should receive the event. + * @param event Event name or symbol. + * @param payload Single payload supplied to registered listeners. + */ export function emitEvent(target: object, event: string | symbol, payload: unknown): boolean { return eventEmitterFor(target).emit(event, payload); } diff --git a/lib/internal/ipc/ipc-bridge.ts b/packages/webview/lib/internal/ipc/ipc-bridge.ts similarity index 68% rename from lib/internal/ipc/ipc-bridge.ts rename to packages/webview/lib/internal/ipc/ipc-bridge.ts index 3fc2f19..340a187 100644 --- a/lib/internal/ipc/ipc-bridge.ts +++ b/packages/webview/lib/internal/ipc/ipc-bridge.ts @@ -3,36 +3,61 @@ import type { IpcMessage, Webview } from '../../../js-bindings'; import { SerializationError } from '../../errors/serialization-error'; import { serializeJson, validateJsonValue } from './serialization'; +/** Handler for a message sent from the page to the native webview. */ export type IpcMessageHandler = (message: IpcMessage) => void; +/** Original native disposal method, preserved before the IPC wrapper is installed. */ const nativeDispose = NativeWebview.prototype.dispose; +/** IPC bridge state keyed by native webview instances without retaining disposed views. */ const bridges = new WeakMap(); interface ExposedNamespace { + /** Object used as `this` when one of its exposed methods is invoked. */ target: object; + /** Methods that the page is allowed to invoke by name. */ functions: Map; } +/** Shape of a page-to-host RPC message recognized by the expose bridge. */ interface ExposeCall { + /** Marker distinguishing an expose call from a user IPC message. */ __e?: unknown; + /** Exposed namespace name. */ ns?: unknown; + /** Exposed method name. */ method?: unknown; + /** Page-side request identifier used to resolve or reject the promise. */ id?: unknown; + /** Arguments passed to the exposed method. */ args?: unknown; } +/** Connects page-side IPC requests to JavaScript handlers and exposed objects. */ export class WebviewIpcBridge { + /** Native webview used for message registration, liveness checks, and responses. */ readonly #native: Webview; + /** Registered namespaces that can be invoked from the page. */ readonly #namespaces = new Map(); + /** Optional user callback for messages that are not expose RPC calls. */ #userHandler: IpcMessageHandler | null = null; + /** Whether the bridge currently owns the native IPC callback. */ #transportInstalled = false; + /** Stable callback instance installed into the native binding. */ readonly #transportHandler: (message: IpcMessage) => void; + /** + * Creates a bridge for a native webview. + * @param native Native webview whose page IPC channel is being adapted. + */ constructor(native: Webview) { this.#native = native; this.#transportHandler = (message) => this.#dispatchMessage(message); } + /** + * Replaces or removes the user callback for ordinary IPC messages. + * @param handler Callback to receive non-RPC messages, or `null` to clear it. + */ setUserHandler(handler: IpcMessageHandler | null | undefined): void { this.#assertNotDisposed(); if (handler != null && typeof handler !== 'function') { @@ -47,6 +72,11 @@ export class WebviewIpcBridge { } } + /** + * Exposes an object's enumerable values and functions to the page under a namespace. + * @param name Valid JavaScript identifier used as the page-side namespace. + * @param target Object whose enumerable function and JSON values are exposed. + */ expose(name: string, target: object): void { this.#assertNotDisposed(); if (!/^[A-Za-z_$][\w$]*$/u.test(name)) { @@ -79,18 +109,21 @@ export class WebviewIpcBridge { this.#installTransport(); } + /** Clears bridge state and unregisters its native IPC callback. */ dispose(): void { this.#namespaces.clear(); this.#userHandler = null; this.#removeTransport(); } + /** Throws if the native webview has already been disposed. */ #assertNotDisposed(): void { if (this.#native.isDisposed()) { throw new Error('Webview has been disposed'); } } + /** Installs this bridge's stable handler as the native IPC callback. */ #installTransport(): void { if (this.#transportInstalled) { return; @@ -99,6 +132,7 @@ export class WebviewIpcBridge { this.#transportInstalled = true; } + /** Removes this bridge's native IPC callback when no bridge features remain. */ #removeTransport(): void { if (!this.#transportInstalled) { return; @@ -111,6 +145,10 @@ export class WebviewIpcBridge { this.#transportInstalled = false; } + /** + * Uses the instance override when available, otherwise the original native method. + * @param handler Callback to install or `null` to clear the native IPC callback. + */ #setNativeHandler(handler: IpcMessageHandler | null): void { const nativeMethod = Object.hasOwn(this.#native, 'onIpcMessage') ? this.#native.onIpcMessage @@ -118,6 +156,10 @@ export class WebviewIpcBridge { nativeMethod.call(this.#native, handler); } + /** + * Routes one native message to the user callback or the exposed-method dispatcher. + * @param message IPC payload received from the webview. + */ #dispatchMessage(message: IpcMessage): void { if (this.#native.isDisposed()) { return; @@ -177,6 +219,12 @@ export class WebviewIpcBridge { }); } + /** + * Sends a serialized rejection response to a pending page-side RPC call. + * @param id Page-side request identifier. + * @param message Error message returned to the page. + * @param name Error name returned to the page. + */ #sendError(id: unknown, message: string, name = 'Error'): void { if (this.#native.isDisposed()) { return; @@ -197,6 +245,10 @@ export class WebviewIpcBridge { } } +/** + * Returns the existing bridge for a webview or creates one on demand. + * @param webview Native webview to associate with the bridge. + */ function bridgeFor(webview: Webview): WebviewIpcBridge { let bridge = bridges.get(webview); if (bridge === undefined) { @@ -206,14 +258,24 @@ function bridgeFor(webview: Webview): WebviewIpcBridge { return bridge; } +/** + * Sets or clears the callback for IPC messages posted by the page. + * @param handler Callback to receive messages, or `null` to remove the callback. + */ export function onIpcMessage(this: Webview, handler?: IpcMessageHandler | null): void { bridgeFor(this).setUserHandler(handler); } +/** + * Exposes an object to the page through promise-based IPC calls. + * @param name Valid identifier used as the exposed namespace. + * @param target Object whose enumerable values and methods are exposed. + */ export function expose(this: Webview, name: string, target: object): void { bridgeFor(this).expose(name, target); } +/** Removes bridge resources before invoking the native webview disposal method. */ export function disposeWebview(this: Webview): void { const bridge = bridges.get(this); bridge?.dispose(); diff --git a/lib/internal/ipc/serialization.ts b/packages/webview/lib/internal/ipc/serialization.ts similarity index 60% rename from lib/internal/ipc/serialization.ts rename to packages/webview/lib/internal/ipc/serialization.ts index 6b36a77..a2ec5af 100644 --- a/lib/internal/ipc/serialization.ts +++ b/packages/webview/lib/internal/ipc/serialization.ts @@ -1,5 +1,10 @@ import { SerializationError } from '../../errors/serialization-error'; +/** + * JSON-encodes a value and reports failures as a WebviewJS serialization error. + * @param value Value to encode. + * @param context Description included in the error message. + */ export function serializeJson(value: unknown, context: string): string { try { const json = JSON.stringify(value); @@ -12,6 +17,11 @@ export function serializeJson(value: unknown, context: string): string { } } +/** + * Verifies that a value can make a JSON round trip. + * @param value Value to validate. + * @param context Description included in the error message. + */ export function validateJsonValue(value: unknown, context: string): void { JSON.parse(serializeJson(value, context)); } diff --git a/lib/internal/protocol/protocol-bridge.ts b/packages/webview/lib/internal/protocol/protocol-bridge.ts similarity index 65% rename from lib/internal/protocol/protocol-bridge.ts rename to packages/webview/lib/internal/protocol/protocol-bridge.ts index 5942f7b..2505b04 100644 --- a/lib/internal/protocol/protocol-bridge.ts +++ b/packages/webview/lib/internal/protocol/protocol-bridge.ts @@ -1,13 +1,24 @@ import type { BrowserWindow, CustomProtocolResponse, ProtocolRequest } from '../../../js-bindings'; import type { BrowserWindowProtocolHandler } from '../../types/browser-window'; +/** Adapts native custom-protocol requests to Fetch API requests and responses. */ export class ProtocolBridge { + /** Native browser window that registered the protocol handler. */ readonly #native: BrowserWindow; + /** + * Creates a bridge associated with one native browser window. + * @param native Browser window receiving custom-protocol requests. + */ constructor(native: BrowserWindow) { this.#native = native; } + /** + * Registers a handler and forwards subsequent native protocol requests to it. + * @param name Protocol name to register. + * @param handler JavaScript callback that generates each protocol response. + */ register(name: string, handler: BrowserWindowProtocolHandler): void { if (this.#native.isDisposed()) { throw new Error('BrowserWindow has been disposed'); @@ -17,6 +28,11 @@ export class ProtocolBridge { }); } + /** + * Runs a handler for one request and safely completes the native response. + * @param protocolRequest Request data received from the native binding. + * @param handler Callback registered for this protocol. + */ async #handle(protocolRequest: ProtocolRequest, handler: BrowserWindowProtocolHandler): Promise { try { const response = await handler(this.#toRequest(protocolRequest)); @@ -27,6 +43,10 @@ export class ProtocolBridge { } } + /** + * Converts a native protocol request into a Fetch API `Request`. + * @param protocolRequest Request data received from the native binding. + */ #toRequest(protocolRequest: ProtocolRequest): Request { const headers = new Headers(); for (const { key, value } of protocolRequest.headers ?? []) { @@ -44,6 +64,10 @@ export class ProtocolBridge { return new Request(protocolRequest.url, requestInit); } + /** + * Converts a Fetch API `Response` to the native response shape when needed. + * @param response Response returned by the protocol handler. + */ async #toNativeResponse(response: Response | CustomProtocolResponse): Promise { if (typeof Response !== 'undefined' && response instanceof Response) { const body = Buffer.from(await response.arrayBuffer()); @@ -64,6 +88,11 @@ export class ProtocolBridge { return response as CustomProtocolResponse; } + /** + * Completes a native protocol request if its window remains alive. + * @param id Identifier of the native request being completed. + * @param response Response data returned to the webview. + */ #complete(id: number, response: CustomProtocolResponse): void { if (this.#native.isDisposed()) { return; @@ -71,6 +100,11 @@ export class ProtocolBridge { this.#native._completeProtocol(id, response); } + /** + * Attempts to complete a request while suppressing races with window disposal. + * @param id Identifier of the native request being completed. + * @param response Response data returned to the webview. + */ #completeSafely(id: number, response: CustomProtocolResponse): void { try { this.#complete(id, response); @@ -79,6 +113,10 @@ export class ProtocolBridge { } } + /** + * Creates a plain-text HTTP 500 response from an error value. + * @param error Error thrown by the user protocol handler or response adapter. + */ #errorResponse(error: unknown): CustomProtocolResponse { const message = error !== null && typeof error === 'object' && 'message' in error ? String(error.message) : String(error); diff --git a/lib/notification.ts b/packages/webview/lib/notification.ts similarity index 54% rename from lib/notification.ts rename to packages/webview/lib/notification.ts index 7289c21..d372305 100644 --- a/lib/notification.ts +++ b/packages/webview/lib/notification.ts @@ -3,72 +3,131 @@ import type { NodeEventMap } from './internal/events/event-emitter'; import type { NativeNotificationAction, NativeNotificationOptions, NotificationEventPayload } from '../js-bindings'; import { NativeNotification } from '../js-bindings'; +/** Permission state returned by this native notification implementation. */ export type NotificationPermission = 'granted'; +/** Text direction used to lay out notification content. */ export type NotificationDirection = 'auto' | 'ltr' | 'rtl'; +/** Event names emitted by {@link Notification}. */ export type NotificationEventName = 'click' | 'close' | 'error' | 'show'; +/** An action button shown by a persistent notification. */ export interface NotificationAction { + /** Identifier delivered in the notification's click event. */ action: string; + /** User-facing label for the action button. */ title: string; + /** Optional icon path for the action button. */ icon?: string; } +/** Options used to create a native desktop notification. */ export interface NotificationOptions { + /** Text displayed beneath the notification title. */ body?: string; + /** Path to the notification icon. */ icon?: string; + /** Image path or encoded image bytes displayed with the notification. */ image?: string | Buffer; + /** Badge image path retained on the instance; not currently used by the native backend. */ badge?: string; + /** Tag retained on the instance; the current native backend does not group notifications by tag. */ tag?: string; + /** Application-defined value retained on the notification object for later access. */ data?: unknown; + /** Text direction retained on the instance; native notification rendering does not currently apply it. */ dir?: NotificationDirection; + /** Language tag retained on the instance; native notification rendering does not currently apply it. */ lang?: string; + /** Renotify setting retained on the instance; the current native backend does not apply it. */ renotify?: boolean; + /** Requests that the notification remain visible until the user acts. */ requireInteraction?: boolean; + /** Keeps the notification active so it can provide action buttons. */ persistent?: boolean; + /** Action buttons; requires `persistent: true`. */ actions?: NotificationAction[]; + /** Silent setting retained on the instance; the current native backend does not apply it. */ silent?: boolean; + /** Timestamp retained on the instance in milliseconds since the Unix epoch. */ timestamp?: number; + /** Vibration pattern retained on the instance; the current native backend does not apply it. */ vibrate?: number | number[]; } +/** Event emitted by a {@link Notification}. */ export interface NotificationEvent { + /** Name of the notification event. */ type: NotificationEventName; + /** Notification object that emitted the event. */ target: Notification; + /** Action identifier for an action-button click. */ action?: string; + /** Error reported while displaying the notification. */ error?: Error; } +/** Maps notification event names to the shared notification event payload. */ export interface NotificationEventMap { + /** Emitted when the notification or one of its actions is clicked. */ click: NotificationEvent; + /** Emitted when the notification is closed. */ close: NotificationEvent; + /** Emitted when displaying the notification fails. */ error: NotificationEvent; + /** Emitted when the notification becomes visible. */ show: NotificationEvent; } +/** Fully populated options passed to the native notification binding. */ interface NormalizedNotificationOptions { + /** Notification body text. */ body: string; + /** Notification icon path. */ icon: string; + /** Image path or bytes. */ image: string | Buffer; + /** Badge image path. */ badge: string; + /** Notification grouping identifier. */ tag: string; + /** Application-defined notification data. */ data: unknown; + /** Text direction. */ dir: NotificationDirection; + /** Language tag. */ lang: string; + /** Whether same-tag notifications may alert again. */ renotify: boolean; + /** Whether to request persistent display. */ requireInteraction: boolean; + /** Whether action buttons are enabled. */ persistent: boolean; + /** Normalized action-button definitions. */ actions: Array<{ action: string; title: string; icon: string }>; + /** Whether alerting behavior is suppressed. */ silent: boolean; + /** Notification timestamp in milliseconds since the Unix epoch. */ timestamp: number; + /** Vibration pattern. */ vibrate: number | number[]; } +/** A native desktop notification with Node.js event-emitter support. */ export class Notification extends EventEmitter> { + /** Native notification handle used to display and close the notification. */ readonly #native: NativeNotification; + /** DOM-style event-property listeners registered on this notification. */ readonly #handlers = new Map void>(); + /** Complete normalized option values exposed by the instance getters. */ readonly #options: NormalizedNotificationOptions; + /** Title supplied when the notification was created. */ readonly #title: string; + /** + * Creates and displays a native notification. + * @param title Text shown as the notification title. + * @param options Optional notification content and behavior settings. + */ constructor(title: string, options: NotificationOptions = {}) { super(); @@ -132,14 +191,20 @@ export class Notification extends EventEmitter { return Promise.resolve('granted'); } + /** + * Dispatches a native notification event through both event-listener APIs. + * @param payload Event payload received from the native notification. + */ #dispatch(payload: NotificationEventPayload): void { const type = payload.event as NotificationEventName; const event: NotificationEvent = { @@ -152,106 +217,136 @@ export class Notification extends EventEmitter void) | null { return this.#handlers.get('click') ?? null; } + /** Sets the click event-property listener; assigning `null` clears it. */ set onclick(listener: ((event: NotificationEvent) => void) | null) { this.#setHandler('click', listener); } + /** Close event-property listener, or `null` when none is registered. */ get onclose(): ((event: NotificationEvent) => void) | null { return this.#handlers.get('close') ?? null; } + /** Sets the close event-property listener; assigning `null` clears it. */ set onclose(listener: ((event: NotificationEvent) => void) | null) { this.#setHandler('close', listener); } + /** Error event-property listener, or `null` when none is registered. */ get onerror(): ((event: NotificationEvent) => void) | null { return this.#handlers.get('error') ?? null; } + /** Sets the error event-property listener; assigning `null` clears it. */ set onerror(listener: ((event: NotificationEvent) => void) | null) { this.#setHandler('error', listener); } + /** Show event-property listener, or `null` when none is registered. */ get onshow(): ((event: NotificationEvent) => void) | null { return this.#handlers.get('show') ?? null; } + /** Sets the show event-property listener; assigning `null` clears it. */ set onshow(listener: ((event: NotificationEvent) => void) | null) { this.#setHandler('show', listener); } + /** + * Replaces or removes the stored listener for one notification event type. + * @param type Notification event name to update. + * @param listener Listener to store, or `null` to remove the current listener. + */ #setHandler(type: NotificationEventName, listener: ((event: NotificationEvent) => void) | null): void { if (listener == null) { this.#handlers.delete(type); diff --git a/lib/tray-icon/events.ts b/packages/webview/lib/tray-icon/events.ts similarity index 61% rename from lib/tray-icon/events.ts rename to packages/webview/lib/tray-icon/events.ts index 97ecc1b..6d6a584 100644 --- a/lib/tray-icon/events.ts +++ b/packages/webview/lib/tray-icon/events.ts @@ -1,8 +1,10 @@ import type { TrayEventPayload, TrayIcon } from '../../js-bindings'; import { emitEvent, eventEmitterFor } from '../internal/events/event-emitter'; +/** Tracks tray icons whose native event callback has already been subscribed. */ const subscribedTrays = new WeakSet(); +/** Installs the native tray-event listener once and initializes its emitter. */ export function ensureTrayEvents(target: object): void { const tray = target as TrayIcon; if (subscribedTrays.has(tray)) { @@ -14,6 +16,11 @@ export function ensureTrayEvents(target: object): void { tray._onTrayEvent((payload) => dispatchTrayEvent(tray, payload)); } +/** + * Emits a native tray interaction on the icon's JavaScript event emitter. + * @param tray Tray icon that received the native event. + * @param payload Event payload received from the native binding. + */ function dispatchTrayEvent(tray: TrayIcon, payload: TrayEventPayload): void { emitEvent(tray, payload.event, payload); } diff --git a/packages/webview/lib/types/application.ts b/packages/webview/lib/types/application.ts new file mode 100644 index 0000000..f625b04 --- /dev/null +++ b/packages/webview/lib/types/application.ts @@ -0,0 +1,38 @@ +import type { ApplicationEvent as NativeApplicationEvent } from '../../js-bindings'; + +/** Native application creation, run-loop, and menu configuration options. */ +export type { ApplicationOptions, ApplicationRunOptions, MenuOptions } from '../../js-bindings'; + +/** Event payloads emitted by an {@link Application}. */ +export interface ApplicationEventMap { + /** Emitted when a window requests that the application close. */ + 'window-close-requested': NativeApplicationEvent; + /** Emitted when the application receives a close request. */ + 'application-close-requested': NativeApplicationEvent; + /** Emitted when a custom application menu item is selected. */ + 'custom-menu-click': NativeApplicationEvent; + /** Emitted once the native application is ready to run. */ + ready: NativeApplicationEvent; +} + +/** + * Controls how {@link Application.whenReady} waits for native readiness and + * whether it starts the JavaScript event pump. + */ +export type ApplicationWhenReadyOptions = + | { + /** Start the event pump automatically. Defaults to `true`. */ + autoRun?: true; + /** Event-pump interval in milliseconds when `autoRun` is enabled. */ + interval?: number; + /** Keep the Node.js process alive while the event pump is running. */ + ref?: boolean; + } + | { + /** Wait for readiness without starting the event pump. */ + autoRun: false; + /** Not supported when `autoRun` is `false`. */ + interval?: never; + /** Not supported when `autoRun` is `false`. */ + ref?: never; + }; diff --git a/packages/webview/lib/types/browser-window.ts b/packages/webview/lib/types/browser-window.ts new file mode 100644 index 0000000..758913b --- /dev/null +++ b/packages/webview/lib/types/browser-window.ts @@ -0,0 +1,188 @@ +import type { CustomProtocolResponse, WebviewEventPayload, WebviewNewWindowFeatures } from '../../js-bindings'; + +/** Native window creation, protocol response, and file-dialog options. */ +export type { BrowserWindowOptions, CustomProtocolResponse, FileDialogOptions } from '../../js-bindings'; + +/** Payload for a window move event. */ +export interface WindowMoveEvent { + /** Event name reported by the native window. */ + event: string; + /** Horizontal position of the window in logical pixels. */ + x: number; + /** Vertical position of the window in logical pixels. */ + y: number; +} + +/** Payload for a window resize event. */ +export interface WindowResizeEvent { + /** Event name reported by the native window. */ + event: string; + /** New width of the window in logical pixels. */ + width: number; + /** New height of the window in logical pixels. */ + height: number; +} + +/** Payload for pointer events received by a browser window. */ +export interface WindowMouseEvent { + /** Event name, such as `mouse-move` or `mouse-down`. */ + event: string; + /** Horizontal pointer position in window coordinates. */ + x: number; + /** Vertical pointer position in window coordinates. */ + y: number; + /** Native mouse-button identifier, when the event has one. */ + button?: number; + /** Native modifier-key bitmask, when supplied by the platform. */ + modifiers?: number; +} + +/** Payload for a mouse-wheel or trackpad scroll event. */ +export interface WindowScrollEvent { + /** Event name reported by the native window. */ + event: string; + /** Horizontal scroll delta. */ + deltaX: number; + /** Vertical scroll delta. */ + deltaY: number; +} + +/** Common payload shape for window events without additional data. */ +export interface WindowBaseEvent { + /** Event name reported by the native window. */ + event: string; +} + +/** Close-request event whose default action can be prevented during dispatch. */ +export interface BrowserWindowCloseEvent extends WindowBaseEvent { + /** Always `close` for this event. */ + readonly event: 'close'; + /** Whether a listener successfully prevented the native close request. */ + readonly defaultPrevented: boolean; + /** Prevents the pending close request while this event is being dispatched. */ + preventDefault(): void; +} + +/** Payload for a keyboard event received by a browser window. */ +export interface WindowKeyEvent { + /** Event name, either `key-down` or `key-up`. */ + event: string; + /** Platform-reported key value, when available. */ + key?: string; + /** Platform-reported physical key code, when available. */ + code?: string; + /** Native modifier-key bitmask, when supplied by the platform. */ + modifiers?: number; + /** Whether the key event is an auto-repeat. */ + isRepeat?: boolean; +} + +/** Payload for a file drag-and-drop event. */ +export interface WindowFileEvent { + /** Event name, such as `file-drop` or `file-hover`. */ + event: string; + /** File paths involved in the event, when available. */ + files?: string[]; +} + +/** Payload emitted when the display scale factor changes. */ +export interface WindowScaleEvent { + /** Event name reported by the native window. */ + event: string; + /** New display scale factor. */ + scaleFactor: number; +} + +/** Payload emitted when the system appearance changes. */ +export interface WindowThemeEvent { + /** Event name reported by the native window. */ + event: string; + /** Current system theme. */ + text: 'light' | 'dark'; +} + +/** Payload for an input-method-editor composition event. */ +export interface WindowImeEvent { + /** Event name reported by the native window. */ + event: string; + /** Composition text, when provided by the platform. */ + text?: string; + /** Current stage of the text-composition lifecycle. */ + phase: 'enabled' | 'preedit' | 'commit' | 'disabled'; +} + +/** Payload for a touch-screen contact event. */ +export interface WindowTouchEvent { + /** Event name reported by the native window. */ + event: string; + /** Horizontal touch position in window coordinates. */ + x: number; + /** Vertical touch position in window coordinates. */ + y: number; + /** Identifier for this touch contact. */ + touchId: number; + /** Stage of this touch contact's lifecycle. */ + phase: 'started' | 'moved' | 'ended' | 'cancelled'; +} + +/** Maps browser-window event names to their payload types. */ +export interface BrowserWindowEventMap { + /** Emitted when the window moves. */ + move: WindowMoveEvent; + /** Emitted when the window changes size. */ + resize: WindowResizeEvent; + /** Emitted when the window receives a close request. */ + close: BrowserWindowCloseEvent; + /** Emitted when the window gains focus. */ + focus: WindowBaseEvent; + /** Emitted when the window loses focus. */ + blur: WindowBaseEvent; + /** Emitted when the pointer enters the window. */ + 'mouse-enter': WindowMouseEvent; + /** Emitted when the pointer leaves the window. */ + 'mouse-leave': WindowBaseEvent; + /** Emitted when the pointer moves. */ + 'mouse-move': WindowMouseEvent; + /** Emitted when a mouse button is pressed. */ + 'mouse-down': WindowMouseEvent; + /** Emitted when a mouse button is released. */ + 'mouse-up': WindowMouseEvent; + /** Emitted when the user scrolls. */ + scroll: WindowScrollEvent; + /** Emitted when a keyboard key is pressed. */ + 'key-down': WindowKeyEvent; + /** Emitted when a keyboard key is released. */ + 'key-up': WindowKeyEvent; + /** Emitted when files are dropped onto the window. */ + 'file-drop': WindowFileEvent; + /** Emitted while files are dragged over the window. */ + 'file-hover': WindowFileEvent; + /** Emitted when a file drag leaves the window. */ + 'file-hover-cancelled': WindowBaseEvent; + /** Emitted when the display scale factor changes. */ + 'scale-factor-changed': WindowScaleEvent; + /** Emitted when the system theme changes. */ + 'theme-changed': WindowThemeEvent; + /** Emitted during text input composition. */ + ime: WindowImeEvent; + /** Emitted for touch-screen contact updates. */ + touch: WindowTouchEvent; +} + +/** + * Handles requests made to a window's custom URL protocol. + * Return a Fetch API `Response` or a native custom-protocol response. + */ +export type BrowserWindowProtocolHandler = ( + request: Request, +) => Response | CustomProtocolResponse | Promise; + +/** Event payload for a webview request to open a new window. */ +export interface PublicNewWindowEvent extends WebviewEventPayload { + /** Always `new-window` for this event. */ + event: 'new-window'; + /** Target classification, when included in the native payload. */ + target?: 'new-window'; + /** Features requested for the new window. */ + windowFeatures?: WebviewNewWindowFeatures; +} diff --git a/lib/types/events.ts b/packages/webview/lib/types/events.ts similarity index 66% rename from lib/types/events.ts rename to packages/webview/lib/types/events.ts index 0c89542..f2546b3 100644 --- a/lib/types/events.ts +++ b/packages/webview/lib/types/events.ts @@ -1,5 +1,7 @@ import type { EventEmitter } from 'node:events'; import type { EventListener, NodeEventMap } from '../internal/events/event-emitter'; +/** A listener that receives one typed event payload. */ export type { EventListener }; +/** Node.js `EventEmitter` type parameterized with a WebviewJS event map. */ export type TypedEventEmitter = EventEmitter>; diff --git a/packages/webview/lib/types/tray-icon.ts b/packages/webview/lib/types/tray-icon.ts new file mode 100644 index 0000000..352bb53 --- /dev/null +++ b/packages/webview/lib/types/tray-icon.ts @@ -0,0 +1,15 @@ +import type { TrayEventPayload } from '../../js-bindings'; + +/** Maps tray-icon interaction events to their native payload type. */ +export type TrayEventMap = { + /** Emitted when the tray icon is clicked. */ + click: TrayEventPayload; + /** Emitted when the tray icon is double-clicked. */ + 'double-click': TrayEventPayload; + /** Emitted when the pointer enters the tray icon. */ + enter: TrayEventPayload; + /** Emitted when the pointer moves over the tray icon. */ + move: TrayEventPayload; + /** Emitted when the pointer leaves the tray icon. */ + leave: TrayEventPayload; +}; diff --git a/lib/types/webview.ts b/packages/webview/lib/types/webview.ts similarity index 50% rename from lib/types/webview.ts rename to packages/webview/lib/types/webview.ts index 82a804a..d364ed9 100644 --- a/lib/types/webview.ts +++ b/packages/webview/lib/types/webview.ts @@ -7,49 +7,80 @@ import type { WebContext } from '../../js-bindings'; export type { IpcMessage, WebviewBounds, WebviewCookie } from '../../js-bindings'; +/** A JSON-compatible value that can cross the webview IPC boundary. */ export type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }; +/** An object whose enumerable properties are exposed to page-side IPC calls. */ export type ExposedTarget = object; +/** Options for creating a webview, including JavaScript navigation callbacks. */ export interface WebviewOptions extends Omit< NativeWebviewOptions, 'webContext' | 'navigationHandler' | 'newWindowHandler' > { + /** Reuses a native web context for shared webview state, or creates a default context. */ webContext?: WebContext | null; + /** + * Decides whether a navigation to `url` is allowed. Return `true` to allow + * the navigation or `false` to cancel it. + */ navigationHandler?: (url: string) => boolean; + /** Decides whether a request to open a new window is allowed. */ newWindowHandler?: (event: WebviewNewWindowEvent) => boolean; } +/** Payload emitted when a page begins or finishes loading. */ export interface WebviewPageLoadEvent extends WebviewEventPayload { + /** Native page-load event name. */ event: string; } +/** Payload emitted when the page title changes. */ export interface WebviewTitleChangedEvent extends WebviewEventPayload { + /** Native title-change event name. */ event: string; } +/** Payload emitted when a page download completes. */ export interface WebviewDownloadEvent extends WebviewEventPayload { + /** Native download event name. */ event: string; } +/** Payload emitted when a page download starts. */ export interface WebviewDownloadStartedEvent extends WebviewDownloadEvent {} +/** Payload for a navigation request targeting the current webview. */ export interface WebviewNavigationEvent extends WebviewEventPayload { + /** Always `navigation` for this event. */ event: 'navigation'; + /** Current webview navigation target. */ target: 'current'; } +/** Payload for a page request to open a new webview window. */ export interface WebviewNewWindowEvent extends WebviewEventPayload { + /** Always `new-window` for this event. */ event: 'new-window'; + /** Target requested by the page. */ target: 'new-window'; + /** Window features requested by the page, when present. */ windowFeatures?: WebviewNewWindowFeatures; } +/** Maps webview event names to their payload types. */ export interface WebviewEventMap { + /** Emitted when page loading begins. */ 'page-load-started': WebviewPageLoadEvent; + /** Emitted when page loading finishes. */ 'page-load-finished': WebviewPageLoadEvent; + /** Emitted when the document title changes. */ 'title-changed': WebviewTitleChangedEvent; + /** Emitted when a page download starts. */ 'download-started': WebviewDownloadStartedEvent; + /** Emitted when a page download completes. */ 'download-completed': WebviewDownloadEvent; + /** Emitted when the page requests navigation. */ navigation: WebviewNavigationEvent; + /** Emitted when the page requests a new window. */ 'new-window': WebviewNewWindowEvent; } diff --git a/npm/android-arm-eabi/README.md b/packages/webview/npm/android-arm-eabi/README.md similarity index 100% rename from npm/android-arm-eabi/README.md rename to packages/webview/npm/android-arm-eabi/README.md diff --git a/npm/android-arm-eabi/package.json b/packages/webview/npm/android-arm-eabi/package.json similarity index 100% rename from npm/android-arm-eabi/package.json rename to packages/webview/npm/android-arm-eabi/package.json diff --git a/npm/android-arm64/README.md b/packages/webview/npm/android-arm64/README.md similarity index 100% rename from npm/android-arm64/README.md rename to packages/webview/npm/android-arm64/README.md diff --git a/npm/android-arm64/package.json b/packages/webview/npm/android-arm64/package.json similarity index 100% rename from npm/android-arm64/package.json rename to packages/webview/npm/android-arm64/package.json diff --git a/npm/darwin-arm64/README.md b/packages/webview/npm/darwin-arm64/README.md similarity index 100% rename from npm/darwin-arm64/README.md rename to packages/webview/npm/darwin-arm64/README.md diff --git a/npm/darwin-arm64/package.json b/packages/webview/npm/darwin-arm64/package.json similarity index 100% rename from npm/darwin-arm64/package.json rename to packages/webview/npm/darwin-arm64/package.json diff --git a/npm/darwin-x64/README.md b/packages/webview/npm/darwin-x64/README.md similarity index 100% rename from npm/darwin-x64/README.md rename to packages/webview/npm/darwin-x64/README.md diff --git a/npm/darwin-x64/package.json b/packages/webview/npm/darwin-x64/package.json similarity index 100% rename from npm/darwin-x64/package.json rename to packages/webview/npm/darwin-x64/package.json diff --git a/npm/freebsd-x64/README.md b/packages/webview/npm/freebsd-x64/README.md similarity index 100% rename from npm/freebsd-x64/README.md rename to packages/webview/npm/freebsd-x64/README.md diff --git a/npm/freebsd-x64/package.json b/packages/webview/npm/freebsd-x64/package.json similarity index 100% rename from npm/freebsd-x64/package.json rename to packages/webview/npm/freebsd-x64/package.json diff --git a/npm/linux-arm-gnueabihf/README.md b/packages/webview/npm/linux-arm-gnueabihf/README.md similarity index 100% rename from npm/linux-arm-gnueabihf/README.md rename to packages/webview/npm/linux-arm-gnueabihf/README.md diff --git a/npm/linux-arm-gnueabihf/package.json b/packages/webview/npm/linux-arm-gnueabihf/package.json similarity index 100% rename from npm/linux-arm-gnueabihf/package.json rename to packages/webview/npm/linux-arm-gnueabihf/package.json diff --git a/npm/linux-arm64-gnu/README.md b/packages/webview/npm/linux-arm64-gnu/README.md similarity index 100% rename from npm/linux-arm64-gnu/README.md rename to packages/webview/npm/linux-arm64-gnu/README.md diff --git a/npm/linux-arm64-gnu/package.json b/packages/webview/npm/linux-arm64-gnu/package.json similarity index 100% rename from npm/linux-arm64-gnu/package.json rename to packages/webview/npm/linux-arm64-gnu/package.json diff --git a/npm/linux-ia32-gnu/README.md b/packages/webview/npm/linux-ia32-gnu/README.md similarity index 100% rename from npm/linux-ia32-gnu/README.md rename to packages/webview/npm/linux-ia32-gnu/README.md diff --git a/npm/linux-ia32-gnu/package.json b/packages/webview/npm/linux-ia32-gnu/package.json similarity index 100% rename from npm/linux-ia32-gnu/package.json rename to packages/webview/npm/linux-ia32-gnu/package.json diff --git a/npm/linux-x64-gnu/README.md b/packages/webview/npm/linux-x64-gnu/README.md similarity index 100% rename from npm/linux-x64-gnu/README.md rename to packages/webview/npm/linux-x64-gnu/README.md diff --git a/npm/linux-x64-gnu/package.json b/packages/webview/npm/linux-x64-gnu/package.json similarity index 100% rename from npm/linux-x64-gnu/package.json rename to packages/webview/npm/linux-x64-gnu/package.json diff --git a/npm/win32-arm64-msvc/README.md b/packages/webview/npm/win32-arm64-msvc/README.md similarity index 100% rename from npm/win32-arm64-msvc/README.md rename to packages/webview/npm/win32-arm64-msvc/README.md diff --git a/npm/win32-arm64-msvc/package.json b/packages/webview/npm/win32-arm64-msvc/package.json similarity index 100% rename from npm/win32-arm64-msvc/package.json rename to packages/webview/npm/win32-arm64-msvc/package.json diff --git a/npm/win32-ia32-msvc/README.md b/packages/webview/npm/win32-ia32-msvc/README.md similarity index 100% rename from npm/win32-ia32-msvc/README.md rename to packages/webview/npm/win32-ia32-msvc/README.md diff --git a/npm/win32-ia32-msvc/package.json b/packages/webview/npm/win32-ia32-msvc/package.json similarity index 100% rename from npm/win32-ia32-msvc/package.json rename to packages/webview/npm/win32-ia32-msvc/package.json diff --git a/npm/win32-x64-msvc/README.md b/packages/webview/npm/win32-x64-msvc/README.md similarity index 100% rename from npm/win32-x64-msvc/README.md rename to packages/webview/npm/win32-x64-msvc/README.md diff --git a/npm/win32-x64-msvc/package.json b/packages/webview/npm/win32-x64-msvc/package.json similarity index 100% rename from npm/win32-x64-msvc/package.json rename to packages/webview/npm/win32-x64-msvc/package.json diff --git a/packages/webview/package.json b/packages/webview/package.json new file mode 100644 index 0000000..ba97fbe --- /dev/null +++ b/packages/webview/package.json @@ -0,0 +1,83 @@ +{ + "name": "@webviewjs/webview", + "version": "0.4.7", + "bin": { + "webview": "./cli/index.mjs", + "webviewjs": "./cli/index.mjs" + }, + "description": "Robust cross-platform webview library for Node.js written in Rust. It also works with deno and bun.", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "repository": "git@github.com:webviewjs/webview.git", + "license": "MIT", + "type": "commonjs", + "keywords": [ + "webview", + "node", + "rust", + "cross-platform", + "gui" + ], + "files": [ + "cli", + "dist", + "js-bindings.js", + "js-bindings.d.ts", + "README.md", + "LICENSE" + ], + "napi": { + "binaryName": "webview", + "targets": [ + "x86_64-pc-windows-msvc", + "i686-pc-windows-msvc", + "aarch64-pc-windows-msvc", + "x86_64-apple-darwin", + "aarch64-apple-darwin", + "x86_64-unknown-linux-gnu", + "i686-unknown-linux-gnu", + "aarch64-unknown-linux-gnu", + "armv7-unknown-linux-gnueabihf", + "aarch64-linux-android", + "armv7-linux-androideabi", + "x86_64-unknown-freebsd" + ], + "constEnum": false + }, + "engines": { + "node": ">= 24" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "scripts": { + "artifacts": "napi artifacts", + "build": "run-s build:native build:lib", + "build:native": "node ./scripts/build.js --release", + "build:lib": "run-s build:lib:clean build:lib:tsc", + "build:lib:clean": "node ./scripts/clean-lib.js", + "build:lib:tsc": "tsc -p tsconfig.json", + "build:debug": "run-s build:native:debug build:lib", + "build:native:debug": "node ./scripts/build.js", + "clean": "napi clean && cargo clean", + "test": "run-s build:lib test:node", + "test:node": "node --test __test__/*.test.*", + "test:watch": "run-s build:lib test:watch:node", + "test:watch:node": "node --test --watch __test__/*.test.*", + "prepublishOnly": "run-s build prepublish:napi", + "prepublish:napi": "napi prepublish -t npm", + "version": "napi version", + "check": "cargo check", + "clippy": "cargo clippy -- -D warnings", + "docs": "cargo doc --no-deps --open", + "update": "bun update", + "setup": "bash ./scripts/install-linux-deps.sh" + }, + "devDependencies": { + "@napi-rs/cli": "^3.7.4", + "@types/node": "^26.1.1", + "npm-run-all2": "^7.0.2", + "typescript": "^5.9.3" + } +} diff --git a/scripts/build.js b/packages/webview/scripts/build.js similarity index 100% rename from scripts/build.js rename to packages/webview/scripts/build.js diff --git a/scripts/clean-lib.js b/packages/webview/scripts/clean-lib.js similarity index 100% rename from scripts/clean-lib.js rename to packages/webview/scripts/clean-lib.js diff --git a/src/app.rs b/packages/webview/src/app.rs similarity index 100% rename from src/app.rs rename to packages/webview/src/app.rs diff --git a/src/browser_window.rs b/packages/webview/src/browser_window.rs similarity index 100% rename from src/browser_window.rs rename to packages/webview/src/browser_window.rs diff --git a/src/custom_protocol_workaround.rs b/packages/webview/src/custom_protocol_workaround.rs similarity index 100% rename from src/custom_protocol_workaround.rs rename to packages/webview/src/custom_protocol_workaround.rs diff --git a/src/freebsd_stub.rs b/packages/webview/src/freebsd_stub.rs similarity index 100% rename from src/freebsd_stub.rs rename to packages/webview/src/freebsd_stub.rs diff --git a/src/lib.rs b/packages/webview/src/lib.rs similarity index 100% rename from src/lib.rs rename to packages/webview/src/lib.rs diff --git a/src/menu.rs b/packages/webview/src/menu.rs similarity index 100% rename from src/menu.rs rename to packages/webview/src/menu.rs diff --git a/src/notifications.rs b/packages/webview/src/notifications.rs similarity index 100% rename from src/notifications.rs rename to packages/webview/src/notifications.rs diff --git a/src/tray.rs b/packages/webview/src/tray.rs similarity index 100% rename from src/tray.rs rename to packages/webview/src/tray.rs diff --git a/src/tray_stub.rs b/packages/webview/src/tray_stub.rs similarity index 100% rename from src/tray_stub.rs rename to packages/webview/src/tray_stub.rs diff --git a/src/types.rs b/packages/webview/src/types.rs similarity index 100% rename from src/types.rs rename to packages/webview/src/types.rs diff --git a/src/version.rs b/packages/webview/src/version.rs similarity index 100% rename from src/version.rs rename to packages/webview/src/version.rs diff --git a/src/web_context.rs b/packages/webview/src/web_context.rs similarity index 100% rename from src/web_context.rs rename to packages/webview/src/web_context.rs diff --git a/src/webview.rs b/packages/webview/src/webview.rs similarity index 100% rename from src/webview.rs rename to packages/webview/src/webview.rs diff --git a/tsconfig.json b/packages/webview/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/webview/tsconfig.json diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000..1df7d57 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,11 @@ +/** @type {import('prettier').Config} */ +export default { + printWidth: 120, + semi: true, + trailingComma: 'all', + singleQuote: true, + arrowParens: 'always', + endOfLine: 'lf', + tabWidth: 2, + useTabs: false, +}; diff --git a/skills/webviewjs/SKILL.md b/skills/webviewjs/SKILL.md index ab90228..a3283bf 100644 --- a/skills/webviewjs/SKILL.md +++ b/skills/webviewjs/SKILL.md @@ -12,8 +12,8 @@ windows with the webview engine supplied by the operating system. Use the hosted documentation as the API authority: - [Documentation](https://webview.js.org) -- [Quickstart](https://webview.js.org/quickstart.md) -- [Installation](https://webview.js.org/installation.md) +- [Quickstart](https://webview.js.org/getting-started/quick-start) +- [Installation](https://webview.js.org/getting-started/installation) - [API index](https://webview.js.org/llms.txt) ## Install and prepare the host @@ -39,7 +39,7 @@ Native prerequisites vary by host: packages are `libwebkit2gtk-4.1-dev` and `libxdo-dev`. For the complete prerequisite list, use the [installation -guide](https://webview.js.org/installation.md). +guide](https://webview.js.org/getting-started/installation). ## Create an application @@ -71,9 +71,9 @@ exclusive. The application owns native resources created through it, and process.on('SIGINT', () => app.exit()); ``` -Read the [Application API](https://webview.js.org/api/application.md), -[BrowserWindow API](https://webview.js.org/api/browser-window.md), and -[Webview API](https://webview.js.org/api/webview.md) before relying on +Read the [Application API](https://webview.js.org/api/application), +[BrowserWindow API](https://webview.js.org/api/browser-window), and +[Webview API](https://webview.js.org/api/webview) before relying on platform-specific behavior. ## Use common features @@ -88,10 +88,10 @@ platform-specific behavior. handlers for application actions and dispose explicitly when ownership is no longer needed. -Use the [IPC guide](https://webview.js.org/guides/ipc-messaging.md), [custom -protocol guide](https://webview.js.org/guides/custom-protocols.md), [menus -guide](https://webview.js.org/guides/menus.md), and [system tray -guide](https://webview.js.org/guides/tray.md) for complete examples. +Use the [IPC guide](https://webview.js.org/guides/ipc-messaging), [custom +protocol guide](https://webview.js.org/guides/custom-protocols), [menus +guide](https://webview.js.org/guides/menus), and [system tray +guide](https://webview.js.org/api/tray) for complete examples. ## Respect native platform boundaries @@ -121,7 +121,7 @@ addon is available, or prepare that addon and its runtime toolchain manually before packaging. Use platform distribution tools for installers, signing, notarization, and release metadata. -See the [standalone executable guide](https://webview.js.org/guides/building-executables.md) +See the [standalone executable guide](https://webview.js.org/guides/building-executables) for runtime-specific options and asset handling. ## Troubleshoot systematically diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..b272295 --- /dev/null +++ b/turbo.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://turbo.build/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["dist/**", ".next/**", "!.next/cache/**", "out/**"] + }, + "build:lib": { + "outputs": ["dist/**"] + }, + "dev": { + "cache": false, + "persistent": true + }, + "test": {}, + "check": {}, + "clippy": { + "cache": false + }, + "@webviewjs/webview#build": { + "cache": false + }, + "@webviewjs/webview#test": { + "cache": false + } + } +} From 1ec64956f7fb03af2c6349374a8de9d02eba7f2b Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Thu, 1 Oct 2026 22:27:14 +0545 Subject: [PATCH 04/15] feat(cli): add typed multi-runtime executable builds - Replace the legacy CLI implementation with a TypeScript build pipeline - Support Node SEA, Bun, and Deno runtimes with assets and native addon resolution - Add CLI unit and integration coverage plus updated documentation --- AGENTS.md | 24 +- README.md | 49 +- .../docs/guides/building-executables.md | 170 +++---- apps/docs/content/docs/index.mdx | 28 +- bun.lock | 12 +- packages/webview/README.md | 49 +- .../webview/__test__/cli.integration.test.mjs | 116 +++++ packages/webview/__test__/cli.test.mjs | 424 ++++++++++++++++++ .../__test__/fixtures/executable-version.mjs | 3 + packages/webview/cli/build.mjs | 134 ------ packages/webview/cli/index.mjs | 137 +----- packages/webview/cli/utils.mjs | 7 - packages/webview/lib/cli/args.ts | 172 +++++++ packages/webview/lib/cli/assets.ts | 65 +++ packages/webview/lib/cli/bootstrap.ts | 81 ++++ packages/webview/lib/cli/build.ts | 220 +++++++++ packages/webview/lib/cli/bundler/esbuild.ts | 92 ++++ packages/webview/lib/cli/errors.ts | 32 ++ packages/webview/lib/cli/index.ts | 28 ++ packages/webview/lib/cli/logger.ts | 62 +++ packages/webview/lib/cli/native-addon.ts | 108 +++++ packages/webview/lib/cli/paths.ts | 7 + packages/webview/lib/cli/platform.ts | 169 +++++++ packages/webview/lib/cli/process.ts | 76 ++++ packages/webview/lib/cli/runtimes/bun.ts | 58 +++ packages/webview/lib/cli/runtimes/deno.ts | 200 +++++++++ packages/webview/lib/cli/runtimes/node.ts | 154 +++++++ packages/webview/lib/cli/runtimes/runtime.ts | 11 + packages/webview/lib/cli/signing.ts | 41 ++ packages/webview/lib/cli/types.ts | 103 +++++ packages/webview/package.json | 4 + skills/webviewjs/SKILL.md | 25 +- 32 files changed, 2358 insertions(+), 503 deletions(-) create mode 100644 packages/webview/__test__/cli.integration.test.mjs create mode 100644 packages/webview/__test__/cli.test.mjs create mode 100644 packages/webview/__test__/fixtures/executable-version.mjs delete mode 100644 packages/webview/cli/build.mjs delete mode 100644 packages/webview/cli/utils.mjs create mode 100644 packages/webview/lib/cli/args.ts create mode 100644 packages/webview/lib/cli/assets.ts create mode 100644 packages/webview/lib/cli/bootstrap.ts create mode 100644 packages/webview/lib/cli/build.ts create mode 100644 packages/webview/lib/cli/bundler/esbuild.ts create mode 100644 packages/webview/lib/cli/errors.ts create mode 100644 packages/webview/lib/cli/index.ts create mode 100644 packages/webview/lib/cli/logger.ts create mode 100644 packages/webview/lib/cli/native-addon.ts create mode 100644 packages/webview/lib/cli/paths.ts create mode 100644 packages/webview/lib/cli/platform.ts create mode 100644 packages/webview/lib/cli/process.ts create mode 100644 packages/webview/lib/cli/runtimes/bun.ts create mode 100644 packages/webview/lib/cli/runtimes/deno.ts create mode 100644 packages/webview/lib/cli/runtimes/node.ts create mode 100644 packages/webview/lib/cli/runtimes/runtime.ts create mode 100644 packages/webview/lib/cli/signing.ts create mode 100644 packages/webview/lib/cli/types.ts diff --git a/AGENTS.md b/AGENTS.md index 9bbe278..d810746 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -71,29 +71,23 @@ Run an example after building the package with `node apps/examples/simple.mjs`. - Handwritten public library source belongs in `packages/webview/lib/`; TypeScript writes CommonJS and declarations to `packages/webview/dist/`. - Native NAPI classes remain the public runtime objects. TypeScript explicitly augments them with JS-only lifecycle, event, protocol, and IPC behavior. - Do not edit `packages/webview/js-bindings.js` or `packages/webview/js-bindings.d.ts`; NAPI-RS generates them from Rust source and both generated files are intentionally tracked. -- CLI files in `packages/webview/cli/` are plain ESM and ship as-is. +- `packages/webview/cli/index.mjs` is the permanent plain ESM npm bin shim. The TypeScript CLI implementation lives in `packages/webview/lib/cli/` and builds to `packages/webview/dist/cli/`. - Tests live in `packages/webview/__test__/` and use `node:test`, not Bun test, Jest, Vitest, or AVA. - Examples in `apps/examples/` import `@webviewjs/webview` through the Bun workspace dependency so they use the same package entry point as consumers. - Documentation lives in `apps/docs/content/docs/`. Its public routes start at the domain root, such as `/getting-started/installation` and `/api/application`. - Keep repository-level tools in the root package. Application and package dependencies belong to their respective workspaces. -## CLI (`webview --build`) +## CLI (`webview build`) -The CLI compiles a user's app into a standalone executable. The runtime is **auto-detected** from globals: +The CLI compiles a user's app into a standalone executable. Node.js is the default runtime; choose Bun or Deno with `--runtime `: -- `globalThis.Bun` present → default `--runtime bun` -- `globalThis.Deno` present → default `--runtime deno` -- otherwise → default `--runtime node` +| Runtime | Mechanism | +| ------- | --------------------------------------------------------------------------------------------------------- | +| `node` | Node.js SEA; Node 24 uses `--experimental-sea-config` + pinned Postject; Node 25.5+ can use `--build-sea` | +| `deno` | Deno 2 `compile --bundle --self-extracting --allow-all` | +| `bun` | `bun build --compile` | -Override with `--runtime `. Each runtime uses a different compiler: - -| Runtime | Mechanism | -| ------- | ---------------------------------------------------------------------------------------- | -| `node` | Node.js SEA (Single Executable Application) via `--experimental-sea-config` + `postject` | -| `deno` | `deno compile --allow-all --no-check` | -| `bun` | `bun build --compile` | - -The `--resources` flag (JSON asset map) is **node-only** — it maps to the SEA `assets` field. +The entry file is positional, for example `webview build src/main.ts`. Use `--asset` to embed files or directories; `--resources` remains available for JSON asset maps. Each runtime adapter embeds the matching WebviewJS native addon. ## Docs / GitHub Pages diff --git a/README.md b/README.md index 1a9abd5..f08fa2e 100644 --- a/README.md +++ b/README.md @@ -495,48 +495,29 @@ Run an example after building the package with: `node apps/examples/menu-system. ## Building executables -The `webview` CLI creates a standalone executable by delegating to the -selected runtime's compiler: - -- Node.js uses Node's Single Executable Application (SEA) workflow. -- Deno uses `deno compile`. -- Bun uses `bun build --compile`. - -It is not a desktop application installer builder, package manager, or full -application bundler. It does not create platform installers or perform -cross-compilation. The WebviewJS `.node` addon is platform-specific, so build -on the target operating system and architecture, or prepare the matching -native addon and runtime toolchain manually before packaging. Use platform -distribution tools alongside this CLI for installers, release metadata, -signing, and notarization. - -> [!NOTE] -> The CLI is evolving. Review the runtime and platform requirements before -> distributing an executable. - -The `webview` CLI compiles your app into a single self-contained executable. The runtime is auto-detected (`Bun` → bun, `Deno` → deno, otherwise Node.js), or you can override it: +Build a standalone executable with Node.js by default, or choose Bun or Deno: ```bash -# Auto-detected runtime -webview --build --input ./path/to/your/script.js --output ./dist --name my-app - -# Explicit runtime -webview --build --runtime node --input ./src/index.js --name my-app -webview --build --runtime deno --input ./src/index.ts --name my-app -webview --build --runtime bun --input ./src/index.ts --name my-app +npm install @webviewjs/webview +npx webview build src/main.ts +npx webview build src/main.ts --runtime bun +npx webview build src/main.ts --runtime deno ``` -| Flag | Default | Description | -| -------------------- | ------------- | ----------------------------- | -| `--runtime` / `-R` | auto-detected | `node`, `deno`, or `bun` | -| `--input` / `-i` | `./index.js` | Entry file | -| `--output` / `-o` | `./dist` | Output directory | -| `--name` / `-n` | `webviewjs` | Executable name | -| `--resources` / `-r` | none | JSON asset map (Node.js only) | +The output goes to `./dist` by default. Set `--name`, `--out-dir`, `--target`, +and repeat `--asset` as needed. Use `--resources` for the legacy Node SEA JSON +asset map. Node SEA embeds WebviewJS's native addon; Bun and Deno builds also +require the matching target-specific native package. +Node SEA is host-only. Bun and Deno accept cross-target identifiers, but only +the current host builds have integration smoke coverage in this repository. +The CLI does not create installers or perform Windows certificate signing. For runtime-specific details, asset embedding, code signing, and release guidance, see [Building Executables](https://webview.js.org/guides/building-executables). +The old `webview --build --input ` form remains temporarily available +and prints a deprecation warning. + ## Agent skill This repository includes a reusable WebviewJS skill for coding agents. Install diff --git a/apps/docs/content/docs/guides/building-executables.md b/apps/docs/content/docs/guides/building-executables.md index d5c9283..d77fa50 100644 --- a/apps/docs/content/docs/guides/building-executables.md +++ b/apps/docs/content/docs/guides/building-executables.md @@ -1,162 +1,112 @@ --- title: 'Building Standalone Executables' -description: 'The webview CLI can package your application into a single self-contained executable — no Node.js, Deno, or Bun installation required on the target machine.' +description: 'Build a self-contained desktop application with the WebviewJS CLI and Node.js, Bun, or Deno.' --- -The `webview` CLI can package your application into a single self-contained executable — no Node.js, Deno, or Bun installation required on the target machine. +The `webview` command builds your application into a standalone executable. The target computer does not need a separate Node.js, Bun, or Deno installation. Your application still needs the platform's desktop webview runtime, such as WebView2 on Windows or WebKit on macOS and Linux. ## Quick start -```bash -# Install globally (or use npx) -npm install -g @webviewjs/webview +Install WebviewJS in your application, then build from the project directory: -# Build with your current runtime (Node.js by default) -webview --build --input src/index.js --name myapp +```bash +npm install @webviewjs/webview +npx webview build src/main.ts ``` -The executable is written to `dist/` by default. On Windows it gets a `.exe` extension automatically. - ---- - -## Choosing a runtime - -Use `--runtime` (short: `-R`) to select how the executable is compiled: - -| Runtime | Flag | Tool used | -| ------- | ---------------- | --------------------- | -| Node.js | `--runtime node` | Node.js SEA (default) | -| Deno | `--runtime deno` | `deno compile` | -| Bun | `--runtime bun` | `bun build --compile` | - -### Node.js (default) - -Node.js does not have a one-shot compile command, so the CLI automates the multi-step [Single Executable Application (SEA)](https://nodejs.org/api/single-executable-applications.html) workflow for you: - -1. Writes a `sea-config.json` in the output directory. -2. Runs `node --experimental-sea-config sea-config.json` to produce `sea-prep.blob`. -3. Copies the current `node` binary. -4. Removes its existing signature (macOS / Windows). -5. Injects the blob via `postject` (downloaded automatically with `npx`). -6. Re-signs the binary (`codesign` on macOS, `signtool` on Windows — optional). +The CLI uses Node.js SEA by default and writes the executable to `./dist`. The default name comes from your `package.json` name when it is a valid filename, otherwise from the entry file. Scoped names such as `@acme/my-app` produce `my-app`. ```bash -webview --build --runtime node --input src/index.js --name myapp --output dist +webview build src/main.ts --name my-app --out-dir ./release ``` -#### Bundling assets (Node.js only) +Use `webview --help`, `webview --version`, and `webview build --help` for command help. The old `webview --build --input src/main.ts` form remains available temporarily and prints a deprecation warning. -Pass a JSON file mapping asset names to file paths via `--resources`: +## Shared options + +| Option | Description | +| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `--runtime node\|bun\|deno` | Select a runtime. Node is the default. | +| `--name ` | Executable filename without an automatically added Windows `.exe` suffix. Names may contain letters, numbers, `-`, `_`, and `.`. | +| `--out-dir ` | Output directory. Defaults to `./dist`. `--output` remains as an alias. | +| `--target ` | Select a runtime-specific target. The matching WebviewJS native package must also be installed. | +| `--native-addon ` | Advanced override for the target-specific WebviewJS `.node` file. | +| `--asset ` | Embed an asset; Node SEA takes files, while Bun and Deno also accept directories. Repeat the option for multiple assets. | +| `--resources ` | Read the legacy Node SEA JSON asset map. Resource paths are relative to the JSON file. | +| `--minify` | Request minification from the selected runtime where supported. | +| `--dry-run` | Validate inputs and runtime support, then print the planned commands without compiling. | +| `--verbose` | Print subprocess commands with their arguments. | + +For Node SEA, `--asset file.txt` uses the file's basename as its SEA key. A resources map can choose explicit keys: ```json { - "icon.png": "./assets/icon.png", - "config.json": "./config.json" + "config.json": "./assets/config.json", + "images/icon.png": "./assets/icon.png" } ``` -```bash -webview --build --runtime node --resources assets.json --input src/index.js --name myapp -``` +Read Node SEA assets with `require('node:sea').getAsset('config.json')`. The private WebviewJS addon asset name is reserved. -Inside your script, read them with the `node:sea` API: +## Node.js -```js -const { getAsset } = require('node:sea'); -const iconBuffer = getAsset('icon.png'); -``` +Node builds bundle the application with esbuild as one CommonJS script targeting Node 24. This gives SEA one entry script and avoids relying on ordinary filesystem modules at runtime. The WebviewJS `.node` addon is added to the SEA asset map automatically. ---- +The runtime capability probe selects one of two SEA flows: -### Deno +- **Node 24 through Node 25.4:** Node creates a preparation blob. The CLI copies that exact Node executable, removes its macOS signature, and injects the blob with the pinned Postject dependency. The temporary bundle, config, and blob live in the operating system's temporary directory and are removed after the build. +- **Node 25.5 and newer:** When `node --help` reports `--build-sea`, Node creates the final executable directly. Postject is not used. -Requires `deno` on your `PATH`. Uses `deno compile` which bundles everything into a single binary. +When the executable starts, a small prelude reads the private addon asset from `node:sea`, writes it atomically beneath `os.tmpdir()` in a directory keyed by the WebviewJS version and addon SHA-256, then sets `NAPI_RS_NATIVE_LIBRARY_PATH`. It replaces SEA's builtin-only `require` with `createRequire(process.execPath)` so NAPI-RS can load that extracted `.node` file. The bundle and addon are both inside the executable; it does not load them from the application's `node_modules`. -```bash -webview --build --runtime deno --input src/index.ts --name myapp --output dist -``` +macOS executables receive an ad-hoc `codesign --sign -` signature. This is not a developer identity or notarization. Windows distribution signing is separate: the CLI does not invent a certificate or claim that the output has been signed. + +Node SEA does not cross-compile. Build on the platform and architecture where the executable will run. -The CLI runs: +## Bun + +Bun builds use Bun's standalone compiler directly: ```bash -deno compile --allow-all --no-check --output dist/myapp src/index.ts +webview build src/main.ts --runtime bun ``` -> `--allow-all` grants all permissions. Restrict them in your own build script if needed. +The CLI passes `--compile`, `--outfile`, optional `--target`, `--minify`, and repeatable embedded assets to `bun build`. It does not add a second bundling pass. WebviewJS's generated N-API loader is included in the application; the Bun integration fixture verifies that a compiled executable can call `getWebviewVersion()` after it has been moved away from the project. ---- +The CLI recognizes Bun target names `bun-darwin-x64`, `bun-darwin-arm64`, `bun-linux-x64`, `bun-linux-arm64`, `bun-windows-x64`, and `bun-windows-arm64`. Bun also accepts musl targets, but WebviewJS does not publish musl native addons, so this CLI rejects them. The Bun integration smoke test covered the current `darwin-arm64` host only; cross-target Bun executables are not claimed as verified. -### Bun +## Deno -Requires `bun` on your `PATH`. Uses `bun build --compile`. +Deno builds use Deno 2's compiler with bundling and self-extraction: ```bash -webview --build --runtime bun --input src/index.ts --name myapp --output dist +webview build src/main.ts --runtime deno ``` -The CLI runs: +The CLI runs `deno compile --bundle --self-extracting --allow-all`. A temporary target adapter gives Deno the selected `.node` file and maps unrelated optional N-API packages to build-only stubs, so it bundles the target addon without changing your project. The compiled entry locates Deno's extracted addon and sets `NAPI_RS_NATIVE_LIBRARY_PATH` before importing your app. The CLI passes `--no-check` because Deno 2.9 reports three unresolved internal callback aliases in WebviewJS's NAPI-RS-generated declaration file; this lets JavaScript and Node-style TypeScript projects package normally. Run `deno check` on application source separately when you want Deno's type diagnostics. User assets are passed through Deno 2.9's `--include` option; Deno also treats included `.js` and `.ts` files as module roots. -```bash -bun build --compile src/index.ts --outfile dist/myapp -``` +The CLI recognizes `x86_64-pc-windows-msvc`, `aarch64-pc-windows-msvc`, `x86_64-apple-darwin`, `aarch64-apple-darwin`, `x86_64-unknown-linux-gnu`, and `aarch64-unknown-linux-gnu`. The Deno integration smoke test covered the current `aarch64-apple-darwin` host only; cross-target Deno executables are not claimed as verified. -On Windows, Bun automatically appends `.exe` if not already present. +## Native packages and cross-compilation ---- +WebviewJS currently publishes native packages for macOS x64 and arm64; Windows x64, arm64, and ia32; and glibc Linux x64, arm64, ia32, and arm. Runtime targets are accepted only when both the runtime compiler and WebviewJS provide a matching target. The CLI resolves that target package from your project first, then checks the matching native file in a WebviewJS development checkout. It never substitutes the host addon for a different target. -## All options +If the target package is not installed, install the optional dependency for the target platform or pass `--native-addon` with a matching `.node` file. The CLI checks a recognizable target in the filename and reports when it does not match. It does not change your dependency installation during cross-compilation. -``` - -b, --build Build the project into a standalone executable - -R, --runtime Runtime to use for compilation: node (default), deno, bun - -n, --name Executable name (default: webviewjs) - -i, --input Entry file (default: index.js in cwd) - -o, --output Output directory (default: dist/) - -r, --resources Resources mapping JSON file path (node runtime only) - -d, --dry-run Print what would be done without executing - -h, --help Show help - -v, --version Show version -``` - ---- +Cross-target compiler support is runtime-specific. Node SEA is host-only. Bun and Deno accept the target identifiers listed above, but an executable can only load WebviewJS when the matching native package is available. A local integration run validates the current host build; it does not execute cross-compiled binaries on their destination operating systems. ## Examples ```bash -# Node.js SEA — default, no extra tools needed beyond node + npx -webview --build --input src/main.js --name myapp +# Default Node SEA build +webview build src/main.ts -# Deno — produces a single binary including the Deno runtime -webview --build --runtime deno --input src/main.ts --name myapp +# Bun standalone build +webview build src/main.ts --runtime bun --minify --asset assets -# Bun — fast compilation, includes the Bun runtime -webview --build --runtime bun --input src/main.ts --name myapp +# Deno self-extracting build +webview build src/main.ts --runtime deno --out-dir ./release -# Custom output directory and project name -webview --build --runtime bun --input src/main.ts --name "MyDesktopApp" --output ./release - -# Dry-run to see what would happen -webview --build --runtime node --input src/main.js --name myapp --dry-run +# Check all inexpensive validations without compiling +webview build src/main.ts --runtime node --dry-run ``` - ---- - -## Platform notes - -| Platform | Node SEA | Deno compile | Bun compile | -| -------- | -------------------- | -------------------- | -------------------- | -| Windows | ✅ `.exe` auto-added | ✅ `.exe` auto-added | ✅ `.exe` auto-added | -| macOS | ✅ codesign applied | ✅ ad-hoc signed | ✅ | -| Linux | ✅ | ✅ | ✅ | - -### Code signing - -- **Node.js** — the CLI removes the existing signature and re-signs with `codesign -s -` (macOS) or `signtool` (Windows) if available. -- **Deno** — applies an ad-hoc signature on macOS automatically. Use `codesign` / `signtool` for distribution. -- **Bun** — use `codesign` on macOS after building. On Windows, use `signtool`. - -### Cross-compilation - -- **Deno**: pass `--target` directly to `deno compile`. Use a custom build script rather than the webviewjs CLI for cross-compile targets. -- **Bun**: pass `--target` to `bun build`. Same recommendation. -- **Node SEA**: cross-compilation is not supported; build on the target OS. diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx index 6c09803..de06fc6 100644 --- a/apps/docs/content/docs/index.mdx +++ b/apps/docs/content/docs/index.mdx @@ -440,30 +440,20 @@ After building the package, run an example with: `node apps/examples/menu-system ## Building executables -> [!WARNING] -> The CLI feature is very experimental and may not work as expected. Please report any issues you find. - -The `webview` CLI compiles your app into a single self-contained executable. The runtime is auto-detected (`Bun` → bun, `Deno` → deno, otherwise Node.js), or you can override it: +Build a standalone executable with Node.js by default, or select Bun or Deno: ```bash -# Auto-detected runtime -webview --build --input ./path/to/your/script.js --output ./dist --name my-app - -# Explicit runtime -webview --build --runtime node --input ./src/index.js --name my-app -webview --build --runtime deno --input ./src/index.ts --name my-app -webview --build --runtime bun --input ./src/index.ts --name my-app +npx webview build src/main.ts +npx webview build src/main.ts --runtime bun +npx webview build src/main.ts --runtime deno ``` -| Flag | Default | Description | -| -------------------- | ------------- | -------------------------- | -| `--runtime` / `-R` | auto-detected | `node`, `deno`, or `bun` | -| `--input` / `-i` | `./index.js` | Entry file | -| `--output` / `-o` | `./dist` | Output directory | -| `--name` / `-n` | `webviewjs` | Executable name | -| `--resources` / `-r` | — | JSON asset map (node only) | +Node SEA embeds WebviewJS's native addon and is host-only. Bun and Deno need +the matching target addon for the executable target; cross-target output is +runtime-specific and only the current host builds have integration smoke tests. -For the full compilation guide including cross-compilation and code signing, see [Building Executables](./guides/building-executables). +For runtime details, target requirements, and asset handling, see +[Building Executables](./guides/building-executables). ## Development diff --git a/bun.lock b/bun.lock index 120f056..89cb54d 100644 --- a/bun.lock +++ b/bun.lock @@ -51,6 +51,10 @@ "webview": "./cli/index.mjs", "webviewjs": "./cli/index.mjs", }, + "dependencies": { + "esbuild": "0.28.2", + "postject": "1.0.0-alpha.6", + }, "devDependencies": { "@napi-rs/cli": "^3.7.4", "@types/node": "^26.1.1", @@ -70,7 +74,7 @@ "@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], - "@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], @@ -1050,6 +1054,8 @@ "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=="], + "postject": ["postject@1.0.0-alpha.6", "", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="], + "prettier": ["prettier@3.9.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="], "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], @@ -1250,8 +1256,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], - "@tailwindcss/node/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], @@ -1298,6 +1302,8 @@ "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + "postject/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "serve/chalk": ["chalk@5.0.1", "", {}, "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w=="], diff --git a/packages/webview/README.md b/packages/webview/README.md index 9f1a799..aeee947 100644 --- a/packages/webview/README.md +++ b/packages/webview/README.md @@ -495,48 +495,29 @@ Run an example after building the package with: `node apps/examples/menu-system. ## Building executables -The `webview` CLI creates a standalone executable by delegating to the -selected runtime's compiler: - -- Node.js uses Node's Single Executable Application (SEA) workflow. -- Deno uses `deno compile`. -- Bun uses `bun build --compile`. - -It is not a desktop application installer builder, package manager, or full -application bundler. It does not create platform installers or perform -cross-compilation. The WebviewJS `.node` addon is platform-specific, so build -on the target operating system and architecture, or prepare the matching -native addon and runtime toolchain manually before packaging. Use platform -distribution tools alongside this CLI for installers, release metadata, -signing, and notarization. - -> [!NOTE] -> The CLI is evolving. Review the runtime and platform requirements before -> distributing an executable. - -The `webview` CLI compiles your app into a single self-contained executable. The runtime is auto-detected (`Bun` → bun, `Deno` → deno, otherwise Node.js), or you can override it: +Build a standalone executable with Node.js by default, or choose Bun or Deno: ```bash -# Auto-detected runtime -webview --build --input ./path/to/your/script.js --output ./dist --name my-app - -# Explicit runtime -webview --build --runtime node --input ./src/index.js --name my-app -webview --build --runtime deno --input ./src/index.ts --name my-app -webview --build --runtime bun --input ./src/index.ts --name my-app +npm install @webviewjs/webview +npx webview build src/main.ts +npx webview build src/main.ts --runtime bun +npx webview build src/main.ts --runtime deno ``` -| Flag | Default | Description | -| -------------------- | ------------- | ----------------------------- | -| `--runtime` / `-R` | auto-detected | `node`, `deno`, or `bun` | -| `--input` / `-i` | `./index.js` | Entry file | -| `--output` / `-o` | `./dist` | Output directory | -| `--name` / `-n` | `webviewjs` | Executable name | -| `--resources` / `-r` | none | JSON asset map (Node.js only) | +The output goes to `./dist` by default. Set `--name`, `--out-dir`, `--target`, +and repeat `--asset` as needed. Use `--resources` for the legacy Node SEA JSON +asset map. Node SEA embeds WebviewJS's native addon; Bun and Deno builds also +require the matching target-specific native package. +Node SEA is host-only. Bun and Deno accept cross-target identifiers, but only +the current host builds have integration smoke coverage in this repository. +The CLI does not create installers or perform Windows certificate signing. For runtime-specific details, asset embedding, code signing, and release guidance, see [Building Executables](https://webview.js.org/guides/building-executables). +The old `webview --build --input ` form remains temporarily available +and prints a deprecation warning. + ## Agent skill This repository includes a reusable WebviewJS skill for coding agents. Install diff --git a/packages/webview/__test__/cli.integration.test.mjs b/packages/webview/__test__/cli.integration.test.mjs new file mode 100644 index 0000000..7cce393 --- /dev/null +++ b/packages/webview/__test__/cli.integration.test.mjs @@ -0,0 +1,116 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { + copyFileSync, + existsSync, + mkdirSync, + mkdtempSync, + renameSync, + rmSync, + symlinkSync, + writeFileSync, +} from 'node:fs'; +import { tmpdir } from 'node:os'; +import { basename, join } from 'node:path'; +import { test } from 'node:test'; +import { + buildExecutable, + getHostPlatform, + nativeAddonFileName, + nativePackageName, + parseRuntimeTarget, + resolveNativeAddon, +} from '../dist/cli/index.js'; + +const packageRoot = join(import.meta.dirname, '..'); +const fixture = join(import.meta.dirname, 'fixtures/executable-version.mjs'); +const hostTarget = parseRuntimeTarget('node', undefined, getHostPlatform()); + +function runtimeAvailable(command) { + const result = spawnSync(command, ['--version'], { encoding: 'utf8' }); + return result.status === 0; +} + +let addonAvailable = false; +try { + resolveNativeAddon(hostTarget, packageRoot, packageRoot); + addonAvailable = true; +} catch { + addonAvailable = false; +} + +async function runStandalone(runtime) { + const directory = mkdtempSync(join(tmpdir(), 'webview-cli-integration-')); + try { + const projectRoot = join(directory, 'consumer project'); + const appNodeModules = join(projectRoot, 'node_modules/@webviewjs'); + const platformPackage = join(appNodeModules, nativePackageName(hostTarget).slice('@webviewjs/'.length)); + const typesDirectory = join(projectRoot, 'node_modules/@types'); + mkdirSync(join(projectRoot, 'src'), { recursive: true }); + mkdirSync(platformPackage, { recursive: true }); + mkdirSync(typesDirectory, { recursive: true }); + symlinkSync(packageRoot, join(appNodeModules, 'webview'), 'dir'); + symlinkSync(join(packageRoot, 'node_modules/@types/node'), join(typesDirectory, 'node')); + const addon = resolveNativeAddon(hostTarget, packageRoot, packageRoot).path; + symlinkSync(addon, join(platformPackage, nativeAddonFileName(hostTarget))); + writeFileSync( + join(platformPackage, 'package.json'), + JSON.stringify({ name: nativePackageName(hostTarget), main: nativeAddonFileName(hostTarget) }), + ); + writeFileSync( + join(projectRoot, 'package.json'), + JSON.stringify({ + name: 'webview-cli-integration', + dependencies: { '@webviewjs/webview': '0.4.7', '@types/node': '26.1.1' }, + }), + ); + const input = join(projectRoot, 'src/main.mjs'); + copyFileSync(fixture, input); + const outputDirectory = join(directory, 'build output'); + mkdirSync(outputDirectory, { recursive: true }); + const result = await buildExecutable( + { runtime, input, cwd: projectRoot, outDir: outputDirectory, name: `webview-${runtime}` }, + { packageRoot, logger: { info() {}, success() {}, warn() {}, error() {} } }, + ); + const isolatedDirectory = join(directory, 'isolated application'); + mkdirSync(isolatedDirectory); + const isolatedExecutable = join(isolatedDirectory, basename(result.output)); + renameSync(result.output, isolatedExecutable); + rmSync(join(projectRoot, 'node_modules'), { recursive: true, force: true }); + assert.ok(existsSync(isolatedExecutable)); + const executed = spawnSync(isolatedExecutable, [], { + cwd: isolatedDirectory, + encoding: 'utf8', + env: { ...process.env, NODE_PATH: '' }, + timeout: 120_000, + }); + assert.equal(executed.status, 0, executed.stderr || executed.error?.message); + assert.match(executed.stdout.trim(), /\d+\.\d+\.\d+/u); + } finally { + rmSync(directory, { recursive: true, force: true }); + } +} + +test('Node SEA embeds and loads WebviewJS without project node_modules', { skip: !addonAvailable }, async () => { + await runStandalone('node'); +}); + +test( + 'Bun standalone embeds and loads WebviewJS N-API addon when Bun is installed', + { + skip: !addonAvailable || !runtimeAvailable('bun'), + }, + async () => { + await runStandalone('bun'); + }, +); + +test( + 'Deno self-extracting executable embeds and loads WebviewJS N-API addon when Deno is installed', + { + skip: !addonAvailable || !runtimeAvailable('deno'), + }, + async () => { + await runStandalone('deno'); + }, +); diff --git a/packages/webview/__test__/cli.test.mjs b/packages/webview/__test__/cli.test.mjs new file mode 100644 index 0000000..46455cf --- /dev/null +++ b/packages/webview/__test__/cli.test.mjs @@ -0,0 +1,424 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { existsSync, realpathSync } from 'node:fs'; +import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { dirname, join } from 'node:path'; +import { test } from 'node:test'; +import { + bootstrapCLI, + buildExecutable, + createSeaPrelude, + formatCommand, + getOutputPath, + nativePackageName, + normalizeExecutableName, + parseCLIArguments, + parseRuntimeTarget, + processRunner, + resolveNativeAddon, + resolvePostjectCli, +} from '../dist/cli/index.js'; +import { NodeRuntimeBuilder } from '../dist/cli/runtimes/node.js'; + +const packageRoot = join(import.meta.dirname, '..'); + +async function withTempDirectory(callback) { + const directory = await mkdtemp(join(tmpdir(), 'webview-cli-test-')); + try { + await callback(directory); + } finally { + await rm(directory, { recursive: true, force: true }); + } +} + +async function makeProject(directory, packageName = '@acme/my-app') { + const project = join(directory, 'project with spaces'); + await mkdir(project, { recursive: true }); + await writeFile(join(project, 'package.json'), JSON.stringify({ name: packageName })); + await mkdir(join(project, 'src'), { recursive: true }); + const input = join(project, 'src', 'main entry.ts'); + await writeFile(input, "console.log('fixture');\n"); + return { project, input }; +} + +test('CommonJS CLI output exposes named bootstrapCLI and the actual bin shim runs', async () => { + assert.equal(typeof bootstrapCLI, 'function'); + const shim = join(packageRoot, 'cli/index.mjs'); + const result = spawnSync(process.execPath, [shim, '--version'], { encoding: 'utf8' }); + assert.equal(result.status, 0, result.stderr); + assert.match(result.stdout, /WebviewJS v0\.4\.7/u); +}); + +test('argument parsing uses positional input, Node default, package name and dist output', async () => { + await withTempDirectory(async (directory) => { + const { project, input } = await makeProject(directory); + const parsed = parseCLIArguments(['build', input], project); + assert.equal(parsed.kind, 'build'); + if (parsed.kind !== 'build') return; + assert.equal(parsed.options.runtime, 'node'); + assert.equal(parsed.options.input, input); + assert.equal(parsed.options.outDir, join(project, 'dist')); + assert.equal(parsed.options.name, 'my-app'); + assert.equal(parsed.deprecated, false); + }); +}); + +test('argument parsing validates runtime and runtime-specific targets', async () => { + await withTempDirectory(async (directory) => { + const { project, input } = await makeProject(directory); + assert.throws(() => parseCLIArguments(['build', input, '--runtime', 'nodejs'], project), /Unknown runtime/u); + assert.throws( + () => parseCLIArguments(['build', input, '--runtime', 'bun', '--target', 'bun-linux-x64-musl'], project), + /does not publish musl native addons/u, + ); + assert.throws( + () => parseCLIArguments(['build', input, '--runtime', 'bun', '--target', 'bun-windows-ia32'], project), + /Unsupported bun target/u, + ); + assert.throws( + () => parseCLIArguments(['build', input, '--runtime', 'node', '--target', 'darwin-arm64'], project), + /cannot cross-compile/u, + ); + }); +}); + +test('legacy --build --input normalizes to build and resources JSON joins the asset model', async () => { + await withTempDirectory(async (directory) => { + const { project, input } = await makeProject(directory, 'simple'); + const resourceDirectory = join(project, 'resources'); + await mkdir(resourceDirectory); + await writeFile(join(resourceDirectory, 'config file.json'), '{}'); + await writeFile(join(resourceDirectory, 'map.json'), JSON.stringify({ 'custom-config': './config file.json' })); + const parsed = parseCLIArguments( + ['--build', '--input', input, '--resources', join(resourceDirectory, 'map.json'), '--name', 'my_app.v2'], + project, + ); + assert.equal(parsed.kind, 'build'); + if (parsed.kind !== 'build') return; + assert.equal(parsed.deprecated, true); + assert.equal(parsed.options.name, 'my_app.v2'); + assert.deepEqual(parsed.options.assets, [ + { key: 'custom-config', path: join(resourceDirectory, 'config file.json') }, + ]); + assert.throws( + () => + parseCLIArguments( + ['build', input, '--runtime', 'bun', '--resources', join(resourceDirectory, 'map.json')], + project, + ), + /Node SEA compatibility option/u, + ); + }); +}); + +test('asset flags support paths with spaces and resource maps report invalid JSON', async () => { + await withTempDirectory(async (directory) => { + const { project, input } = await makeProject(directory, 'simple'); + const asset = join(project, 'an asset.txt'); + await writeFile(asset, 'hello'); + const parsed = parseCLIArguments(['build', input, '--asset', asset], project); + assert.equal(parsed.kind, 'build'); + if (parsed.kind === 'build') assert.deepEqual(parsed.options.assets, [{ key: 'an asset.txt', path: asset }]); + + const malformed = join(project, 'assets.json'); + await writeFile(malformed, '{nope'); + assert.throws( + () => parseCLIArguments(['build', input, '--resources', malformed], project), + /parse resources JSON/u, + ); + }); +}); + +test('executable names preserve sensible punctuation and reject path separators', () => { + assert.equal(normalizeExecutableName('my-app', '/tmp', 'src/main.js'), 'my-app'); + assert.equal(normalizeExecutableName('foo_bar', '/tmp', 'src/main.js'), 'foo_bar'); + assert.equal(normalizeExecutableName('foo.bar', '/tmp', 'src/main.js'), 'foo.bar'); + assert.throws(() => normalizeExecutableName('../escape', '/tmp', 'src/main.js'), /Invalid executable name/u); + assert.equal( + getOutputPath({ outDir: '/tmp/release', name: 'my-app' }, { os: 'win32', arch: 'x64' }), + '/tmp/release/my-app.exe', + ); + assert.equal( + getOutputPath({ outDir: '/tmp/release', name: 'my-app.exe' }, { os: 'win32', arch: 'x64' }), + '/tmp/release/my-app.exe', + ); + assert.deepEqual(parseCLIArguments(['--help']).kind, 'help'); + assert.deepEqual(parseCLIArguments(['build', '--help']).kind, 'help'); + assert.deepEqual(parseCLIArguments(['--version']).kind, 'version'); +}); + +test('target mapping covers every published WebviewJS desktop native package', () => { + const targets = [ + [{ os: 'darwin', arch: 'x64' }, '@webviewjs/webview-darwin-x64'], + [{ os: 'darwin', arch: 'arm64' }, '@webviewjs/webview-darwin-arm64'], + [{ os: 'win32', arch: 'x64' }, '@webviewjs/webview-win32-x64-msvc'], + [{ os: 'win32', arch: 'arm64' }, '@webviewjs/webview-win32-arm64-msvc'], + [{ os: 'win32', arch: 'ia32' }, '@webviewjs/webview-win32-ia32-msvc'], + [{ os: 'linux', arch: 'x64', libc: 'gnu' }, '@webviewjs/webview-linux-x64-gnu'], + [{ os: 'linux', arch: 'arm64', libc: 'gnu' }, '@webviewjs/webview-linux-arm64-gnu'], + [{ os: 'linux', arch: 'ia32', libc: 'gnu' }, '@webviewjs/webview-linux-ia32-gnu'], + [{ os: 'linux', arch: 'arm', libc: 'gnu' }, '@webviewjs/webview-linux-arm-gnueabihf'], + ]; + for (const [target, packageName] of targets) assert.equal(nativePackageName(target), packageName); + assert.throws(() => nativePackageName({ os: 'linux', arch: 'x64', libc: 'musl' }), /does not publish/u); + assert.deepEqual(parseRuntimeTarget('deno', 'aarch64-pc-windows-msvc'), { os: 'win32', arch: 'arm64' }); +}); + +test('native resolver is project-anchored and never falls back to a host addon', async () => { + await withTempDirectory(async (directory) => { + const { project } = await makeProject(directory); + const localPackage = join(directory, 'webview-package'); + await mkdir(localPackage); + await writeFile(join(localPackage, 'webview.darwin-arm64.node'), 'host placeholder'); + assert.throws( + () => resolveNativeAddon({ os: 'win32', arch: 'x64' }, project, localPackage), + /win32-x64.*optional dependency/u, + ); + + const targetPackage = join(project, 'node_modules/@webviewjs/webview-win32-x64-msvc'); + await mkdir(targetPackage, { recursive: true }); + const addon = join(targetPackage, 'webview.win32-x64-msvc.node'); + await writeFile(addon, 'target placeholder'); + await writeFile(join(targetPackage, 'package.json'), JSON.stringify({ main: 'webview.win32-x64-msvc.node' })); + assert.equal(resolveNativeAddon({ os: 'win32', arch: 'x64' }, project, localPackage).path, realpathSync(addon)); + assert.throws( + () => + resolveNativeAddon( + { os: 'win32', arch: 'x64' }, + project, + localPackage, + join(localPackage, 'webview.darwin-arm64.node'), + ), + /requested target is win32-x64/u, + ); + }); +}); + +test('process runner preserves exact arguments and distinguishes missing commands from non-zero exits', async () => { + const argument = '/tmp/a path/with spaces.txt'; + const result = await processRunner.run( + process.execPath, + ['-e', 'process.stdout.write(JSON.stringify(process.argv.slice(1)))', argument], + { capture: true }, + ); + assert.deepEqual(JSON.parse(result.stdout), [argument]); + assert.match(formatCommand(process.execPath, [argument]), /"\/tmp\/a path\/with spaces\.txt"/u); + + await assert.rejects(processRunner.run('/definitely/missing/webview-runtime', [], { capture: true }), (error) => { + assert.equal(error.kind, 'not-found'); + return true; + }); + await assert.rejects(processRunner.run(process.execPath, ['-e', 'process.exit(7)'], { capture: true }), (error) => { + assert.equal(error.kind, 'failed'); + assert.equal(error.exitCode, 7); + return true; + }); +}); + +test('SEA prelude embeds the private addon asset and extracts it under a version/hash cache', () => { + const digest = 'a'.repeat(64); + const prelude = createSeaPrelude('0.4.7', digest); + assert.match(prelude, /__webviewjs_native\.node/u); + assert.match(prelude, /NAPI_RS_NATIVE_LIBRARY_PATH/u); + assert.match(prelude, /createRequire\(process\.execPath\)/u); + assert.match(prelude, /0\.4\.7-[a]{64}/u); + assert.match(prelude, /renameSync/u); + assert.match(prelude, /Buffer\.from\(__wvSea\.getAsset/u); +}); + +function createFakeRunner(onRun = () => {}) { + const calls = []; + return { + calls, + runner: { + async run(executable, args, options = {}) { + const call = { executable, args: [...args], cwd: options.cwd }; + calls.push(call); + await onRun(call); + return { code: 0, stdout: '', stderr: '' }; + }, + }, + }; +} + +async function makeNodeBuildContext(directory, supportsBuildSea, target = { os: 'linux', arch: 'x64', libc: 'gnu' }) { + const projectRoot = join(directory, 'user project'); + const tempDir = join(directory, 'temp build'); + const outDir = join(directory, 'release output with spaces'); + await mkdir(projectRoot, { recursive: true }); + await mkdir(tempDir, { recursive: true }); + await mkdir(outDir, { recursive: true }); + const input = join(projectRoot, 'main.js'); + const addonPath = join( + directory, + target.os === 'darwin' ? 'webview.darwin-arm64.node' : 'webview.linux-x64-gnu.node', + ); + const fakeNode = join(directory, 'fake node executable'); + await writeFile(input, "console.log('bundle fixture');\n"); + await writeFile(addonPath, 'fake native bytes'); + await writeFile(fakeNode, 'not executed'); + const options = { + runtime: 'node', + input, + outDir, + name: 'my-app', + minify: false, + verbose: false, + assets: [], + dryRun: false, + projectRoot, + }; + const context = { + options, + target, + addonPath, + packageVersion: '0.4.7', + packageRoot, + tempDir, + runtimeExecutable: fakeNode, + runtime: { executable: fakeNode, version: supportsBuildSea ? '25.5.0' : '24.21.0', supportsBuildSea }, + seaOptions: { useCodeCache: false, execArgv: [], execArgvExtension: 'env', useSnapshot: false }, + runner: undefined, + logger: { info() {}, success() {}, warn() {}, error() {} }, + }; + return { context, output: join(outDir, 'my-app'), addonPath, tempDir, fakeNode }; +} + +test('Node 24 SEA planning bundles first, embeds the addon and invokes installed Postject with array arguments', async () => { + await withTempDirectory(async (directory) => { + const { context, output, addonPath, fakeNode, tempDir } = await makeNodeBuildContext(directory, false); + let config; + const fake = createFakeRunner(async ({ args }) => { + if (args[0] === '--experimental-sea-config') { + config = JSON.parse(await readFile(args[1], 'utf8')); + await writeFile(config.output, 'fake sea blob'); + } + }); + context.runner = fake.runner; + const result = await new NodeRuntimeBuilder().build(context); + assert.equal(result.output, output); + assert.equal(config.main, join(tempDir, 'bundled-entry.cjs')); + assert.equal(config.output, join(tempDir, 'sea-prep.blob')); + assert.equal(config.useCodeCache, false); + assert.equal(config.useSnapshot, false); + assert.equal(config.assets['__webviewjs_native.node'], addonPath); + const postjectCall = fake.calls.find((call) => call.args[0].includes('postject')); + assert.ok(postjectCall); + assert.equal(postjectCall.executable, fakeNode); + assert.equal(postjectCall.args[0], resolvePostjectCli(packageRoot)); + assert.ok(postjectCall.args.includes('NODE_SEA_BLOB')); + assert.ok(postjectCall.args.includes('NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2')); + assert.ok(postjectCall.args.includes(join(tempDir, 'sea-prep.blob'))); + assert.ok(!postjectCall.args.includes('npx')); + assert.equal( + fake.calls.some((call) => call.args[0] === '--experimental-sea-config'), + true, + ); + assert.equal(existsSync(join(dirname(output), 'sea-config.json')), false, 'SEA config stays in the temp directory'); + assert.equal(existsSync(join(dirname(output), 'sea-prep.blob')), false, 'SEA blob stays in the temp directory'); + }); +}); + +test('Node 25.5 capability selects --build-sea and skips Postject', async () => { + await withTempDirectory(async (directory) => { + const { context, output } = await makeNodeBuildContext(directory, true); + let config; + const fake = createFakeRunner(async ({ args }) => { + if (args[0] === '--build-sea') { + config = JSON.parse(await readFile(args[1], 'utf8')); + await writeFile(config.output, 'fake native SEA binary'); + } + }); + context.runner = fake.runner; + await new NodeRuntimeBuilder().build(context); + assert.equal(config.output, output); + assert.deepEqual( + fake.calls.map((call) => call.args[0]), + ['--build-sea'], + ); + }); +}); + +test('Node probe detects SEA support by capability output and macOS legacy injection uses its segment name', async () => { + const builder = new NodeRuntimeBuilder(); + const base = { + options: { runtime: 'node', target: undefined, minify: false }, + target: { os: 'darwin', arch: 'arm64' }, + addonPath: '/tmp/webview.darwin-arm64.node', + packageVersion: '0.4.7', + packageRoot, + runtimeExecutable: process.execPath, + seaOptions: { useCodeCache: false, execArgv: [], execArgvExtension: 'env', useSnapshot: false }, + logger: { info() {}, success() {}, warn() {}, error() {} }, + }; + const probe24 = createFakeRunner(); + probe24.runner.run = async (_executable, args) => ({ + code: 0, + stdout: args[0] === '--version' ? 'v24.21.0' : 'Usage: node [options]', + stderr: '', + }); + assert.equal((await builder.probe({ ...base, runner: probe24.runner })).supportsBuildSea, false); + const probe25 = createFakeRunner(); + probe25.runner.run = async (_executable, args) => ({ + code: 0, + stdout: args[0] === '--version' ? 'v25.5.0' : ' --build-sea config.json', + stderr: '', + }); + assert.equal((await builder.probe({ ...base, runner: probe25.runner })).supportsBuildSea, true); + + await withTempDirectory(async (directory) => { + const { context, fakeNode, tempDir } = await makeNodeBuildContext(directory, false, { + os: 'darwin', + arch: 'arm64', + }); + const fake = createFakeRunner(async ({ args }) => { + if (args[0] === '--experimental-sea-config') { + const config = JSON.parse(await readFile(args[1], 'utf8')); + await writeFile(config.output, 'sea blob'); + } + }); + context.runner = fake.runner; + await new NodeRuntimeBuilder().build(context); + const postjectCall = fake.calls.find((call) => call.args[0].includes('postject')); + assert.ok(postjectCall); + assert.deepEqual(postjectCall.args.slice(-2), ['--macho-segment-name', 'NODE_SEA']); + assert.ok(fake.calls.some((call) => call.executable === 'codesign' && call.args[0] === '--remove-signature')); + assert.ok(fake.calls.some((call) => call.executable === 'codesign' && call.args[0] === '--sign')); + assert.equal(fakeNode.length > 0, true); + assert.equal(tempDir.includes('temp build'), true); + }); +}); + +test('dry run validates the addon and runtime but does not create output or invoke a compiler', async () => { + await withTempDirectory(async (directory) => { + const { project, input } = await makeProject(directory, 'dry-run-app'); + const addon = join(project, 'custom-native.node'); + const outDir = join(directory, 'release output'); + await writeFile(addon, 'native'); + const fake = createFakeRunner(); + fake.runner.run = async (executable, args, options = {}) => { + fake.calls.push({ executable, args: [...args], cwd: options.cwd }); + return { + code: 0, + stdout: args[0] === '--version' ? 'v24.21.0' : 'Usage: node [options]', + stderr: '', + }; + }; + const result = await buildExecutable( + { input, cwd: project, outDir, nativeAddon: addon, dryRun: true }, + { + runner: fake.runner, + packageRoot, + nodeExecutable: process.execPath, + logger: { info() {}, success() {}, warn() {}, error() {} }, + }, + ); + assert.equal(result.dryRun, true); + assert.equal(existsSync(outDir), false); + assert.deepEqual( + fake.calls.map((call) => call.args[0]), + ['--version', '--help'], + ); + }); +}); diff --git a/packages/webview/__test__/fixtures/executable-version.mjs b/packages/webview/__test__/fixtures/executable-version.mjs new file mode 100644 index 0000000..b095bce --- /dev/null +++ b/packages/webview/__test__/fixtures/executable-version.mjs @@ -0,0 +1,3 @@ +import { getWebviewVersion } from '@webviewjs/webview'; + +console.log(getWebviewVersion()); diff --git a/packages/webview/cli/build.mjs b/packages/webview/cli/build.mjs deleted file mode 100644 index 98e1f5a..0000000 --- a/packages/webview/cli/build.mjs +++ /dev/null @@ -1,134 +0,0 @@ -import { execSync } from 'node:child_process'; -import { copyFileSync, constants, writeFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs'; -import { dirname, join } from 'node:path'; -import { execPath } from 'node:process'; - -const isWindows = process.platform === 'win32'; -const isMac = process.platform === 'darwin'; -const NODE_SEA_FUSE = 'NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2'; - -function writeSeaConfig(main, dest, resources = {}) { - const config = { - main, - output: join(dirname(dest), 'sea-prep.blob'), - disableExperimentalSEAWarning: true, - assets: resources, - }; - - writeFileSync(dest, JSON.stringify(config, null, 2)); -} - -function run(command, args) { - const cmd = !args?.length ? command : `${command} ${args.join(' ')}`; - execSync(cmd, { stdio: 'inherit' }); -} - -function generateBlob(configPath) { - run('node', ['--experimental-sea-config', configPath]); - - return join(dirname(configPath), 'sea-prep.blob'); -} - -function copyNode(output, name) { - const ext = isWindows ? '.exe' : ''; - const f = join(output, name + ext); - copyFileSync(execPath, f, constants.COPYFILE_FICLONE); - - return f; -} - -function removeSignature(path) { - if (!isWindows && !isMac) return; - - if (isWindows) { - try { - run('signtool remove /s ' + path); - } catch (e) { - console.warn(`Failed to remove signature: ${e.message}`); - } - } else { - run('codesign --remove-signature ' + path); - } -} - -function injectFuse(target, blob) { - let args; - - if (isMac) { - args = [`"${target}"`, 'NODE_SEA_BLOB', blob, '--sentinel-fuse', NODE_SEA_FUSE, '--macho-segment-name', 'NODE_SEA']; - } else { - args = [target, 'NODE_SEA_BLOB', blob, '--sentinel-fuse', NODE_SEA_FUSE]; - } - - run('npx', ['--yes', 'postject', ...args]); -} - -function sign(bin) { - if (isWindows) { - try { - run('signtool', ['sign', '/fd', 'SHA256', bin]); - } catch (e) { - console.warn(`Failed to sign: ${e.message}`); - } - } else if (isMac) { - run('codesign', ['--sign', '-', bin]); - } -} - -function buildNode(input, output, name, resources) { - const assets = resources ? JSON.parse(readFileSync(resources, 'utf-8')) : {}; - const configPath = join(output, 'sea-config.json'); - const binPath = copyNode(output, name); - - writeSeaConfig(input, configPath, assets); - const blob = generateBlob(configPath); - removeSignature(binPath); - injectFuse(binPath, blob); - sign(binPath); - - return binPath; -} - -function buildDeno(input, output, name) { - const ext = isWindows ? '.exe' : ''; - const outfile = join(output, name + ext); - - run('deno', ['compile', '--allow-all', '--no-check', '--output', `"${outfile}"`, `"${input}"`]); - - return outfile; -} - -function buildBun(input, output, name) { - const ext = isWindows ? '.exe' : ''; - const outfile = join(output, name + ext); - - run('bun', ['build', '--compile', `"${input}"`, '--outfile', `"${outfile}"`]); - - // Bun auto-appends .exe on Windows even if already present, normalise - return outfile; -} - -export function build(input, output, name, resources, runtime = 'node') { - if (!existsSync(input)) { - throw new Error('Input file does not exist'); - } - - if (resources && !existsSync(resources)) { - throw new Error('Resources file does not exist'); - } - - if (!existsSync(output)) { - mkdirSync(output, { recursive: true }); - } - - switch (runtime) { - case 'deno': - return buildDeno(input, output, name); - case 'bun': - return buildBun(input, output, name); - case 'node': - return buildNode(input, output, name, resources); - default: - throw new Error(`Unknown runtime: "${runtime}". Must be one of: node, deno, bun`); - } -} diff --git a/packages/webview/cli/index.mjs b/packages/webview/cli/index.mjs index 6e09889..19b26b0 100755 --- a/packages/webview/cli/index.mjs +++ b/packages/webview/cli/index.mjs @@ -1,138 +1,5 @@ #!/usr/bin/env node -import { readFile } from 'node:fs/promises'; -import { parseArgs, styleText } from 'node:util'; -import { join } from 'node:path'; -import { stripIndents } from './utils.mjs'; -import { build } from './build.mjs'; -async function readPackageJSON() { - const packageJSON = await readFile(join(import.meta.dirname, '..', 'package.json'), 'utf-8'); - return JSON.parse(packageJSON); -} +import { bootstrapCLI } from '../dist/cli/index.js'; -const { version, description, main } = await readPackageJSON(); - -function inferRuntime() { - if (typeof globalThis.Bun !== 'undefined') return 'bun'; - if (typeof globalThis.Deno !== 'undefined') return 'deno'; - return 'node'; -} - -const defaultRuntime = inferRuntime(); - -const options = { - help: { type: 'boolean', short: 'h', description: 'Show help' }, - version: { type: 'boolean', short: 'v', description: 'Show version' }, - build: { - type: 'boolean', - short: 'b', - description: 'Build the project into a standalone executable', - }, - runtime: { - type: 'string', - short: 'R', - default: defaultRuntime, - description: 'Runtime to use for compilation (node, deno, bun)', - }, - name: { - type: 'string', - short: 'n', - default: 'webviewjs', - description: 'Project name', - }, - output: { - type: 'string', - short: 'o', - default: join(process.cwd(), 'dist'), - description: 'Output directory', - }, - input: { - type: 'string', - short: 'i', - default: join(process.cwd(), main), - description: 'Entry file', - }, - resources: { - type: 'string', - short: 'r', - description: 'Resources mapping json file path (node runtime only)', - }, - 'dry-run': { - type: 'boolean', - short: 'd', - description: 'Dry run', - }, -}; - -const args = parseArgs({ - strict: true, - args: process.argv.slice(2), - options, -}); - -let stdErr = false; - -const logger = (message) => { - console.log(message); - process.exit(+stdErr); -}; - -const defaultValuesOptionNames = new Set(Object.keys(options).filter((k) => !!options[k].default)); - -if (!Object.keys(args.values).filter((k) => !defaultValuesOptionNames.has(k)).length) { - args.values.help = true; - stdErr = true; -} - -if (args.values.help) { - const message = stripIndents`WebviewJS: ${styleText('greenBright', description)} - - ${styleText('dim', 'Usage:')} ${styleText('greenBright', 'webview [options]')} - - ${styleText('dim', 'Options:')} -${Object.entries(options) - .map(([name, { short, default: defaultValue, type }]) => { - const msg = ` ${styleText('greenBright', ` -${short}, --${name}`)} - ${styleText('dim', options[name].description || `${type} option`)}`; - - if (defaultValue) { - return `${msg} (default: ${styleText('blueBright', defaultValue)})`; - } - - return msg; - }) - .join('\n')} - `; - - logger(message); -} else if (args.values.version) { - logger( - `- WebviewJS v${version}\n- Node.js ${process.version}\n- Operating System: ${process.platform} ${process.arch}`, - ); -} else if (args.values.build) { - const isDry = !!args.values['dry-run']; - const { output, input, resources, runtime } = args.values; - - const validRuntimes = ['node', 'deno', 'bun']; - if (!validRuntimes.includes(runtime)) { - console.error(styleText('red', `Invalid runtime "${runtime}". Must be one of: ${validRuntimes.join(', ')}`)); - process.exit(1); - } - - if (isDry) { - logger(`Dry run: building ${input} to ${output} using ${runtime} runtime`); - } else { - const projectName = args.values.name || 'webviewjs'; - const target = build(input, output, prettify(projectName), resources, runtime); - logger( - styleText( - 'greenBright', - `\nBuilt ${input} to ${target}. You can now run the executable using ${styleText(['cyanBright', 'bold'], target)}`, - ), - ); - } -} - -function prettify(str) { - // remove stuff like @, /, whitespace, etc - return str.replace(/[^a-zA-Z0-9]/g, ''); -} +await bootstrapCLI(); diff --git a/packages/webview/cli/utils.mjs b/packages/webview/cli/utils.mjs deleted file mode 100644 index 6f8830e..0000000 --- a/packages/webview/cli/utils.mjs +++ /dev/null @@ -1,7 +0,0 @@ -export function stripIndents(strings, ...values) { - let str = ''; - strings.forEach((string, i) => { - str += string + (values[i] || ''); - }); - return str.replace(/(\t)+/g, ' ').trim(); -} diff --git a/packages/webview/lib/cli/args.ts b/packages/webview/lib/cli/args.ts new file mode 100644 index 0000000..6635f2e --- /dev/null +++ b/packages/webview/lib/cli/args.ts @@ -0,0 +1,172 @@ +import { accessSync, constants, existsSync, readFileSync, statSync } from 'node:fs'; +import { basename, extname, isAbsolute, resolve } from 'node:path'; +import { parseArgs } from 'node:util'; +import { normalizeAssets } from './assets'; +import { CliError } from './errors'; +import { getHostPlatform, parseRuntimeTarget, type PlatformInfo } from './platform'; +import type { BuildOptions, RuntimeName } from './types'; + +export type ParsedCommand = + | { kind: 'help'; scope: 'top' | 'build' } + | { kind: 'version' } + | { kind: 'build'; options: BuildOptions; deprecated: boolean }; + +const runtimeNames = new Set(['node', 'bun', 'deno']); + +const buildArgOptions = { + help: { type: 'boolean', short: 'h' }, + version: { type: 'boolean', short: 'v' }, + runtime: { type: 'string', short: 'R' }, + input: { type: 'string', short: 'i' }, + name: { type: 'string', short: 'n' }, + 'out-dir': { type: 'string' }, + output: { type: 'string', short: 'o' }, + target: { type: 'string' }, + 'native-addon': { type: 'string' }, + minify: { type: 'boolean' }, + verbose: { type: 'boolean' }, + asset: { type: 'string', multiple: true }, + resources: { type: 'string', short: 'r' }, + 'dry-run': { type: 'boolean', short: 'd' }, +} as const; + +export function parseCLIArguments( + argv: readonly string[], + cwd = process.cwd(), + host: PlatformInfo = getHostPlatform(), +): ParsedCommand { + const tokens = [...argv]; + if (tokens.length === 0) return { kind: 'help', scope: 'top' }; + if (tokens.includes('--version') || tokens.includes('-v')) return { kind: 'version' }; + + let deprecated = false; + if (tokens[0] === 'build') { + tokens.shift(); + } else if (tokens.includes('--build') || tokens.includes('-b')) { + deprecated = true; + for (let index = tokens.length - 1; index >= 0; index -= 1) { + if (tokens[index] === '--build' || tokens[index] === '-b') tokens.splice(index, 1); + } + } else if (tokens.includes('--help') || tokens.includes('-h')) { + return { kind: 'help', scope: 'top' }; + } else { + throw new CliError(`Unknown command "${tokens[0]}". Use "webview build " or "webview --help".`); + } + + let parsed; + try { + parsed = parseArgs({ args: tokens, options: buildArgOptions, allowPositionals: true, strict: true }); + } catch (cause) { + throw new CliError(cause instanceof Error ? cause.message : 'Invalid CLI arguments.', { cause }); + } + if (parsed.values.help) return { kind: 'help', scope: 'build' }; + if (parsed.values.version) return { kind: 'version' }; + + const positionalInput = parsed.positionals[0]; + if (parsed.positionals.length > 1) throw new CliError('Only one entry file may be provided.'); + if (positionalInput && parsed.values.input) + throw new CliError('Provide the entry file either positionally or with --input, not both.'); + const inputArgument = positionalInput ?? parsed.values.input ?? './index.js'; + const input = resolve(cwd, inputArgument); + + const runtimeText = parsed.values.runtime ?? 'node'; + if (!runtimeNames.has(runtimeText as RuntimeName)) { + throw new CliError(`Unknown runtime "${runtimeText}". Choose node, bun, or deno.`); + } + const runtime = runtimeText as RuntimeName; + if (parsed.values.resources && runtime !== 'node') { + throw new CliError('--resources is a Node SEA compatibility option; use --asset with Bun or Deno.'); + } + + const outDirArgument = parsed.values['out-dir'] ?? parsed.values.output ?? './dist'; + if (parsed.values['out-dir'] && parsed.values.output) { + throw new CliError('Use either --out-dir or the backwards-compatible --output alias, not both.'); + } + const outDir = resolve(cwd, outDirArgument); + + parseRuntimeTarget(runtime, parsed.values.target, host); + const name = normalizeExecutableName(parsed.values.name, cwd, inputArgument); + const nativeAddon = parsed.values['native-addon'] ? resolve(cwd, parsed.values['native-addon']) : undefined; + const assets = normalizeAssets(parsed.values.asset ?? [], parsed.values.resources, cwd); + + return { + kind: 'build', + deprecated, + options: { + runtime, + input, + outDir, + name, + target: parsed.values.target, + nativeAddon, + minify: parsed.values.minify ?? false, + verbose: parsed.values.verbose ?? false, + assets, + dryRun: parsed.values['dry-run'] ?? false, + projectRoot: cwd, + }, + }; +} + +export function normalizeExecutableName(explicit: string | undefined, cwd: string, input: string): string { + if (explicit !== undefined) return validateExecutableName(explicit); + const packageName = readPackageName(cwd); + if (packageName) { + const unscoped = packageName.startsWith('@') ? packageName.slice(packageName.indexOf('/') + 1) : packageName; + if (isValidExecutableName(unscoped)) return unscoped; + } + const inputBase = basename(input, extname(input)); + return validateExecutableName(inputBase); +} + +function readPackageName(cwd: string): string | undefined { + const packageJson = resolve(cwd, 'package.json'); + if (!existsSync(packageJson)) return undefined; + try { + const parsed = JSON.parse(readFileSync(packageJson, 'utf8')) as { name?: unknown }; + return typeof parsed.name === 'string' ? parsed.name : undefined; + } catch { + return undefined; + } +} + +function validateExecutableName(name: string): string { + if (!isValidExecutableName(name)) { + throw new CliError( + `Invalid executable name "${name}". Use letters, numbers, hyphens, underscores, or dots without path separators.`, + ); + } + return name; +} + +function isValidExecutableName(name: string): boolean { + if (!name || name === '.' || name === '..' || /[\\/:*?"<>|]/u.test(name) || /[. ]$/u.test(name)) return false; + if ([...name].some((character) => character.charCodeAt(0) < 32)) return false; + if (isAbsolute(name)) return false; + if (/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu.test(name)) return false; + return true; +} + +export function validateBuildInputs(options: BuildOptions): void { + if (!existsSync(options.input)) throw new CliError(`Entry file does not exist: ${options.input}`); + if (!statSync(options.input).isFile()) throw new CliError(`Entry path is not a file: ${options.input}`); + if (existsSync(options.outDir) && !statSync(options.outDir).isDirectory()) { + throw new CliError(`Output path exists and is not a directory: ${options.outDir}`); + } + let writableParent = options.outDir; + while (!existsSync(writableParent)) { + const parent = resolve(writableParent, '..'); + if (parent === writableParent) break; + writableParent = parent; + } + try { + accessSync(writableParent, constants.W_OK); + } catch (cause) { + throw new CliError(`Output directory is not writable: ${writableParent}`, { cause }); + } + if (options.nativeAddon) { + if (!existsSync(options.nativeAddon)) throw new CliError(`Native addon does not exist: ${options.nativeAddon}`); + if (!options.nativeAddon.endsWith('.node')) + throw new CliError(`Native addon must be a .node file: ${options.nativeAddon}`); + } +} diff --git a/packages/webview/lib/cli/assets.ts b/packages/webview/lib/cli/assets.ts new file mode 100644 index 0000000..f0d879f --- /dev/null +++ b/packages/webview/lib/cli/assets.ts @@ -0,0 +1,65 @@ +import { existsSync, readFileSync, statSync } from 'node:fs'; +import { basename, dirname, resolve } from 'node:path'; +import { CliError } from './errors'; +import type { BuildAsset } from './types'; + +export const SEA_NATIVE_ASSET_KEY = '__webviewjs_native.node'; + +export function normalizeAssets( + assetPaths: readonly string[], + resourcesPath: string | undefined, + cwd: string, +): BuildAsset[] { + const assets: BuildAsset[] = []; + const keys = new Set(); + + const add = (key: string, path: string) => { + if (!key || key.includes('\0') || key === '__proto__') { + throw new CliError('Asset names must be non-empty, cannot contain null bytes, and cannot be "__proto__".'); + } + if (key === SEA_NATIVE_ASSET_KEY) throw new CliError(`Asset name "${key}" is reserved by WebviewJS.`); + if (keys.has(key)) throw new CliError(`Asset name "${key}" was provided more than once.`); + const absolutePath = resolve(cwd, path); + if (!existsSync(absolutePath)) throw new CliError(`Asset does not exist: ${absolutePath}`); + keys.add(key); + assets.push({ key, path: absolutePath }); + }; + + for (const path of assetPaths) add(basename(path), path); + + if (resourcesPath) { + const absoluteResources = resolve(cwd, resourcesPath); + if (!existsSync(absoluteResources)) throw new CliError(`Resources file does not exist: ${absoluteResources}`); + let parsed: unknown; + try { + parsed = JSON.parse(readFileSync(absoluteResources, 'utf8')); + } catch (cause) { + throw new CliError(`Could not parse resources JSON at ${absoluteResources}.`, { cause }); + } + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + throw new CliError('Resources JSON must be an object mapping asset names to file paths.'); + } + for (const [key, value] of Object.entries(parsed)) { + if (typeof value !== 'string' || value.length === 0) { + throw new CliError(`Resource "${key}" must map to a non-empty file path.`); + } + add(key, resolve(dirname(absoluteResources), value)); + } + } + + return assets; +} + +export function validateAssets(assets: readonly BuildAsset[], runtime: 'node' | 'bun' | 'deno'): void { + for (const asset of assets) { + let info; + try { + info = statSync(asset.path); + } catch (cause) { + throw new CliError(`Asset does not exist: ${asset.path}`, { cause }); + } + if (runtime === 'node' && !info.isFile()) { + throw new CliError(`Node SEA assets must be files: ${asset.path}`); + } + } +} diff --git a/packages/webview/lib/cli/bootstrap.ts b/packages/webview/lib/cli/bootstrap.ts new file mode 100644 index 0000000..b5fe687 --- /dev/null +++ b/packages/webview/lib/cli/bootstrap.ts @@ -0,0 +1,81 @@ +import { readFileSync } from 'node:fs'; +import { join, resolve } from 'node:path'; +import { parseCLIArguments } from './args'; +import { buildExecutable } from './build'; +import { CliError } from './errors'; +import { consoleLogger } from './logger'; + +const packageRoot = resolve(__dirname, '../..'); + +export async function bootstrapCLI(argv: readonly string[] = process.argv.slice(2)): Promise { + try { + const parsed = parseCLIArguments(argv); + if (parsed.kind === 'version') { + const { version } = readPackageInfo(); + consoleLogger.info(`WebviewJS v${version} · Node.js ${process.version} · ${process.platform}-${process.arch}`); + return; + } + if (parsed.kind === 'help') { + consoleLogger.info(parsed.scope === 'build' ? buildHelp : topHelp); + return; + } + if (parsed.deprecated) consoleLogger.warn('webview --build is deprecated; use "webview build ".'); + await buildExecutable({ ...parsed.options, cwd: parsed.options.projectRoot }); + } catch (error) { + const message = error instanceof CliError || error instanceof Error ? error.message : String(error); + consoleLogger.error(`Error: ${message}`); + process.exitCode = 1; + } +} + +function readPackageInfo(): { version: string; description: string } { + try { + const parsed = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8')) as { + version?: string; + description?: string; + }; + return { + version: parsed.version ?? 'unknown', + description: parsed.description ?? 'Build standalone WebviewJS applications.', + }; + } catch { + return { version: 'unknown', description: 'Build standalone WebviewJS applications.' }; + } +} + +const topHelp = `WebviewJS - Build standalone applications + +Usage: webview [options] + +Commands: + build Build a standalone executable + +Options: + -h, --help Show help + -v, --version Show version + +Run "webview build --help" for build options.`; + +const buildHelp = `Build a standalone executable + +Usage: webview build [entry] [options] + +Options: + -R, --runtime Runtime: node, bun, or deno (default: node) + -n, --name Executable name (default: package name or entry basename) + --out-dir Output directory (default: ./dist) + --target Runtime-specific target + --native-addon Override the target-specific WebviewJS .node addon + --asset Embed assets where supported (repeatable) + -r, --resources Read a Node SEA JSON asset map (compatibility option) + --minify Minify the Node.js bundle or Bun output + --verbose Print subprocess commands + -d, --dry-run Validate and print the build plan + -h, --help Show this help + +Examples: + webview build src/main.ts + webview build src/main.ts --runtime bun --minify + webview build src/main.ts --runtime deno --out-dir ./release + +The deprecated form "webview --build --input " remains supported temporarily.`; diff --git a/packages/webview/lib/cli/build.ts b/packages/webview/lib/cli/build.ts new file mode 100644 index 0000000..b47579a --- /dev/null +++ b/packages/webview/lib/cli/build.ts @@ -0,0 +1,220 @@ +import { accessSync, constants, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join, resolve } from 'node:path'; +import { BunRuntimeBuilder } from './runtimes/bun'; +import { DenoRuntimeBuilder } from './runtimes/deno'; +import { NodeRuntimeBuilder } from './runtimes/node'; +import type { RuntimeBuilder, RuntimeProbeContext } from './runtimes/runtime'; +import { normalizeAssets, SEA_NATIVE_ASSET_KEY, validateAssets } from './assets'; +import { normalizeExecutableName, validateBuildInputs } from './args'; +import { CliError, ProcessExecutionError } from './errors'; +import { consoleLogger, printBuildPlan, printBuildResult } from './logger'; +import { resolveNativeAddon } from './native-addon'; +import { assertRuntimeTarget, findExecutable, getHostPlatform, parseRuntimeTarget } from './platform'; +import { processRunner } from './process'; +import { executableOutputPath } from './paths'; +import type { + BuildContext, + BuildExecutableOptions, + BuildLogger, + BuildOptions, + BuildResult, + BuildServices, + BuildAsset, + NativeTarget, + RuntimeName, + SeaOptions, +} from './types'; + +const validRuntimes = new Set(['node', 'bun', 'deno']); +const builders: Record RuntimeBuilder> = { + node: () => new NodeRuntimeBuilder(), + bun: () => new BunRuntimeBuilder(), + deno: () => new DenoRuntimeBuilder(), +}; + +const defaultSeaOptions: SeaOptions = { + useSnapshot: false, + useCodeCache: false, + execArgv: [], + execArgvExtension: 'env', +}; + +export function normalizeBuildOptions( + raw: BuildExecutableOptions, + services: Pick = {}, +): BuildOptions { + const cwd = resolve(raw.cwd ?? process.cwd()); + const runtimeText = raw.runtime ?? 'node'; + if (!validRuntimes.has(runtimeText as RuntimeName)) { + throw new CliError(`Unknown runtime "${runtimeText}". Choose node, bun, or deno.`); + } + const runtime = runtimeText as RuntimeName; + if (raw.resources && runtime !== 'node') { + throw new CliError('The resources JSON map is only supported by Node SEA; use assets for Bun or Deno.'); + } + if (raw.outDir !== undefined && raw.output !== undefined) { + throw new CliError('Use either outDir or the backwards-compatible output alias, not both.'); + } + const inputArgument = raw.input ?? './index.js'; + const input = resolve(cwd, inputArgument); + const outDir = resolve(cwd, raw.outDir ?? raw.output ?? './dist'); + parseRuntimeTarget(runtime, raw.target, services.platform ?? getHostPlatform()); + const stringAssets = (raw.assets ?? []).filter((asset): asset is string => typeof asset === 'string'); + const assets = normalizeAssets(stringAssets, raw.resources, cwd); + for (const rawAsset of raw.assets ?? []) { + if (typeof rawAsset === 'string') continue; + addProgrammaticAsset(assets, rawAsset, cwd); + } + const name = normalizeExecutableName(raw.name, cwd, inputArgument); + const nativeAddon = raw.nativeAddon ? resolve(cwd, raw.nativeAddon) : undefined; + const options: BuildOptions = { + runtime, + input, + outDir, + name, + target: raw.target, + nativeAddon, + minify: raw.minify ?? false, + verbose: raw.verbose ?? false, + assets, + dryRun: raw.dryRun ?? false, + projectRoot: cwd, + }; + return options; +} + +export async function buildExecutable( + rawOptions: BuildExecutableOptions, + services: BuildServices = {}, +): Promise { + const options = normalizeBuildOptions(rawOptions, { platform: services.platform }); + validateBuildInputs(options); + validateAssets(options.assets, options.runtime); + const target = parseRuntimeTarget(options.runtime, options.target, services.platform ?? getHostPlatform()); + assertRuntimeTarget(options.runtime, target); + const packageRoot = services.packageRoot ?? resolvePackageRoot(); + const addon = resolveNativeAddon(target, options.projectRoot, packageRoot, options.nativeAddon); + const runtimeExecutable = await getRuntimeExecutable(options.runtime, services); + const logger = services.logger ?? consoleLogger; + const runner = withCommandLogging(services.runner ?? processRunner, logger, options.verbose); + const builder = builders[options.runtime](); + const probeContext: RuntimeProbeContext = { + options, + target, + addonPath: addon.path, + packageVersion: readPackageVersion(packageRoot), + packageRoot, + runtimeExecutable, + seaOptions: { ...defaultSeaOptions, execArgv: [...defaultSeaOptions.execArgv] }, + runner, + logger, + }; + + const runtime = await builder.probe(probeContext); + await builder.validate(probeContext, runtime); + const plannedSteps = builder.plan(probeContext, runtime); + const output = getOutputPath(options, target); + if (options.dryRun) { + printBuildPlan(options.runtime, runtime.version, target, options.input, output, plannedSteps, logger); + return { + output, + runtime: options.runtime, + runtimeVersion: runtime.version, + target, + steps: plannedSteps, + dryRun: true, + }; + } + + try { + mkdirSync(options.outDir, { recursive: true }); + } catch (cause) { + throw new CliError(`Could not create output directory ${options.outDir}.`, { cause }); + } + const tempDir = mkdtempSync(join(tmpdir(), 'webviewjs-build-')); + const context: BuildContext = { + ...probeContext, + tempDir, + runtime, + }; + try { + const result = await builder.build(context); + printBuildResult(result, options.input, logger); + return result; + } catch (cause) { + if (cause instanceof CliError || cause instanceof ProcessExecutionError) throw cause; + throw new CliError(`The ${options.runtime} executable build failed.`, { cause }); + } finally { + rmSync(tempDir, { recursive: true, force: true }); + } +} + +export function getOutputPath(options: Pick, target: NativeTarget): string { + return executableOutputPath(options.outDir, options.name, target); +} + +function addProgrammaticAsset(assets: BuildAsset[], asset: BuildAsset, cwd: string): void { + if (asset.key === SEA_NATIVE_ASSET_KEY) + throw new CliError(`Asset name "${SEA_NATIVE_ASSET_KEY}" is reserved by WebviewJS.`); + if (!asset.key || assets.some((existing) => existing.key === asset.key)) { + throw new CliError(`Asset name "${asset.key}" is empty or was provided more than once.`); + } + const path = resolve(cwd, asset.path); + if (!existsSync(path)) throw new CliError(`Asset does not exist: ${path}`); + assets.push({ key: asset.key, path }); +} + +async function getRuntimeExecutable(runtime: RuntimeName, services: BuildServices): Promise { + if (runtime === 'node') { + const executable = services.nodeExecutable ?? process.execPath; + try { + accessSync(executable, constants.X_OK); + } catch (cause) { + throw new CliError(`Node.js executable is not accessible: ${executable}`, { cause }); + } + return executable; + } + const configured = runtime === 'bun' ? services.bunExecutable : services.denoExecutable; + if (configured) { + try { + accessSync(configured, process.platform === 'win32' ? constants.F_OK : constants.X_OK); + } catch (cause) { + throw new CliError(`${runtime} executable is not accessible: ${configured}`, { cause }); + } + return configured; + } + const executable = await findExecutable(runtime); + if (!executable) + throw new CliError(`Could not find ${runtime} on PATH. Install ${runtime} or select another runtime.`); + return executable; +} + +function resolvePackageRoot(): string { + // Dist/cli is two levels below the package root. The same result holds in a checkout. + return resolve(__dirname, '../..'); +} + +function readPackageVersion(packageRoot: string): string { + try { + const packageJson = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8')) as { version?: unknown }; + return typeof packageJson.version === 'string' ? packageJson.version : 'unknown'; + } catch { + return 'unknown'; + } +} + +function withCommandLogging(runner: NonNullable, logger: BuildLogger, verbose: boolean) { + return { + run(executable: string, args: readonly string[], options: Parameters[2] = {}) { + const original = options.onCommand; + return runner.run(executable, args, { + ...options, + onCommand(command) { + if (verbose) logger.info(`$ ${command}`); + original?.(command); + }, + }); + }, + }; +} diff --git a/packages/webview/lib/cli/bundler/esbuild.ts b/packages/webview/lib/cli/bundler/esbuild.ts new file mode 100644 index 0000000..61135a1 --- /dev/null +++ b/packages/webview/lib/cli/bundler/esbuild.ts @@ -0,0 +1,92 @@ +import { createHash } from 'node:crypto'; +import { readFileSync } from 'node:fs'; +import { basename } from 'node:path'; +import { build as esbuild } from 'esbuild'; +import { CliError } from '../errors'; +import { SEA_NATIVE_ASSET_KEY } from '../assets'; +import type { BuildAsset, NativeTarget } from '../types'; + +export interface NodeBundleOptions { + input: string; + outfile: string; + cwd: string; + minify: boolean; + addonPath: string; + packageVersion: string; +} + +export interface NodeBundleResult { + outfile: string; + addonAsset: BuildAsset; + addonHash: string; +} + +export async function bundleNodeApplication(options: NodeBundleOptions): Promise { + const addonHash = createHash('sha256').update(readFileSync(options.addonPath)).digest('hex'); + const prelude = createSeaPrelude(options.packageVersion, addonHash); + try { + await esbuild({ + absWorkingDir: options.cwd, + entryPoints: [options.input], + outfile: options.outfile, + bundle: true, + platform: 'node', + format: 'cjs', + target: 'node24', + minify: options.minify, + banner: { js: prelude }, + external: ['@webviewjs/webview-*', '*.node'], + logLevel: 'silent', + }); + } catch (cause) { + throw new CliError(`Could not bundle application entry ${options.input}.`, { cause }); + } + return { + outfile: options.outfile, + addonAsset: { key: SEA_NATIVE_ASSET_KEY, path: options.addonPath }, + addonHash, + }; +} + +export function createSeaPrelude(packageVersion: string, addonHash: string): string { + const cacheName = `${packageVersion}-${addonHash}`; + const key = JSON.stringify(SEA_NATIVE_ASSET_KEY); + const cache = JSON.stringify(cacheName); + return `(() => { + const __wvSea = require('node:sea'); + if (!__wvSea.isSea()) return; + const __wvFs = require('node:fs'); + const __wvPath = require('node:path'); + const __wvOs = require('node:os'); + const __wvAddon = __wvPath.join(__wvOs.tmpdir(), 'webviewjs', ${cache}, '__webviewjs_native.node'); + __wvFs.mkdirSync(__wvPath.dirname(__wvAddon), { recursive: true, mode: 0o700 }); + if (!__wvFs.existsSync(__wvAddon)) { + const __wvTemp = __wvAddon + '.' + process.pid + '.' + Math.random().toString(16).slice(2) + '.tmp'; + try { + __wvFs.writeFileSync(__wvTemp, Buffer.from(__wvSea.getAsset(${key})), { flag: 'wx', mode: 0o700 }); + try { + __wvFs.renameSync(__wvTemp, __wvAddon); + } catch (__wvRenameError) { + if (!__wvFs.existsSync(__wvAddon)) throw __wvRenameError; + __wvFs.unlinkSync(__wvTemp); + } + } catch (__wvWriteError) { + try { __wvFs.unlinkSync(__wvTemp); } catch {} + throw __wvWriteError; + } + } + process.env.NAPI_RS_NATIVE_LIBRARY_PATH = __wvAddon; + require = require('node:module').createRequire(process.execPath); +})();`; +} + +export function createSeaAssets(userAssets: readonly BuildAsset[], addonPath: string): Record { + const assets = Object.create(null) as Record; + for (const asset of userAssets) assets[asset.key] = asset.path; + assets[SEA_NATIVE_ASSET_KEY] = addonPath; + return assets; +} + +export function describeAddonAsset(target: NativeTarget, addonPath: string): string { + return `embedded ${target.os}-${target.arch} WebviewJS native addon (${basename(addonPath)})`; +} diff --git a/packages/webview/lib/cli/errors.ts b/packages/webview/lib/cli/errors.ts new file mode 100644 index 0000000..26ec02c --- /dev/null +++ b/packages/webview/lib/cli/errors.ts @@ -0,0 +1,32 @@ +export class CliError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + this.name = 'CliError'; + } +} + +export class ProcessExecutionError extends CliError { + readonly executable: string; + readonly args: readonly string[]; + readonly exitCode?: number; + readonly kind: 'not-found' | 'failed'; + + constructor( + executable: string, + args: readonly string[], + kind: 'not-found' | 'failed', + options: { exitCode?: number; cause?: unknown } = {}, + ) { + const command = [executable, ...args].join(' '); + const message = + kind === 'not-found' + ? `Could not find executable "${executable}". Install it or put it on PATH.` + : `Command failed with exit code ${options.exitCode ?? 1}: ${command}`; + super(message, { cause: options.cause }); + this.name = 'ProcessExecutionError'; + this.executable = executable; + this.args = args; + this.exitCode = options.exitCode; + this.kind = kind; + } +} diff --git a/packages/webview/lib/cli/index.ts b/packages/webview/lib/cli/index.ts new file mode 100644 index 0000000..9cbd145 --- /dev/null +++ b/packages/webview/lib/cli/index.ts @@ -0,0 +1,28 @@ +export { bootstrapCLI } from './bootstrap'; +export { buildExecutable, getOutputPath, normalizeBuildOptions } from './build'; +export { parseCLIArguments, normalizeExecutableName, validateBuildInputs } from './args'; +export { CliError, ProcessExecutionError } from './errors'; +export { processRunner, formatCommand } from './process'; +export { executableOutputPath } from './paths'; +export { getHostPlatform, parseRuntimeTarget, nativeTargetKey, nativePackageName, formatTarget } from './platform'; +export { resolveNativeAddon, nativeAddonFileName, validateNativeAddonPath, inferNativeTarget } from './native-addon'; +export { bundleNodeApplication, createSeaPrelude, createSeaAssets } from './bundler/esbuild'; +export { NodeRuntimeBuilder, createSeaConfig, resolvePostjectCli } from './runtimes/node'; +export { BunRuntimeBuilder } from './runtimes/bun'; +export { DenoRuntimeBuilder } from './runtimes/deno'; +export { createDenoPackageAdapter } from './runtimes/deno'; +export type { + BuildAsset, + BuildContext, + BuildExecutableOptions, + BuildLogger, + BuildOptions, + BuildResult, + BuildServices, + NativeArch, + NativeOs, + NativeTarget, + RuntimeInfo, + RuntimeName, + SeaOptions, +} from './types'; diff --git a/packages/webview/lib/cli/logger.ts b/packages/webview/lib/cli/logger.ts new file mode 100644 index 0000000..9dc6f22 --- /dev/null +++ b/packages/webview/lib/cli/logger.ts @@ -0,0 +1,62 @@ +import { styleText } from 'node:util'; +import type { BuildLogger, BuildResult } from './types'; +import { formatTarget } from './platform'; + +export const consoleLogger: BuildLogger = { + info: (message) => console.log(message), + success: (message) => console.log(styleText('green', ` ✓ ${message}`)), + warn: (message) => console.warn(styleText('yellow', message)), + error: (message) => console.error(styleText('red', message)), +}; + +export function printBuildPlan( + runtime: string, + version: string, + target: BuildResult['target'], + entry: string, + output: string, + steps: readonly string[], + logger: BuildLogger = consoleLogger, +): void { + logger.info( + [ + 'WebviewJS build plan', + '', + ` Runtime ${runtime} ${version}`, + ` Target ${formatTarget(target)}`, + ` Entry ${entry}`, + ` Output ${output}`, + '', + ' Steps', + ...steps.map((step, index) => ` ${index + 1}. ${step}`), + ].join('\n'), + ); +} + +export function printBuildResult(result: BuildResult, entry: string, logger: BuildLogger = consoleLogger): void { + logger.info( + [ + 'WebviewJS', + '', + ` Runtime ${runtimeLabel(result.runtime)} ${result.runtimeVersion}`, + ` Target ${formatTarget(result.target)}`, + ` Entry ${entry}`, + ` Output ${result.output}`, + '', + ...result.steps.map((step) => ` ✓ ${step}`), + '', + `Built ${result.output}`, + ].join('\n'), + ); +} + +export function runtimeLabel(name: string): string { + switch (name) { + case 'node': + return 'Node.js'; + case 'bun': + return 'Bun'; + default: + return 'Deno'; + } +} diff --git a/packages/webview/lib/cli/native-addon.ts b/packages/webview/lib/cli/native-addon.ts new file mode 100644 index 0000000..ec7b207 --- /dev/null +++ b/packages/webview/lib/cli/native-addon.ts @@ -0,0 +1,108 @@ +import { existsSync, statSync } from 'node:fs'; +import { createRequire } from 'node:module'; +import { basename, join, resolve } from 'node:path'; +import { CliError } from './errors'; +import { formatTarget, nativePackageName } from './platform'; +import type { NativeTarget } from './types'; + +export interface ResolvedNativeAddon { + path: string; + packageName: string; +} + +export function nativeAddonFileName(target: NativeTarget): string { + const suffix = + target.os === 'darwin' + ? `darwin-${target.arch}` + : target.os === 'win32' + ? `win32-${target.arch}-msvc` + : target.arch === 'arm' + ? 'linux-arm-gnueabihf' + : `linux-${target.arch}-${target.libc ?? 'gnu'}`; + return `webview.${suffix}.node`; +} + +export function packageRootFromModule(moduleDirectory: string = __dirname): string { + return resolve(moduleDirectory, '../..'); +} + +export function resolveNativeAddon( + target: NativeTarget, + projectRoot: string, + packageRoot = packageRootFromModule(), + override?: string, +): ResolvedNativeAddon { + const packageName = nativePackageName(target); + if (override) { + const absolute = resolve(projectRoot, override); + validateNativeAddonPath(absolute, target); + return { path: absolute, packageName }; + } + + const projectRequire = createRequire(join(projectRoot, 'package.json')); + try { + const resolved = projectRequire.resolve(packageName); + validateNativeAddonPath(resolved, target); + return { path: resolved, packageName }; + } catch (cause) { + if (cause instanceof CliError) throw cause; + } + + // Development builds place N-API output beside the package or in npm/. + const localCandidates = [ + join(packageRoot, nativeAddonFileName(target)), + join(packageRoot, 'npm', packageName.slice('@webviewjs/webview-'.length), nativeAddonFileName(target)), + ]; + const localAddon = localCandidates.find((candidate) => existsSync(candidate)); + if (localAddon) { + validateNativeAddonPath(localAddon, target); + return { path: localAddon, packageName }; + } + + throw new CliError( + `Could not find the ${formatTarget(target)} WebviewJS native addon (${packageName}) from ${projectRoot}. ` + + `Install the target-specific optional dependency for the target platform, or pass --native-addon . ` + + `Cross-compilation never uses the host addon as a fallback.`, + ); +} + +export function validateNativeAddonPath(path: string, target: NativeTarget): void { + if (!path.endsWith('.node')) throw new CliError(`Native addon must end in .node: ${path}`); + if (!existsSync(path) || !statSync(path).isFile()) throw new CliError(`Native addon file does not exist: ${path}`); + const inferred = inferNativeTarget(basename(path)); + if (inferred && !sameNativeTarget(inferred, target)) { + throw new CliError( + `Native addon "${path}" is for ${formatTarget(inferred)}, but the requested target is ${formatTarget(target)}.`, + ); + } +} + +export function inferNativeTarget(fileName: string): NativeTarget | undefined { + const match = /^webview\.(darwin|win32|linux)-(.+)\.node$/u.exec(fileName); + if (!match) return undefined; + const [, os, suffix] = match; + if (os === 'darwin' && (suffix === 'x64' || suffix === 'arm64')) return { os, arch: suffix }; + if (os === 'win32') { + const arch = suffix.replace(/-msvc$/u, ''); + if (suffix.endsWith('-msvc') && (arch === 'x64' || arch === 'arm64' || arch === 'ia32')) { + return { os, arch }; + } + } + if (os === 'linux') { + const target = suffix.match(/^(x64|arm64|ia32|arm)-(gnu|musl|gnueabihf)$/u); + if (target) { + const arch = target[1] as NativeTarget['arch']; + const libc = target[2] === 'musl' ? 'musl' : 'gnu'; + return { os, arch, libc }; + } + } + return undefined; +} + +function sameNativeTarget(left: NativeTarget, right: NativeTarget): boolean { + return ( + left.os === right.os && + left.arch === right.arch && + (left.os !== 'linux' || (left.libc ?? 'gnu') === (right.libc ?? 'gnu')) + ); +} diff --git a/packages/webview/lib/cli/paths.ts b/packages/webview/lib/cli/paths.ts new file mode 100644 index 0000000..d4ed8da --- /dev/null +++ b/packages/webview/lib/cli/paths.ts @@ -0,0 +1,7 @@ +import { join } from 'node:path'; +import type { NativeTarget } from './types'; + +export function executableOutputPath(outDir: string, name: string, target: NativeTarget): string { + const extension = target.os === 'win32' && !name.toLowerCase().endsWith('.exe') ? '.exe' : ''; + return join(outDir, `${name}${extension}`); +} diff --git a/packages/webview/lib/cli/platform.ts b/packages/webview/lib/cli/platform.ts new file mode 100644 index 0000000..bc0099e --- /dev/null +++ b/packages/webview/lib/cli/platform.ts @@ -0,0 +1,169 @@ +import { access, constants, stat } from 'node:fs/promises'; +import { delimiter, join } from 'node:path'; +import { CliError } from './errors'; +import type { NativeArch, NativeTarget, RuntimeName } from './types'; + +export interface PlatformInfo { + os: NodeJS.Platform; + arch: string; + libc?: 'gnu' | 'musl'; +} + +export function getHostPlatform(): PlatformInfo { + let libc: 'gnu' | 'musl' | undefined; + if (process.platform === 'linux') { + const report = process.report?.getReport?.() as { header?: { glibcVersionRuntime?: string } } | undefined; + libc = report?.header?.glibcVersionRuntime ? 'gnu' : 'musl'; + } + return { os: process.platform, arch: process.arch, libc }; +} + +export function toNativeTarget(platform: PlatformInfo): NativeTarget { + if (!['darwin', 'win32', 'linux'].includes(platform.os)) { + throw new CliError(`WebviewJS executable builds do not support host operating system "${platform.os}".`); + } + if (!['x64', 'arm64', 'ia32', 'arm'].includes(platform.arch)) { + throw new CliError(`WebviewJS does not publish a desktop native addon for ${platform.os}-${platform.arch}.`); + } + const target: NativeTarget = { + os: platform.os as NativeTarget['os'], + arch: platform.arch as NativeArch, + }; + if (target.os === 'linux') target.libc = platform.libc ?? 'gnu'; + return target; +} + +const BUN_TARGETS: Record = { + 'bun-darwin-x64': { os: 'darwin', arch: 'x64' }, + 'bun-darwin-arm64': { os: 'darwin', arch: 'arm64' }, + 'bun-linux-x64': { os: 'linux', arch: 'x64', libc: 'gnu' }, + 'bun-linux-arm64': { os: 'linux', arch: 'arm64', libc: 'gnu' }, + 'bun-linux-x64-musl': { os: 'linux', arch: 'x64', libc: 'musl' }, + 'bun-linux-arm64-musl': { os: 'linux', arch: 'arm64', libc: 'musl' }, + 'bun-windows-x64': { os: 'win32', arch: 'x64' }, + 'bun-windows-arm64': { os: 'win32', arch: 'arm64' }, +}; + +const DENO_TARGETS: Record = { + 'x86_64-pc-windows-msvc': { os: 'win32', arch: 'x64' }, + 'aarch64-pc-windows-msvc': { os: 'win32', arch: 'arm64' }, + 'x86_64-apple-darwin': { os: 'darwin', arch: 'x64' }, + 'aarch64-apple-darwin': { os: 'darwin', arch: 'arm64' }, + 'x86_64-unknown-linux-gnu': { os: 'linux', arch: 'x64', libc: 'gnu' }, + 'aarch64-unknown-linux-gnu': { os: 'linux', arch: 'arm64', libc: 'gnu' }, +}; + +export function parseRuntimeTarget( + runtime: RuntimeName, + value: string | undefined, + host: PlatformInfo = getHostPlatform(), +): NativeTarget { + if (!value) { + const hostTarget = toNativeTarget(host); + if (runtime === 'bun' && !Object.values(BUN_TARGETS).some((target) => sameTarget(target, hostTarget))) { + throw new CliError(`Bun does not support host target ${formatTarget(hostTarget)}.`); + } + if (runtime === 'deno' && !Object.values(DENO_TARGETS).some((target) => sameTarget(target, hostTarget))) { + throw new CliError(`Deno does not support host target ${formatTarget(hostTarget)}.`); + } + return hostTarget; + } + if (runtime === 'node') { + throw new CliError( + 'Node SEA uses the current Node executable and cannot cross-compile. Remove --target or build on the target platform.', + ); + } + + const targets = runtime === 'bun' ? BUN_TARGETS : DENO_TARGETS; + const target = targets[value]; + if (!target) { + const available = Object.keys(targets).join(', '); + throw new CliError(`Unsupported ${runtime} target "${value}". Supported targets: ${available}.`); + } + if (runtime === 'bun' && target.libc === 'musl') { + throw new CliError( + `Bun can target musl, but WebviewJS does not publish musl native addons. Use a glibc target such as "bun-linux-x64".`, + ); + } + return { ...target }; +} + +function sameTarget(left: NativeTarget, right: NativeTarget): boolean { + return ( + left.os === right.os && + left.arch === right.arch && + (left.os !== 'linux' || (left.libc ?? 'gnu') === (right.libc ?? 'gnu')) + ); +} + +export function nativeTargetKey(target: NativeTarget): string { + const platform = target.os === 'win32' ? 'win32' : target.os; + const libc = target.os === 'linux' ? `-${target.libc ?? 'gnu'}` : ''; + return `${platform}-${target.arch}${libc}`; +} + +export function formatTarget(target: NativeTarget): string { + return `${target.os}-${target.arch}${target.os === 'linux' ? `-${target.libc ?? 'gnu'}` : ''}`; +} + +export function nativePackageName(target: NativeTarget): string { + if (target.os === 'linux' && (target.libc ?? 'gnu') !== 'gnu') { + throw new CliError(`WebviewJS does not publish a ${formatTarget(target)} native addon.`); + } + const suffix = + target.os === 'darwin' + ? `darwin-${target.arch}` + : target.os === 'win32' + ? `win32-${target.arch}-msvc` + : target.arch === 'arm' + ? 'linux-arm-gnueabihf' + : `linux-${target.arch}-gnu`; + const available = new Set([ + 'darwin-x64', + 'darwin-arm64', + 'win32-x64-msvc', + 'win32-arm64-msvc', + 'win32-ia32-msvc', + 'linux-x64-gnu', + 'linux-arm64-gnu', + 'linux-ia32-gnu', + 'linux-arm-gnueabihf', + ]); + if (!available.has(suffix)) { + throw new CliError(`WebviewJS does not publish a ${formatTarget(target)} native addon.`); + } + return `@webviewjs/webview-${suffix}`; +} + +export function assertRuntimeTarget(runtime: RuntimeName, target: NativeTarget): void { + // Parsing is the runtime-capability check. This additionally checks the N-API intersection. + nativePackageName(target); + if (runtime === 'node' && target.os !== process.platform) { + throw new CliError('Node SEA cannot cross-compile to a different operating system.'); + } +} + +export async function findExecutable(name: string, env: NodeJS.ProcessEnv = process.env): Promise { + const paths = (env.PATH ?? '').split(delimiter).filter(Boolean); + const suffixes = process.platform === 'win32' ? (env.PATHEXT ?? '.EXE;.CMD;.BAT').split(';') : ['']; + const candidates = paths.flatMap((path) => + suffixes.map((suffix) => + join(path, suffix && !name.toLowerCase().endsWith(suffix.toLowerCase()) ? `${name}${suffix}` : name), + ), + ); + for (const candidate of candidates) { + try { + const info = await stat(candidate); + if (!info.isFile()) continue; + await access(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK); + return candidate; + } catch { + // Continue searching PATH. + } + } + return undefined; +} + +export function executableName(runtime: RuntimeName): string { + return runtime === 'node' ? process.execPath : runtime; +} diff --git a/packages/webview/lib/cli/process.ts b/packages/webview/lib/cli/process.ts new file mode 100644 index 0000000..e875965 --- /dev/null +++ b/packages/webview/lib/cli/process.ts @@ -0,0 +1,76 @@ +import { spawn } from 'node:child_process'; +import type { SpawnOptions } from 'node:child_process'; +import { ProcessExecutionError } from './errors'; + +export interface ProcessOutput { + code: number; + stdout: string; + stderr: string; +} + +export interface RunProcessOptions { + cwd?: string; + env?: NodeJS.ProcessEnv; + capture?: boolean; + allowNonZero?: boolean; + onCommand?: (command: string) => void; +} + +export interface ProcessRunner { + run(executable: string, args: readonly string[], options?: RunProcessOptions): Promise; +} + +export function formatCommand(executable: string, args: readonly string[]): string { + return [executable, ...args].map(formatArgument).join(' '); +} + +function formatArgument(value: string): string { + if (value === '') return '""'; + if (!/[\s"']/u.test(value)) return value; + return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`; +} + +export const processRunner: ProcessRunner = { + run(executable, args, options = {}) { + return new Promise((resolve, reject) => { + const capture = options.capture === true; + const command = formatCommand(executable, args); + options.onCommand?.(command); + + const spawnOptions: SpawnOptions = { + cwd: options.cwd, + env: options.env, + shell: false, + stdio: capture ? ['ignore', 'pipe', 'pipe'] : 'inherit', + }; + + let child; + try { + child = spawn(executable, [...args], spawnOptions); + } catch (cause) { + reject(new ProcessExecutionError(executable, args, 'failed', { cause })); + return; + } + + let stdout = ''; + let stderr = ''; + child.stdout?.setEncoding('utf8'); + child.stderr?.setEncoding('utf8'); + child.stdout?.on('data', (chunk: string) => (stdout += chunk)); + child.stderr?.on('data', (chunk: string) => (stderr += chunk)); + child.once('error', (cause: NodeJS.ErrnoException) => { + reject( + new ProcessExecutionError(executable, args, cause.code === 'ENOENT' ? 'not-found' : 'failed', { cause }), + ); + }); + child.once('close', (code) => { + const result = { code: code ?? 1, stdout, stderr }; + if (result.code !== 0 && !options.allowNonZero) { + reject(new ProcessExecutionError(executable, args, 'failed', { exitCode: result.code })); + return; + } + resolve(result); + }); + }); + }, +}; diff --git a/packages/webview/lib/cli/runtimes/bun.ts b/packages/webview/lib/cli/runtimes/bun.ts new file mode 100644 index 0000000..03cc26f --- /dev/null +++ b/packages/webview/lib/cli/runtimes/bun.ts @@ -0,0 +1,58 @@ +import { basename } from 'node:path'; +import { formatCommand } from '../process'; +import { executableOutputPath } from '../paths'; +import { CliError } from '../errors'; +import { formatTarget } from '../platform'; +import type { BuildContext, BuildResult, RuntimeInfo } from '../types'; +import type { RuntimeBuilder, RuntimeProbeContext } from './runtime'; + +export class BunRuntimeBuilder implements RuntimeBuilder { + readonly name = 'bun' as const; + + async probe(context: RuntimeProbeContext): Promise { + const versionResult = await context.runner.run(context.runtimeExecutable, ['--version'], { capture: true }); + const version = versionResult.stdout.trim() || versionResult.stderr.trim(); + if (!version) throw new CliError('Could not determine Bun version.'); + return { executable: context.runtimeExecutable, version }; + } + + async validate(context: RuntimeProbeContext): Promise { + if (context.target.os === 'linux' && context.target.libc === 'musl') { + throw new CliError( + 'Bun musl targets cannot load WebviewJS because no musl native addon is published. Select a glibc target.', + ); + } + } + + plan(context: RuntimeProbeContext, info: RuntimeInfo): string[] { + const outfile = executableOutputPath(context.options.outDir, context.options.name, context.target); + const args = ['build', context.options.input, '--compile', '--outfile', outfile]; + if (context.options.target) args.push('--target', context.options.target); + if (context.options.minify) args.push('--minify'); + for (const asset of context.options.assets) args.push('--asset', asset.path); + const steps = [`run ${formatCommand(info.executable, args)}`]; + if (context.options.assets.length) steps.push(`embed ${context.options.assets.length} asset(s)`); + steps.push(`include the ${formatTarget(context.target)} WebviewJS N-API addon through Bun's native addon loader`); + return steps; + } + + async build(context: BuildContext): Promise { + const output = executableOutputPath(context.options.outDir, context.options.name, context.target); + const args = ['build', context.options.input, '--compile', '--outfile', output]; + if (context.options.target) args.push('--target', context.options.target); + if (context.options.minify) args.push('--minify'); + for (const asset of context.options.assets) args.push('--asset', asset.path); + await context.runner.run(context.runtimeExecutable, args, { cwd: context.options.projectRoot }); + return { + output, + runtime: 'bun', + runtimeVersion: context.runtime.version, + target: context.target, + steps: [ + `compiled standalone Bun executable for ${formatTarget(context.target)}`, + `embedded ${context.options.assets.length} user asset(s)`, + `compiled WebviewJS native addon reference (${basename(context.addonPath)})`, + ], + }; + } +} diff --git a/packages/webview/lib/cli/runtimes/deno.ts b/packages/webview/lib/cli/runtimes/deno.ts new file mode 100644 index 0000000..c15e245 --- /dev/null +++ b/packages/webview/lib/cli/runtimes/deno.ts @@ -0,0 +1,200 @@ +import { cpSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { createHash } from 'node:crypto'; +import { join } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { CliError } from '../errors'; +import { formatTarget } from '../platform'; +import { formatCommand } from '../process'; +import { executableOutputPath } from '../paths'; +import type { BuildContext, BuildResult, RuntimeInfo } from '../types'; +import type { RuntimeBuilder, RuntimeProbeContext } from './runtime'; + +export class DenoRuntimeBuilder implements RuntimeBuilder { + readonly name = 'deno' as const; + + async probe(context: RuntimeProbeContext): Promise { + const versionResult = await context.runner.run(context.runtimeExecutable, ['--version'], { capture: true }); + const version = versionResult.stdout.trim().split(/\r?\n/u)[0] || versionResult.stderr.trim(); + if (!version) throw new CliError('Could not determine Deno version.'); + return { executable: context.runtimeExecutable, version }; + } + + async validate(_context: RuntimeProbeContext, info: RuntimeInfo): Promise { + const version = Number(/^deno\s+(\d+)/iu.exec(info.version)?.[1]); + if (!Number.isFinite(version) || version < 2) { + throw new CliError(`Deno 2 or newer is required for native-addon self-extracting builds; found ${info.version}.`); + } + } + + plan(context: RuntimeProbeContext, info: RuntimeInfo): string[] { + const output = executableOutputPath(context.options.outDir, context.options.name, context.target); + const args = [ + 'compile', + '--bundle', + '--self-extracting', + '--allow-all', + '--no-check', + '--output', + output, + '--config', + '/deno.json', + ]; + if (context.options.target) args.push('--target', context.options.target); + if (context.options.minify) args.push('--minify'); + for (const asset of context.options.assets) args.push('--include', asset.path); + args.push('--include', '/webview..node'); + args.push('/deno-entry.mjs'); + const steps = [ + `run ${formatCommand(info.executable, args)}`, + `prepare a temporary ${formatTarget(context.target)} package adapter so Deno resolves only WebviewJS's selected native addon`, + `compile a self-extracting executable with the ${formatTarget(context.target)} native addon`, + ]; + if (context.options.assets.length) steps.push(`include ${context.options.assets.length} user asset(s)`); + return steps; + } + + async build(context: BuildContext): Promise { + const output = executableOutputPath(context.options.outDir, context.options.name, context.target); + const adapter = createDenoPackageAdapter(context); + // Deno's current checker rejects three unresolved internal callback aliases in + // NAPI-RS-generated js-bindings.d.ts. Keep CLI packaging usable for JS/Node projects; + // applications can still run `deno check` against their own source separately. + const args = [ + 'compile', + '--bundle', + '--self-extracting', + '--allow-all', + '--no-check', + '--output', + output, + '--config', + adapter.configPath, + ]; + if (context.options.target) args.push('--target', context.options.target); + if (context.options.minify) args.push('--minify'); + for (const asset of context.options.assets) args.push('--include', asset.path); + args.push('--include', adapter.addonPath); + args.push(adapter.entryPath); + await context.runner.run(context.runtimeExecutable, args, { cwd: context.options.projectRoot }); + return { + output, + runtime: 'deno', + runtimeVersion: context.runtime.version, + target: context.target, + steps: [ + `compiled self-extracting Deno executable for ${formatTarget(context.target)}`, + 'bundled reachable application and WebviewJS native addon', + `included ${context.options.assets.length} user asset(s)`, + ], + }; + } +} + +export function createDenoPackageAdapter(context: BuildContext): { + root: string; + configPath: string; + addonPath: string; + entryPath: string; +} { + const root = join(context.tempDir, 'deno-webview-adapter'); + const dist = join(root, 'dist'); + mkdirSync(dist, { recursive: true }); + cpSync(join(context.packageRoot, 'dist'), dist, { recursive: true }); + cpSync(join(context.packageRoot, 'js-bindings.js'), join(root, 'js-bindings.js')); + cpSync(join(context.packageRoot, 'js-bindings.d.ts'), join(root, 'js-bindings.d.ts')); + writeFileSync( + join(root, 'webview.wasi.cjs'), + 'throw new Error("The WebviewJS WASI fallback is not part of this native executable build.");\n', + ); + const addonHash = createHash('sha256').update(readFileSync(context.addonPath)).digest('hex'); + const addonAssetName = `__webviewjs_native_${addonHash}.node`; + const addonPath = join(context.tempDir, addonAssetName); + cpSync(context.addonPath, addonPath); + const entryPath = join(context.tempDir, 'deno-entry.mjs'); + writeFileSync(entryPath, createDenoEntrySource(addonAssetName, pathToFileURL(context.options.input).href)); + + const packageMetadata = JSON.parse(readFileSync(join(context.packageRoot, 'package.json'), 'utf8')) as { + name?: string; + version?: string; + }; + const bindingSource = readFileSync(join(context.packageRoot, 'js-bindings.js'), 'utf8'); + const packageReferences = new Set(); + for (const match of bindingSource.matchAll(/require\(['"](@webviewjs\/[^'"]+)['"]\)/gu)) { + packageReferences.add(match[1].replace(/\/package\.json$/u, '')); + } + const nodeModulesRoot = join(root, 'node_modules'); + const namespace = join(nodeModulesRoot, '@webviewjs'); + mkdirSync(namespace, { recursive: true }); + const optionalDependencies: Record = {}; + for (const packageName of packageReferences) { + optionalDependencies[packageName] = '*'; + const name = packageName.slice('@webviewjs/'.length); + const stub = join(namespace, name); + mkdirSync(stub, { recursive: true }); + writeFileSync( + join(stub, 'package.json'), + JSON.stringify({ + name: packageName, + version: packageName === nativeTargetPackage(context) ? packageMetadata.version : '0.0.0', + main: 'index.js', + }), + ); + writeFileSync( + join(stub, 'index.js'), + 'throw new Error("This WebviewJS native package is not selected for this target.");\n', + ); + } + + const packageJson = { + name: packageMetadata.name ?? '@webviewjs/webview', + version: packageMetadata.version ?? '0.0.0', + type: 'commonjs', + main: './dist/index.js', + types: './dist/index.d.ts', + optionalDependencies, + }; + writeFileSync(join(root, 'package.json'), JSON.stringify(packageJson, null, 2)); + const configPath = join(context.tempDir, 'deno.json'); + writeFileSync( + configPath, + JSON.stringify({ imports: { '@webviewjs/webview': pathToFileURL(join(dist, 'index.js')).href } }, null, 2), + ); + return { root, configPath, addonPath, entryPath }; +} + +export function createDenoEntrySource(addonAssetName: string, applicationUrl: string): string { + return `import { basename, dirname, join } from 'node:path'; +import { readdirSync } from 'node:fs'; + +function findEmbeddedAddon(root, wantedName, depth = 16) { + if (depth < 0) return undefined; + let entries; + try { entries = readdirSync(root, { withFileTypes: true }); } catch { return undefined; } + for (const entry of entries) { + if (entry.isFile() && entry.name === wantedName) return join(root, entry.name); + } + for (const entry of entries) { + if (entry.isDirectory()) { + const found = findEmbeddedAddon(join(root, entry.name), wantedName, depth - 1); + if (found) return found; + } + } + return undefined; +} + +const executable = Deno.execPath(); +const executableName = basename(executable).replace(/\\.exe$/iu, ''); +const extractionParent = join(dirname(executable), '.' + executableName); +const addonPath = findEmbeddedAddon(extractionParent, ${JSON.stringify(addonAssetName)}); +if (!addonPath) throw new Error('Could not locate the extracted WebviewJS native addon in Deno self-extraction data.'); +process.env.NAPI_RS_NATIVE_LIBRARY_PATH = addonPath; +await import(${JSON.stringify(applicationUrl)}); +`; +} + +function nativeTargetPackage(context: BuildContext): string { + if (context.target.os === 'darwin') return `@webviewjs/webview-darwin-${context.target.arch}`; + if (context.target.os === 'win32') return `@webviewjs/webview-win32-${context.target.arch}-msvc`; + if (context.target.arch === 'arm') return '@webviewjs/webview-linux-arm-gnueabihf'; + return `@webviewjs/webview-linux-${context.target.arch}-${context.target.libc ?? 'gnu'}`; +} diff --git a/packages/webview/lib/cli/runtimes/node.ts b/packages/webview/lib/cli/runtimes/node.ts new file mode 100644 index 0000000..d772ced --- /dev/null +++ b/packages/webview/lib/cli/runtimes/node.ts @@ -0,0 +1,154 @@ +import { copyFileSync, constants, mkdirSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { createRequire } from 'node:module'; +import { bundleNodeApplication, createSeaAssets, describeAddonAsset } from '../bundler/esbuild'; +import { CliError } from '../errors'; +import { removeLegacyNodeSignature, signLegacyNodeExecutable } from '../signing'; +import { executableOutputPath } from '../paths'; +import { formatCommand } from '../process'; +import type { BuildContext, BuildResult, RuntimeInfo } from '../types'; +import type { RuntimeBuilder, RuntimeProbeContext } from './runtime'; + +const SEA_FUSE = 'NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2'; + +export class NodeRuntimeBuilder implements RuntimeBuilder { + readonly name = 'node' as const; + + async probe(context: RuntimeProbeContext): Promise { + const versionResult = await context.runner.run(context.runtimeExecutable, ['--version'], { capture: true }); + const helpResult = await context.runner.run(context.runtimeExecutable, ['--help'], { capture: true }); + const version = versionResult.stdout.trim() || versionResult.stderr.trim(); + const major = Number(/^v?(\d+)/u.exec(version)?.[1]); + if (!Number.isFinite(major)) throw new CliError(`Could not determine Node.js version from "${version}".`); + if (major < 24) + throw new CliError(`Node.js 24 or newer is required for WebviewJS executable builds; found ${version}.`); + return { + executable: context.runtimeExecutable, + version: version.startsWith('v') ? version.slice(1) : version, + supportsBuildSea: /--build-sea\b/u.test(`${helpResult.stdout}\n${helpResult.stderr}`), + }; + } + + async validate(context: RuntimeProbeContext, _info: RuntimeInfo): Promise { + if (context.options.target) { + throw new CliError('Node SEA uses the current Node executable and does not support --target.'); + } + if (context.options.minify !== undefined && typeof context.options.minify !== 'boolean') { + throw new CliError('The Node minify setting must be boolean.'); + } + } + + plan(context: RuntimeProbeContext, info: RuntimeInfo): string[] { + const output = executableOutputPath(context.options.outDir, context.options.name, context.target); + const config = '/sea-config.json'; + const bundle = '/bundled-entry.cjs'; + const steps = [ + `bundle ${context.options.input} to ${bundle} with esbuild (bundle, platform=node, format=cjs, target=node24${context.options.minify ? ', minify' : ''})`, + `add ${context.addonPath} to SEA assets as __webviewjs_native.node${context.options.assets.length ? ` and include ${context.options.assets.length} user asset(s)` : ''}`, + ]; + if (info.supportsBuildSea) { + steps.push(`run ${formatCommand(context.runtimeExecutable, ['--build-sea', config])} to write ${output}`); + if (context.target.os === 'darwin') steps.push(`run ${formatCommand('codesign', ['--sign', '-', output])}`); + } else { + const blob = '/sea-prep.blob'; + const postject = resolvePostjectCli(context.packageRoot); + steps.push( + `run ${formatCommand(context.runtimeExecutable, ['--experimental-sea-config', config])} to write ${blob}`, + ); + steps.push(`copy ${context.runtimeExecutable} to ${output}`); + if (context.target.os === 'darwin') + steps.push(`run ${formatCommand('codesign', ['--remove-signature', output])}`); + const injectArgs = [postject, output, 'NODE_SEA_BLOB', blob, '--sentinel-fuse', SEA_FUSE]; + if (context.target.os === 'darwin') injectArgs.push('--macho-segment-name', 'NODE_SEA'); + steps.push(`run ${formatCommand(context.runtimeExecutable, injectArgs)}`); + if (context.target.os === 'darwin') steps.push(`run ${formatCommand('codesign', ['--sign', '-', output])}`); + } + return steps; + } + + async build(context: BuildContext): Promise { + const output = executableOutputPath(context.options.outDir, context.options.name, context.target); + const bundlePath = join(context.tempDir, 'bundled-entry.cjs'); + const bundle = await bundleNodeApplication({ + input: context.options.input, + outfile: bundlePath, + cwd: context.options.projectRoot, + minify: context.options.minify, + addonPath: context.addonPath, + packageVersion: context.packageVersion, + }); + const steps = ['bundled application', describeAddonAsset(context.target, context.addonPath)]; + const configOutput = context.runtime.supportsBuildSea ? output : join(context.tempDir, 'sea-prep.blob'); + const config = createSeaConfig( + bundle.outfile, + configOutput, + createSeaAssets(context.options.assets, context.addonPath), + context.seaOptions, + ); + const configPath = join(context.tempDir, 'sea-config.json'); + writeFileSync(configPath, JSON.stringify(config, null, 2)); + + if (context.runtime.supportsBuildSea) { + await context.runner.run(context.runtimeExecutable, ['--build-sea', configPath], { + cwd: context.options.projectRoot, + }); + steps.push('created Node SEA with --build-sea'); + } else { + await context.runner.run(context.runtimeExecutable, ['--experimental-sea-config', configPath], { + cwd: context.options.projectRoot, + }); + mkdirSync(dirname(output), { recursive: true }); + copyFileSync(context.runtimeExecutable, output, constants.COPYFILE_FICLONE); + await removeLegacyNodeSignature(output, context.target, context.runner, context.logger); + const postject = resolvePostjectCli(context.packageRoot); + const injectArgs = [postject, output, 'NODE_SEA_BLOB', configOutput, '--sentinel-fuse', SEA_FUSE]; + if (context.target.os === 'darwin') injectArgs.push('--macho-segment-name', 'NODE_SEA'); + await context.runner.run(context.runtimeExecutable, injectArgs, { cwd: context.options.projectRoot }); + steps.push('created Node SEA with the Node 24 Postject injection flow'); + } + const signed = await signLegacyNodeExecutable(output, context.target, { signMac: true }, context.runner); + if (signed) steps.push('signed executable with an ad-hoc macOS signature'); + return { + output, + runtime: 'node', + runtimeVersion: context.runtime.version, + target: context.target, + steps, + }; + } +} + +export function createSeaConfig( + main: string, + output: string, + assets: Record, + options: BuildContext['seaOptions'], +) { + return { + main, + output, + disableExperimentalSEAWarning: true, + useSnapshot: options.useSnapshot, + useCodeCache: options.useCodeCache, + execArgv: [...options.execArgv], + execArgvExtension: options.execArgvExtension, + assets, + }; +} + +export function resolvePostjectCli(packageRoot: string): string { + const requireFromPackage = createRequire(join(packageRoot, 'package.json')); + let packageJsonPath: string; + try { + packageJsonPath = requireFromPackage.resolve('postject/package.json'); + } catch (cause) { + throw new CliError( + 'The pinned Postject runtime dependency is not installed. Reinstall @webviewjs/webview dependencies.', + { cause }, + ); + } + const packageJson = require(packageJsonPath) as { bin?: string | Record }; + const binPath = typeof packageJson.bin === 'string' ? packageJson.bin : packageJson.bin?.postject; + if (!binPath) throw new CliError('The installed Postject package does not declare its CLI entrypoint.'); + return join(dirname(packageJsonPath), binPath); +} diff --git a/packages/webview/lib/cli/runtimes/runtime.ts b/packages/webview/lib/cli/runtimes/runtime.ts new file mode 100644 index 0000000..9d3dbcd --- /dev/null +++ b/packages/webview/lib/cli/runtimes/runtime.ts @@ -0,0 +1,11 @@ +import type { BuildContext, BuildResult, RuntimeInfo, RuntimeName } from '../types'; + +export type RuntimeProbeContext = Omit; + +export interface RuntimeBuilder { + readonly name: RuntimeName; + probe(context: RuntimeProbeContext): Promise; + validate(context: RuntimeProbeContext, info: RuntimeInfo): Promise; + build(context: BuildContext): Promise; + plan(context: RuntimeProbeContext, info: RuntimeInfo): string[]; +} diff --git a/packages/webview/lib/cli/signing.ts b/packages/webview/lib/cli/signing.ts new file mode 100644 index 0000000..4da3237 --- /dev/null +++ b/packages/webview/lib/cli/signing.ts @@ -0,0 +1,41 @@ +import { findExecutable } from './platform'; +import type { ProcessRunner } from './process'; +import type { NativeTarget } from './types'; + +export interface NodeSigningOptions { + /** macOS SEA binaries are ad-hoc signed unless explicitly disabled internally. */ + signMac: boolean; +} + +export async function removeLegacyNodeSignature( + executable: string, + target: NativeTarget, + runner: ProcessRunner, + logger: { warn(message: string): void }, +): Promise { + if (target.os === 'darwin') { + await runner.run('codesign', ['--remove-signature', executable]); + return; + } + if (target.os !== 'win32') return; + + const signtool = await findExecutable('signtool'); + if (!signtool) return; + try { + await runner.run(signtool, ['remove', '/s', executable]); + } catch { + // Removal is optional for unsigned development binaries on Windows. + logger.warn('Could not remove an existing Windows signature; continuing with the SEA injection.'); + } +} + +export async function signLegacyNodeExecutable( + executable: string, + target: NativeTarget, + options: NodeSigningOptions, + runner: ProcessRunner, +): Promise { + if (target.os !== 'darwin' || !options.signMac) return false; + await runner.run('codesign', ['--sign', '-', executable]); + return true; +} diff --git a/packages/webview/lib/cli/types.ts b/packages/webview/lib/cli/types.ts new file mode 100644 index 0000000..e43c81e --- /dev/null +++ b/packages/webview/lib/cli/types.ts @@ -0,0 +1,103 @@ +import type { PlatformInfo } from './platform'; +import type { ProcessRunner } from './process'; + +export type RuntimeName = 'node' | 'bun' | 'deno'; +export type NativeOs = 'darwin' | 'win32' | 'linux'; +export type NativeArch = 'x64' | 'arm64' | 'ia32' | 'arm'; + +export interface NativeTarget { + os: NativeOs; + arch: NativeArch; + libc?: 'gnu' | 'musl'; +} + +export interface BuildAsset { + /** SEA asset key. Other runtimes preserve the file's path when embedding it. */ + key: string; + path: string; +} + +/** Fully normalized options used by runtime adapters. Paths are absolute. */ +export interface BuildOptions { + runtime: RuntimeName; + input: string; + outDir: string; + name: string; + target?: string; + nativeAddon?: string; + minify: boolean; + verbose: boolean; + assets: BuildAsset[]; + dryRun: boolean; + projectRoot: string; +} + +export interface BuildExecutableOptions { + runtime?: RuntimeName | string; + input?: string; + outDir?: string; + /** Backwards-compatible programmatic alias for outDir. */ + output?: string; + name?: string; + target?: string; + nativeAddon?: string; + minify?: boolean; + verbose?: boolean; + assets?: readonly (string | BuildAsset)[]; + resources?: string; + dryRun?: boolean; + cwd?: string; +} + +export interface SeaOptions { + useCodeCache: boolean; + execArgv: string[]; + execArgvExtension: 'none' | 'env' | 'cli'; + useSnapshot: false; +} + +export interface RuntimeInfo { + executable: string; + version: string; + supportsBuildSea?: boolean; +} + +export interface BuildResult { + output: string; + runtime: RuntimeName; + runtimeVersion: string; + target: NativeTarget; + steps: string[]; + dryRun?: boolean; +} + +export interface BuildLogger { + info(message: string): void; + success(message: string): void; + warn(message: string): void; + error(message: string): void; +} + +export interface BuildServices { + runner?: ProcessRunner; + platform?: PlatformInfo; + packageRoot?: string; + nodeExecutable?: string; + bunExecutable?: string; + denoExecutable?: string; + logger?: BuildLogger; +} + +export interface BuildContext { + options: BuildOptions; + target: NativeTarget; + addonPath: string; + packageVersion: string; + packageRoot: string; + tempDir: string; + runtimeExecutable: string; + runtime: RuntimeInfo; + seaOptions: SeaOptions; + runner: ProcessRunner; + logger: BuildLogger; +} diff --git a/packages/webview/package.json b/packages/webview/package.json index ba97fbe..700cc90 100644 --- a/packages/webview/package.json +++ b/packages/webview/package.json @@ -79,5 +79,9 @@ "@types/node": "^26.1.1", "npm-run-all2": "^7.0.2", "typescript": "^5.9.3" + }, + "dependencies": { + "esbuild": "0.28.2", + "postject": "1.0.0-alpha.6" } } diff --git a/skills/webviewjs/SKILL.md b/skills/webviewjs/SKILL.md index a3283bf..019069a 100644 --- a/skills/webviewjs/SKILL.md +++ b/skills/webviewjs/SKILL.md @@ -108,18 +108,19 @@ but it cannot make a native addon portable. ## Build a standalone executable -The `webview --build` CLI delegates to the selected JavaScript runtime: - -- Node.js uses Node's Single Executable Application (SEA) workflow. -- Deno uses `deno compile`. -- Bun uses `bun build --compile`. - -This CLI is not a desktop installer builder, package manager, or general -application bundler. It does not perform cross-compilation. Build on the -target operating system and architecture so the matching WebviewJS `.node` -addon is available, or prepare that addon and its runtime toolchain manually -before packaging. Use platform distribution tools for installers, signing, -notarization, and release metadata. +Use `webview build `; Node.js SEA is the default runtime: + +```bash +webview build src/main.ts +webview build src/main.ts --runtime bun +webview build src/main.ts --runtime deno +``` + +All runtimes need a matching WebviewJS `.node` addon. Node SEA is host-only; +Bun and Deno accept runtime-specific target identifiers when that target addon +is installed. Cross-target output is not covered by the current host +integration smoke tests. This CLI does not create desktop installers or +perform Windows certificate signing. See the [standalone executable guide](https://webview.js.org/guides/building-executables) for runtime-specific options and asset handling. From ce6fac49f152d99d909073ae1b0ab65e4fc6febf Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Thu, 1 Oct 2026 23:43:47 +0545 Subject: [PATCH 05/15] feat(docs): add redesigned WebviewJS homepage - Add custom homepage sections, visuals, metadata, and branding - Update docs routing, navigation styling, and project READMEs - Refresh CLI guidance in AGENTS.md --- AGENTS.md | 8 +- README.md | 579 +----------- apps/docs/README.md | 11 +- .../{[[...slug]] => [...slug]}/page.tsx | 2 +- apps/docs/app/(home)/layout.tsx | 11 + apps/docs/app/(home)/page.tsx | 48 + apps/docs/app/global.css | 172 ++++ apps/docs/app/icon.svg | 5 + apps/docs/app/layout.tsx | 9 +- .../docs/components/home/capability-bento.tsx | 169 ++++ apps/docs/components/home/code-showcase.tsx | 128 +++ .../docs/components/home/copy-code-button.tsx | 42 + apps/docs/components/home/docs-links.tsx | 82 ++ .../components/home/executable-builder.tsx | 31 + apps/docs/components/home/footer.tsx | 44 + apps/docs/components/home/hero.tsx | 52 ++ .../components/home/home-visuals.module.css | 830 ++++++++++++++++++ apps/docs/components/home/install-command.tsx | 52 ++ .../components/home/native-capabilities.tsx | 128 +++ apps/docs/components/home/product-window.tsx | 124 +++ apps/docs/components/home/runtime-bridge.tsx | 72 ++ .../components/home/runtime-build-panel.tsx | 93 ++ apps/docs/content/docs/index.mdx | 477 ---------- apps/docs/content/docs/meta.json | 2 +- apps/docs/lib/layout.shared.tsx | 20 +- packages/webview/README.md | 51 +- 26 files changed, 2161 insertions(+), 1081 deletions(-) rename apps/docs/app/(docs)/{[[...slug]] => [...slug]}/page.tsx (96%) create mode 100644 apps/docs/app/(home)/layout.tsx create mode 100644 apps/docs/app/(home)/page.tsx create mode 100644 apps/docs/app/icon.svg create mode 100644 apps/docs/components/home/capability-bento.tsx create mode 100644 apps/docs/components/home/code-showcase.tsx create mode 100644 apps/docs/components/home/copy-code-button.tsx create mode 100644 apps/docs/components/home/docs-links.tsx create mode 100644 apps/docs/components/home/executable-builder.tsx create mode 100644 apps/docs/components/home/footer.tsx create mode 100644 apps/docs/components/home/hero.tsx create mode 100644 apps/docs/components/home/home-visuals.module.css create mode 100644 apps/docs/components/home/install-command.tsx create mode 100644 apps/docs/components/home/native-capabilities.tsx create mode 100644 apps/docs/components/home/product-window.tsx create mode 100644 apps/docs/components/home/runtime-bridge.tsx create mode 100644 apps/docs/components/home/runtime-build-panel.tsx delete mode 100644 apps/docs/content/docs/index.mdx diff --git a/AGENTS.md b/AGENTS.md index d810746..d25cbdf 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -99,11 +99,13 @@ The entry file is positional, for example `webview build src/main.ts`. Use `--as ## Adding a new CLI flag -1. Add the option object to `options` in `packages/webview/cli/index.mjs`. -2. Destructure from `args.values` in the relevant branch. -3. Pass it through to the appropriate build function in `packages/webview/cli/build.mjs`. +1. Add or update argument parsing in `packages/webview/lib/cli/args.ts`. +2. Pass the parsed option to the relevant command or runtime implementation under `packages/webview/lib/cli/`. +3. Update runtime-specific behavior in `packages/webview/lib/cli/runtimes/` when needed. 4. Update the options table in `apps/docs/content/docs/guides/building-executables.md`. +`packages/webview/cli/index.mjs` is the small permanent ESM npm-bin bootstrap. Do not put CLI implementation logic there. + ## Rust / NAPI notes - Bindings are declared in `packages/webview/src/`. After editing Rust, build from the Webview package with `bun --filter @webviewjs/webview build` to regenerate `js-bindings.js` / `js-bindings.d.ts` and compile the TypeScript layer. diff --git a/README.md b/README.md index f08fa2e..3ad4489 100644 --- a/README.md +++ b/README.md @@ -1,578 +1,75 @@ -# `@webviewjs/webview` +# WebviewJS [![CI](https://github.com/webviewjs/webview/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/webviewjs/webview/actions/workflows/CI.yml) [![npm](https://img.shields.io/npm/v/%40webviewjs%2Fwebview?logo=npm)](https://www.npmjs.com/package/@webviewjs/webview) [![License](https://img.shields.io/github/license/webviewjs/webview)](https://github.com/webviewjs/webview/blob/main/LICENSE) -Build lightweight native desktop applications with JavaScript and the webview -engine already provided by the operating system. WebviewJS is a typed N-API -binding to [tao](https://github.com/tauri-apps/tao) and -[wry](https://github.com/tauri-apps/wry), with a small JavaScript surface and -first-class support for Node.js, Bun, and Deno. +WebviewJS is a typed JavaScript binding for building desktop applications with the webview provided by the operating system. It connects Node.js, Bun, or Deno to native windows through N-API and the `tao` and `wry` libraries. -It is a good fit for utilities, internal tools, desktop companions, and -existing web applications that need a native window without bundling a second -browser engine. +This repository contains the published package, its documentation site, runnable examples, and the tooling used to develop them. -[Get started](https://webview.js.org/getting-started/quick-start) · -[API reference](https://webview.js.org/api/application) · -[Examples](./apps/examples) · -[Platform notes](https://webview.js.org/platform/linux) +[Documentation](https://webview.js.org) · [npm package](https://www.npmjs.com/package/@webviewjs/webview) · [Examples](https://github.com/webviewjs/webview/tree/main/apps/examples) · [Issues](https://github.com/webviewjs/webview/issues) -![WebviewJS preview](https://github.com/webviewjs/webview/raw/main/assets/preview.png) +## Repository -## Highlights +| Workspace | Purpose | +| ------------------ | -------------------------------------------------------------- | +| `packages/webview` | Published `@webviewjs/webview` native binding and CLI | +| `apps/docs` | Documentation site at [webview.js.org](https://webview.js.org) | +| `apps/examples` | Runnable JavaScript examples | -- Native windows backed by WebView2, WebKit, or WebKitGTK instead of a bundled browser runtime. -- Non-blocking event pumping that keeps ordinary JavaScript timers and I/O responsive. -- Typed APIs for windows, webviews, menus, dialogs, cookies, DevTools, and window controls. -- Shared browser contexts for profiles, cookies, cache, storage, and automation. -- System tray icons, native notifications, and platform-specific window extensions. -- IPC through `window.ipc.postMessage()` plus Promise-based `webview.expose()` namespaces. -- Fetch-compatible asynchronous custom protocols, including Hono routing without an HTTP server. -- A CLI for compiling Node.js, Deno, or Bun applications into standalone executables. - -> [!NOTE] -> WebviewJS provides the native window and webview layer. It is intentionally -> smaller than an application framework such as Electron or Tauri, so you can -> choose your own frontend, routing, state management, and build tools. - -## Documentation - -The complete documentation is available at [webview.js.org](https://webview.js.org). Documentation tools and assistants can use [`llms.txt`](https://webview.js.org/llms.txt), the full [`llms-full.txt`](https://webview.js.org/llms-full.txt), or per-page Markdown such as [`/api/application.md`](https://webview.js.org/api/application.md). - -### Getting started - -| | | -| ------------------------------------------------------------------- | ------------------------------- | -| [Installation](https://webview.js.org/getting-started/installation) | System requirements and setup | -| [Quick Start](https://webview.js.org/getting-started/quick-start) | Your first window in minutes | -| [Event Loop](https://webview.js.org/getting-started/event-loop) | How the non-blocking pump works | - -### API reference - -| | | -| ---------------------------------------------------------- | ----------------------------------------------------- | -| [Application](https://webview.js.org/api/application) | Root object, event loop, windows, menus | -| [BrowserWindow](https://webview.js.org/api/browser-window) | OS window, size, position, cursor, decorations | -| [Webview](https://webview.js.org/api/webview) | Embedded browser, navigation, cookies, script, bounds | -| [WebContext](https://webview.js.org/api/web-context) | Shared browser data, profiles, and automation | -| [System Tray](https://webview.js.org/api/tray) | Tray icons, menus, updates, and pointer events | -| [Notification](https://webview.js.org/api/notification) | Native desktop notifications and lifecycle events | -| [Menu](https://webview.js.org/api/menu) | Native menu bar construction | -| [Types](https://webview.js.org/api/types) | Shared interfaces and enums | - -### Guides - -| | | -| -------------------------------------------------------------------------- | ----------------------------------------------- | -| [Building Executables](https://webview.js.org/guides/building-executables) | Compile to `.exe` / binary with node, deno, bun | -| [IPC Messaging](https://webview.js.org/guides/ipc-messaging) | Page ↔ Node communication | -| [Menus](https://webview.js.org/guides/menus) | Building menu bars with roles and accelerators | -| [Multiple Windows](https://webview.js.org/guides/multiple-windows) | Managing several windows | -| [Cookies & Storage](https://webview.js.org/guides/cookies-and-storage) | Reading, writing, and clearing cookies | -| [Custom Protocols](https://webview.js.org/guides/custom-protocols) | Serving local content to the webview | - -### Platform notes - -| | | -| -------------------------------------------------- | ----------------------------------------- | -| [Windows](https://webview.js.org/platform/windows) | WebView2, taskbar, DPI | -| [macOS](https://webview.js.org/platform/macos) | WebKit, main-thread requirement, app menu | -| [Linux](https://webview.js.org/platform/linux) | WebKitGTK, Wayland/X11, menu limitations | -| [iOS](https://webview.js.org/platform/ios) | Orientation, status bar, and gestures | -| [Android](https://webview.js.org/platform/android) | Content rectangle and configuration | - -## Installation +## Development -Install the package with your preferred JavaScript package manager. The native -platform package is resolved automatically through optional dependencies. +Install [Bun 1.3.14](https://bun.sh/), [Rust stable](https://www.rust-lang.org/tools/install), and [Node.js 24 or newer](https://nodejs.org/) for package tests. ```bash -npm install @webviewjs/webview -# or -bun add @webviewjs/webview -# or -pnpm add @webviewjs/webview -``` - -Keep optional dependencies enabled when installing. They contain the native -addon selected for the current operating system and architecture. - -### System requirements - -| Platform | Requirements | -| --------------- | ----------------------------------------------------------------------------------------------------------- | -| Windows | WebView2. It ships with Windows 11 and current Edge installations; Windows 10 can install it automatically. | -| macOS | macOS 10.15 Catalina or later. WebKit is built in. | -| Linux | WebKitGTK 4.1 and `libxdo`. See the [Linux platform guide](https://webview.js.org/platform/linux). | -| Android and iOS | Native project setup and platform SDKs. See the [hosted documentation](https://webview.js.org). | - -For distribution and platform-specific behavior, review the complete -[installation guide](https://webview.js.org/getting-started/installation) before shipping. - -## Supported platforms - -| Target | Platform | Architecture | Status | Notes | -| ------------------------------- | -------- | ------------ | ------------ | ---------------------------------------------- | -| `x86_64-pc-windows-msvc` | Windows | x64 | Supported | WebView2 | -| `i686-pc-windows-msvc` | Windows | x86 | Supported | WebView2 | -| `aarch64-pc-windows-msvc` | Windows | arm64 | Supported | WebView2 | -| `x86_64-apple-darwin` | macOS | x64 | Supported | WebKit | -| `aarch64-apple-darwin` | macOS | arm64 | Supported | WebKit | -| `x86_64-unknown-linux-gnu` | Linux | x64 | Supported | WebKitGTK 4.1, X11, and Wayland | -| `i686-unknown-linux-gnu` | Linux | x86 | Supported | WebKitGTK 4.1, X11, and Wayland | -| `aarch64-unknown-linux-gnu` | Linux | arm64 | Supported | WebKitGTK 4.1, X11, and Wayland | -| `armv7-unknown-linux-gnueabihf` | Linux | armv7 | Supported | WebKitGTK 4.1, X11, and Wayland | -| `aarch64-linux-android` | Android | arm64 | Experimental | Platform APIs are still evolving | -| `armv7-linux-androideabi` | Android | armv7 | Experimental | Platform APIs are still evolving | -| `x86_64-unknown-freebsd` | FreeBSD | x64 | Stub | Package resolution only; no GUI implementation | - -## Examples - -### Quick start - -```js -import { Application } from '@webviewjs/webview'; - -const app = new Application(); -const window = app.createBrowserWindow({ - title: 'WebviewJS', - width: 1024, - height: 768, -}); - -window.createWebview({ url: 'https://example.com' }); -app.run(); -``` - -For CommonJS projects, use the same API through `require()`: - -```js -const { Application } = require('@webviewjs/webview'); - -const app = new Application(); -const window = app.createBrowserWindow({ title: 'WebviewJS' }); -window.createWebview({ html: '

    Hello from WebviewJS

    ' }); -app.run(); -``` - -The application owns native resources created through it. Call `app.exit()` -when your application needs to shut down explicitly: - -```js -process.on('SIGINT', () => { - app.exit(); -}); -``` - -### Event pumping - -`app.whenReady()` starts the non-blocking event pump by default: - -```js -await app.whenReady({ interval: 16, ref: true }); -``` - -For manual startup, disable auto-run: - -```js -const ready = app.whenReady({ autoRun: false }); -app.run({ interval: 16, ref: true }); -await ready; -``` - -`interval` defaults to `16` milliseconds and `ref` defaults to `true`. Use `app.pumpEvents()` for manual pumping. - -### System tray - -Keep a strong JavaScript reference when you need to call tray methods or keep -its listeners reachable: - -```js -let tray = null; - -app.whenReady().then(() => { - tray = app.createTrayIcon({ - id: 'main', - icon: { data: rgba, width: 16, height: 16 }, - tooltip: 'My application', - menu: { items: [{ id: 'quit', label: 'Quit' }] }, - }); - - tray.on('click', (event) => console.log(event)); -}); -``` - -See the [system tray reference](https://webview.js.org/api/tray) and -[runnable tray example](./apps/examples/tray.mjs). - -### Notifications - -```js -import { Notification } from '@webviewjs/webview'; - -const notification = new Notification('Build complete', { - body: 'The release executable is ready.', -}); - -notification.on('click', () => console.log('notification clicked')); -notification.on('error', ({ error }) => console.error(error)); -``` - -Notification permission is always `"granted"` for native applications. See the -[notification reference](https://webview.js.org/api/notification) and -[runnable notification example](./apps/examples/notification.mjs). - -### IPC and exposed functions - -The webview page can send messages to Node through `window.ipc.postMessage()`: - -```js -const webview = window.createWebview({ ipcName: 'bindings' }); -webview.onIpcMessage((message) => console.log(message.body.toString())); -``` - -`ipcName` adds an alias, so the page can use `window.bindings.postMessage(...)`; `window.ipc` remains available. - -For typed request/response style calls, expose a namespace: - -```js -webview.expose('native', { - version: '0.1.4', - readConfig: async () => JSON.parse(await readFile('./config.json', 'utf8')), -}); -``` - -In the page: - -```js -console.log(window.native.version); -const config = await window.native.readConfig(); -``` - -Every exposed function returns a Promise in the page. Values, arguments, and results must be JSON-serializable. Violations use `SerializationError`. - -### Asynchronous custom protocols - -Register a protocol before creating its webview: - -```js -window.registerProtocol('app', async (request) => { - const filePath = join(process.cwd(), 'dist', new URL(request.url).pathname); - try { - return new Response(await readFile(filePath), { - headers: { 'Content-Type': 'text/html; charset=utf-8' }, - }); - } catch { - return new Response('Not found', { - status: 404, - headers: { 'Content-Type': 'text/plain; charset=utf-8' }, - }); - } -}); - -window.createWebview({ url: 'app://localhost/index.html' }); -``` - -See [Custom Protocols](https://webview.js.org/guides/custom-protocols), [IPC](https://webview.js.org/guides/ipc-messaging), and the runnable [custom protocol](./apps/examples/custom-protocol.mjs) and [expose](./apps/examples/expose.mjs) examples. - -### Menu system - -WebviewJS provides a cross-platform menu system that works on macOS, Windows, and Linux. - -#### Basic menu setup - -```js -import { Application } from '@webviewjs/webview'; - -const app = new Application(); - -// Set global application menu -app.setMenu({ - items: [ - { - label: 'File', - submenu: { - items: [ - { id: 'new', label: 'New', accelerator: 'CmdOrCtrl+N' }, - { id: 'open', label: 'Open', accelerator: 'CmdOrCtrl+O' }, - { role: 'separator' }, - { id: 'quit', label: 'Quit', accelerator: 'CmdOrCtrl+Q' }, - ], - }, - }, - { - label: 'Edit', - submenu: { - items: [{ role: 'copy' }, { role: 'paste' }, { role: 'cut' }, { role: 'selectall' }], - }, - }, - ], -}); - -const window = app.createBrowserWindow(); -const webview = window.createWebview({ url: 'https://nodejs.org' }); - -app.run(); -``` - -#### Menu event handling - -```js -import { Application } from '@webviewjs/webview'; - -const app = new Application(); - -// Handle menu events -app.on('custom-menu-click', ({ customMenuEvent: menuEvent }) => { - console.log(`Menu item clicked: ${menuEvent.id}`); - console.log(`From window: ${menuEvent.windowId}`); - - // Handle specific menu items - switch (menuEvent.id) { - case 'new': - console.log('Creating new document...'); - break; - case 'open': - console.log('Opening file...'); - break; - case 'quit': - app.exit(); - break; - } -}); - -// Set up menu... -app.setMenu({/* ... */}); -``` - -#### Window-specific menus - -```js -const app = new Application(); - -// Create window with custom menu -const window = app.createBrowserWindow({ - title: 'Custom Window', - menu: { - items: [ - { - id: 'window-action', - label: 'Window Action', - accelerator: 'Ctrl+W', - }, - ], - }, -}); - -// Or check if window has a menu -if (window.hasMenu()) { - console.log('This window has a menu'); -} -``` - -#### Menu item options - -- **`id`**: Unique identifier for the menu item (used in events) -- **`label`**: Display text for the menu item -- **`enabled`**: Whether the item is clickable (default: true) -- **`accelerator`**: Keyboard shortcut (e.g., "CmdOrCtrl+N", "Alt+F4") -- **`submenu`**: Nested menu items -- **`role`**: Predefined menu items with built-in behavior - -#### Predefined menu roles - -- **`"copy"`**: Standard copy action -- **`"paste"`**: Standard paste action -- **`"cut"`**: Standard cut action -- **`"selectall"`**: Select all text action -- **`"separator"`**: Visual separator line - -### IPC - -```js -const app = new Application(); -const window = app.createBrowserWindow(); - -const webview = window.createWebview({ - html: ` - - - Webview - - -

    Hello world!

    - - - - - `, - preload: `window.onIpcMessage = function(data) { - const output = document.getElementById('output'); - output.innerText = \`Server Sent A Message: \${data}\`; - }`, -}); - -if (!webview.isDevtoolsOpen()) webview.openDevtools(); - -webview.onIpcMessage((data) => { - const reply = `You sent ${data.body.toString('utf-8')}`; - webview.evaluateScript(`onIpcMessage("${reply}")`); -}); - -app.run(); -``` - -### Closing the application - -You can close the application, windows, and webviews gracefully to ensure all resources (including temporary folders) are cleaned up properly. - -```js -const app = new Application(); -const window = app.createBrowserWindow(); -const webview = window.createWebview({ url: 'https://nodejs.org' }); - -app.on('application-close-requested', () => { - console.log('Application is closing, cleaning up resources...'); -}); - -app.on('window-close-requested', () => { - console.log('Window close requested'); -}); - -// Close the application gracefully (cleans up temp folders) -app.exit(); - -// Or hide/show the window -window.hide(); // Hide the window -window.show(); // Show the window again - -// Or reload the webview -webview.reload(); -``` - -For more details on application lifecycle and disposal, see the -[Application API reference](https://webview.js.org/api/application) and the -[closing example](./apps/examples/close-example.mjs). - -### Keep strong references - -Retain `BrowserWindow`, `Webview`, `WebContext`, and `TrayIcon` wrappers for as -long as you need to call their methods or retain their JavaScript listeners. -Avoid discarded temporary handles: - -```js -const windows = []; - -app.whenReady().then(() => { - const window = app.createBrowserWindow(); - const webview = window.createWebview({ url: 'https://example.com' }); - windows.push({ window, webview }); -}); +bun install +bun run build +bun run test +bun run lint +bun run format:check +bun run check ``` -The root `Application` owns native resources created through it. `app.exit()`, -`app[Symbol.dispose]()`, and application garbage collection dispose those -resources in shutdown order. Retained wrappers then report `isDisposed() === -true`, and method calls fail with a disposed error. Individual windows, -webviews, contexts, and tray icons also support `dispose()` and -`Symbol.dispose`. - -Check out [examples](./apps/examples) directory for more examples: - -- **[menu-system.mjs](./apps/examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features -- **[window-menus.mjs](./apps/examples/window-menus.mjs)** - Window-specific vs global menu examples -- **[http/](./apps/examples/http/)** - Serving content from a web server to webview -- **[transparent.mjs](./apps/examples/transparent.mjs)** - Transparent window example -- **[close-example.mjs](./apps/examples/close-example.mjs)** - Graceful application closing - -Run an example after building the package with: `node apps/examples/menu-system.mjs`. +## Working on the package -## Building executables - -Build a standalone executable with Node.js by default, or choose Bun or Deno: +Build the native package and its TypeScript API with: ```bash -npm install @webviewjs/webview -npx webview build src/main.ts -npx webview build src/main.ts --runtime bun -npx webview build src/main.ts --runtime deno +bun --filter @webviewjs/webview build ``` -The output goes to `./dist` by default. Set `--name`, `--out-dir`, `--target`, -and repeat `--asset` as needed. Use `--resources` for the legacy Node SEA JSON -asset map. Node SEA embeds WebviewJS's native addon; Bun and Deno builds also -require the matching target-specific native package. -Node SEA is host-only. Bun and Deno accept cross-target identifiers, but only -the current host builds have integration smoke coverage in this repository. -The CLI does not create installers or perform Windows certificate signing. - -For runtime-specific details, asset embedding, code signing, and release -guidance, see [Building Executables](https://webview.js.org/guides/building-executables). - -The old `webview --build --input ` form remains temporarily available -and prints a deprecation warning. +## Working on the docs -## Agent skill - -This repository includes a reusable WebviewJS skill for coding agents. Install -it with: +Start the documentation site locally with: ```bash -npx skills add webviewjs/webview +bun --filter @webviewjs/docs dev ``` -It covers application structure, native prerequisites, platform constraints, -API patterns, and executable builds. - -## Development - -The published library is in `packages/webview`, runnable examples are in -`apps/examples`, and the documentation website is in `apps/docs`. - -### Prerequisites - -- [Bun](https://bun.sh/) 1.3.14 -- [Rust](https://www.rust-lang.org/) stable toolchain -- [Node.js](https://nodejs.org/) >= 24 (for testing) - -### Setup - -```bash -bun install -``` +## Examples -### Build and run an example +Build the package, then run an example with Node.js: ```bash bun --filter @webviewjs/webview build node apps/examples/simple.mjs ``` -The native build requires the platform's Rust and GUI development dependencies. -To build only the TypeScript layer, run `bun --filter @webviewjs/webview build:lib`. +## Project structure -### Repository commands - -```bash -bun run dev # Start the documentation app -bun run build # Build the native package and static docs -bun run test # Run Node's built-in test runner -bun run lint # Run Oxlint across the repository -bun run lint:fix -bun run format # Format JS/TS/MD and Rust source -bun run format:check -bun run check # Cargo check and docs type check -bun run clippy +```text +apps/ + docs/ Documentation site + examples/ Runnable examples +packages/ + webview/ @webviewjs/webview package ``` -The docs workspace can also be run on its own with `bun --filter @webviewjs/docs dev` or built with `bun --filter @webviewjs/docs build`. +## Contributing -``` +Issues and pull requests are welcome. For bugs or feature requests, [open an issue](https://github.com/webviewjs/webview/issues); before contributing code, review the repository guidance in [`AGENTS.md`](./AGENTS.md). -``` +## License + +MIT. See [`LICENSE`](./LICENSE). diff --git a/apps/docs/README.md b/apps/docs/README.md index 2281159..04b4be3 100644 --- a/apps/docs/README.md +++ b/apps/docs/README.md @@ -1,6 +1,8 @@ -# WebviewJS documentation +# WebviewJS documentation site -The static Fumadocs site is built from `content/docs` and exports to `out/`. +This workspace powers [webview.js.org](https://webview.js.org). The guides and +API reference live in `apps/docs/content/docs`; the custom homepage lives in +`apps/docs/app/(home)`. From the repository root, run: @@ -10,6 +12,5 @@ bun --filter @webviewjs/docs dev bun --filter @webviewjs/docs build ``` -The app uses Fumadocs' generated static search index, `llms.txt`, -`llms-full.txt`, and processed per-page Markdown routes. Its build also copies -those Markdown pages to convenient `/.md` files in the static export. +The build exports the static site to `apps/docs/out/`, including search, +`llms.txt`, `llms-full.txt`, and per-page Markdown aliases. diff --git a/apps/docs/app/(docs)/[[...slug]]/page.tsx b/apps/docs/app/(docs)/[...slug]/page.tsx similarity index 96% rename from apps/docs/app/(docs)/[[...slug]]/page.tsx rename to apps/docs/app/(docs)/[...slug]/page.tsx index 503ef61..a859486 100644 --- a/apps/docs/app/(docs)/[[...slug]]/page.tsx +++ b/apps/docs/app/(docs)/[...slug]/page.tsx @@ -13,7 +13,7 @@ import type { Metadata } from 'next'; import { createRelativeLink } from 'fumadocs-ui/mdx'; import { getPageImageUrl, getPageMarkdownUrl, gitConfig } from '@/lib/shared'; -type DocsPageProps = { params: Promise<{ slug?: string[] }> }; +type DocsPageProps = { params: Promise<{ slug: string[] }> }; export default async function Page(props: DocsPageProps) { const params = await props.params; diff --git a/apps/docs/app/(home)/layout.tsx b/apps/docs/app/(home)/layout.tsx new file mode 100644 index 0000000..4222cb0 --- /dev/null +++ b/apps/docs/app/(home)/layout.tsx @@ -0,0 +1,11 @@ +import { baseOptions } from '@/lib/layout.shared'; +import { HomeLayout } from 'fumadocs-ui/layouts/home'; +import type { ReactNode } from 'react'; + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} diff --git a/apps/docs/app/(home)/page.tsx b/apps/docs/app/(home)/page.tsx new file mode 100644 index 0000000..4edcee4 --- /dev/null +++ b/apps/docs/app/(home)/page.tsx @@ -0,0 +1,48 @@ +import type { Metadata } from 'next'; +import styles from '@/components/home/home-visuals.module.css'; +import { CapabilityBento } from '@/components/home/capability-bento'; +import { CodeShowcase } from '@/components/home/code-showcase'; +import { DocsLinks } from '@/components/home/docs-links'; +import { ExecutableBuilder } from '@/components/home/executable-builder'; +import { Footer } from '@/components/home/footer'; +import { Hero } from '@/components/home/hero'; +import { NativeCapabilities } from '@/components/home/native-capabilities'; +import { RuntimeBridge } from '@/components/home/runtime-bridge'; + +const title = 'WebviewJS | Native webviews for JavaScript'; +const description = + 'Create desktop applications with JavaScript or TypeScript using Node.js, Bun, or Deno and the native webview provided by Windows, macOS, and Linux.'; + +export const metadata: Metadata = { + title: { absolute: title }, + description, + openGraph: { + title, + description, + url: '/', + siteName: 'WebviewJS', + type: 'website', + images: [{ url: '/preview.png', alt: 'A WebviewJS native window showing a web application.' }], + }, + twitter: { + card: 'summary_large_image', + title, + description, + images: ['/preview.png'], + }, +}; + +export default function Page() { + return ( +
    + + + + + + + +
    +
    + ); +} diff --git a/apps/docs/app/global.css b/apps/docs/app/global.css index f86f3c9..08afc43 100644 --- a/apps/docs/app/global.css +++ b/apps/docs/app/global.css @@ -10,3 +10,175 @@ html > body[data-scroll-locked] { margin-right: 0px !important; --removed-body-scroll-bar-size: 0px !important; } + +.home-layout { + --fd-layout-width: 1480px; + --wjs-bg: #f3f4f1; + --wjs-bg-soft: #eceeeb; + --wjs-surface: #fafbf9; + --wjs-surface-raised: #ffffff; + --wjs-border: rgb(20 32 37 / 0.09); + --wjs-border-strong: rgb(20 32 37 / 0.15); + --wjs-text: #151b1d; + --wjs-muted: #586367; + --wjs-subtle: #7e898c; + --wjs-accent: #087f91; + --wjs-accent-soft: rgb(8 127 145 / 0.08); + --wjs-accent-border: rgb(8 127 145 / 0.22); + min-height: 100vh; + color: var(--wjs-text); + background: var(--wjs-bg); +} + +.dark .home-layout { + --wjs-bg: #0b0e10; + --wjs-bg-soft: #0e1214; + --wjs-surface: #101518; + --wjs-surface-raised: #151a1d; + --wjs-border: rgb(230 242 245 / 0.075); + --wjs-border-strong: rgb(230 242 245 / 0.13); + --wjs-text: #eef3f4; + --wjs-muted: #a5b0b4; + --wjs-subtle: #778388; + --wjs-accent: #83dce8; + --wjs-accent-soft: rgb(131 220 232 / 0.085); + --wjs-accent-border: rgb(131 220 232 / 0.24); +} + +#nd-home-layout #nd-nav { + height: 72px; +} + +#nd-home-layout #nd-nav > nav, +#nd-home-layout #nd-nav > nav > div { + height: 72px; +} + +#nd-home-layout #nd-nav > nav { + color: var(--wjs-text); + background: color-mix(in srgb, var(--wjs-bg) 84%, transparent); + border-color: var(--wjs-border); + backdrop-filter: blur(14px); +} + +#nd-home-layout #nd-nav > nav > div { + padding-inline: clamp(20px, 4vw, 56px); +} + +#nd-home-layout #nd-nav ul:first-of-type { + gap: 6px; + padding-inline: 28px; +} + +#nd-home-layout #nd-nav ul:first-of-type a { + padding-inline: 12px; + font-size: 14px; + color: var(--wjs-muted); +} + +#nd-home-layout #nd-nav ul:first-of-type a:hover, +#nd-home-layout #nd-nav ul:first-of-type a[data-active='true'] { + color: var(--wjs-text); +} + +#nd-home-layout #nd-nav button[data-search-full] { + max-width: 268px; + border-radius: 8px; + border-color: var(--wjs-border); + background: var(--wjs-surface); + color: var(--wjs-muted); + box-shadow: 0 1px 2px rgb(0 0 0 / 0.04); +} + +.wjs-wordmark { + display: inline-flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 650; + letter-spacing: -0.035em; + color: var(--wjs-text); +} + +.wjs-wordmark-glyph { + display: grid; + width: 25px; + height: 25px; + place-items: center; + border: 1px solid var(--wjs-accent-border); + border-radius: 7px; + color: var(--wjs-accent); + background: var(--wjs-accent-soft); +} + +.wjs-wordmark-glyph svg { + width: 14px; + height: 14px; + stroke-width: 1.8; +} + +.webview-home { + overflow: hidden; + color: var(--wjs-text); + background: var(--wjs-bg); +} + +.wjs-container { + width: min(calc(100% - clamp(40px, 8vw, 112px)), 1360px); + margin-inline: auto; +} + +.wjs-section { + padding-block: clamp(84px, 10vw, 152px); +} + +.wjs-eyebrow { + color: var(--wjs-subtle); + font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace); + font-size: 11px; + font-weight: 600; + letter-spacing: 0.15em; + line-height: 1.4; + text-transform: uppercase; +} + +.wjs-section-title { + color: var(--wjs-text); + font-size: clamp(2.2rem, 3.8vw, 3.5rem); + font-weight: 560; + letter-spacing: -0.055em; + line-height: 1.03; + text-wrap: balance; +} + +.wjs-copy { + color: var(--wjs-muted); + font-size: 16px; + line-height: 1.75; +} + +.wjs-panel { + border: 1px solid var(--wjs-border); + border-radius: 16px; + background: var(--wjs-surface); + box-shadow: + 0 16px 44px rgb(0 0 0 / 0.08), + inset 0 1px 0 rgb(255 255 255 / 0.025); +} + +.home-layout :is(a, button):focus-visible { + outline: 2px solid var(--wjs-accent); + outline-offset: 3px; +} + +@media (max-width: 767px) { + #nd-home-layout #nd-nav, + #nd-home-layout #nd-nav > nav, + #nd-home-layout #nd-nav > nav > div { + height: 62px; + } + + #nd-home-layout #nd-nav > nav > div { + padding-inline: 18px; + } +} diff --git a/apps/docs/app/icon.svg b/apps/docs/app/icon.svg new file mode 100644 index 0000000..626f2f3 --- /dev/null +++ b/apps/docs/app/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx index 9bd2786..0eec142 100644 --- a/apps/docs/app/layout.tsx +++ b/apps/docs/app/layout.tsx @@ -6,9 +6,16 @@ import './global.css'; export const metadata: Metadata = { metadataBase: new URL('https://webview.js.org'), title: { - default: 'WebviewJS', + default: 'WebviewJS | Native webviews for JavaScript', template: '%s | WebviewJS', }, + description: + 'A typed N-API binding for creating native desktop windows with Node.js, Bun, or Deno and the webview provided by the operating system.', + openGraph: { + siteName: 'WebviewJS', + type: 'website', + locale: 'en_US', + }, }; const inter = Inter({ diff --git a/apps/docs/components/home/capability-bento.tsx b/apps/docs/components/home/capability-bento.tsx new file mode 100644 index 0000000..4f16bbb --- /dev/null +++ b/apps/docs/components/home/capability-bento.tsx @@ -0,0 +1,169 @@ +import { Bell, Braces, Code2, Ellipsis, Globe2, LayoutGrid, MessageSquare, PanelTop, Settings2 } from 'lucide-react'; + +const apiTypes = ['Application', 'BrowserWindow', 'Webview', 'WebContext', 'TrayIcon', 'Notification']; + +const engines = [ + { platform: 'Windows', engine: 'WebView2' }, + { platform: 'macOS', engine: 'WebKit' }, + { platform: 'Linux', engine: 'WebKitGTK' }, +]; + +export function CapabilityBento() { + return ( +
    +
    +
    +
    +

    Built around the host operating system

    +

    Native building blocks. JavaScript-shaped APIs.

    +
    +

    + Keep the UI in web technologies. Reach window, platform, and page capabilities through a typed native layer. +

    +
    + +
    +
    +
    +
    + + +

    The system webview

    +

    + Use the browser engine supplied by the operating system instead of bundling a separate browser. +

    +
    + + PLATFORM PROVIDED + +
    + +
    + {engines.map(({ platform, engine }) => ( +
    +
    +
    + + + +
    +
    +
    +

    {platform}

    +

    + {engine} +

    +
    + ))} +
    +
    + +
    +
    + + +
    +

    Typed native objects

    +

    + Keep windows, contexts, and app state in familiar JS objects. +

    +
    +
    +
    +
    +
    +
    + {apiTypes.map((type, index) => ( +
    + {String(index + 1).padStart(2, '0')} + {type} +
    + ))} +
    +
    +

    + Public runtime objects also expose familiar Node-style EventEmitter methods. +

    +
    + +
    +
    + + +
    +

    Page ↔ native IPC

    +

    + Send page messages to JavaScript, or expose callable host functions. +

    +
    +
    +
    +
    + page + window.ipc.postMessage(...) +
    +
    +
    + host + webview.expose(...) +
    +
    +
    + +
    +
    +
    + + +
    +

    Desktop primitives

    +

    + Add operating-system features around the web content you already build. +

    +
    +
    + +
    +
    + {[ + { label: 'Menus', icon:
    +
    +
    +
    +
    + ); +} diff --git a/apps/docs/components/home/code-showcase.tsx b/apps/docs/components/home/code-showcase.tsx new file mode 100644 index 0000000..cfad964 --- /dev/null +++ b/apps/docs/components/home/code-showcase.tsx @@ -0,0 +1,128 @@ +import Link from 'next/link'; +import { ArrowRight, CodeXml, ExternalLink } from 'lucide-react'; +import { CopyCodeButton } from './copy-code-button'; + +const source = `import { Application } from '@webviewjs/webview'; + +const app = new Application(); +const window = app.createBrowserWindow({ + title: 'My App', + width: 1024, + height: 768, +}); + +window.createWebview({ url: 'https://example.com' }); +app.run();`; + +const lines = source.split('\n'); + +export function CodeShowcase() { + return ( +
    +
    +
    +
    +

    Start with JavaScript

    +

    A small API. A native result.

    +
    +
    +

    + Create an application, open a native window, and choose what the webview displays. Keep your UI framework + and build tools. +

    + + Read the quick start
    +
    + +
    +
    +
    + + + TypeScript +
    + +
    + +
    +
    +
    +                
    +                  {lines.map((line, index) => (
    +                    
    +                      {index + 1}
    +                      
    +                    
    +                  ))}
    +                
    +              
    +
    + +
    +
    +

    Native window

    + + SYSTEM WEBVIEW + +
    +
    +
    + + + + + + example.com +
    +
    + + + Your web content + rendered by the platform engine +
    +
    +
    +
    +
    +
    +
    + ); +} + +function HighlightedLine({ line }: { line: string }) { + const pieces = line.split(/('(?:[^']*)'|\b(?:import|from|const|new)\b|\b\d+\b)/g); + + return pieces.map((piece, index) => { + const key = `${piece}-${index}`; + if (/^'(?:[^']*)'$/.test(piece)) { + return ( + + {piece} + + ); + } + if (/^(import|from|const|new)$/.test(piece)) { + return ( + + {piece} + + ); + } + if (/^\d+$/.test(piece)) { + return ( + + {piece} + + ); + } + return {piece}; + }); +} diff --git a/apps/docs/components/home/copy-code-button.tsx b/apps/docs/components/home/copy-code-button.tsx new file mode 100644 index 0000000..2f6abd2 --- /dev/null +++ b/apps/docs/components/home/copy-code-button.tsx @@ -0,0 +1,42 @@ +'use client'; + +import { Check, Clipboard } from 'lucide-react'; +import { useState } from 'react'; + +export function CopyCodeButton({ source }: { source: string }) { + const [copied, setCopied] = useState(false); + const [feedback, setFeedback] = useState(''); + + async function copyCode() { + try { + await navigator.clipboard.writeText(source); + setCopied(true); + setFeedback('Code copied to clipboard.'); + window.setTimeout(() => setCopied(false), 1800); + } catch { + setCopied(false); + setFeedback('Copy unavailable. Select the code to copy it.'); + } + } + + return ( +
    +

    + {feedback} +

    + +
    + ); +} diff --git a/apps/docs/components/home/docs-links.tsx b/apps/docs/components/home/docs-links.tsx new file mode 100644 index 0000000..ab86857 --- /dev/null +++ b/apps/docs/components/home/docs-links.tsx @@ -0,0 +1,82 @@ +import Link from 'next/link'; +import { ArrowRight, ArrowUpRight } from 'lucide-react'; + +const links = [ + { + index: '01', + title: 'Quick start', + description: 'Create your first native window.', + href: '/getting-started/quick-start', + }, + { + index: '02', + title: 'API reference', + description: 'Explore applications, windows, and webviews.', + href: '/api/application', + }, + { + index: '03', + title: 'Guides', + description: 'IPC, menus, contexts, and executables.', + href: '/guides/building-executables', + }, + { + index: '04', + title: 'Examples', + description: 'Run working examples from the repository.', + href: 'https://github.com/webviewjs/webview/tree/main/apps/examples', + external: true, + }, +]; + +export function DocsLinks() { + return ( +
    + +
    + ); +} diff --git a/apps/docs/components/home/executable-builder.tsx b/apps/docs/components/home/executable-builder.tsx new file mode 100644 index 0000000..f6cad48 --- /dev/null +++ b/apps/docs/components/home/executable-builder.tsx @@ -0,0 +1,31 @@ +import Link from 'next/link'; +import { ArrowUpRight } from 'lucide-react'; +import { RuntimeBuildPanel } from './runtime-build-panel'; + +export function ExecutableBuilder() { + return ( +
    +
    +
    +
    +

    From source to executable

    +

    Choose the runtime that ships your app.

    +
    +
    +

    + Build the same WebviewJS application into a standalone executable with the runtime backend that fits your + project. +

    + + Building executables guide
    +
    + +
    +
    + ); +} diff --git a/apps/docs/components/home/footer.tsx b/apps/docs/components/home/footer.tsx new file mode 100644 index 0000000..7f4e63b --- /dev/null +++ b/apps/docs/components/home/footer.tsx @@ -0,0 +1,44 @@ +import Link from 'next/link'; +import { PanelsTopLeft } from 'lucide-react'; + +const links = [ + { label: 'Documentation', href: '/getting-started/quick-start' }, + { label: 'GitHub', href: 'https://github.com/webviewjs/webview', external: true }, + { label: 'npm', href: 'https://www.npmjs.com/package/@webviewjs/webview', external: true }, + { label: 'MIT License', href: 'https://github.com/webviewjs/webview/blob/main/LICENSE', external: true }, +]; + +export function Footer() { + return ( +
    +
    + + + WebviewJS + + + JavaScript · Native windows +
    +
    + ); +} diff --git a/apps/docs/components/home/hero.tsx b/apps/docs/components/home/hero.tsx new file mode 100644 index 0000000..839bcea --- /dev/null +++ b/apps/docs/components/home/hero.tsx @@ -0,0 +1,52 @@ +import Link from 'next/link'; +import { ArrowRight, ArrowUpRight } from 'lucide-react'; +import { InstallCommand } from './install-command'; +import { ProductWindow } from './product-window'; + +export function Hero() { + return ( +
    +
    +
    +

    +

    +

    + Native webviews for JavaScript. +

    +

    + Build desktop applications with the browser engine your operating system already provides. +

    +

    + Node.js / Bun{' '} + / Deno + + one typed native API + +

    + +
    + + Get started
    + +
    + +
    +
    + + +
    +
    + ); +} diff --git a/apps/docs/components/home/home-visuals.module.css b/apps/docs/components/home/home-visuals.module.css new file mode 100644 index 0000000..8363475 --- /dev/null +++ b/apps/docs/components/home/home-visuals.module.css @@ -0,0 +1,830 @@ +.homeVisuals { +} + +.homeVisuals :global(.wjs-hero) { + position: relative; + isolation: isolate; + border-bottom: 1px solid var(--wjs-border); + background: + radial-gradient(ellipse at 78% 42%, rgb(95 191 208 / 0.09), transparent 35%), + linear-gradient(180deg, var(--wjs-bg), var(--wjs-bg-soft)); +} + +.homeVisuals :global(.wjs-hero)::before { + position: absolute; + z-index: -1; + inset: 0 0 auto 38%; + height: 100%; + content: ''; + opacity: 0.5; + pointer-events: none; + background-image: + linear-gradient(to right, rgb(134 164 170 / 0.09) 1px, transparent 1px), + linear-gradient(to bottom, rgb(134 164 170 / 0.09) 1px, transparent 1px); + background-size: 64px 64px; + mask-image: radial-gradient(ellipse at 58% 42%, black 0%, transparent 70%); +} + +:global(.dark) .homeVisuals :global(.wjs-hero) { + background: + radial-gradient(ellipse at 77% 43%, rgb(76 174 194 / 0.105), transparent 35%), + linear-gradient(180deg, #0b0e10 0%, #0d1113 100%); +} + +:global(.dark) .homeVisuals :global(.wjs-hero)::before { + opacity: 0.34; +} + +.homeVisuals :global(.wjs-hero-layout) { + display: grid; + min-height: min(760px, calc(100svh - 72px)); + align-items: center; + gap: clamp(40px, 5vw, 76px); + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + padding-block: clamp(64px, 7vw, 104px) clamp(90px, 9vw, 132px); +} + +.homeVisuals :global(.wjs-hero-title) { + max-width: 11ch; + font-size: clamp(3.65rem, 5.5vw, 5.25rem); + font-weight: 610; + letter-spacing: -0.074em; + line-height: 0.96; + text-wrap: balance; +} + +.homeVisuals :global(.wjs-hero-title-accent) { + color: var(--wjs-accent); +} + +.homeVisuals :global(.wjs-hero-copy) { + max-width: 580px; + color: var(--wjs-muted); + font-size: clamp(17px, 1.35vw, 20px); + line-height: 1.65; +} + +.homeVisuals :global(.wjs-button-primary), +.homeVisuals :global(.wjs-button-secondary) { + display: inline-flex; + min-height: 48px; + align-items: center; + justify-content: center; + gap: 10px; + border-radius: 9px; + padding: 0 18px; + font-size: 14px; + font-weight: 600; + transition: + transform 160ms ease, + border-color 160ms ease, + background-color 160ms ease, + color 160ms ease; +} + +.homeVisuals :global(.wjs-button-primary) { + color: #062126; + border: 1px solid color-mix(in srgb, var(--wjs-accent) 70%, white 30%); + background: var(--wjs-accent); + box-shadow: + 0 3px 14px rgb(69 177 192 / 0.16), + inset 0 1px 0 rgb(255 255 255 / 0.24); +} + +.homeVisuals :global(.wjs-button-secondary) { + color: var(--wjs-text); + border: 1px solid var(--wjs-border-strong); + background: color-mix(in srgb, var(--wjs-surface) 78%, transparent); +} + +.homeVisuals :global(.wjs-button-primary):hover, +.homeVisuals :global(.wjs-button-secondary):hover { + transform: translateY(-1px); +} + +.homeVisuals :global(.wjs-button-secondary):hover { + border-color: var(--wjs-accent-border); + background: var(--wjs-accent-soft); +} + +.homeVisuals :global(.wjs-hero-visual) { + position: relative; + min-width: 0; + min-height: 520px; +} + +.homeVisuals :global(.wjs-window-shell) { + overflow: hidden; + border: 1px solid rgb(255 255 255 / 0.14); + border-radius: 20px; + background: #14191c; + box-shadow: + 0 36px 90px rgb(0 0 0 / 0.28), + 0 6px 22px rgb(0 0 0 / 0.18), + inset 0 1px 0 rgb(255 255 255 / 0.14); +} + +.homeVisuals :global(.wjs-window-chrome) { + display: flex; + height: 46px; + align-items: center; + gap: 14px; + border-bottom: 1px solid rgb(255 255 255 / 0.08); + padding-inline: 16px; + color: rgb(237 245 247 / 0.72); + background: linear-gradient(180deg, #1e2529, #171d20); +} + +.homeVisuals :global(.wjs-window-dots) { + display: flex; + gap: 6px; +} + +.homeVisuals :global(.wjs-window-dots) i { + width: 9px; + height: 9px; + border: 1px solid rgb(255 255 255 / 0.13); + border-radius: 50%; + background: #697276; +} + +.homeVisuals :global(.wjs-window-address) { + display: flex; + width: min(42%, 260px); + height: 25px; + align-items: center; + justify-content: center; + gap: 7px; + margin-inline: auto; + border: 1px solid rgb(255 255 255 / 0.07); + border-radius: 6px; + color: rgb(237 245 247 / 0.53); + background: rgb(0 0 0 / 0.16); + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 10px; +} + +.homeVisuals :global(.wjs-app-content) { + display: grid; + min-height: 390px; + grid-template-columns: 64px minmax(0, 1fr); + color: #1d282c; + background: #edf1f0; +} + +.homeVisuals :global(.wjs-app-rail) { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + border-right: 1px solid rgb(25 40 46 / 0.08); + padding-block: 17px; + background: #e7ecea; +} + +.homeVisuals :global(.wjs-app-rail-mark) { + display: grid; + width: 29px; + height: 29px; + place-items: center; + border-radius: 8px; + color: #eafcff; + background: #15282e; + font-size: 12px; + font-weight: 700; +} + +.homeVisuals :global(.wjs-app-rail-icon) { + display: grid; + width: 30px; + height: 30px; + place-items: center; + border-radius: 7px; + color: #7c898c; +} + +.homeVisuals :global(.wjs-app-rail-icon.is-active) { + color: #087f91; + background: rgb(8 127 145 / 0.1); +} + +.homeVisuals :global(.wjs-app-main) { + min-width: 0; + padding: 20px clamp(18px, 3vw, 34px) 26px; +} + +.homeVisuals :global(.wjs-app-topline), +.homeVisuals :global(.wjs-app-toolbar), +.homeVisuals :global(.wjs-app-row) { + display: flex; + align-items: center; + justify-content: space-between; +} + +.homeVisuals :global(.wjs-app-topline) { + color: #7b878a; + font-size: 10px; +} + +.homeVisuals :global(.wjs-app-avatar) { + display: grid; + width: 24px; + height: 24px; + place-items: center; + border: 1px solid rgb(32 69 75 / 0.13); + border-radius: 50%; + color: #1b616c; + background: #d6ebea; + font-size: 9px; + font-weight: 650; +} + +.homeVisuals :global(.wjs-app-kicker) { + color: #728083; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 9px; + letter-spacing: 0.11em; + text-transform: uppercase; +} + +.homeVisuals :global(.wjs-app-heading) { + color: #1b2629; + font-size: clamp(21px, 2.35vw, 31px); + font-weight: 560; + letter-spacing: -0.055em; + line-height: 1.15; +} + +.homeVisuals :global(.wjs-app-row) { + min-height: 52px; + gap: 12px; + border-top: 1px solid rgb(25 40 46 / 0.09); + color: #435054; + font-size: 11px; +} + +.homeVisuals :global(.wjs-app-row) strong { + color: #263438; + font-size: 11px; + font-weight: 600; +} + +.homeVisuals :global(.wjs-app-row) span:last-child { + color: #879195; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 9px; +} + +.homeVisuals :global(.wjs-hero-code) { + position: absolute; + z-index: 2; + right: -12px; + bottom: -34px; + width: min(78%, 510px); + overflow: hidden; + border: 1px solid rgb(255 255 255 / 0.14); + border-radius: 13px; + color: #d8e4e6; + background: #101619; + box-shadow: + 0 24px 58px rgb(0 0 0 / 0.34), + inset 0 1px 0 rgb(255 255 255 / 0.07); +} + +.homeVisuals :global(.wjs-code-header) { + display: flex; + height: 38px; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid rgb(255 255 255 / 0.08); + padding-inline: 14px; + color: #98a7ab; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 10px; +} + +.homeVisuals :global(.wjs-code-line) { + display: block; + white-space: pre; +} + +.homeVisuals :global(.wjs-code-number) { + display: inline-block; + width: 24px; + padding-right: 10px; + color: #526166; + text-align: right; + user-select: none; +} + +.homeVisuals :global(.wjs-token-keyword) { + color: #7dd4e2; +} + +.homeVisuals :global(.wjs-token-string) { + color: #d9b982; +} + +.homeVisuals :global(.wjs-token-number) { + color: #c6a2df; +} + +.homeVisuals :global(.wjs-runtime-section) { + border-bottom: 1px solid var(--wjs-border); + background: var(--wjs-bg-soft); +} + +.homeVisuals :global(.wjs-bridge) { + display: grid; + grid-template-columns: 1fr minmax(250px, 0.82fr) 1fr; + align-items: stretch; + border-top: 1px solid var(--wjs-border-strong); + border-bottom: 1px solid var(--wjs-border-strong); +} + +.homeVisuals :global(.wjs-bridge-plane) { + position: relative; + padding: 30px clamp(20px, 4vw, 54px); +} + +.homeVisuals :global(.wjs-bridge-plane) + :global(.wjs-bridge-plane) { + border-left: 1px solid var(--wjs-border); +} + +.homeVisuals :global(.wjs-bridge-runtime-list), +.homeVisuals :global(.wjs-bridge-platform-list) { + display: grid; + gap: 13px; + margin-top: 25px; +} + +.homeVisuals :global(.wjs-bridge-runtime), +.homeVisuals :global(.wjs-bridge-platform) { + display: flex; + min-height: 39px; + align-items: center; + justify-content: space-between; + gap: 12px; + color: var(--wjs-text); + font-size: 15px; + font-weight: 540; +} + +.homeVisuals :global(.wjs-bridge-runtime) span:last-child, +.homeVisuals :global(.wjs-bridge-platform) span:last-child { + color: var(--wjs-subtle); + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 11px; + font-weight: 450; +} + +.homeVisuals :global(.wjs-bridge-runtime) span:first-child { + display: inline-flex; + align-items: center; + gap: 11px; +} + +.homeVisuals :global(.wjs-bridge-runtime) span:first-child::before { + width: 7px; + height: 7px; + border: 1px solid var(--wjs-accent-border); + border-radius: 2px; + content: ''; + background: var(--wjs-accent-soft); +} + +.homeVisuals :global(.wjs-bridge-core) { + display: flex; + min-height: 250px; + flex-direction: column; + align-items: center; + justify-content: center; + border-inline: 1px solid var(--wjs-accent-border); + background: linear-gradient(180deg, var(--wjs-accent-soft), transparent 95%), var(--wjs-surface); + text-align: center; +} + +.homeVisuals :global(.wjs-bridge-core-mark) { + display: grid; + width: 48px; + height: 48px; + place-items: center; + margin-bottom: 16px; + border: 1px solid var(--wjs-accent-border); + border-radius: 13px; + color: var(--wjs-accent); + background: var(--wjs-accent-soft); +} + +.homeVisuals :global(.wjs-bridge-core-mark) svg { + width: 21px; + height: 21px; +} + +.homeVisuals :global(.wjs-bento-card) { + position: relative; + overflow: hidden; + border: 1px solid var(--wjs-border); + border-radius: 15px; + background: + linear-gradient(150deg, color-mix(in srgb, var(--wjs-surface-raised) 88%, transparent), var(--wjs-surface)), + var(--wjs-surface); + box-shadow: + 0 10px 30px rgb(0 0 0 / 0.035), + inset 0 1px 0 rgb(255 255 255 / 0.025); + transition: + border-color 180ms ease, + transform 180ms ease, + box-shadow 180ms ease; +} + +.homeVisuals :global(.wjs-bento-card):hover { + transform: translateY(-2px); + border-color: var(--wjs-border-strong); + box-shadow: + 0 18px 38px rgb(0 0 0 / 0.075), + inset 0 1px 0 rgb(255 255 255 / 0.04); +} + +.homeVisuals :global(.wjs-engine-window) { + min-width: 0; + overflow: hidden; + border: 1px solid var(--wjs-border-strong); + border-radius: 9px; + background: color-mix(in srgb, var(--wjs-bg) 78%, transparent); +} + +.homeVisuals :global(.wjs-engine-window-bar) { + display: flex; + height: 22px; + align-items: center; + gap: 4px; + border-bottom: 1px solid var(--wjs-border); + padding-inline: 7px; +} + +.homeVisuals :global(.wjs-engine-window-bar) i { + width: 4px; + height: 4px; + border-radius: 50%; + background: var(--wjs-subtle); +} + +.homeVisuals :global(.wjs-engine-window-body) { + height: 38px; + background: linear-gradient(135deg, var(--wjs-accent-soft), transparent 78%); +} + +.homeVisuals :global(.wjs-desktop-section) { + border-block: 1px solid var(--wjs-border); + background: linear-gradient(180deg, var(--wjs-bg-soft), var(--wjs-bg)); +} + +.homeVisuals :global(.wjs-desktop-stage) { + position: relative; + min-height: 445px; + overflow: hidden; + border: 1px solid rgb(255 255 255 / 0.12); + border-radius: 19px; + background: radial-gradient(ellipse at 60% 35%, rgb(131 220 232 / 0.08), transparent 56%), #12191c; + box-shadow: + 0 28px 64px rgb(0 0 0 / 0.18), + inset 0 1px 0 rgb(255 255 255 / 0.06); +} + +.homeVisuals :global(.wjs-desktop-notice), +.homeVisuals :global(.wjs-desktop-menu) { + position: absolute; + z-index: 2; + border: 1px solid rgb(28 42 46 / 0.11); + border-radius: 12px; + color: #263336; + background: rgb(249 251 249 / 0.96); + box-shadow: + 0 20px 55px rgb(0 0 0 / 0.23), + inset 0 1px 0 white; +} + +.homeVisuals :global(.wjs-desktop-notice) { + top: 30px; + right: 24px; + display: flex; + width: min(300px, calc(100% - 48px)); + align-items: center; + gap: 12px; + padding: 13px 14px; +} + +.homeVisuals :global(.wjs-desktop-notice-icon) { + display: grid; + width: 34px; + height: 34px; + flex: 0 0 auto; + place-items: center; + border-radius: 9px; + color: #0a7688; + background: #dceff0; +} + +.homeVisuals :global(.wjs-desktop-notice-icon) svg { + width: 16px; + height: 16px; +} + +.homeVisuals :global(.wjs-desktop-menu) { + right: 31px; + bottom: 22px; + width: 204px; + padding: 8px; +} + +.homeVisuals :global(.wjs-desktop-menu-row) { + display: flex; + height: 32px; + align-items: center; + justify-content: space-between; + border-radius: 6px; + padding-inline: 8px; + color: #344348; + font-size: 11px; +} + +.homeVisuals :global(.wjs-desktop-menu-row.is-selected) { + color: #075b67; + background: #e4f2f1; +} + +.homeVisuals :global(.wjs-desktop-app) { + position: absolute; + inset: 74px 92px 43px 30px; + overflow: hidden; + border: 1px solid rgb(255 255 255 / 0.17); + border-radius: 11px; + background: #e8eeec; + box-shadow: 0 22px 50px rgb(0 0 0 / 0.22); +} + +.homeVisuals :global(.wjs-desktop-app-bar) { + display: flex; + height: 34px; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid rgb(29 48 52 / 0.1); + padding-inline: 13px; + color: #5e6e72; + background: #f6f8f6; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 9px; +} + +.homeVisuals :global(.wjs-desktop-app-body) { + display: grid; + height: calc(100% - 34px); + grid-template-columns: 76px minmax(0, 1fr); +} + +.homeVisuals :global(.wjs-desktop-app-rail) { + border-right: 1px solid rgb(29 48 52 / 0.09); + padding: 14px 10px; + color: #748185; + background: #e2e9e6; + font-size: 8px; +} + +.homeVisuals :global(.wjs-desktop-app-view) { + min-width: 0; + padding: 20px; + color: #2d3a3d; + font-size: 10px; +} + +.homeVisuals :global(.wjs-terminal) { + overflow: hidden; + border: 1px solid var(--wjs-border-strong); + border-radius: 16px; + color: #d9e4e6; + background: #101619; + box-shadow: + 0 26px 68px rgb(0 0 0 / 0.18), + inset 0 1px 0 rgb(255 255 255 / 0.05); +} + +.homeVisuals :global(.wjs-terminal-tab) { + border: 1px solid transparent; + border-radius: 7px; + padding: 8px 11px; + color: #91a0a4; + font-size: 12px; + transition: + color 150ms ease, + border-color 150ms ease, + background-color 150ms ease; +} + +.homeVisuals :global(.wjs-terminal-tab)[aria-pressed='true'] { + border-color: rgb(131 220 232 / 0.2); + color: #c5f3f7; + background: rgb(131 220 232 / 0.08); +} + +.homeVisuals :global(.wjs-doc-link) { + border-top: 1px solid var(--wjs-border-strong); + padding: 24px 8px 20px; + transition: + color 160ms ease, + border-color 160ms ease; +} + +.homeVisuals :global(.wjs-doc-link):hover { + border-color: var(--wjs-accent-border); + color: var(--wjs-accent); +} + +.homeVisuals :global(.wjs-footer) { + border-top: 1px solid var(--wjs-border); + background: var(--wjs-bg); +} + +.homeVisuals :global(.wjs-status-mark) { + position: relative; + width: 8px; + height: 8px; + flex: 0 0 auto; + border: 1px solid var(--wjs-accent-border); + border-radius: 50%; + background: var(--wjs-accent); + box-shadow: 0 0 0 4px var(--wjs-accent-soft); +} + +.homeVisuals :global(.wjs-capabilities-section) { + border-bottom: 1px solid var(--wjs-border); + background: linear-gradient(180deg, var(--wjs-bg), var(--wjs-bg-soft) 100%); +} + +.homeVisuals :global(.wjs-code-section) { + border-bottom: 1px solid var(--wjs-border); + background: var(--wjs-bg); +} + +.homeVisuals :global(.wjs-code-editor) { + overflow: hidden; + border: 1px solid rgb(255 255 255 / 0.12); + border-radius: 16px; + color: #d9e4e6; + background: #101619; + box-shadow: + 0 26px 68px rgb(0 0 0 / 0.16), + inset 0 1px 0 rgb(255 255 255 / 0.05); +} + +.homeVisuals :global(.wjs-build-section) { + border-block: 1px solid var(--wjs-border); + background: linear-gradient(180deg, var(--wjs-bg-soft), var(--wjs-bg)); +} + +.homeVisuals :global(.wjs-docs-section) { + background: var(--wjs-bg-soft); +} + +@media (max-width: 1279px) { + .homeVisuals :global(.wjs-hero-layout) { + min-height: initial; + grid-template-columns: minmax(0, 1fr); + padding-block: 72px 96px; + } + + .homeVisuals :global(.wjs-hero-copy) { + max-width: 700px; + } + + .homeVisuals :global(.wjs-hero-visual) { + width: min(100%, 900px); + margin-inline: auto; + min-height: 470px; + } +} + +@media (max-width: 767px) { + .homeVisuals :global(.wjs-container) { + width: min(calc(100% - 36px), 1360px); + } + + .homeVisuals :global(.wjs-section) { + padding-block: 76px; + } + + .homeVisuals :global(.wjs-hero-layout) { + gap: 42px; + padding-block: 63px 82px; + } + + .homeVisuals :global(.wjs-hero-title) { + max-width: none; + font-size: clamp(3.25rem, 14vw, 4.6rem); + } + + .homeVisuals :global(.wjs-hero-copy) { + font-size: 17px; + } + + .homeVisuals :global(.wjs-hero-visual) { + min-height: initial; + padding-bottom: 0; + } + + .homeVisuals :global(.wjs-app-content) { + min-height: 330px; + grid-template-columns: 48px minmax(0, 1fr); + } + + .homeVisuals :global(.wjs-app-rail) { + gap: 12px; + } + + .homeVisuals :global(.wjs-app-rail-icon) { + width: 26px; + height: 26px; + } + + .homeVisuals :global(.wjs-app-main) { + padding: 15px 13px 18px; + } + + .homeVisuals :global(.wjs-app-row) { + min-height: 45px; + font-size: 9px; + } + + .homeVisuals :global(.wjs-app-row) strong { + font-size: 9px; + } + + .homeVisuals :global(.wjs-hero-code) { + position: relative; + right: auto; + bottom: auto; + width: calc(100% - 22px); + margin: -29px 0 0 auto; + } + + .homeVisuals :global(.wjs-bridge) { + grid-template-columns: 1fr; + } + + .homeVisuals :global(.wjs-bridge-plane) + :global(.wjs-bridge-plane) { + border-top: 1px solid var(--wjs-border); + border-left: 0; + } + + .homeVisuals :global(.wjs-bridge-core) { + min-height: 190px; + border: 1px solid var(--wjs-accent-border); + } + + .homeVisuals :global(.wjs-bridge-plane) { + padding: 25px 22px; + } + + .homeVisuals :global(.wjs-bridge-runtime-list), + .homeVisuals :global(.wjs-bridge-platform-list) { + gap: 8px; + margin-top: 16px; + } + + .homeVisuals :global(.wjs-desktop-stage) { + min-height: 370px; + } + + .homeVisuals :global(.wjs-desktop-app) { + inset: 92px 25px 72px 15px; + } + + .homeVisuals :global(.wjs-desktop-app-body) { + grid-template-columns: 54px minmax(0, 1fr); + } + + .homeVisuals :global(.wjs-desktop-app-view) { + padding: 13px; + } + + .homeVisuals :global(.wjs-desktop-notice) { + top: 20px; + right: 13px; + } + + .homeVisuals :global(.wjs-desktop-menu) { + right: 16px; + bottom: 14px; + width: 174px; + } +} + +@media (prefers-reduced-motion: reduce) { + .homeVisuals :global(.wjs-button-primary), + .homeVisuals :global(.wjs-button-secondary), + .homeVisuals :global(.wjs-bento-card), + .homeVisuals :global(.wjs-terminal-tab), + .homeVisuals :global(.wjs-doc-link) { + transition: none; + } +} diff --git a/apps/docs/components/home/install-command.tsx b/apps/docs/components/home/install-command.tsx new file mode 100644 index 0000000..1d324de --- /dev/null +++ b/apps/docs/components/home/install-command.tsx @@ -0,0 +1,52 @@ +'use client'; + +import { Check, Copy } from 'lucide-react'; +import { useState } from 'react'; + +const command = 'npm install @webviewjs/webview'; + +export function InstallCommand() { + const [copied, setCopied] = useState(false); + const [status, setStatus] = useState(''); + + async function copyCommand() { + try { + await navigator.clipboard.writeText(command); + setCopied(true); + setStatus('Install command copied to clipboard.'); + window.setTimeout(() => setCopied(false), 1800); + } catch { + setCopied(false); + setStatus('Copy unavailable. Select the command to copy it.'); + } + } + + return ( +
    +
    + + + {command} + + +
    +

    + {status} +

    +
    + ); +} diff --git a/apps/docs/components/home/native-capabilities.tsx b/apps/docs/components/home/native-capabilities.tsx new file mode 100644 index 0000000..f55e28c --- /dev/null +++ b/apps/docs/components/home/native-capabilities.tsx @@ -0,0 +1,128 @@ +import Link from 'next/link'; +import { + ArrowRight, + BellRing, + ChevronRight, + Command, + FilePlus2, + FolderOpen, + SlidersHorizontal, + Wifi, +} from 'lucide-react'; + +const capabilities = [ + ['Menus', 'Application and context menus'], + ['System tray', 'Tray icons and menu events'], + ['Notifications', 'Native desktop alerts'], + ['More', 'Dialogs, cookies, contexts, protocols'], +]; + +export function NativeCapabilities() { + return ( +
    +
    +
    +
    +
    + ◈   PROJECTS + + +
    +
    +
    +
    +
    + + + + +
    +
    +
    +

    Project overview

    +
    + Desktop, connected. +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + Workspace updated + Your project is ready to open. + + now +
    + + + +
    +

    Beyond the webview

    +

    The desktop around your app.

    +

    + Add native menus, notifications, and tray icons alongside the web content. The API also covers dialogs, + browser contexts, cookies, custom protocols, and window controls. +

    +
    + {capabilities.map(([name, description]) => ( +
    + {name} + {description} +
    + ))} +
    + + Explore the API
    +
    +
    + ); +} diff --git a/apps/docs/components/home/product-window.tsx b/apps/docs/components/home/product-window.tsx new file mode 100644 index 0000000..0c466f0 --- /dev/null +++ b/apps/docs/components/home/product-window.tsx @@ -0,0 +1,124 @@ +import { Activity, Command, FileCode2, FolderClosed, LayoutGrid, Search, Settings2 } from 'lucide-react'; + +export function ProductWindow() { + return ( +
    +
    +
    + + + + +
    + +
    + + +
    +
    + + Workspace / Projects + + M +
    +
    +

    MONDAY, OCTOBER 01

    +

    A window into your work.

    +

    + A web interface, hosted in a window provided by the operating system. +

    +
    + +
    + RECENT PROJECTS + Open project +
    +
    + + webview-site + + apps/docs +
    +
    + + native-shell + + src/main.ts +
    +
    +
    +
    + +
    +
    + + src/main.ts + + TypeScript +
    +
    +          
    +            
    +              1
    +              const app = new{' '}
    +              Application();
    +            
    +            
    +              2
    +              const window = app.createBrowserWindow({'{'}
    +            
    +            
    +              3 title: 'My App',
    +            
    +            
    +              4
    +              {'}'});
    +            
    +            
    +              5window.createWebview({'{'}
    +            
    +            
    +              6 url:{' '}
    +              'https://example.com',
    +            
    +            
    +              7
    +              {'}'});
    +            
    +          
    +        
    +
    + + Native window · system webview +
    +
    +
    + ); +} diff --git a/apps/docs/components/home/runtime-bridge.tsx b/apps/docs/components/home/runtime-bridge.tsx new file mode 100644 index 0000000..a31f793 --- /dev/null +++ b/apps/docs/components/home/runtime-bridge.tsx @@ -0,0 +1,72 @@ +import { Layers2 } from 'lucide-react'; + +const runtimes = [ + { name: 'Node.js', note: 'N-API runtime' }, + { name: 'Bun', note: 'N-API runtime' }, + { name: 'Deno', note: 'N-API runtime' }, +]; + +const platforms = [ + { name: 'Windows', engine: 'WebView2' }, + { name: 'macOS', engine: 'WebKit' }, + { name: 'Linux', engine: 'WebKitGTK' }, +]; + +export function RuntimeBridge() { + return ( +
    +
    +
    +
    +

    The runtime stays yours

    +

    JavaScript in. System webview underneath.

    +
    +

    + Use Node.js, Bun, or Deno while the desktop window and browser engine come from the host platform. +

    +
    + +
    +
    +

    Runtime

    +
    + {runtimes.map(({ name, note }) => ( +
    + {name} + {note} +
    + ))} +
    +
    + +
    + + WebviewJS + + Typed N-API + + Tao + Wry +
    + +
    +

    Platform webview

    +
    + {platforms.map(({ name, engine }) => ( +
    + {name} + {engine} +
    + ))} +
    +
    +
    +
    +
    + ); +} diff --git a/apps/docs/components/home/runtime-build-panel.tsx b/apps/docs/components/home/runtime-build-panel.tsx new file mode 100644 index 0000000..513cdb9 --- /dev/null +++ b/apps/docs/components/home/runtime-build-panel.tsx @@ -0,0 +1,93 @@ +'use client'; + +import { Check, Terminal } from 'lucide-react'; +import { useState } from 'react'; + +const runtimes = [ + { id: 'node', label: 'Node.js SEA', mechanism: 'Node.js SEA' }, + { id: 'bun', label: 'Bun', mechanism: 'Bun compile' }, + { id: 'deno', label: 'Deno', mechanism: 'Deno compile · bundle + self-extract' }, +] as const; + +type RuntimeId = (typeof runtimes)[number]['id']; + +export function RuntimeBuildPanel() { + const [runtime, setRuntime] = useState('node'); + const selected = runtimes.find((item) => item.id === runtime)!; + const command = runtime === 'node' ? 'webview build src/main.ts' : `webview build src/main.ts --runtime ${runtime}`; + + return ( +
    +
    + + +
    + {runtimes.map(({ id, label }) => ( + + ))} +
    +
    + +
    +
    +

    Command

    +
    + + {command} +
    + +
    +
    + Build plan + {selected.mechanism} +
    +
    + {[ + 'Prepare application code', + 'Embed the matching WebviewJS native addon', + `Compile with ${selected.mechanism}`, + ].map((step, index) => ( +
    + 0{index + 1} + {step} +
    + ))} +
    +
    +
    + +
    +
    +
    +

    + The target machine does not need a separate runtime installation. +

    +
    + Default output directory + ./dist +
    +

    + The desktop platform still provides its webview. Runtime targets and native addon support vary. +

    +
    +
    +
    + ); +} diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx deleted file mode 100644 index de06fc6..0000000 --- a/apps/docs/content/docs/index.mdx +++ /dev/null @@ -1,477 +0,0 @@ ---- -title: WebviewJS -description: 'Build lightweight native desktop applications with JavaScript and the webview engine already provided by the operating system.' ---- - -Robust cross-platform webview library for Node.js written in Rust. It is a native binding to [tao](https://github.com/tauri-apps/tao) and [wry](https://github.com/tauri-apps/wry) allowing you to easily manage cross platform windowing and webview. - -## Highlights - -- Promise-based application readiness with optional automatic event pumping. -- Non-blocking application pumping, so ordinary Node timers and I/O continue running. -- Browser windows, menus, dialogs, cookies, DevTools, and window controls. -- Typed EventEmitter APIs for applications, windows, webviews, and system tray icons. -- Shared browser contexts for profile, cookie, cache, and storage isolation. -- Cross-platform system tray icons with menus and runtime updates. -- Native desktop notifications with a browser-familiar API. -- Native Windows, macOS, X11, Wayland, iOS, and Android window extensions. -- IPC through `window.ipc.postMessage()`, with an optional alias such as `window.bindings`. -- Fetch-compatible asynchronous custom protocols, including Hono routing without an HTTP server. -- Promise-based `webview.expose()` namespaces for page-to-Node calls. - -![WebviewJS preview](/preview.png) - -> [!NOTE] -> This library is meant to be a lightweight system webview binding for JavaScript. It does not aim to be a full-featured framework like Electron or Tauri. Please report any issues you find, and consider contributing to the project if you need additional features. - -See the [full documentation](./) for API references, guides, platform -notes, and runnable examples. Documentation tools can use [llms.txt](https://webview.js.org/llms.txt), [llms-full.txt](https://webview.js.org/llms-full.txt), and per-page Markdown such as [the Application API](https://webview.js.org/api/application.md). - -## Documentation - -### Getting started - -| | | -| ---------------------------------------------- | ------------------------------- | -| [Installation](./getting-started/installation) | System requirements and setup | -| [Quick Start](./getting-started/quick-start) | Your first window in minutes | -| [Event Loop](./getting-started/event-loop) | How the non-blocking pump works | - -### API reference - -| | | -| ------------------------------------- | ------------------------------------------------------ | -| [Application](./api/application) | Root object — event loop, windows, menus | -| [BrowserWindow](./api/browser-window) | OS window, size, position, cursor, decorations | -| [Webview](./api/webview) | Embedded browser — navigation, cookies, script, bounds | -| [WebContext](./api/web-context) | Shared browser data, profiles, and automation | -| [System Tray](./api/tray) | Tray icons, menus, updates, and pointer events | -| [Notification](./api/notification) | Native desktop notifications and lifecycle events | -| [Menu](./api/menu) | Native menu bar construction | -| [Types](./api/types) | Shared interfaces and enums | - -### Guides - -| | | -| ----------------------------------------------------- | ----------------------------------------------- | -| [Building Executables](./guides/building-executables) | Compile to `.exe` / binary with node, deno, bun | -| [IPC Messaging](./guides/ipc-messaging) | Page ↔ Node communication | -| [Menus](./guides/menus) | Building menu bars with roles and accelerators | -| [Multiple Windows](./guides/multiple-windows) | Managing several windows | -| [Cookies & Storage](./guides/cookies-and-storage) | Reading, writing, and clearing cookies | -| [Custom Protocols](./guides/custom-protocols) | Serving local content to the webview | - -### Platform notes - -| | | -| ----------------------------- | ----------------------------------------- | -| [Windows](./platform/windows) | WebView2, taskbar, DPI | -| [macOS](./platform/macos) | WebKit, main-thread requirement, app menu | -| [Linux](./platform/linux) | WebKitGTK, Wayland/X11, menu limitations | -| [iOS](./platform/ios) | Orientation, status bar, and gestures | -| [Android](./platform/android) | Content rectangle and configuration | - -## Installation - -```bash -npm install @webviewjs/webview -``` - -## Supported platforms - -| Platform | OS | Arch | Supported | -| ----------------------------- | ------- | ----- | ----------------- | -| x86_64-pc-windows-msvc | Windows | x64 | ✅ | -| i686-pc-windows-msvc | Windows | x86 | ✅ | -| aarch64-pc-windows-msvc | Windows | arm64 | ✅ | -| x86_64-apple-darwin | macOS | x64 | ✅ | -| aarch64-apple-darwin | macOS | arm64 | ✅ | -| x86_64-unknown-linux-gnu | Linux | x64 | ✅ | -| aarch64-unknown-linux-gnu | Linux | arm64 | ✅ | -| armv7-unknown-linux-gnueabihf | Linux | armv7 | ✅ | -| i686-unknown-linux-gnu | Linux | x86 | ✅ | -| aarch64-linux-android | Android | arm64 | ⚠️ (experimental) | -| armv7-linux-androideabi | Android | armv7 | ⚠️ (experimental) | -| x86_64-unknown-freebsd | FreeBSD | x64 | ⚠️ (no CI) | - -## Examples - -### Load external url - -```js -import { Application } from '@webviewjs/webview'; -// or -const { Application } = require('@webviewjs/webview'); - -const app = new Application(); -let mainWindow = null; -let mainWebview = null; - -app.whenReady().then(() => { - mainWindow = app.createBrowserWindow(); - mainWebview = mainWindow.createWebview({ url: 'https://nodejs.org' }); -}); -``` - -### Event pumping - -`app.whenReady()` starts the non-blocking event pump by default: - -```js -await app.whenReady({ interval: 16, ref: true }); -``` - -For manual startup, disable auto-run: - -```js -const ready = app.whenReady({ autoRun: false }); -app.run({ interval: 16, ref: true }); -await ready; -``` - -`interval` defaults to `16` milliseconds and `ref` defaults to `true`. Use `app.pumpEvents()` for manual pumping. - -### System tray - -Keep a strong JavaScript reference when you need to call tray methods or keep -its listeners reachable: - -```js -let tray = null; - -app.whenReady().then(() => { - tray = app.createTrayIcon({ - id: 'main', - icon: { data: rgba, width: 16, height: 16 }, - tooltip: 'My application', - menu: { items: [{ id: 'quit', label: 'Quit' }] }, - }); - - tray.on('click', (event) => console.log(event)); -}); -``` - -See the [system tray reference](./api/tray) and -[runnable tray example](https://github.com/webviewjs/webview/blob/main/apps/examples/tray.mjs). - -### Notifications - -```js -import { Notification } from '@webviewjs/webview'; - -const notification = new Notification('Build complete', { - body: 'The release executable is ready.', -}); - -notification.on('click', () => console.log('notification clicked')); -notification.on('error', ({ error }) => console.error(error)); -``` - -Notification permission is always `"granted"` for native applications. See the -[notification reference](./api/notification) and -[runnable notification example](https://github.com/webviewjs/webview/blob/main/apps/examples/notification.mjs). - -### IPC and exposed functions - -The webview page can send messages to Node through `window.ipc.postMessage()`: - -```js -const webview = window.createWebview({ ipcName: 'bindings' }); -webview.onIpcMessage((message) => console.log(message.body.toString())); -``` - -`ipcName` adds an alias, so the page can use `window.bindings.postMessage(...)`; `window.ipc` remains available. - -For typed request/response style calls, expose a namespace: - -```js -webview.expose('native', { - version: '0.1.4', - readConfig: async () => JSON.parse(await readFile('./config.json', 'utf8')), -}); -``` - -In the page: - -```js -console.log(window.native.version); -const config = await window.native.readConfig(); -``` - -Every exposed function returns a Promise in the page. Values, arguments, and results must be JSON-serializable. Violations use `SerializationError`. - -### Asynchronous custom protocols - -Register a protocol before creating its webview: - -```js -window.registerProtocol('app', async (request) => { - const filePath = join(process.cwd(), 'dist', new URL(request.url).pathname); - try { - return new Response(await readFile(filePath), { - headers: { 'Content-Type': 'text/html; charset=utf-8' }, - }); - } catch { - return new Response('Not found', { - status: 404, - headers: { 'Content-Type': 'text/plain; charset=utf-8' }, - }); - } -}); - -window.createWebview({ url: 'app://localhost/index.html' }); -``` - -See [Custom Protocols](/guides/custom-protocols), [IPC](/guides/ipc-messaging), and the runnable [custom protocol](https://github.com/webviewjs/webview/blob/main/apps/examples/custom-protocol.mjs) and [expose](https://github.com/webviewjs/webview/blob/main/apps/examples/expose.mjs) examples. - -### Menu System - -WebviewJS provides a cross-platform menu system that works on macOS, Windows, and Linux. - -#### Basic Menu Setup - -```js -import { Application } from '@webviewjs/webview'; - -const app = new Application(); - -// Set global application menu -app.setMenu({ - items: [ - { - label: 'File', - submenu: { - items: [ - { id: 'new', label: 'New', accelerator: 'CmdOrCtrl+N' }, - { id: 'open', label: 'Open', accelerator: 'CmdOrCtrl+O' }, - { role: 'separator' }, - { id: 'quit', label: 'Quit', accelerator: 'CmdOrCtrl+Q' }, - ], - }, - }, - { - label: 'Edit', - submenu: { - items: [{ role: 'copy' }, { role: 'paste' }, { role: 'cut' }, { role: 'selectall' }], - }, - }, - ], -}); - -const window = app.createBrowserWindow(); -const webview = window.createWebview({ url: 'https://nodejs.org' }); - -app.run(); -``` - -#### Menu Event Handling - -```js -import { Application } from '@webviewjs/webview'; - -const app = new Application(); - -// Handle menu events -app.on('custom-menu-click', ({ customMenuEvent: menuEvent }) => { - console.log(`Menu item clicked: ${menuEvent.id}`); - console.log(`From window: ${menuEvent.windowId}`); - - // Handle specific menu items - switch (menuEvent.id) { - case 'new': - console.log('Creating new document...'); - break; - case 'open': - console.log('Opening file...'); - break; - case 'quit': - app.exit(); - break; - } -}); - -// Set up menu... -app.setMenu({/* ... */}); -``` - -#### Window-Specific Menus - -```js -const app = new Application(); - -// Create window with custom menu -const window = app.createBrowserWindow({ - title: 'Custom Window', - menu: { - items: [ - { - id: 'window-action', - label: 'Window Action', - accelerator: 'Ctrl+W', - }, - ], - }, -}); - -// Or check if window has a menu -if (window.hasMenu()) { - console.log('This window has a menu'); -} -``` - -#### Menu Item Options - -- **`id`**: Unique identifier for the menu item (used in events) -- **`label`**: Display text for the menu item -- **`enabled`**: Whether the item is clickable (default: true) -- **`accelerator`**: Keyboard shortcut (e.g., "CmdOrCtrl+N", "Alt+F4") -- **`submenu`**: Nested menu items -- **`role`**: Predefined menu items with built-in behavior - -#### Predefined Menu Roles - -- **`"copy"`**: Standard copy action -- **`"paste"`**: Standard paste action -- **`"cut"`**: Standard cut action -- **`"selectall"`**: Select all text action -- **`"separator"`**: Visual separator line - -### IPC - -```js -const app = new Application(); -const window = app.createBrowserWindow(); - -const webview = window.createWebview({ - html: ` - - - Webview - - -

    Hello world!

    - - - - - `, - preload: `window.onIpcMessage = function(data) { - const output = document.getElementById('output'); - output.innerText = \`Server Sent A Message: \${data}\`; - }`, -}); - -if (!webview.isDevtoolsOpen()) webview.openDevtools(); - -webview.onIpcMessage((data) => { - const reply = `You sent ${data.body.toString('utf-8')}`; - webview.evaluateScript(`onIpcMessage("${reply}")`); -}); - -app.run(); -``` - -### Closing the Application - -You can close the application, windows, and webviews gracefully to ensure all resources (including temporary folders) are cleaned up properly. - -```js -const app = new Application(); -const window = app.createBrowserWindow(); -const webview = window.createWebview({ url: 'https://nodejs.org' }); - -app.on('application-close-requested', () => { - console.log('Application is closing, cleaning up resources...'); -}); - -app.on('window-close-requested', () => { - console.log('Window close requested'); -}); - -// Close the application gracefully (cleans up temp folders) -app.exit(); - -// Or hide/show the window -window.hide(); // Hide the window -window.show(); // Show the window again - -// Or reload the webview -webview.reload(); -``` - -For more details on closing applications and cleaning up resources, see the [Application API](./api/application#exit). - -### Keep strong references - -Retain `BrowserWindow`, `Webview`, `WebContext`, and `TrayIcon` wrappers for as -long as you need to call their methods or retain their JavaScript listeners. -Avoid discarded temporary handles: - -```js -const windows = []; - -app.whenReady().then(() => { - const window = app.createBrowserWindow(); - const webview = window.createWebview({ url: 'https://example.com' }); - windows.push({ window, webview }); -}); -``` - -The root `Application` owns native resources created through it. `app.exit()`, -`app[Symbol.dispose]()`, and application garbage collection dispose those -resources in shutdown order. Retained wrappers then report `isDisposed() === -true`, and method calls fail with a disposed error. Individual windows, -webviews, contexts, and tray icons also support `dispose()` and -`Symbol.dispose`. - -Check out [examples](https://github.com/webviewjs/webview/tree/main/apps/examples) directory for more examples: - -- **[menu-system.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features -- **[window-menus.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/window-menus.mjs)** - Window-specific vs global menu examples -- **[http/](https://github.com/webviewjs/webview/blob/main/apps/examples/http/)** - Serving content from a web server to webview -- **[transparent.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/transparent.mjs)** - Transparent window example -- **[close-example.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/close-example.mjs)** - Graceful application closing - -After building the package, run an example with: `node apps/examples/menu-system.mjs` - -## Building executables - -Build a standalone executable with Node.js by default, or select Bun or Deno: - -```bash -npx webview build src/main.ts -npx webview build src/main.ts --runtime bun -npx webview build src/main.ts --runtime deno -``` - -Node SEA embeds WebviewJS's native addon and is host-only. Bun and Deno need -the matching target addon for the executable target; cross-target output is -runtime-specific and only the current host builds have integration smoke tests. - -For runtime details, target requirements, and asset handling, see -[Building Executables](./guides/building-executables). - -## Development - -### Prerequisites - -- [Bun](https://bun.sh/) 1.3.14 -- [Rust](https://www.rust-lang.org/) stable toolchain -- [Node.js](https://nodejs.org/) >= 24 (for testing) - -### Setup - -```bash -bun install -``` - -### Build - -```bash -bun --filter @webviewjs/webview build -node apps/examples/simple.mjs -``` diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json index 857cc84..dfe7772 100644 --- a/apps/docs/content/docs/meta.json +++ b/apps/docs/content/docs/meta.json @@ -1,4 +1,4 @@ { "title": "WebviewJS", - "pages": ["index", "getting-started", "api", "guides", "platform"] + "pages": ["getting-started", "api", "guides", "platform"] } diff --git a/apps/docs/lib/layout.shared.tsx b/apps/docs/lib/layout.shared.tsx index 88b9ca8..d7143a5 100644 --- a/apps/docs/lib/layout.shared.tsx +++ b/apps/docs/lib/layout.shared.tsx @@ -1,12 +1,28 @@ import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; +import { PanelsTopLeft } from 'lucide-react'; import { appName, gitConfig } from './shared'; export function baseOptions(): BaseLayoutProps { return { nav: { - // JSX supported - title: appName, + title: ( + + + {appName} + + ), }, + links: [ + { text: 'Docs', url: '/getting-started/quick-start' }, + { text: 'API', url: '/api/application' }, + { + text: 'Examples', + url: `https://github.com/${gitConfig.user}/${gitConfig.repo}/tree/${gitConfig.branch}/apps/examples`, + external: true, + }, + ], githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`, }; } diff --git a/packages/webview/README.md b/packages/webview/README.md index aeee947..5de21c3 100644 --- a/packages/webview/README.md +++ b/packages/webview/README.md @@ -487,12 +487,10 @@ Check out [examples](https://github.com/webviewjs/webview/tree/main/apps/example - **[menu-system.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/menu-system.mjs)** - Comprehensive menu system demonstration with all features - **[window-menus.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/window-menus.mjs)** - Window-specific vs global menu examples -- **[http/](https://github.com/webviewjs/webview/tree/main/apps/examples)** - Serving content from a web server to webview +- **[http/](https://github.com/webviewjs/webview/tree/main/apps/examples/http)** - Serving content from a web server to webview - **[transparent.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/transparent.mjs)** - Transparent window example - **[close-example.mjs](https://github.com/webviewjs/webview/blob/main/apps/examples/close-example.mjs)** - Graceful application closing -Run an example after building the package with: `node apps/examples/menu-system.mjs`. - ## Building executables Build a standalone executable with Node.js by default, or choose Bun or Deno: @@ -529,50 +527,3 @@ npx skills add webviewjs/webview It covers application structure, native prerequisites, platform constraints, API patterns, and executable builds. - -## Development - -The published library is in `packages/webview`, runnable examples are in -`apps/examples`, and the documentation website is in `apps/docs`. - -### Prerequisites - -- [Bun](https://bun.sh/) 1.3.14 -- [Rust](https://www.rust-lang.org/) stable toolchain -- [Node.js](https://nodejs.org/) >= 24 (for testing) - -### Setup - -```bash -bun install -``` - -### Build and run an example - -```bash -bun --filter @webviewjs/webview build -node apps/examples/simple.mjs -``` - -The native build requires the platform's Rust and GUI development dependencies. -To build only the TypeScript layer, run `bun --filter @webviewjs/webview build:lib`. - -### Repository commands - -```bash -bun run dev # Start the documentation app -bun run build # Build the native package and static docs -bun run test # Run Node's built-in test runner -bun run lint # Run Oxlint across the repository -bun run lint:fix -bun run format # Format JS/TS/MD and Rust source -bun run format:check -bun run check # Cargo check and docs type check -bun run clippy -``` - -The docs workspace can also be run on its own with `bun --filter @webviewjs/docs dev` or built with `bun --filter @webviewjs/docs build`. - -``` - -``` From 47dc5142f74ef4fb5845016c492e4b07519060a4 Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Fri, 2 Oct 2026 00:53:16 +0545 Subject: [PATCH 06/15] feat: redesign docs homepage and add create-webview package - Replace the homepage visuals with a dark, native-focused layout - Add the initial create-webview package scaffold --- apps/docs/app/(home)/page.tsx | 29 +- apps/docs/app/global.css | 219 +++-- apps/docs/app/icon.jpg | Bin 0 -> 35817 bytes apps/docs/app/icon.svg | 5 - .../docs/components/home/capability-bento.tsx | 169 ---- apps/docs/components/home/code-editor.tsx | 91 ++ apps/docs/components/home/code-showcase.tsx | 128 --- .../docs/components/home/copy-code-button.tsx | 42 - apps/docs/components/home/docs-links.tsx | 82 -- .../components/home/executable-builder.tsx | 31 - apps/docs/components/home/executable.tsx | 115 +++ apps/docs/components/home/footer.tsx | 59 +- apps/docs/components/home/hero.tsx | 86 +- .../components/home/home-visuals.module.css | 830 ------------------ apps/docs/components/home/install-command.tsx | 31 +- .../components/home/javascript-native.tsx | 106 +++ .../components/home/native-capabilities.tsx | 128 --- apps/docs/components/home/native-window.tsx | 84 ++ apps/docs/components/home/product-window.tsx | 124 --- apps/docs/components/home/runtime-bridge.tsx | 72 -- .../components/home/runtime-build-panel.tsx | 93 -- apps/docs/components/home/system-webview.tsx | 79 ++ apps/docs/components/home/webview-logo.tsx | 16 + apps/docs/lib/layout.shared.tsx | 6 +- packages/create-webview/package.json | 7 + packages/create-webview/src/index.js | 1 + 26 files changed, 709 insertions(+), 1924 deletions(-) create mode 100644 apps/docs/app/icon.jpg delete mode 100644 apps/docs/app/icon.svg delete mode 100644 apps/docs/components/home/capability-bento.tsx create mode 100644 apps/docs/components/home/code-editor.tsx delete mode 100644 apps/docs/components/home/code-showcase.tsx delete mode 100644 apps/docs/components/home/copy-code-button.tsx delete mode 100644 apps/docs/components/home/docs-links.tsx delete mode 100644 apps/docs/components/home/executable-builder.tsx create mode 100644 apps/docs/components/home/executable.tsx delete mode 100644 apps/docs/components/home/home-visuals.module.css create mode 100644 apps/docs/components/home/javascript-native.tsx delete mode 100644 apps/docs/components/home/native-capabilities.tsx create mode 100644 apps/docs/components/home/native-window.tsx delete mode 100644 apps/docs/components/home/product-window.tsx delete mode 100644 apps/docs/components/home/runtime-bridge.tsx delete mode 100644 apps/docs/components/home/runtime-build-panel.tsx create mode 100644 apps/docs/components/home/system-webview.tsx create mode 100644 apps/docs/components/home/webview-logo.tsx create mode 100644 packages/create-webview/package.json create mode 100644 packages/create-webview/src/index.js diff --git a/apps/docs/app/(home)/page.tsx b/apps/docs/app/(home)/page.tsx index 4edcee4..1665a8e 100644 --- a/apps/docs/app/(home)/page.tsx +++ b/apps/docs/app/(home)/page.tsx @@ -1,17 +1,13 @@ import type { Metadata } from 'next'; -import styles from '@/components/home/home-visuals.module.css'; -import { CapabilityBento } from '@/components/home/capability-bento'; -import { CodeShowcase } from '@/components/home/code-showcase'; -import { DocsLinks } from '@/components/home/docs-links'; -import { ExecutableBuilder } from '@/components/home/executable-builder'; +import { Executable } from '@/components/home/executable'; import { Footer } from '@/components/home/footer'; import { Hero } from '@/components/home/hero'; -import { NativeCapabilities } from '@/components/home/native-capabilities'; -import { RuntimeBridge } from '@/components/home/runtime-bridge'; +import { JavaScriptNative } from '@/components/home/javascript-native'; +import { SystemWebview } from '@/components/home/system-webview'; -const title = 'WebviewJS | Native webviews for JavaScript'; +const title = 'WebviewJS | Native webviews. JavaScript.'; const description = - 'Create desktop applications with JavaScript or TypeScript using Node.js, Bun, or Deno and the native webview provided by Windows, macOS, and Linux.'; + 'Create native desktop windows from JavaScript using the webview already provided by the operating system.'; export const metadata: Metadata = { title: { absolute: title }, @@ -22,27 +18,22 @@ export const metadata: Metadata = { url: '/', siteName: 'WebviewJS', type: 'website', - images: [{ url: '/preview.png', alt: 'A WebviewJS native window showing a web application.' }], }, twitter: { card: 'summary_large_image', title, description, - images: ['/preview.png'], }, }; export default function Page() { return ( -
    +
    - - - - - - + + +
    -
    + ); } diff --git a/apps/docs/app/global.css b/apps/docs/app/global.css index 08afc43..917d53c 100644 --- a/apps/docs/app/global.css +++ b/apps/docs/app/global.css @@ -4,45 +4,67 @@ html { scrollbar-gutter: stable; + scrollbar-width: thin; + scrollbar-color: rgb(120 120 120 / 0.55) transparent; +} + +* { + scrollbar-width: thin; + scrollbar-color: rgb(120 120 120 / 0.55) transparent; +} + +*::-webkit-scrollbar { + width: 3px; + height: 3px; +} + +*::-webkit-scrollbar-track { + background: transparent; +} + +*::-webkit-scrollbar-thumb { + border-radius: 4px; + background: rgb(120 120 120 / 0.55); +} + +html:has(.home-layout) { + background: #030303; + scrollbar-color: rgb(245 245 245 / 0.22) transparent; +} + +.home-layout * { + scrollbar-color: rgb(245 245 245 / 0.22) transparent; +} + +.home-layout *::-webkit-scrollbar-thumb { + background: rgb(245 245 245 / 0.22); } html > body[data-scroll-locked] { - margin-right: 0px !important; + margin-right: 0 !important; --removed-body-scroll-bar-size: 0px !important; } .home-layout { - --fd-layout-width: 1480px; - --wjs-bg: #f3f4f1; - --wjs-bg-soft: #eceeeb; - --wjs-surface: #fafbf9; - --wjs-surface-raised: #ffffff; - --wjs-border: rgb(20 32 37 / 0.09); - --wjs-border-strong: rgb(20 32 37 / 0.15); - --wjs-text: #151b1d; - --wjs-muted: #586367; - --wjs-subtle: #7e898c; - --wjs-accent: #087f91; - --wjs-accent-soft: rgb(8 127 145 / 0.08); - --wjs-accent-border: rgb(8 127 145 / 0.22); + --fd-layout-width: 1500px; + --wjs-black: #030303; + --wjs-black-soft: #070707; + --wjs-surface: #0b0b0c; + --wjs-surface-raised: #101011; + --wjs-white: #f5f5f5; + --wjs-muted: #949494; + --wjs-dim: #5c5c5c; + --wjs-red: #c8152f; + --wjs-red-bright: #ff2347; + --wjs-red-deep: #730b1c; min-height: 100vh; - color: var(--wjs-text); - background: var(--wjs-bg); + color: var(--wjs-white); + color-scheme: dark; + background: var(--wjs-black); } -.dark .home-layout { - --wjs-bg: #0b0e10; - --wjs-bg-soft: #0e1214; - --wjs-surface: #101518; - --wjs-surface-raised: #151a1d; - --wjs-border: rgb(230 242 245 / 0.075); - --wjs-border-strong: rgb(230 242 245 / 0.13); - --wjs-text: #eef3f4; - --wjs-muted: #a5b0b4; - --wjs-subtle: #778388; - --wjs-accent: #83dce8; - --wjs-accent-soft: rgb(131 220 232 / 0.085); - --wjs-accent-border: rgb(131 220 232 / 0.24); +body:has(.home-layout) { + background: #030303; } #nd-home-layout #nd-nav { @@ -50,132 +72,109 @@ html > body[data-scroll-locked] { } #nd-home-layout #nd-nav > nav, -#nd-home-layout #nd-nav > nav > div { +#nd-home-layout #nd-nav > nav > div:first-child { height: 72px; } +#nd-home-layout #nd-nav[data-open], +#nd-home-layout #nd-nav[data-open] > nav { + height: auto; +} + #nd-home-layout #nd-nav > nav { - color: var(--wjs-text); - background: color-mix(in srgb, var(--wjs-bg) 84%, transparent); - border-color: var(--wjs-border); + border-color: rgb(255 255 255 / 0.09); + color: #f5f5f5; + background: rgb(3 3 3 / 0.88); backdrop-filter: blur(14px); } #nd-home-layout #nd-nav > nav > div { - padding-inline: clamp(20px, 4vw, 56px); + padding-inline: clamp(20px, 4vw, 64px); } #nd-home-layout #nd-nav ul:first-of-type { - gap: 6px; - padding-inline: 28px; + gap: 4px; + padding-inline: 30px; } #nd-home-layout #nd-nav ul:first-of-type a { padding-inline: 12px; - font-size: 14px; - color: var(--wjs-muted); + color: rgb(245 245 245 / 0.55); + font-size: 13px; } #nd-home-layout #nd-nav ul:first-of-type a:hover, #nd-home-layout #nd-nav ul:first-of-type a[data-active='true'] { - color: var(--wjs-text); + color: #f5f5f5; } #nd-home-layout #nd-nav button[data-search-full] { - max-width: 268px; - border-radius: 8px; - border-color: var(--wjs-border); - background: var(--wjs-surface); - color: var(--wjs-muted); - box-shadow: 0 1px 2px rgb(0 0 0 / 0.04); -} - -.wjs-wordmark { - display: inline-flex; - align-items: center; - gap: 10px; - font-size: 15px; - font-weight: 650; - letter-spacing: -0.035em; - color: var(--wjs-text); + max-width: 260px; + border-color: rgb(255 255 255 / 0.12); + border-radius: 5px; + color: rgb(245 245 245 / 0.48); + background: #0b0b0c; + box-shadow: none; } -.wjs-wordmark-glyph { - display: grid; - width: 25px; - height: 25px; - place-items: center; - border: 1px solid var(--wjs-accent-border); - border-radius: 7px; - color: var(--wjs-accent); - background: var(--wjs-accent-soft); +#nd-home-layout #nd-nav button[data-search-full] kbd { + border-color: rgb(255 255 255 / 0.12); + color: rgb(245 245 245 / 0.48); + background: #101011; } -.wjs-wordmark-glyph svg { - width: 14px; - height: 14px; - stroke-width: 1.8; +#nd-home-layout #nd-nav [data-theme-toggle] { + display: none; } -.webview-home { - overflow: hidden; - color: var(--wjs-text); - background: var(--wjs-bg); +#nd-home-layout #nd-nav [data-open] > div > [role='separator'] { + display: none; } -.wjs-container { - width: min(calc(100% - clamp(40px, 8vw, 112px)), 1360px); - margin-inline: auto; +#nd-home-layout #nd-nav button:not([data-theme-toggle]):hover { + color: #f5f5f5; + background-color: rgb(245 245 245 / 0.08); } -.wjs-section { - padding-block: clamp(84px, 10vw, 152px); +#nd-home-layout #nd-nav [data-open] > div > a { + color: rgb(245 245 245 / 0.72); } -.wjs-eyebrow { - color: var(--wjs-subtle); - font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace); - font-size: 11px; - font-weight: 600; - letter-spacing: 0.15em; - line-height: 1.4; - text-transform: uppercase; +#nd-home-layout #nd-nav [data-open] > div > a:hover { + color: #f5f5f5; + background: rgb(245 245 245 / 0.06); } -.wjs-section-title { - color: var(--wjs-text); - font-size: clamp(2.2rem, 3.8vw, 3.5rem); - font-weight: 560; - letter-spacing: -0.055em; - line-height: 1.03; - text-wrap: balance; -} - -.wjs-copy { - color: var(--wjs-muted); - font-size: 16px; - line-height: 1.75; +#nd-home-layout #nd-nav button[data-search-full]:focus-visible, +.home-layout :is(a, button):focus-visible { + outline: 2px solid #ff2347; + outline-offset: 3px; } -.wjs-panel { - border: 1px solid var(--wjs-border); - border-radius: 16px; - background: var(--wjs-surface); - box-shadow: - 0 16px 44px rgb(0 0 0 / 0.08), - inset 0 1px 0 rgb(255 255 255 / 0.025); +.wjs-wordmark { + display: inline-flex; + align-items: center; + gap: 10px; + color: inherit; + font-size: 15px; + font-weight: 650; + letter-spacing: -0.035em; } -.home-layout :is(a, button):focus-visible { - outline: 2px solid var(--wjs-accent); - outline-offset: 3px; +.wjs-wordmark img { + flex: none; } @media (max-width: 767px) { #nd-home-layout #nd-nav, #nd-home-layout #nd-nav > nav, - #nd-home-layout #nd-nav > nav > div { - height: 62px; + #nd-home-layout #nd-nav > nav > div:first-child { + height: 64px; + } + + #nd-home-layout #nd-nav[data-open], + #nd-home-layout #nd-nav[data-open] > nav { + height: auto; } #nd-home-layout #nd-nav > nav > div { diff --git a/apps/docs/app/icon.jpg b/apps/docs/app/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44a2756603753b9899b3089e99cf88130c339374 GIT binary patch literal 35817 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 - - - - diff --git a/apps/docs/components/home/capability-bento.tsx b/apps/docs/components/home/capability-bento.tsx deleted file mode 100644 index 4f16bbb..0000000 --- a/apps/docs/components/home/capability-bento.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import { Bell, Braces, Code2, Ellipsis, Globe2, LayoutGrid, MessageSquare, PanelTop, Settings2 } from 'lucide-react'; - -const apiTypes = ['Application', 'BrowserWindow', 'Webview', 'WebContext', 'TrayIcon', 'Notification']; - -const engines = [ - { platform: 'Windows', engine: 'WebView2' }, - { platform: 'macOS', engine: 'WebKit' }, - { platform: 'Linux', engine: 'WebKitGTK' }, -]; - -export function CapabilityBento() { - return ( -
    -
    -
    -
    -

    Built around the host operating system

    -

    Native building blocks. JavaScript-shaped APIs.

    -
    -

    - Keep the UI in web technologies. Reach window, platform, and page capabilities through a typed native layer. -

    -
    - -
    -
    -
    -
    - - -

    The system webview

    -

    - Use the browser engine supplied by the operating system instead of bundling a separate browser. -

    -
    - - PLATFORM PROVIDED - -
    - -
    - {engines.map(({ platform, engine }) => ( -
    -
    -
    - - - -
    -
    -
    -

    {platform}

    -

    - {engine} -

    -
    - ))} -
    -
    - -
    -
    - - -
    -

    Typed native objects

    -

    - Keep windows, contexts, and app state in familiar JS objects. -

    -
    -
    -
    -
    -
    -
    - {apiTypes.map((type, index) => ( -
    - {String(index + 1).padStart(2, '0')} - {type} -
    - ))} -
    -
    -

    - Public runtime objects also expose familiar Node-style EventEmitter methods. -

    -
    - -
    -
    - - -
    -

    Page ↔ native IPC

    -

    - Send page messages to JavaScript, or expose callable host functions. -

    -
    -
    -
    -
    - page - window.ipc.postMessage(...) -
    -
    -
    - host - webview.expose(...) -
    -
    -
    - -
    -
    -
    - - -
    -

    Desktop primitives

    -

    - Add operating-system features around the web content you already build. -

    -
    -
    - -
    -
    - {[ - { label: 'Menus', icon:
    -
    -
    -
    -
    - ); -} diff --git a/apps/docs/components/home/code-editor.tsx b/apps/docs/components/home/code-editor.tsx new file mode 100644 index 0000000..55273c1 --- /dev/null +++ b/apps/docs/components/home/code-editor.tsx @@ -0,0 +1,91 @@ +export function CodeEditor() { + const lineClass = 'block whitespace-pre'; + const numberClass = 'mr-5 inline-block w-5 select-none text-right text-white/25'; + + return ( +
    +
    + +

    +dE<6X83NaQ< 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 z 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