@noego/wood 0.7.1 → 0.7.2

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.
@@ -52,6 +52,9 @@ async function openHappyDomTab(inputs, bundle, route) {
52
52
  });
53
53
  Object.assign(window, {
54
54
  global: window,
55
+ // happy-dom's Window lacks the structuredClone global renderer code and
56
+ // the bridge client rely on; lend the host's implementation.
57
+ structuredClone: globalThis.structuredClone,
55
58
  __woodNativeRoute: intoWindow(route),
56
59
  __woodNativeInvoke: async (channel, payload) => {
57
60
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/testing/native_browser/happy_dom_tab.ts"],"sourcesContent":["import { installHappyDomFetch } from '@noego/testing/browser';\nimport { createHappyDomTransfer } from './happy_dom_transfer.js';\nimport type { NativeBrowserInputs, NativeBrowserTab, NativeRendererBundle, NativeRendererRoute } from './native_browser.types.js';\nimport { nativeHostTransport } from './host_transport.js';\nimport { disposeNativeResources, hostDeadline } from './native_browser_lifecycle.js';\n\nexport async function openHappyDomTab(\n inputs: NativeBrowserInputs, bundle: NativeRendererBundle, route: NativeRendererRoute,\n): Promise<NativeBrowserTab> {\n const { Window } = await import('happy-dom');\n const windowConfig = inputs.source.config.windows[route.page.split('.')[0]!];\n const window = new Window({\n url: `https://wood.test/${encodeURIComponent(route.page)}`,\n width: windowConfig?.width ?? 1024, height: windowConfig?.height ?? 768,\n settings: {enableJavaScriptEvaluation: true},\n });\n // The Window owns its VM, timers, DOM and storage. Never install it on Node\n // globalThis or replace Vitest's globals; simultaneous cases remain isolated.\n const networkHost = installHappyDomFetch(window, request => inputs.network.dispatch(request));\n const intoWindow = createHappyDomTransfer(window);\n const globals = window as unknown as Record<string, any>;\n const transport = nativeHostTransport(inputs, async (channel, payload) => {\n globals.__woodNativeEmit(channel, intoWindow(payload));\n });\n Object.assign(window, {\n global: window,\n __woodNativeRoute: intoWindow(route),\n __woodNativeInvoke: async (channel: string, payload: unknown) => {\n try { return intoWindow(await transport.invoke(channel, structuredClone(payload))); }\n catch (error) {\n const nativeError = new window.Error(error instanceof Error ? error.message : String(error));\n if (error instanceof Error) nativeError.name = error.name;\n throw nativeError;\n }\n },\n __woodNativeSubscribe: transport.subscribe,\n __woodNativeTrace: (payload: unknown) => transport.trace(structuredClone(payload)),\n __woodNativeLog: (payload: unknown) => transport.log(structuredClone(payload)),\n });\n let closing: Promise<void> | null = null;\n const dispose = () => closing ??= disposeNativeResources('Wood happy-dom window cleanup failed', [\n () => hostDeadline(Promise.resolve(globals.__woodNativeDispose?.()), 'renderer teardown'),\n () => transport.dispose(),\n () => hostDeadline(transport.flush(), 'event drain'),\n () => networkHost.dispose(),\n () => window.happyDOM.close(),\n ]);\n try {\n window.document.body.innerHTML = '<div id=\"app\"></div>';\n if (bundle.css) {\n const style = window.document.createElement('style');\n style.textContent = bundle.css;\n window.document.head.appendChild(style);\n }\n window.eval(bundle.code);\n await hostDeadline(Promise.resolve(globals.__woodNativeReady), 'initial mount');\n return {\n native: window,\n async flush() {\n await hostDeadline(networkHost.settle(), 'external fetch drain');\n await hostDeadline(Promise.resolve(globals.__woodNativeFlush()), 'renderer flush');\n await hostDeadline(transport.flush(), 'event flush');\n await globals.__woodNativeFlush();\n },\n dispose,\n };\n } catch (error) {\n await disposeNativeResources('Wood happy-dom open failed', [() => {throw error;}, dispose]);\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAqC;AACrC,gCAAuC;AAEvC,4BAAoC;AACpC,sCAAqD;AAErD,eAAsB,gBACpB,QAA6B,QAA8B,OAChC;AAC3B,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,WAAW;AAC3C,QAAM,eAAe,OAAO,OAAO,OAAO,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE;AAC3E,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,KAAK,qBAAqB,mBAAmB,MAAM,IAAI,CAAC;AAAA,IACxD,OAAO,cAAc,SAAS;AAAA,IAAM,QAAQ,cAAc,UAAU;AAAA,IACpE,UAAU,EAAC,4BAA4B,KAAI;AAAA,EAC7C,CAAC;AAGD,QAAM,kBAAc,qCAAqB,QAAQ,aAAW,OAAO,QAAQ,SAAS,OAAO,CAAC;AAC5F,QAAM,iBAAa,kDAAuB,MAAM;AAChD,QAAM,UAAU;AAChB,QAAM,gBAAY,2CAAoB,QAAQ,OAAO,SAAS,YAAY;AACxE,YAAQ,iBAAiB,SAAS,WAAW,OAAO,CAAC;AAAA,EACvD,CAAC;AACD,SAAO,OAAO,QAAQ;AAAA,IACpB,QAAQ;AAAA,IACR,mBAAmB,WAAW,KAAK;AAAA,IACnC,oBAAoB,OAAO,SAAiB,YAAqB;AAC/D,UAAI;AAAE,eAAO,WAAW,MAAM,UAAU,OAAO,SAAS,gBAAgB,OAAO,CAAC,CAAC;AAAA,MAAG,SAC7E,OAAO;AACZ,cAAM,cAAc,IAAI,OAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC3F,YAAI,iBAAiB,MAAO,aAAY,OAAO,MAAM;AACrD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,uBAAuB,UAAU;AAAA,IACjC,mBAAmB,CAAC,YAAqB,UAAU,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACjF,iBAAiB,CAAC,YAAqB,UAAU,IAAI,gBAAgB,OAAO,CAAC;AAAA,EAC/E,CAAC;AACD,MAAI,UAAgC;AACpC,QAAM,UAAU,MAAM,0BAAY,wDAAuB,wCAAwC;AAAA,IAC/F,UAAM,8CAAa,QAAQ,QAAQ,QAAQ,sBAAsB,CAAC,GAAG,mBAAmB;AAAA,IACxF,MAAM,UAAU,QAAQ;AAAA,IACxB,UAAM,8CAAa,UAAU,MAAM,GAAG,aAAa;AAAA,IACnD,MAAM,YAAY,QAAQ;AAAA,IAC1B,MAAM,OAAO,SAAS,MAAM;AAAA,EAC9B,CAAC;AACD,MAAI;AACF,WAAO,SAAS,KAAK,YAAY;AACjC,QAAI,OAAO,KAAK;AACd,YAAM,QAAQ,OAAO,SAAS,cAAc,OAAO;AACnD,YAAM,cAAc,OAAO;AAC3B,aAAO,SAAS,KAAK,YAAY,KAAK;AAAA,IACxC;AACA,WAAO,KAAK,OAAO,IAAI;AACvB,cAAM,8CAAa,QAAQ,QAAQ,QAAQ,iBAAiB,GAAG,eAAe;AAC9E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,QAAQ;AACZ,kBAAM,8CAAa,YAAY,OAAO,GAAG,sBAAsB;AAC/D,kBAAM,8CAAa,QAAQ,QAAQ,QAAQ,kBAAkB,CAAC,GAAG,gBAAgB;AACjF,kBAAM,8CAAa,UAAU,MAAM,GAAG,aAAa;AACnD,cAAM,QAAQ,kBAAkB;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,cAAM,wDAAuB,8BAA8B,CAAC,MAAM;AAAC,YAAM;AAAA,IAAM,GAAG,OAAO,CAAC;AAC1F,UAAM;AAAA,EACR;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/testing/native_browser/happy_dom_tab.ts"],"sourcesContent":["import { installHappyDomFetch } from '@noego/testing/browser';\nimport { createHappyDomTransfer } from './happy_dom_transfer.js';\nimport type { NativeBrowserInputs, NativeBrowserTab, NativeRendererBundle, NativeRendererRoute } from './native_browser.types.js';\nimport { nativeHostTransport } from './host_transport.js';\nimport { disposeNativeResources, hostDeadline } from './native_browser_lifecycle.js';\n\nexport async function openHappyDomTab(\n inputs: NativeBrowserInputs, bundle: NativeRendererBundle, route: NativeRendererRoute,\n): Promise<NativeBrowserTab> {\n const { Window } = await import('happy-dom');\n const windowConfig = inputs.source.config.windows[route.page.split('.')[0]!];\n const window = new Window({\n url: `https://wood.test/${encodeURIComponent(route.page)}`,\n width: windowConfig?.width ?? 1024, height: windowConfig?.height ?? 768,\n settings: {enableJavaScriptEvaluation: true},\n });\n // The Window owns its VM, timers, DOM and storage. Never install it on Node\n // globalThis or replace Vitest's globals; simultaneous cases remain isolated.\n const networkHost = installHappyDomFetch(window, request => inputs.network.dispatch(request));\n const intoWindow = createHappyDomTransfer(window);\n const globals = window as unknown as Record<string, any>;\n const transport = nativeHostTransport(inputs, async (channel, payload) => {\n globals.__woodNativeEmit(channel, intoWindow(payload));\n });\n Object.assign(window, {\n global: window,\n // happy-dom's Window lacks the structuredClone global renderer code and\n // the bridge client rely on; lend the host's implementation.\n structuredClone: globalThis.structuredClone,\n __woodNativeRoute: intoWindow(route),\n __woodNativeInvoke: async (channel: string, payload: unknown) => {\n try { return intoWindow(await transport.invoke(channel, structuredClone(payload))); }\n catch (error) {\n const nativeError = new window.Error(error instanceof Error ? error.message : String(error));\n if (error instanceof Error) nativeError.name = error.name;\n throw nativeError;\n }\n },\n __woodNativeSubscribe: transport.subscribe,\n __woodNativeTrace: (payload: unknown) => transport.trace(structuredClone(payload)),\n __woodNativeLog: (payload: unknown) => transport.log(structuredClone(payload)),\n });\n let closing: Promise<void> | null = null;\n const dispose = () => closing ??= disposeNativeResources('Wood happy-dom window cleanup failed', [\n () => hostDeadline(Promise.resolve(globals.__woodNativeDispose?.()), 'renderer teardown'),\n () => transport.dispose(),\n () => hostDeadline(transport.flush(), 'event drain'),\n () => networkHost.dispose(),\n () => window.happyDOM.close(),\n ]);\n try {\n window.document.body.innerHTML = '<div id=\"app\"></div>';\n if (bundle.css) {\n const style = window.document.createElement('style');\n style.textContent = bundle.css;\n window.document.head.appendChild(style);\n }\n window.eval(bundle.code);\n await hostDeadline(Promise.resolve(globals.__woodNativeReady), 'initial mount');\n return {\n native: window,\n async flush() {\n await hostDeadline(networkHost.settle(), 'external fetch drain');\n await hostDeadline(Promise.resolve(globals.__woodNativeFlush()), 'renderer flush');\n await hostDeadline(transport.flush(), 'event flush');\n await globals.__woodNativeFlush();\n },\n dispose,\n };\n } catch (error) {\n await disposeNativeResources('Wood happy-dom open failed', [() => {throw error;}, dispose]);\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAqC;AACrC,gCAAuC;AAEvC,4BAAoC;AACpC,sCAAqD;AAErD,eAAsB,gBACpB,QAA6B,QAA8B,OAChC;AAC3B,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,WAAW;AAC3C,QAAM,eAAe,OAAO,OAAO,OAAO,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE;AAC3E,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,KAAK,qBAAqB,mBAAmB,MAAM,IAAI,CAAC;AAAA,IACxD,OAAO,cAAc,SAAS;AAAA,IAAM,QAAQ,cAAc,UAAU;AAAA,IACpE,UAAU,EAAC,4BAA4B,KAAI;AAAA,EAC7C,CAAC;AAGD,QAAM,kBAAc,qCAAqB,QAAQ,aAAW,OAAO,QAAQ,SAAS,OAAO,CAAC;AAC5F,QAAM,iBAAa,kDAAuB,MAAM;AAChD,QAAM,UAAU;AAChB,QAAM,gBAAY,2CAAoB,QAAQ,OAAO,SAAS,YAAY;AACxE,YAAQ,iBAAiB,SAAS,WAAW,OAAO,CAAC;AAAA,EACvD,CAAC;AACD,SAAO,OAAO,QAAQ;AAAA,IACpB,QAAQ;AAAA;AAAA;AAAA,IAGR,iBAAiB,WAAW;AAAA,IAC5B,mBAAmB,WAAW,KAAK;AAAA,IACnC,oBAAoB,OAAO,SAAiB,YAAqB;AAC/D,UAAI;AAAE,eAAO,WAAW,MAAM,UAAU,OAAO,SAAS,gBAAgB,OAAO,CAAC,CAAC;AAAA,MAAG,SAC7E,OAAO;AACZ,cAAM,cAAc,IAAI,OAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC3F,YAAI,iBAAiB,MAAO,aAAY,OAAO,MAAM;AACrD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,uBAAuB,UAAU;AAAA,IACjC,mBAAmB,CAAC,YAAqB,UAAU,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACjF,iBAAiB,CAAC,YAAqB,UAAU,IAAI,gBAAgB,OAAO,CAAC;AAAA,EAC/E,CAAC;AACD,MAAI,UAAgC;AACpC,QAAM,UAAU,MAAM,0BAAY,wDAAuB,wCAAwC;AAAA,IAC/F,UAAM,8CAAa,QAAQ,QAAQ,QAAQ,sBAAsB,CAAC,GAAG,mBAAmB;AAAA,IACxF,MAAM,UAAU,QAAQ;AAAA,IACxB,UAAM,8CAAa,UAAU,MAAM,GAAG,aAAa;AAAA,IACnD,MAAM,YAAY,QAAQ;AAAA,IAC1B,MAAM,OAAO,SAAS,MAAM;AAAA,EAC9B,CAAC;AACD,MAAI;AACF,WAAO,SAAS,KAAK,YAAY;AACjC,QAAI,OAAO,KAAK;AACd,YAAM,QAAQ,OAAO,SAAS,cAAc,OAAO;AACnD,YAAM,cAAc,OAAO;AAC3B,aAAO,SAAS,KAAK,YAAY,KAAK;AAAA,IACxC;AACA,WAAO,KAAK,OAAO,IAAI;AACvB,cAAM,8CAAa,QAAQ,QAAQ,QAAQ,iBAAiB,GAAG,eAAe;AAC9E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,QAAQ;AACZ,kBAAM,8CAAa,YAAY,OAAO,GAAG,sBAAsB;AAC/D,kBAAM,8CAAa,QAAQ,QAAQ,QAAQ,kBAAkB,CAAC,GAAG,gBAAgB;AACjF,kBAAM,8CAAa,UAAU,MAAM,GAAG,aAAa;AACnD,cAAM,QAAQ,kBAAkB;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,cAAM,wDAAuB,8BAA8B,CAAC,MAAM;AAAC,YAAM;AAAA,IAAM,GAAG,OAAO,CAAC;AAC1F,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -19,6 +19,9 @@ async function openHappyDomTab(inputs, bundle, route) {
19
19
  });
20
20
  Object.assign(window, {
21
21
  global: window,
22
+ // happy-dom's Window lacks the structuredClone global renderer code and
23
+ // the bridge client rely on; lend the host's implementation.
24
+ structuredClone: globalThis.structuredClone,
22
25
  __woodNativeRoute: intoWindow(route),
23
26
  __woodNativeInvoke: async (channel, payload) => {
24
27
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/testing/native_browser/happy_dom_tab.ts"],"sourcesContent":["import { installHappyDomFetch } from '@noego/testing/browser';\nimport { createHappyDomTransfer } from './happy_dom_transfer.js';\nimport type { NativeBrowserInputs, NativeBrowserTab, NativeRendererBundle, NativeRendererRoute } from './native_browser.types.js';\nimport { nativeHostTransport } from './host_transport.js';\nimport { disposeNativeResources, hostDeadline } from './native_browser_lifecycle.js';\n\nexport async function openHappyDomTab(\n inputs: NativeBrowserInputs, bundle: NativeRendererBundle, route: NativeRendererRoute,\n): Promise<NativeBrowserTab> {\n const { Window } = await import('happy-dom');\n const windowConfig = inputs.source.config.windows[route.page.split('.')[0]!];\n const window = new Window({\n url: `https://wood.test/${encodeURIComponent(route.page)}`,\n width: windowConfig?.width ?? 1024, height: windowConfig?.height ?? 768,\n settings: {enableJavaScriptEvaluation: true},\n });\n // The Window owns its VM, timers, DOM and storage. Never install it on Node\n // globalThis or replace Vitest's globals; simultaneous cases remain isolated.\n const networkHost = installHappyDomFetch(window, request => inputs.network.dispatch(request));\n const intoWindow = createHappyDomTransfer(window);\n const globals = window as unknown as Record<string, any>;\n const transport = nativeHostTransport(inputs, async (channel, payload) => {\n globals.__woodNativeEmit(channel, intoWindow(payload));\n });\n Object.assign(window, {\n global: window,\n __woodNativeRoute: intoWindow(route),\n __woodNativeInvoke: async (channel: string, payload: unknown) => {\n try { return intoWindow(await transport.invoke(channel, structuredClone(payload))); }\n catch (error) {\n const nativeError = new window.Error(error instanceof Error ? error.message : String(error));\n if (error instanceof Error) nativeError.name = error.name;\n throw nativeError;\n }\n },\n __woodNativeSubscribe: transport.subscribe,\n __woodNativeTrace: (payload: unknown) => transport.trace(structuredClone(payload)),\n __woodNativeLog: (payload: unknown) => transport.log(structuredClone(payload)),\n });\n let closing: Promise<void> | null = null;\n const dispose = () => closing ??= disposeNativeResources('Wood happy-dom window cleanup failed', [\n () => hostDeadline(Promise.resolve(globals.__woodNativeDispose?.()), 'renderer teardown'),\n () => transport.dispose(),\n () => hostDeadline(transport.flush(), 'event drain'),\n () => networkHost.dispose(),\n () => window.happyDOM.close(),\n ]);\n try {\n window.document.body.innerHTML = '<div id=\"app\"></div>';\n if (bundle.css) {\n const style = window.document.createElement('style');\n style.textContent = bundle.css;\n window.document.head.appendChild(style);\n }\n window.eval(bundle.code);\n await hostDeadline(Promise.resolve(globals.__woodNativeReady), 'initial mount');\n return {\n native: window,\n async flush() {\n await hostDeadline(networkHost.settle(), 'external fetch drain');\n await hostDeadline(Promise.resolve(globals.__woodNativeFlush()), 'renderer flush');\n await hostDeadline(transport.flush(), 'event flush');\n await globals.__woodNativeFlush();\n },\n dispose,\n };\n } catch (error) {\n await disposeNativeResources('Wood happy-dom open failed', [() => {throw error;}, dispose]);\n throw error;\n }\n}\n"],"mappings":"AAAA,SAAS,4BAA4B;AACrC,SAAS,8BAA8B;AAEvC,SAAS,2BAA2B;AACpC,SAAS,wBAAwB,oBAAoB;AAErD,eAAsB,gBACpB,QAA6B,QAA8B,OAChC;AAC3B,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,WAAW;AAC3C,QAAM,eAAe,OAAO,OAAO,OAAO,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE;AAC3E,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,KAAK,qBAAqB,mBAAmB,MAAM,IAAI,CAAC;AAAA,IACxD,OAAO,cAAc,SAAS;AAAA,IAAM,QAAQ,cAAc,UAAU;AAAA,IACpE,UAAU,EAAC,4BAA4B,KAAI;AAAA,EAC7C,CAAC;AAGD,QAAM,cAAc,qBAAqB,QAAQ,aAAW,OAAO,QAAQ,SAAS,OAAO,CAAC;AAC5F,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,UAAU;AAChB,QAAM,YAAY,oBAAoB,QAAQ,OAAO,SAAS,YAAY;AACxE,YAAQ,iBAAiB,SAAS,WAAW,OAAO,CAAC;AAAA,EACvD,CAAC;AACD,SAAO,OAAO,QAAQ;AAAA,IACpB,QAAQ;AAAA,IACR,mBAAmB,WAAW,KAAK;AAAA,IACnC,oBAAoB,OAAO,SAAiB,YAAqB;AAC/D,UAAI;AAAE,eAAO,WAAW,MAAM,UAAU,OAAO,SAAS,gBAAgB,OAAO,CAAC,CAAC;AAAA,MAAG,SAC7E,OAAO;AACZ,cAAM,cAAc,IAAI,OAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC3F,YAAI,iBAAiB,MAAO,aAAY,OAAO,MAAM;AACrD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,uBAAuB,UAAU;AAAA,IACjC,mBAAmB,CAAC,YAAqB,UAAU,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACjF,iBAAiB,CAAC,YAAqB,UAAU,IAAI,gBAAgB,OAAO,CAAC;AAAA,EAC/E,CAAC;AACD,MAAI,UAAgC;AACpC,QAAM,UAAU,MAAM,sBAAY,uBAAuB,wCAAwC;AAAA,IAC/F,MAAM,aAAa,QAAQ,QAAQ,QAAQ,sBAAsB,CAAC,GAAG,mBAAmB;AAAA,IACxF,MAAM,UAAU,QAAQ;AAAA,IACxB,MAAM,aAAa,UAAU,MAAM,GAAG,aAAa;AAAA,IACnD,MAAM,YAAY,QAAQ;AAAA,IAC1B,MAAM,OAAO,SAAS,MAAM;AAAA,EAC9B,CAAC;AACD,MAAI;AACF,WAAO,SAAS,KAAK,YAAY;AACjC,QAAI,OAAO,KAAK;AACd,YAAM,QAAQ,OAAO,SAAS,cAAc,OAAO;AACnD,YAAM,cAAc,OAAO;AAC3B,aAAO,SAAS,KAAK,YAAY,KAAK;AAAA,IACxC;AACA,WAAO,KAAK,OAAO,IAAI;AACvB,UAAM,aAAa,QAAQ,QAAQ,QAAQ,iBAAiB,GAAG,eAAe;AAC9E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,QAAQ;AACZ,cAAM,aAAa,YAAY,OAAO,GAAG,sBAAsB;AAC/D,cAAM,aAAa,QAAQ,QAAQ,QAAQ,kBAAkB,CAAC,GAAG,gBAAgB;AACjF,cAAM,aAAa,UAAU,MAAM,GAAG,aAAa;AACnD,cAAM,QAAQ,kBAAkB;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,uBAAuB,8BAA8B,CAAC,MAAM;AAAC,YAAM;AAAA,IAAM,GAAG,OAAO,CAAC;AAC1F,UAAM;AAAA,EACR;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/testing/native_browser/happy_dom_tab.ts"],"sourcesContent":["import { installHappyDomFetch } from '@noego/testing/browser';\nimport { createHappyDomTransfer } from './happy_dom_transfer.js';\nimport type { NativeBrowserInputs, NativeBrowserTab, NativeRendererBundle, NativeRendererRoute } from './native_browser.types.js';\nimport { nativeHostTransport } from './host_transport.js';\nimport { disposeNativeResources, hostDeadline } from './native_browser_lifecycle.js';\n\nexport async function openHappyDomTab(\n inputs: NativeBrowserInputs, bundle: NativeRendererBundle, route: NativeRendererRoute,\n): Promise<NativeBrowserTab> {\n const { Window } = await import('happy-dom');\n const windowConfig = inputs.source.config.windows[route.page.split('.')[0]!];\n const window = new Window({\n url: `https://wood.test/${encodeURIComponent(route.page)}`,\n width: windowConfig?.width ?? 1024, height: windowConfig?.height ?? 768,\n settings: {enableJavaScriptEvaluation: true},\n });\n // The Window owns its VM, timers, DOM and storage. Never install it on Node\n // globalThis or replace Vitest's globals; simultaneous cases remain isolated.\n const networkHost = installHappyDomFetch(window, request => inputs.network.dispatch(request));\n const intoWindow = createHappyDomTransfer(window);\n const globals = window as unknown as Record<string, any>;\n const transport = nativeHostTransport(inputs, async (channel, payload) => {\n globals.__woodNativeEmit(channel, intoWindow(payload));\n });\n Object.assign(window, {\n global: window,\n // happy-dom's Window lacks the structuredClone global renderer code and\n // the bridge client rely on; lend the host's implementation.\n structuredClone: globalThis.structuredClone,\n __woodNativeRoute: intoWindow(route),\n __woodNativeInvoke: async (channel: string, payload: unknown) => {\n try { return intoWindow(await transport.invoke(channel, structuredClone(payload))); }\n catch (error) {\n const nativeError = new window.Error(error instanceof Error ? error.message : String(error));\n if (error instanceof Error) nativeError.name = error.name;\n throw nativeError;\n }\n },\n __woodNativeSubscribe: transport.subscribe,\n __woodNativeTrace: (payload: unknown) => transport.trace(structuredClone(payload)),\n __woodNativeLog: (payload: unknown) => transport.log(structuredClone(payload)),\n });\n let closing: Promise<void> | null = null;\n const dispose = () => closing ??= disposeNativeResources('Wood happy-dom window cleanup failed', [\n () => hostDeadline(Promise.resolve(globals.__woodNativeDispose?.()), 'renderer teardown'),\n () => transport.dispose(),\n () => hostDeadline(transport.flush(), 'event drain'),\n () => networkHost.dispose(),\n () => window.happyDOM.close(),\n ]);\n try {\n window.document.body.innerHTML = '<div id=\"app\"></div>';\n if (bundle.css) {\n const style = window.document.createElement('style');\n style.textContent = bundle.css;\n window.document.head.appendChild(style);\n }\n window.eval(bundle.code);\n await hostDeadline(Promise.resolve(globals.__woodNativeReady), 'initial mount');\n return {\n native: window,\n async flush() {\n await hostDeadline(networkHost.settle(), 'external fetch drain');\n await hostDeadline(Promise.resolve(globals.__woodNativeFlush()), 'renderer flush');\n await hostDeadline(transport.flush(), 'event flush');\n await globals.__woodNativeFlush();\n },\n dispose,\n };\n } catch (error) {\n await disposeNativeResources('Wood happy-dom open failed', [() => {throw error;}, dispose]);\n throw error;\n }\n}\n"],"mappings":"AAAA,SAAS,4BAA4B;AACrC,SAAS,8BAA8B;AAEvC,SAAS,2BAA2B;AACpC,SAAS,wBAAwB,oBAAoB;AAErD,eAAsB,gBACpB,QAA6B,QAA8B,OAChC;AAC3B,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,WAAW;AAC3C,QAAM,eAAe,OAAO,OAAO,OAAO,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE;AAC3E,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,KAAK,qBAAqB,mBAAmB,MAAM,IAAI,CAAC;AAAA,IACxD,OAAO,cAAc,SAAS;AAAA,IAAM,QAAQ,cAAc,UAAU;AAAA,IACpE,UAAU,EAAC,4BAA4B,KAAI;AAAA,EAC7C,CAAC;AAGD,QAAM,cAAc,qBAAqB,QAAQ,aAAW,OAAO,QAAQ,SAAS,OAAO,CAAC;AAC5F,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,UAAU;AAChB,QAAM,YAAY,oBAAoB,QAAQ,OAAO,SAAS,YAAY;AACxE,YAAQ,iBAAiB,SAAS,WAAW,OAAO,CAAC;AAAA,EACvD,CAAC;AACD,SAAO,OAAO,QAAQ;AAAA,IACpB,QAAQ;AAAA;AAAA;AAAA,IAGR,iBAAiB,WAAW;AAAA,IAC5B,mBAAmB,WAAW,KAAK;AAAA,IACnC,oBAAoB,OAAO,SAAiB,YAAqB;AAC/D,UAAI;AAAE,eAAO,WAAW,MAAM,UAAU,OAAO,SAAS,gBAAgB,OAAO,CAAC,CAAC;AAAA,MAAG,SAC7E,OAAO;AACZ,cAAM,cAAc,IAAI,OAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC3F,YAAI,iBAAiB,MAAO,aAAY,OAAO,MAAM;AACrD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,uBAAuB,UAAU;AAAA,IACjC,mBAAmB,CAAC,YAAqB,UAAU,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACjF,iBAAiB,CAAC,YAAqB,UAAU,IAAI,gBAAgB,OAAO,CAAC;AAAA,EAC/E,CAAC;AACD,MAAI,UAAgC;AACpC,QAAM,UAAU,MAAM,sBAAY,uBAAuB,wCAAwC;AAAA,IAC/F,MAAM,aAAa,QAAQ,QAAQ,QAAQ,sBAAsB,CAAC,GAAG,mBAAmB;AAAA,IACxF,MAAM,UAAU,QAAQ;AAAA,IACxB,MAAM,aAAa,UAAU,MAAM,GAAG,aAAa;AAAA,IACnD,MAAM,YAAY,QAAQ;AAAA,IAC1B,MAAM,OAAO,SAAS,MAAM;AAAA,EAC9B,CAAC;AACD,MAAI;AACF,WAAO,SAAS,KAAK,YAAY;AACjC,QAAI,OAAO,KAAK;AACd,YAAM,QAAQ,OAAO,SAAS,cAAc,OAAO;AACnD,YAAM,cAAc,OAAO;AAC3B,aAAO,SAAS,KAAK,YAAY,KAAK;AAAA,IACxC;AACA,WAAO,KAAK,OAAO,IAAI;AACvB,UAAM,aAAa,QAAQ,QAAQ,QAAQ,iBAAiB,GAAG,eAAe;AAC9E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,QAAQ;AACZ,cAAM,aAAa,YAAY,OAAO,GAAG,sBAAsB;AAC/D,cAAM,aAAa,QAAQ,QAAQ,QAAQ,kBAAkB,CAAC,GAAG,gBAAgB;AACjF,cAAM,aAAa,UAAU,MAAM,GAAG,aAAa;AACnD,cAAM,QAAQ,kBAAkB;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,uBAAuB,8BAA8B,CAAC,MAAM;AAAC,YAAM;AAAA,IAAM,GAAG,OAAO,CAAC;AAC1F,UAAM;AAAA,EACR;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noego/wood",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",