@stacksjs/desktop 0.2.196 → 0.2.197
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +0 -2
- package/dist/index.js +0 -2
- package/dist/test-utils.js +0 -2
- package/package.json +1 -1
- package/dist/browser.js.map +0 -64
- package/dist/index.js.map +0 -72
- package/dist/test-utils.js.map +0 -10
package/dist/test-utils.js.map
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/test-utils.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Test utilities — install a mock `window.craft` namespace + capture\n * every call against it. Apps consuming this package can `import {\n * installMockBridge } from '@stacksjs/desktop/test-utils'` to hand\n * their unit tests the same harness this package uses internally.\n *\n * The mock auto-vivifies namespaces on access — `craft.fs.readFile`\n * works without pre-declaring `fs`. Methods return a Promise resolving\n * to whatever was queued via `whenCalled`, defaulting to `undefined`.\n *\n * Tests should follow the install / call / assert / uninstall cycle:\n * ```ts\n * import { installMockBridge, findCall } from '@stacksjs/desktop/test-utils'\n * import { fs } from '@stacksjs/desktop'\n *\n * const bridge = installMockBridge()\n * bridge.whenCalled('fs', 'readFile', { data: 'hello' })\n * expect(await fs.readFile('/x')).toBe('hello')\n * expect(findCall(bridge.calls, 'fs', 'readFile')!.args).toEqual(['/x'])\n * bridge.uninstall()\n * ```\n *\n * Polyfills `window.addEventListener` / `dispatchEvent` for runners\n * (very-happy-dom, jsdom older versions) that don't ship them by\n * default — facade tests rely on those for event-based facades.\n */\n\nensureWindowEventTarget()\n\nfunction ensureWindowEventTarget(): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.addEventListener === 'function' && typeof w.dispatchEvent === 'function') return\n\n const listeners = new Map<string, Set<EventListener>>()\n\n w.addEventListener = (name: string, cb: EventListener): void => {\n let set = listeners.get(name)\n if (!set) {\n set = new Set()\n listeners.set(name, set)\n }\n set.add(cb)\n }\n\n w.removeEventListener = (name: string, cb: EventListener): void => {\n listeners.get(name)?.delete(cb)\n }\n\n w.dispatchEvent = (event: Event): boolean => {\n const set = listeners.get(event.type)\n if (set) {\n for (const fn of set) {\n try { fn(event) } catch { /* swallow listener errors during tests */ }\n }\n }\n return true\n }\n}\n\nexport interface CapturedCall {\n ns: string\n method: string\n args: unknown[]\n}\n\nexport interface MockBridgeHandle {\n /** Calls captured since the bridge was installed. */\n calls: CapturedCall[]\n /**\n * Queue the response from `window.craft[ns][method]`. The mock\n * walks: explicit return → matched response handler → default.\n */\n whenCalled: (\n ns: string,\n method: string,\n response: unknown | ((...args: unknown[]) => unknown)\n ) => void\n /** Remove the mock and restore whatever was on window.craft before. */\n uninstall: () => void\n}\n\nexport function installMockBridge(initialNamespaces: string[] = []): MockBridgeHandle {\n const calls: CapturedCall[] = []\n const responses = new Map<string, unknown | ((...args: unknown[]) => unknown)>()\n\n // If the production bridge IIFE has already loaded — flagged via\n // `__craft_bridge_loaded` — treat the existing window.craft as\n // \"no real previous.\" Otherwise restoring it on uninstall would\n // leak the production facade into \"no bridge\" assertions in\n // subsequent tests.\n const previousRaw = (window as any).craft\n const previous = previousRaw && previousRaw.__craft_bridge_loaded ? undefined : previousRaw\n\n function makeMethod(ns: string, method: string) {\n return (...args: unknown[]) => {\n calls.push({ ns, method, args })\n const key = `${ns}:${method}`\n if (responses.has(key)) {\n const r = responses.get(key)\n const resolved = typeof r === 'function'\n ? (r as (...a: unknown[]) => unknown)(...args)\n : r\n return Promise.resolve(resolved)\n }\n return Promise.resolve(undefined)\n }\n }\n\n function makeNamespace(ns: string): Record<string, unknown> {\n return new Proxy({} as Record<string, unknown>, {\n get(_target, prop: string) {\n if (typeof prop !== 'string') return undefined\n // Some non-method properties may be read synchronously (e.g.\n // theme.get returns an object, not a promise). Allow callers\n // to register those by passing a zero-arg function — we\n // recognize the shape and return the value synchronously.\n if (responses.has(`${ns}:${prop}`)) {\n const r = responses.get(`${ns}:${prop}`)\n if (typeof r === 'function' && r.length === 0) {\n return () => {\n calls.push({ ns, method: prop, args: [] })\n return (r as () => unknown)()\n }\n }\n }\n return makeMethod(ns, prop)\n },\n })\n }\n\n const root = new Proxy({} as Record<string, unknown>, {\n get(_target, prop: string) {\n if (typeof prop !== 'string') return undefined\n return makeNamespace(prop)\n },\n has(_target, prop) {\n if (typeof prop !== 'string') return false\n if (initialNamespaces.length === 0) return true\n return initialNamespaces.includes(prop)\n },\n })\n\n ;(window as any).craft = root\n\n return {\n calls,\n whenCalled(ns, method, response) {\n responses.set(`${ns}:${method}`, response)\n },\n uninstall() {\n if (previous === undefined) {\n delete (window as any).craft\n }\n else {\n ;(window as any).craft = previous\n }\n },\n }\n}\n\n/** Helper — find the first captured call matching `ns` + `method`. */\nexport function findCall(\n calls: CapturedCall[],\n ns: string,\n method: string,\n): CapturedCall | undefined {\n return calls.find(c => c.ns === ns && c.method === method)\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "112673127C3680E664756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|