@ricsam/isolate 0.1.0 → 0.1.1
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/README.md +254 -0
- package/dist/cjs/bridge/diagnostics.cjs +2 -2
- package/dist/cjs/bridge/diagnostics.cjs.map +1 -1
- package/dist/cjs/bridge/legacy-adapters.cjs +2 -2
- package/dist/cjs/bridge/legacy-adapters.cjs.map +1 -1
- package/dist/cjs/bridge/request-context.cjs +2 -2
- package/dist/cjs/bridge/request-context.cjs.map +1 -1
- package/dist/cjs/bridge/runtime-bindings.cjs +2 -2
- package/dist/cjs/bridge/runtime-bindings.cjs.map +1 -1
- package/dist/cjs/browser/browser-runtime.cjs +2 -2
- package/dist/cjs/browser/browser-runtime.cjs.map +1 -1
- package/dist/cjs/daemon.cjs +2 -2
- package/dist/cjs/daemon.cjs.map +1 -1
- package/dist/cjs/files/index.cjs +2 -2
- package/dist/cjs/files/index.cjs.map +1 -1
- package/dist/cjs/host/create-isolate-host.cjs +4 -4
- package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
- package/dist/cjs/host/index.cjs +2 -2
- package/dist/cjs/host/index.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/internal/client/connection.cjs +2 -2
- package/dist/cjs/internal/client/connection.cjs.map +1 -1
- package/dist/cjs/internal/client/index.cjs +2 -2
- package/dist/cjs/internal/client/index.cjs.map +1 -1
- package/dist/cjs/internal/client/types.cjs +2 -2
- package/dist/cjs/internal/client/types.cjs.map +1 -1
- package/dist/cjs/internal/console/index.cjs +2 -2
- package/dist/cjs/internal/console/index.cjs.map +1 -1
- package/dist/cjs/internal/console/utils.cjs +2 -2
- package/dist/cjs/internal/console/utils.cjs.map +1 -1
- package/dist/cjs/internal/core/index.cjs +2 -2
- package/dist/cjs/internal/core/index.cjs.map +1 -1
- package/dist/cjs/internal/crypto/index.cjs +2 -2
- package/dist/cjs/internal/crypto/index.cjs.map +1 -1
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs +2 -2
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +1 -1
- package/dist/cjs/internal/daemon/connection.cjs +2 -2
- package/dist/cjs/internal/daemon/connection.cjs.map +1 -1
- package/dist/cjs/internal/daemon/daemon.cjs +2 -2
- package/dist/cjs/internal/daemon/daemon.cjs.map +1 -1
- package/dist/cjs/internal/daemon/index.cjs +2 -2
- package/dist/cjs/internal/daemon/index.cjs.map +1 -1
- package/dist/cjs/internal/daemon/runtime-pool.cjs +2 -2
- package/dist/cjs/internal/daemon/runtime-pool.cjs.map +1 -1
- package/dist/cjs/internal/daemon/types.cjs +2 -2
- package/dist/cjs/internal/daemon/types.cjs.map +1 -1
- package/dist/cjs/internal/encoding/index.cjs +2 -2
- package/dist/cjs/internal/encoding/index.cjs.map +1 -1
- package/dist/cjs/internal/fetch/consistency/origins.cjs +2 -2
- package/dist/cjs/internal/fetch/consistency/origins.cjs.map +1 -1
- package/dist/cjs/internal/fetch/index.cjs +2 -2
- package/dist/cjs/internal/fetch/index.cjs.map +1 -1
- package/dist/cjs/internal/fetch/stream-state.cjs +2 -2
- package/dist/cjs/internal/fetch/stream-state.cjs.map +1 -1
- package/dist/cjs/internal/fs/index.cjs +2 -2
- package/dist/cjs/internal/fs/index.cjs.map +1 -1
- package/dist/cjs/internal/fs/node-adapter.cjs +2 -2
- package/dist/cjs/internal/fs/node-adapter.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/bundle.cjs +2 -2
- package/dist/cjs/internal/module-loader/bundle.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/index.cjs +2 -2
- package/dist/cjs/internal/module-loader/index.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/mappings.cjs +2 -2
- package/dist/cjs/internal/module-loader/mappings.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/resolve.cjs +2 -2
- package/dist/cjs/internal/module-loader/resolve.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/strip-types.cjs +2 -2
- package/dist/cjs/internal/module-loader/strip-types.cjs.map +1 -1
- package/dist/cjs/internal/path/index.cjs +2 -2
- package/dist/cjs/internal/path/index.cjs.map +1 -1
- package/dist/cjs/internal/playwright/client.cjs +2 -2
- package/dist/cjs/internal/playwright/client.cjs.map +1 -1
- package/dist/cjs/internal/playwright/handler.cjs +2 -2
- package/dist/cjs/internal/playwright/handler.cjs.map +1 -1
- package/dist/cjs/internal/playwright/index.cjs +2 -2
- package/dist/cjs/internal/playwright/index.cjs.map +1 -1
- package/dist/cjs/internal/playwright/types.cjs +2 -2
- package/dist/cjs/internal/playwright/types.cjs.map +1 -1
- package/dist/cjs/internal/protocol/codec.cjs +2 -2
- package/dist/cjs/internal/protocol/codec.cjs.map +1 -1
- package/dist/cjs/internal/protocol/framing.cjs +2 -2
- package/dist/cjs/internal/protocol/framing.cjs.map +1 -1
- package/dist/cjs/internal/protocol/index.cjs +2 -2
- package/dist/cjs/internal/protocol/index.cjs.map +1 -1
- package/dist/cjs/internal/protocol/marshalValue.cjs +2 -2
- package/dist/cjs/internal/protocol/marshalValue.cjs.map +1 -1
- package/dist/cjs/internal/protocol/serialization.cjs +2 -2
- package/dist/cjs/internal/protocol/serialization.cjs.map +1 -1
- package/dist/cjs/internal/protocol/types.cjs +2 -2
- package/dist/cjs/internal/protocol/types.cjs.map +1 -1
- package/dist/cjs/internal/runtime/index.cjs +2 -2
- package/dist/cjs/internal/runtime/index.cjs.map +1 -1
- package/dist/cjs/internal/server/index.cjs +2 -2
- package/dist/cjs/internal/server/index.cjs.map +1 -1
- package/dist/cjs/internal/test-environment/index.cjs +2 -2
- package/dist/cjs/internal/test-environment/index.cjs.map +1 -1
- package/dist/cjs/internal/timers/index.cjs +2 -2
- package/dist/cjs/internal/timers/index.cjs.map +1 -1
- package/dist/cjs/internal/transform/index.cjs +2 -2
- package/dist/cjs/internal/transform/index.cjs.map +1 -1
- package/dist/cjs/internal/typecheck/index.cjs +2 -2
- package/dist/cjs/internal/typecheck/index.cjs.map +1 -1
- package/dist/cjs/internal/typecheck/isolate-types.cjs +2 -2
- package/dist/cjs/internal/typecheck/isolate-types.cjs.map +1 -1
- package/dist/cjs/internal/typecheck/typecheck.cjs +2 -2
- package/dist/cjs/internal/typecheck/typecheck.cjs.map +1 -1
- package/dist/cjs/modules/index.cjs +2 -2
- package/dist/cjs/modules/index.cjs.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/runtime/script-runtime.cjs +2 -2
- package/dist/cjs/runtime/script-runtime.cjs.map +1 -1
- package/dist/cjs/server/app-server.cjs +2 -2
- package/dist/cjs/server/app-server.cjs.map +1 -1
- package/dist/cjs/testing/integration-helpers.cjs +2 -2
- package/dist/cjs/testing/integration-helpers.cjs.map +1 -1
- package/dist/cjs/typecheck/index.cjs +2 -2
- package/dist/cjs/typecheck/index.cjs.map +1 -1
- package/dist/cjs/types.cjs +2 -2
- package/dist/cjs/types.cjs.map +1 -1
- package/dist/mjs/bridge/diagnostics.mjs +2 -2
- package/dist/mjs/bridge/diagnostics.mjs.map +1 -1
- package/dist/mjs/bridge/legacy-adapters.mjs +2 -2
- package/dist/mjs/bridge/legacy-adapters.mjs.map +1 -1
- package/dist/mjs/bridge/request-context.mjs +2 -2
- package/dist/mjs/bridge/request-context.mjs.map +1 -1
- package/dist/mjs/bridge/runtime-bindings.mjs +2 -2
- package/dist/mjs/bridge/runtime-bindings.mjs.map +1 -1
- package/dist/mjs/browser/browser-runtime.mjs +2 -2
- package/dist/mjs/browser/browser-runtime.mjs.map +1 -1
- package/dist/mjs/daemon.mjs +2 -2
- package/dist/mjs/daemon.mjs.map +1 -1
- package/dist/mjs/files/index.mjs +2 -2
- package/dist/mjs/files/index.mjs.map +1 -1
- package/dist/mjs/host/create-isolate-host.mjs +3 -3
- package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
- package/dist/mjs/host/index.mjs +2 -2
- package/dist/mjs/host/index.mjs.map +1 -1
- package/dist/mjs/index.mjs +2 -2
- package/dist/mjs/index.mjs.map +1 -1
- package/dist/mjs/internal/client/connection.mjs +2 -2
- package/dist/mjs/internal/client/connection.mjs.map +1 -1
- package/dist/mjs/internal/client/index.mjs +2 -2
- package/dist/mjs/internal/client/index.mjs.map +1 -1
- package/dist/mjs/internal/client/types.mjs +1 -1
- package/dist/mjs/internal/client/types.mjs.map +1 -1
- package/dist/mjs/internal/console/index.mjs +2 -2
- package/dist/mjs/internal/console/index.mjs.map +1 -1
- package/dist/mjs/internal/console/utils.mjs +2 -2
- package/dist/mjs/internal/console/utils.mjs.map +1 -1
- package/dist/mjs/internal/core/index.mjs +2 -2
- package/dist/mjs/internal/core/index.mjs.map +1 -1
- package/dist/mjs/internal/crypto/index.mjs +2 -2
- package/dist/mjs/internal/crypto/index.mjs.map +1 -1
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs +2 -2
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +1 -1
- package/dist/mjs/internal/daemon/connection.mjs +2 -2
- package/dist/mjs/internal/daemon/connection.mjs.map +1 -1
- package/dist/mjs/internal/daemon/daemon.mjs +2 -2
- package/dist/mjs/internal/daemon/daemon.mjs.map +1 -1
- package/dist/mjs/internal/daemon/index.mjs +2 -2
- package/dist/mjs/internal/daemon/index.mjs.map +1 -1
- package/dist/mjs/internal/daemon/runtime-pool.mjs +2 -2
- package/dist/mjs/internal/daemon/runtime-pool.mjs.map +1 -1
- package/dist/mjs/internal/daemon/types.mjs +1 -1
- package/dist/mjs/internal/daemon/types.mjs.map +1 -1
- package/dist/mjs/internal/encoding/index.mjs +2 -2
- package/dist/mjs/internal/encoding/index.mjs.map +1 -1
- package/dist/mjs/internal/fetch/consistency/origins.mjs +2 -2
- package/dist/mjs/internal/fetch/consistency/origins.mjs.map +1 -1
- package/dist/mjs/internal/fetch/index.mjs +2 -2
- package/dist/mjs/internal/fetch/index.mjs.map +1 -1
- package/dist/mjs/internal/fetch/stream-state.mjs +2 -2
- package/dist/mjs/internal/fetch/stream-state.mjs.map +1 -1
- package/dist/mjs/internal/fs/index.mjs +2 -2
- package/dist/mjs/internal/fs/index.mjs.map +1 -1
- package/dist/mjs/internal/fs/node-adapter.mjs +2 -2
- package/dist/mjs/internal/fs/node-adapter.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/bundle.mjs +2 -2
- package/dist/mjs/internal/module-loader/bundle.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/index.mjs +2 -2
- package/dist/mjs/internal/module-loader/index.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/mappings.mjs +2 -2
- package/dist/mjs/internal/module-loader/mappings.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/resolve.mjs +2 -2
- package/dist/mjs/internal/module-loader/resolve.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/strip-types.mjs +2 -2
- package/dist/mjs/internal/module-loader/strip-types.mjs.map +1 -1
- package/dist/mjs/internal/path/index.mjs +2 -2
- package/dist/mjs/internal/path/index.mjs.map +1 -1
- package/dist/mjs/internal/playwright/client.mjs +2 -2
- package/dist/mjs/internal/playwright/client.mjs.map +1 -1
- package/dist/mjs/internal/playwright/handler.mjs +2 -2
- package/dist/mjs/internal/playwright/handler.mjs.map +1 -1
- package/dist/mjs/internal/playwright/index.mjs +2 -2
- package/dist/mjs/internal/playwright/index.mjs.map +1 -1
- package/dist/mjs/internal/playwright/types.mjs +2 -2
- package/dist/mjs/internal/playwright/types.mjs.map +1 -1
- package/dist/mjs/internal/protocol/codec.mjs +2 -2
- package/dist/mjs/internal/protocol/codec.mjs.map +1 -1
- package/dist/mjs/internal/protocol/framing.mjs +2 -2
- package/dist/mjs/internal/protocol/framing.mjs.map +1 -1
- package/dist/mjs/internal/protocol/index.mjs +2 -2
- package/dist/mjs/internal/protocol/index.mjs.map +1 -1
- package/dist/mjs/internal/protocol/marshalValue.mjs +2 -2
- package/dist/mjs/internal/protocol/marshalValue.mjs.map +1 -1
- package/dist/mjs/internal/protocol/serialization.mjs +2 -2
- package/dist/mjs/internal/protocol/serialization.mjs.map +1 -1
- package/dist/mjs/internal/protocol/types.mjs +2 -2
- package/dist/mjs/internal/protocol/types.mjs.map +1 -1
- package/dist/mjs/internal/runtime/index.mjs +2 -2
- package/dist/mjs/internal/runtime/index.mjs.map +1 -1
- package/dist/mjs/internal/server/index.mjs +2 -2
- package/dist/mjs/internal/server/index.mjs.map +1 -1
- package/dist/mjs/internal/test-environment/index.mjs +2 -2
- package/dist/mjs/internal/test-environment/index.mjs.map +1 -1
- package/dist/mjs/internal/timers/index.mjs +2 -2
- package/dist/mjs/internal/timers/index.mjs.map +1 -1
- package/dist/mjs/internal/transform/index.mjs +2 -2
- package/dist/mjs/internal/transform/index.mjs.map +1 -1
- package/dist/mjs/internal/typecheck/index.mjs +2 -2
- package/dist/mjs/internal/typecheck/index.mjs.map +1 -1
- package/dist/mjs/internal/typecheck/isolate-types.mjs +2 -2
- package/dist/mjs/internal/typecheck/isolate-types.mjs.map +1 -1
- package/dist/mjs/internal/typecheck/typecheck.mjs +2 -2
- package/dist/mjs/internal/typecheck/typecheck.mjs.map +1 -1
- package/dist/mjs/modules/index.mjs +2 -2
- package/dist/mjs/modules/index.mjs.map +1 -1
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/runtime/script-runtime.mjs +2 -2
- package/dist/mjs/runtime/script-runtime.mjs.map +1 -1
- package/dist/mjs/server/app-server.mjs +2 -2
- package/dist/mjs/server/app-server.mjs.map +1 -1
- package/dist/mjs/testing/integration-helpers.mjs +2 -2
- package/dist/mjs/testing/integration-helpers.mjs.map +1 -1
- package/dist/mjs/typecheck/index.mjs +2 -2
- package/dist/mjs/typecheck/index.mjs.map +1 -1
- package/dist/mjs/types.mjs +1 -1
- package/dist/mjs/types.mjs.map +1 -1
- package/package.json +46 -38
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import ivm from \"isolated-vm\";\nimport path from \"node:path\";\nimport { setupCore } from \"../core/index.cjs\";\nimport { normalizeEntryFilename } from \"../protocol/index.cjs\";\nimport {\n transformEntryCode,\n transformModuleCode,\n contentHash,\n mapErrorStack,\n type SourceMap,\n type TransformResult,\n} from \"../transform/index.cjs\";\n\n// Re-export for convenience\nexport { normalizeEntryFilename } from \"../protocol/index.cjs\";\nimport { setupConsole } from \"../console/index.cjs\";\nimport { setupEncoding } from \"../encoding/index.cjs\";\nimport { setupTimers } from \"../timers/index.cjs\";\nimport { setupPath } from \"../path/index.cjs\";\nimport { setupCrypto } from \"../crypto/index.cjs\";\nimport { setupFetch } from \"../fetch/index.cjs\";\nimport { setupFs } from \"../fs/index.cjs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"../test-environment/index.cjs\";\nimport {\n setupPlaywright,\n type PlaywrightCallback,\n type PlaywrightSetupOptions,\n} from \"../playwright/index.cjs\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"../console/index.cjs\";\nimport type {\n FetchOptions,\n FetchHandle,\n DispatchRequestOptions,\n UpgradeRequest,\n WebSocketCommand,\n ClientWebSocketCommand,\n} from \"../fetch/index.cjs\";\nimport type { FsOptions, FsHandle } from \"../fs/index.cjs\";\nimport type { CoreHandle } from \"../core/index.cjs\";\nimport type { EncodingHandle } from \"../encoding/index.cjs\";\nimport type { TimersHandle } from \"../timers/index.cjs\";\nimport type { PathHandle } from \"../path/index.cjs\";\nimport type { CryptoHandle } from \"../crypto/index.cjs\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"../test-environment/index.cjs\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n PlaywrightEvent,\n} from \"../playwright/index.cjs\";\nimport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n FetchRequestInit,\n ModuleLoaderCallback,\n CustomFunctionDefinition,\n CustomFunctions,\n CustomAsyncGeneratorFunction,\n DispatchOptions,\n EvalOptions as ProtocolEvalOptions,\n PlaywrightOptions as ProtocolPlaywrightOptions,\n BaseRuntimeOptions,\n} from \"../protocol/index.cjs\";\nimport {\n marshalValue,\n unmarshalValue,\n type MarshalContext,\n} from \"../protocol/index.cjs\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n FetchRequestInit,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"../protocol/index.cjs\";\n\n// Re-export shared protocol option types\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\n\n/**\n * Options for customizing how custom function return values are marshalled.\n * Used by the daemon to support returned callbacks/promises/iterators via IPC.\n */\nexport interface CustomFunctionsMarshalOptions {\n /** Factory to create a MarshalContext for registering returned callbacks/promises/iterators */\n createMarshalContext: () => MarshalContext;\n /** Post-processor to add callback IDs to PromiseRef/AsyncIteratorRef values */\n addCallbackIdsToRefs: (value: unknown) => unknown;\n /** Handler for numeric callback IDs from marshalled refs (CallbackRef, PromiseRef, AsyncIteratorRef) */\n invokeCallback: (callbackId: number, args: unknown[]) => Promise<unknown>;\n}\n\n/**\n * Options for creating a runtime.\n * Extends BaseRuntimeOptions and adds runtime-specific fs type.\n */\nexport interface RuntimeOptions<T extends Record<string, any[]> = Record<string, unknown[]>>\n extends BaseRuntimeOptions<T> {\n /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /**\n * Optional marshal options for custom functions.\n * When provided, enables MarshalContext-based marshalling for returned values.\n * Used by the daemon for IPC proxying of callbacks/promises/iterators.\n */\n customFunctionsMarshalOptions?: CustomFunctionsMarshalOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(\n connectionId: string,\n code: number,\n reason: string\n ): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n /** Dispatch open event to a client WebSocket in the isolate */\n dispatchClientWebSocketOpen(socketId: string, protocol: string, extensions: string): void;\n /** Dispatch message event to a client WebSocket in the isolate */\n dispatchClientWebSocketMessage(socketId: string, data: string | ArrayBuffer): void;\n /** Dispatch close event to a client WebSocket in the isolate */\n dispatchClientWebSocketClose(socketId: string, code: number, reason: string, wasClean: boolean): void;\n /** Dispatch error event to a client WebSocket in the isolate */\n dispatchClientWebSocketError(socketId: string): void;\n /** Register callback for client WebSocket commands from isolate */\n onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void): () => void;\n /** Register callback for events emitted from isolate code */\n onEvent(callback: (event: string, payload: unknown) => void): () => void;\n /** Dispatch an event into the isolate (calls __on listeners) */\n dispatchEvent(event: string, payload: unknown): void;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n * Timers fire automatically based on real time.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n pageErrors: PageErrorInfo[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n requestFailures: RequestFailureInfo[];\n}\n\n/**\n * Runtime handle - the main interface for interacting with the isolate.\n */\nexport interface RuntimeHandle {\n /** Unique runtime identifier */\n readonly id: string;\n /** Execute code as ES module (supports top-level await) */\n eval(code: string, filenameOrOptions?: string | EvalOptions): Promise<void>;\n /** Dispose all resources */\n dispose(): Promise<void>;\n /** Clear module cache and source maps (used for namespace pooling/reuse) */\n clearModuleCache(): void;\n\n /**\n * Array of pending callback promises. Push promises here to have them\n * awaited after each eval() call completes. Used by daemon for IPC flush.\n * For standalone use this array stays empty (callbacks are synchronous).\n */\n readonly pendingCallbacks: Promise<unknown>[];\n\n /** Fetch handle - access to fetch/serve operations */\n readonly fetch: RuntimeFetchHandle;\n /** Timers handle - access to timer operations */\n readonly timers: RuntimeTimersHandle;\n /** Console handle - access to console state */\n readonly console: RuntimeConsoleHandle;\n /** Test environment handle - access to test execution (throws if not enabled) */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to playwright operations (throws if not configured) */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n// Internal state for runtime\ninterface RuntimeState {\n id: string;\n isolate: ivm.Isolate;\n context: ivm.Context;\n handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n testEnvironment?: TestEnvironmentHandle;\n playwright?: PlaywrightHandle;\n };\n moduleCache: Map<string, ivm.Module>;\n staticModuleCache: Map<string, ivm.Module>;\n moduleLoadsInFlight: Map<string, Promise<ivm.Module>>;\n transformCache: Map<string, TransformResult>;\n moduleToFilename: Map<ivm.Module, string>;\n moduleLoader?: ModuleLoaderCallback;\n customFunctions?: CustomFunctions;\n customFnInvokeRef?: ivm.Reference<\n (name: string, argsJson: string) => Promise<string>\n >;\n sourceMaps: Map<string, SourceMap>;\n /** Tracks the import chain for each module (resolved path → list of ancestor paths) */\n moduleImportChain: Map<string, string[]>;\n /** Tracks which file imported a given specifier (resolvedSpecifier → importerPath) */\n specifierToImporter: Map<string, string>;\n /** Pending callbacks to await after eval (for daemon IPC fire-and-forget pattern) */\n pendingCallbacks: Promise<unknown>[];\n /** Per-runtime eval queue to prevent overlapping module linking/evaluation */\n evalChain: Promise<void>;\n /** Optional timeout for full eval/test executions */\n executionTimeout?: number;\n /** True after dispose() starts */\n isDisposed: boolean;\n /** Cached dispose promise to make disposal idempotent */\n disposePromise?: Promise<void>;\n /** Human-readable reason recorded when disposal first started */\n disposeReason?: string;\n /** Timeout budget that permanently poisoned this runtime */\n timedOutExecutionMs?: number;\n}\n\nfunction getConfiguredExecutionTimeout(timeoutMs?: number): number | undefined {\n if (typeof timeoutMs !== \"number\" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return undefined;\n }\n return timeoutMs;\n}\n\nfunction createTimeoutError(label: string, timeoutMs: number): Error {\n const error = new Error(`${label} timed out after ${timeoutMs}ms`);\n error.name = \"TimeoutError\";\n return error;\n}\n\nfunction createDisposedRuntimeError(): Error {\n return new Error(\"Runtime has been disposed\");\n}\n\nfunction createTimedOutRuntimeError(timeoutMs: number): Error {\n const error = new Error(\n `Runtime execution timed out after ${timeoutMs}ms; create a new runtime.`\n );\n error.name = \"TimeoutError\";\n return error;\n}\n\nfunction assertRuntimeUsable(state: RuntimeState): void {\n if (state.timedOutExecutionMs !== undefined) {\n throw createTimedOutRuntimeError(state.timedOutExecutionMs);\n }\n if (state.isDisposed) {\n throw createDisposedRuntimeError();\n }\n}\n\ninterface DisposeRuntimeStateOptions {\n reason: string;\n log?: boolean;\n error?: unknown;\n}\n\nfunction logRuntimeDisposal(state: RuntimeState, options: DisposeRuntimeStateOptions): void {\n const message = `[isolate-runtime] Disposing runtime ${state.id}: ${options.reason}`;\n if (options.error) {\n console.error(message, options.error);\n return;\n }\n console.warn(message);\n}\n\nasync function disposeRuntimeState(\n state: RuntimeState,\n options: DisposeRuntimeStateOptions = { reason: \"RuntimeHandle.dispose() called\", log: false },\n): Promise<void> {\n if (state.disposePromise) {\n return state.disposePromise;\n }\n\n state.disposeReason = options.reason;\n state.isDisposed = true;\n if (options.log !== false) {\n logRuntimeDisposal(state, options);\n }\n state.disposePromise = (async () => {\n if (state.customFnInvokeRef) {\n try {\n state.customFnInvokeRef.release();\n } catch {\n // Ignore cleanup errors during disposal.\n } finally {\n state.customFnInvokeRef = undefined;\n }\n }\n\n const disposeHandle = (dispose: (() => void) | undefined): void => {\n if (!dispose) return;\n try {\n dispose();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n };\n\n disposeHandle(state.handles.playwright?.dispose.bind(state.handles.playwright));\n disposeHandle(state.handles.testEnvironment?.dispose.bind(state.handles.testEnvironment));\n disposeHandle(state.handles.fs?.dispose.bind(state.handles.fs));\n disposeHandle(state.handles.fetch?.dispose.bind(state.handles.fetch));\n disposeHandle(state.handles.crypto?.dispose.bind(state.handles.crypto));\n disposeHandle(state.handles.path?.dispose.bind(state.handles.path));\n disposeHandle(state.handles.timers?.dispose.bind(state.handles.timers));\n disposeHandle(state.handles.encoding?.dispose.bind(state.handles.encoding));\n disposeHandle(state.handles.console?.dispose.bind(state.handles.console));\n disposeHandle(state.handles.core?.dispose.bind(state.handles.core));\n\n state.pendingCallbacks.length = 0;\n state.moduleCache.clear();\n state.moduleLoadsInFlight.clear();\n state.moduleToFilename.clear();\n state.moduleImportChain.clear();\n state.specifierToImporter.clear();\n state.sourceMaps.clear();\n\n try {\n state.context.release();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n\n try {\n state.isolate.dispose();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n })();\n\n return state.disposePromise;\n}\n\nasync function runWithExecutionTimeout<T>(\n state: RuntimeState,\n timeoutMs: number | undefined,\n label: string,\n operation: () => Promise<T>,\n): Promise<T> {\n const effectiveTimeoutMs = getConfiguredExecutionTimeout(timeoutMs);\n if (effectiveTimeoutMs === undefined) {\n return operation();\n }\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n const timeoutError = createTimeoutError(label, effectiveTimeoutMs);\n state.timedOutExecutionMs ??= effectiveTimeoutMs;\n void disposeRuntimeState(state, {\n reason: timeoutError.message,\n error: timeoutError,\n });\n reject(timeoutError);\n }, effectiveTimeoutMs);\n });\n\n try {\n return await Promise.race([operation(), timeoutPromise]);\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Lightweight marshalling code to inject into the isolate.\n * Converts JavaScript types to Ref objects for type-preserving serialization.\n */\nconst ISOLATE_MARSHAL_CODE = `\n(function() {\n // Marshal a value (JavaScript → Ref)\n function marshalForHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null) return null;\n if (value === undefined) return { __type: 'UndefinedRef' };\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };\n if (type === 'function') throw new Error('Cannot marshal functions from isolate');\n if (type === 'symbol') throw new Error('Cannot marshal Symbol values');\n\n if (type === 'object') {\n if (value instanceof Date) {\n return { __type: 'DateRef', timestamp: value.getTime() };\n }\n if (value instanceof RegExp) {\n return { __type: 'RegExpRef', source: value.source, flags: value.flags };\n }\n if (value instanceof URL) {\n return { __type: 'URLRef', href: value.href };\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n const pairs = [];\n value.forEach((v, k) => pairs.push([k, v]));\n return { __type: 'HeadersRef', pairs };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8ArrayRef', data: Array.from(value) };\n }\n if (value instanceof ArrayBuffer) {\n return { __type: 'Uint8ArrayRef', data: Array.from(new Uint8Array(value)) };\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n throw new Error('Cannot marshal Request from isolate. Use fetch callback instead.');\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n throw new Error('Cannot marshal Response from isolate. Return plain objects instead.');\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n throw new Error('Cannot marshal File from isolate.');\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n throw new Error('Cannot marshal Blob from isolate.');\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n throw new Error('Cannot marshal FormData from isolate.');\n }\n if (Array.isArray(value)) {\n return value.map(v => marshalForHost(v, depth + 1));\n }\n // Plain object\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = marshalForHost(value[key], depth + 1);\n }\n return result;\n }\n return value;\n }\n\n // Unmarshal a value (Ref → JavaScript)\n function unmarshalFromHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');\n\n if (value === null) return null;\n if (typeof value !== 'object') return value;\n\n if (value.__type) {\n switch (value.__type) {\n case 'UndefinedRef': return undefined;\n case 'DateRef': return new Date(value.timestamp);\n case 'RegExpRef': return new RegExp(value.source, value.flags);\n case 'BigIntRef': return BigInt(value.value);\n case 'URLRef': return new URL(value.href);\n case 'HeadersRef': return new Headers(value.pairs);\n case 'Uint8ArrayRef': return new Uint8Array(value.data);\n case 'RequestRef': {\n const init = {\n method: value.method,\n headers: value.headers,\n body: value.body ? new Uint8Array(value.body) : null,\n };\n if (value.mode) init.mode = value.mode;\n if (value.credentials) init.credentials = value.credentials;\n if (value.cache) init.cache = value.cache;\n if (value.redirect) init.redirect = value.redirect;\n if (value.referrer) init.referrer = value.referrer;\n if (value.referrerPolicy) init.referrerPolicy = value.referrerPolicy;\n if (value.integrity) init.integrity = value.integrity;\n return new Request(value.url, init);\n }\n case 'ResponseRef': {\n return new Response(value.body ? new Uint8Array(value.body) : null, {\n status: value.status,\n statusText: value.statusText,\n headers: value.headers,\n });\n }\n case 'FileRef': {\n if (!value.name) {\n return new Blob([new Uint8Array(value.data)], { type: value.type });\n }\n return new File([new Uint8Array(value.data)], value.name, {\n type: value.type,\n lastModified: value.lastModified,\n });\n }\n case 'FormDataRef': {\n const fd = new FormData();\n for (const [key, entry] of value.entries) {\n if (typeof entry === 'string') {\n fd.append(key, entry);\n } else {\n const file = unmarshalFromHost(entry, depth + 1);\n fd.append(key, file);\n }\n }\n return fd;\n }\n case 'CallbackRef': {\n const callbackId = value.callbackId;\n return async function(...args) {\n const argsJson = JSON.stringify(marshalForHost(args));\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [callbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n }\n\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n }\n case 'PromiseRef': {\n const promiseId = value.promiseId;\n return (async () => {\n const argsJson = JSON.stringify([promiseId]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [value.__resolveCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n }\n\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n })();\n }\n case 'AsyncIteratorRef': {\n const iteratorId = value.iteratorId;\n const nextCallbackId = value.__nextCallbackId;\n const returnCallbackId = value.__returnCallbackId;\n const throwCallbackId = value.__throwCallbackId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify([iteratorId]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [nextCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value)\n };\n },\n async return(v) {\n const argsJson = JSON.stringify([iteratorId, marshalForHost(v)]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [returnCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done ?? true,\n value: unmarshalFromHost(result.value.value ?? result.value),\n };\n },\n async throw(e) {\n if (throwCallbackId == null) {\n throw e;\n }\n const errorValue = e && typeof e === 'object'\n ? { message: e.message, name: e.name, stack: e.stack }\n : { message: String(e), name: 'Error' };\n const argsJson = JSON.stringify([iteratorId, errorValue]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [throwCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value),\n };\n }\n };\n }\n default:\n // Unknown ref type, return as-is\n break;\n }\n }\n\n if (Array.isArray(value)) {\n return value.map(v => unmarshalFromHost(v, depth + 1));\n }\n\n // Plain object - recursively unmarshal\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = unmarshalFromHost(value[key], depth + 1);\n }\n return result;\n }\n\n // Expose as globals\n globalThis.__marshalForHost = marshalForHost;\n globalThis.__unmarshalFromHost = unmarshalFromHost;\n})();\n`;\n\n// CustomFunctionsMarshalOptions is exported at the top of the file\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n *\n * When marshalOptions is provided, returned values are marshalled with a MarshalContext,\n * enabling proper proxying of callbacks/promises/iterators across boundaries.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions,\n marshalOptions?: CustomFunctionsMarshalOptions,\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result.\n // The first argument can be a string function name (for custom functions) or a\n // numeric callback ID (for returned callbacks/promises/iterators from marshal).\n const invokeCallbackRef = new ivm.Reference(\n async (nameOrId: string | number, argsJson: string): Promise<string> => {\n // Check if this is a local callback ID (numeric, used by returned callbacks/promises/iterators)\n if (typeof nameOrId === \"number\" && marshalOptions) {\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n const result = await marshalOptions.invokeCallback(nameOrId, args);\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n\n const name = String(nameOrId);\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Custom function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n // Unmarshal args from isolate (converts Refs back to JavaScript types)\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n // Always await the result: for daemon-bridged functions, even \"sync\" custom functions\n // are async due to IPC, so we need to resolve the promise.\n const result = await def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n }\n const marshalledResult = await marshalValue(result);\n return JSON.stringify({ ok: true, value: marshalledResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Inject marshalling helpers into the isolate\n context.evalSync(ISOLATE_MARSHAL_CODE);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === \"async\") {\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n `);\n } else if (def.type === \"sync\") {\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = __customFn_invoke.applySync(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n `);\n } else if (def.type === \"asyncIterator\") {\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const iteratorPromise = (async () => {\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n throw Object.assign(new Error(result.error.message), {\n name: result.error.name,\n });\n })();\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const iterator = await iteratorPromise;\n return iterator.next();\n },\n async return(v) {\n const iterator = await iteratorPromise;\n return iterator.return ? iterator.return(v) : { done: true, value: v };\n },\n async throw(e) {\n const iterator = await iteratorPromise;\n if (!iterator.throw) {\n throw e;\n }\n return iterator.throw(e);\n }\n };\n };\n `);\n }\n }\n\n return invokeCallbackRef;\n}\n\n/**\n * Create local marshal options for standalone runtime custom functions.\n * Enables returned callbacks/promises/iterators without daemon IPC.\n */\nfunction createLocalCustomFunctionsMarshalOptions(): CustomFunctionsMarshalOptions {\n const returnedCallbacks = new Map<number, Function>();\n const returnedPromises = new Map<number, Promise<unknown>>();\n const returnedIterators = new Map<number, AsyncIterator<unknown>>();\n let nextLocalCallbackId = 1_000_000;\n\n const createMarshalContext = (): MarshalContext => ({\n registerCallback: (fn: Function): number => {\n const callbackId = nextLocalCallbackId++;\n returnedCallbacks.set(callbackId, fn);\n return callbackId;\n },\n registerPromise: (promise: Promise<unknown>): number => {\n const promiseId = nextLocalCallbackId++;\n returnedPromises.set(promiseId, promise);\n return promiseId;\n },\n registerIterator: (iterator: AsyncIterator<unknown>): number => {\n const iteratorId = nextLocalCallbackId++;\n returnedIterators.set(iteratorId, iterator);\n return iteratorId;\n },\n });\n\n const isPromiseRef = (\n value: unknown\n ): value is { __type: \"PromiseRef\"; promiseId: number } =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { __type?: string }).__type === \"PromiseRef\";\n\n const isAsyncIteratorRef = (\n value: unknown\n ): value is { __type: \"AsyncIteratorRef\"; iteratorId: number } =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { __type?: string }).__type === \"AsyncIteratorRef\";\n\n const addCallbackIdsToRefs = (value: unknown): unknown => {\n if (value === null || typeof value !== \"object\") return value;\n\n if (isPromiseRef(value)) {\n if (\"__resolveCallbackId\" in value) return value;\n\n const resolveCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(resolveCallbackId, async (promiseId: number) => {\n const promise = returnedPromises.get(promiseId);\n if (!promise) {\n throw new Error(`Promise ${promiseId} not found`);\n }\n const result = await promise;\n returnedPromises.delete(promiseId);\n const ctx = createMarshalContext();\n const marshalled = await marshalValue(result, ctx);\n return addCallbackIdsToRefs(marshalled);\n });\n\n return { ...value, __resolveCallbackId: resolveCallbackId };\n }\n\n if (isAsyncIteratorRef(value)) {\n if (\"__nextCallbackId\" in value) return value;\n\n const nextCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(nextCallbackId, async (iteratorId: number) => {\n const iterator = returnedIterators.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n const result = await iterator.next();\n if (result.done) {\n returnedIterators.delete(iteratorId);\n }\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n const returnCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(\n returnCallbackId,\n async (iteratorId: number, returnValue?: unknown) => {\n const iterator = returnedIterators.get(iteratorId);\n returnedIterators.delete(iteratorId);\n if (!iterator || !iterator.return) {\n return { done: true, value: undefined };\n }\n const result = await iterator.return(returnValue);\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: true,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n }\n );\n\n const throwCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(\n throwCallbackId,\n async (\n iteratorId: number,\n errorValue?: { message?: string; name?: string; stack?: string },\n ) => {\n const iterator = returnedIterators.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n try {\n if (!iterator.throw) {\n throw Object.assign(\n new Error(errorValue?.message ?? \"Iterator does not support throw()\"),\n { name: errorValue?.name ?? \"Error\", stack: errorValue?.stack },\n );\n }\n const thrownError = Object.assign(\n new Error(errorValue?.message ?? \"Iterator throw()\"),\n { name: errorValue?.name ?? \"Error\", stack: errorValue?.stack },\n );\n const result = await iterator.throw(thrownError);\n if (result.done) {\n returnedIterators.delete(iteratorId);\n }\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n } catch (error) {\n returnedIterators.delete(iteratorId);\n throw error;\n }\n },\n );\n\n return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n __throwCallbackId: throwCallbackId,\n };\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => addCallbackIdsToRefs(item));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = addCallbackIdsToRefs(\n (value as Record<string, unknown>)[key]\n );\n }\n return result;\n };\n\n const invokeCallback = async (\n callbackId: number,\n args: unknown[]\n ): Promise<unknown> => {\n const callback = returnedCallbacks.get(callbackId);\n if (!callback) {\n throw new Error(`Local callback ${callbackId} not found`);\n }\n return await callback(...args);\n };\n\n return { createMarshalContext, addCallbackIdsToRefs, invokeCallback };\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Get importer info\n const importerPath = state.moduleToFilename.get(referrer) ?? \"<unknown>\";\n const importerResolveDir = path.posix.dirname(importerPath);\n const importerStack = state.moduleImportChain.get(importerPath) ?? [];\n\n // Resolve relative specifiers to absolute-like paths for cache key uniqueness.\n // This prevents cross-package collisions (e.g. two different packages both importing \"./utils.js\").\n const resolvedSpecifier = specifier.startsWith('.')\n ? path.posix.normalize(path.posix.join(importerResolveDir, specifier))\n : specifier;\n\n // Track who imports this specifier (for error diagnostics)\n state.specifierToImporter.set(resolvedSpecifier, importerPath);\n\n // Static cache first\n const staticCached = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCached) return staticCached;\n\n const cached = state.moduleCache.get(resolvedSpecifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n }\n\n // Invoke module loader - capture full result including static flag\n const result = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\n const { code, resolveDir } = result;\n\n // Validate filename: must be a basename (no slashes)\n if (result.filename.includes('/')) {\n throw new Error(\n `moduleLoader returned a filename with slashes: \"${result.filename}\". ` +\n `filename must be a basename (e.g. \"utils.js\"), not a path.`\n );\n }\n\n // Construct resolved filename using result.filename\n const resolvedFilename = path.posix.join(resolveDir, result.filename);\n\n // Cache by specifier + content hash (allows invalidation when content changes)\n const hash = contentHash(code);\n const cacheKey = `${resolvedSpecifier}:${hash}`;\n const inFlightKey = `${result.static ? \"static\" : \"dynamic\"}:${cacheKey}`;\n\n // Cache checks again after await in case another resolver call won the race\n const staticCachedAfterLoad = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCachedAfterLoad) return staticCachedAfterLoad;\n\n const cachedAfterLoad = state.moduleCache.get(resolvedSpecifier);\n if (cachedAfterLoad) return cachedAfterLoad;\n\n const hashCached = state.moduleCache.get(cacheKey);\n if (hashCached) return hashCached;\n\n const inFlight = state.moduleLoadsInFlight.get(inFlightKey);\n if (inFlight) return inFlight;\n\n const loadPromise = (async (): Promise<ivm.Module> => {\n let mod: ivm.Module | undefined;\n try {\n // Transform cache — check transform cache first (survives reuse in daemon)\n let transformed: TransformResult | undefined = state.transformCache.get(hash);\n if (!transformed) {\n transformed = await transformModuleCode(code, resolvedSpecifier);\n state.transformCache.set(hash, transformed);\n }\n\n if (transformed.sourceMap) {\n state.sourceMaps.set(resolvedSpecifier, transformed.sourceMap);\n }\n\n // Compile the module using resolvedSpecifier as filename\n mod = await state.isolate.compileModule(transformed.code, {\n filename: resolvedSpecifier,\n });\n\n // Track resolved filename for nested imports\n state.moduleToFilename.set(mod, resolvedFilename);\n\n // Track import chain for error diagnostics\n state.moduleImportChain.set(resolvedFilename, [...importerStack, importerPath]);\n\n // Cache the compiled module before linker uses it (supports circular deps)\n if (result.static) {\n state.staticModuleCache.set(resolvedSpecifier, mod);\n } else {\n state.moduleCache.set(resolvedSpecifier, mod);\n state.moduleCache.set(cacheKey, mod);\n }\n\n return mod;\n } catch (err) {\n // Annotate error with module resolution context\n const error = err instanceof Error ? err : new Error(String(err));\n error.message = `Failed to compile module \"${resolvedSpecifier}\" (imported by \"${importerPath}\"):\\n${error.message}`;\n if (importerStack.length > 0) {\n error.message += `\\n\\nImport chain:\\n ${[...importerStack, importerPath].join('\\n -> ')}`;\n }\n\n // Remove partial cache state to avoid returning poisoned module entries later.\n if (mod) {\n state.moduleToFilename.delete(mod);\n if (result.static) {\n if (state.staticModuleCache.get(resolvedSpecifier) === mod) {\n state.staticModuleCache.delete(resolvedSpecifier);\n }\n } else {\n if (state.moduleCache.get(resolvedSpecifier) === mod) {\n state.moduleCache.delete(resolvedSpecifier);\n }\n if (state.moduleCache.get(cacheKey) === mod) {\n state.moduleCache.delete(cacheKey);\n }\n }\n }\n throw error;\n }\n })();\n\n state.moduleLoadsInFlight.set(inFlightKey, loadPromise);\n try {\n return await loadPromise;\n } finally {\n state.moduleLoadsInFlight.delete(inFlightKey);\n }\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (url: string, init: FetchRequestInit): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(url, init));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\n */\nexport async function createRuntime<T extends Record<string, any[]> = Record<string, unknown[]>>(\n options?: RuntimeOptions<T>\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n id,\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n staticModuleCache: new Map(),\n moduleLoadsInFlight: new Map(),\n transformCache: new Map(),\n moduleToFilename: new Map(),\n sourceMaps: new Map(),\n moduleImportChain: new Map(),\n specifierToImporter: new Map(),\n pendingCallbacks: [],\n evalChain: Promise.resolve(),\n executionTimeout: getConfiguredExecutionTimeout(opts.executionTimeout),\n isDisposed: false,\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob) and Buffer\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n const customMarshalOptions =\n opts.customFunctionsMarshalOptions ??\n createLocalCustomFunctionsMarshalOptions();\n\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n customMarshalOptions,\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\"\n ? opts.testEnvironment\n : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(\n context,\n testEnvOptions\n );\n }\n\n // Setup playwright - AFTER test environment so expect can be extended\n if (opts.playwright) {\n if (!opts.playwright.handler) {\n throw new Error(\n \"Playwright configured without handler. Provide playwright.handler in createRuntime options.\"\n );\n }\n\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n stdout: event.stdout,\n location: event.location,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n const playwrightSetupOptions: PlaywrightSetupOptions = {\n handler: opts.playwright.handler,\n timeout: opts.playwright.timeout,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n };\n\n state.handles.playwright = await setupPlaywright(context, playwrightSetupOptions);\n }\n\n const ensureRuntimeUsable = (): void => {\n assertRuntimeUsable(state);\n };\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response> {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.dispatchRequest(request, options);\n },\n getUpgradeRequest() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen(connectionId: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasActiveConnections();\n },\n dispatchClientWebSocketOpen(socketId: string, protocol: string, extensions: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketOpen(socketId, protocol, extensions);\n },\n dispatchClientWebSocketMessage(socketId: string, data: string | ArrayBuffer) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketMessage(socketId, data);\n },\n dispatchClientWebSocketClose(socketId: string, code: number, reason: string, wasClean: boolean) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketClose(socketId, code, reason, wasClean);\n },\n dispatchClientWebSocketError(socketId: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketError(socketId);\n },\n onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onClientWebSocketCommand(callback);\n },\n onEvent(callback: (event: string, payload: unknown) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onEvent(callback);\n },\n dispatchEvent(event: string, payload: unknown) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchEvent(event, payload);\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n ensureRuntimeUsable();\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n ensureRuntimeUsable();\n state.handles.console?.reset();\n },\n getTimers() {\n ensureRuntimeUsable();\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n ensureRuntimeUsable();\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\n ensureRuntimeUsable();\n return state.handles.console?.getGroupDepth() ?? 0;\n },\n };\n\n // Create test environment handle wrapper\n const testEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(timeout?: number): Promise<RunResults> {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n\n const executionTimeout = timeout ?? state.executionTimeout;\n return runWithExecutionTimeout(\n state,\n executionTimeout,\n \"Test\",\n async () => {\n return runTestsInContext(state.context);\n },\n );\n },\n hasTests(): boolean {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return hasTestsInContext(state.context);\n },\n getTestCount(): number {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return getTestCountInContext(state.context);\n },\n reset() {\n ensureRuntimeUsable();\n state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\n ensureRuntimeUsable();\n if (!state.handles.playwright) {\n throw new Error(\n \"Playwright not configured. Provide playwright.handler in createRuntime options.\"\n );\n }\n return {\n browserConsoleLogs: state.handles.playwright.getBrowserConsoleLogs(),\n pageErrors: state.handles.playwright.getPageErrors(),\n networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n requestFailures: state.handles.playwright.getRequestFailures(),\n };\n },\n clearCollectedData() {\n ensureRuntimeUsable();\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\n pendingCallbacks: state.pendingCallbacks,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n async eval(\n code: string,\n filenameOrOptions?: string | EvalOptions\n ): Promise<void> {\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n const executionTimeout = options?.executionTimeout ?? state.executionTimeout;\n\n const runEval = async (): Promise<void> => {\n assertRuntimeUsable(state);\n\n // Normalize filename to absolute path for module resolution\n const filename = normalizeEntryFilename(options?.filename);\n\n try {\n await runWithExecutionTimeout(\n state,\n executionTimeout,\n \"Execution\",\n async () => {\n // Transform entry code: strip types, validate, wrap in async function\n const transformed = await transformEntryCode(code, filename);\n if (transformed.sourceMap) {\n state.sourceMaps.set(filename, transformed.sourceMap);\n }\n\n // Compile as ES module\n const mod = await state.isolate.compileModule(transformed.code, {\n filename,\n });\n\n // Track entry module filename and import chain\n state.moduleToFilename.set(mod, filename);\n state.moduleImportChain.set(filename, []);\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n try {\n await mod.instantiate(state.context, resolver);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Extract failing module specifier and export name from V8 error\n // e.g. \"The requested module './foo' does not provide an export named 'Bar'\"\n const specifierMatch = error.message.match(/The requested module '([^']+)'/);\n const exportMatch = error.message.match(/export named '([^']+)'/);\n const failingSpecifier = specifierMatch?.[1];\n const failingExport = exportMatch?.[1];\n\n // Find which file imports the failing specifier\n const importerFile = failingSpecifier\n ? state.specifierToImporter.get(failingSpecifier)\n : undefined;\n\n // Build the full import chain from entry → importer → failing module\n const details: string[] = [];\n\n if (importerFile) {\n const chain = state.moduleImportChain.get(importerFile) ?? [];\n const fullChain = [...chain, importerFile];\n if (failingSpecifier) fullChain.push(failingSpecifier);\n const trimmed = fullChain.length > 12 ? fullChain.slice(-12) : fullChain;\n const prefix = fullChain.length > 12 ? \" ...\\n\" : \"\";\n details.push(`Import chain:\\n${prefix}${trimmed.map((p) => ` ${p}`).join(\"\\n -> \")}`);\n } else if (failingSpecifier) {\n // Fallback: search moduleImportChain for any path containing the specifier\n for (const [modPath, chain] of state.moduleImportChain) {\n if (modPath.includes(failingSpecifier) || modPath.endsWith(failingSpecifier)) {\n const fullChain = [...chain, modPath];\n const trimmed = fullChain.length > 12 ? fullChain.slice(-12) : fullChain;\n details.push(`Import chain:\\n${trimmed.map((p) => ` ${p}`).join(\"\\n -> \")}`);\n break;\n }\n }\n }\n\n if (failingExport && failingSpecifier) {\n details.push(\n `Hint: If '${failingExport}' is a TypeScript type/interface, use \\`import type\\` to prevent it from being resolved at runtime:\\n` +\n ` import type { ${failingExport} } from '${failingSpecifier}';`\n );\n }\n\n const suffix = details.length > 0 ? \"\\n\\n\" + details.join(\"\\n\\n\") : \"\";\n error.message = `Module instantiation failed: ${error.message}${suffix}`;\n throw error;\n }\n\n await mod.evaluate();\n\n const ns = mod.namespace;\n const runRef = await ns.get(\"default\", { reference: true });\n try {\n await runRef.apply(undefined, [], {\n result: { promise: true },\n });\n } finally {\n runRef.release();\n }\n\n if (state.pendingCallbacks.length > 0) {\n await Promise.all(state.pendingCallbacks);\n state.pendingCallbacks.length = 0;\n }\n },\n );\n } catch (err) {\n const error = err as Error;\n if (error.stack && state.sourceMaps.size > 0) {\n error.stack = mapErrorStack(error.stack, state.sourceMaps);\n }\n throw error;\n }\n };\n\n const queuedEval = state.evalChain.then(runEval, runEval);\n state.evalChain = queuedEval.then(\n () => undefined,\n () => undefined\n );\n return queuedEval;\n },\n\n clearModuleCache() {\n ensureRuntimeUsable();\n state.moduleCache.clear();\n state.moduleLoadsInFlight.clear();\n state.moduleToFilename.clear();\n state.moduleImportChain.clear();\n state.specifierToImporter.clear();\n state.sourceMaps.clear();\n // staticModuleCache and transformCache intentionally preserved\n },\n\n async dispose(): Promise<void> {\n await disposeRuntimeState(state);\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"../core/index.cjs\";\nexport type { CoreHandle, SetupCoreOptions } from \"../core/index.cjs\";\n\nexport { setupConsole } from \"../console/index.cjs\";\nexport {\n simpleConsoleHandler,\n type SimpleConsoleCallbacks,\n} from \"../console/utils.cjs\";\nexport type {\n ConsoleHandle,\n ConsoleOptions,\n ConsoleEntry as ConsoleEntryFromConsole,\n} from \"../console/index.cjs\";\n\nexport { setupCrypto } from \"../crypto/index.cjs\";\nexport type { CryptoHandle } from \"../crypto/index.cjs\";\n\nexport { setupEncoding } from \"../encoding/index.cjs\";\nexport type { EncodingHandle } from \"../encoding/index.cjs\";\n\nexport { setupFetch } from \"../fetch/index.cjs\";\nexport type {\n FetchHandle,\n FetchOptions,\n WebSocketCommand,\n UpgradeRequest,\n ClientWebSocketCommand,\n} from \"../fetch/index.cjs\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"../fs/index.cjs\";\nexport type {\n FsHandle,\n FsOptions,\n FileSystemHandler,\n NodeFileSystemHandlerOptions,\n} from \"../fs/index.cjs\";\n\nexport { setupPath } from \"../path/index.cjs\";\nexport type { PathHandle, PathOptions } from \"../path/index.cjs\";\n\nexport { setupTimers } from \"../timers/index.cjs\";\nexport type { TimersHandle } from \"../timers/index.cjs\";\n\nexport {\n setupTestEnvironment,\n runTests,\n hasTests,\n getTestCount,\n} from \"../test-environment/index.cjs\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"../test-environment/index.cjs\";\n\nexport {\n setupPlaywright,\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n} from \"../playwright/index.cjs\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n} from \"../playwright/index.cjs\";\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "C038E2F2DDE69DFD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -36,7 +36,7 @@ var __export = (target, all) => {
|
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// src/internal/server/index.ts
|
|
40
40
|
var exports_server = {};
|
|
41
41
|
__export(exports_server, {
|
|
42
42
|
IsolateServer: () => IsolateServer
|
|
@@ -220,4 +220,4 @@ class IsolateServer {
|
|
|
220
220
|
}
|
|
221
221
|
}
|
|
222
222
|
|
|
223
|
-
//# debugId=
|
|
223
|
+
//# debugId=92DF47A502A2457564756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import type {\n DaemonConnection,\n DispatchOptions,\n RemoteRuntime,\n RuntimeOptions,\n UpgradeRequest,\n WebSocketCommand,\n} from \"../client/index.cjs\";\nimport { isBenignDisposeError } from \"../client/index.cjs\";\n\nconst LINKER_CONFLICT_ERROR = \"Module is currently being linked by another linker\";\n\nfunction isLinkerConflictError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.includes(LINKER_CONFLICT_ERROR);\n}\n\nexport interface IsolateServerOptions {\n namespaceId: string;\n getConnection: () => Promise<DaemonConnection>;\n}\n\nexport interface IsolateServerStartOptions {\n runtimeOptions: RuntimeOptions;\n entry: string;\n entryFilename?: string;\n onWebSocketCommand?: (cmd: WebSocketCommand) => void;\n}\n\nexport interface IsolateServerFetch {\n dispatchRequest(request: Request, options?: DispatchOptions): Promise<Response>;\n getUpgradeRequest(): Promise<UpgradeRequest | null>;\n dispatchWebSocketOpen(connectionId: string): Promise<void>;\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): Promise<void>;\n dispatchWebSocketClose(connectionId: string, code: number, reason: string): Promise<void>;\n dispatchWebSocketError(connectionId: string, error: Error): Promise<void>;\n hasServeHandler(): Promise<boolean>;\n hasActiveConnections(): Promise<boolean>;\n}\n\nexport class IsolateServer {\n private readonly namespaceId: string;\n private readonly getConnection: () => Promise<DaemonConnection>;\n private runtime: RemoteRuntime | null = null;\n private lastStartOptions: IsolateServerStartOptions | null = null;\n private lifecycleLock: Promise<void> = Promise.resolve();\n private closed = true;\n\n readonly fetch: IsolateServerFetch = {\n dispatchRequest: (request, options) => this.dispatchRequestWithRetry(request, options),\n getUpgradeRequest: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen: async (connectionId) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage: async (connectionId, message) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose: async (connectionId, code, reason) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError: async (connectionId, error) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketError(connectionId, error);\n },\n hasServeHandler: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.hasServeHandler();\n },\n hasActiveConnections: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.hasActiveConnections();\n },\n };\n\n constructor(options: IsolateServerOptions) {\n this.namespaceId = options.namespaceId;\n this.getConnection = options.getConnection;\n }\n\n async start(options: IsolateServerStartOptions): Promise<void> {\n this.lastStartOptions = options;\n this.closed = false;\n\n await this.withLifecycleLock(async () => {\n if (this.runtime) {\n return;\n }\n\n this.runtime = await this.createAndInitializeRuntime(options);\n });\n }\n\n async reload(): Promise<void> {\n const startOptions = this.lastStartOptions;\n if (!startOptions) {\n throw new Error(\"Server not configured. Call start() first.\");\n }\n\n this.closed = false;\n await this.withLifecycleLock(async () => {\n if (this.runtime) {\n const runtime = this.runtime;\n this.runtime = null;\n await this.disposeRuntime(runtime, {\n hard: true,\n reason: \"IsolateServer.reload()\",\n });\n }\n\n this.runtime = await this.createAndInitializeRuntime(startOptions);\n });\n }\n\n async close(): Promise<void> {\n await this.withLifecycleLock(async () => {\n if (this.runtime) {\n const runtime = this.runtime;\n this.runtime = null;\n await this.disposeRuntime(runtime);\n }\n\n this.closed = true;\n });\n }\n\n getRuntime(): RemoteRuntime | null {\n return this.runtime;\n }\n\n private async withLifecycleLock<T>(operation: () => Promise<T>): Promise<T> {\n const previous = this.lifecycleLock;\n let release!: () => void;\n this.lifecycleLock = new Promise<void>((resolve) => {\n release = resolve;\n });\n\n await previous;\n try {\n return await operation();\n } finally {\n release();\n }\n }\n\n private buildRuntimeOptions(options: IsolateServerStartOptions): RuntimeOptions {\n if (options.onWebSocketCommand) {\n return {\n ...options.runtimeOptions,\n onWebSocketCommand: options.onWebSocketCommand,\n };\n }\n\n return options.runtimeOptions;\n }\n\n private async createAndInitializeRuntime(\n options: IsolateServerStartOptions,\n allowRetry: boolean = true\n ): Promise<RemoteRuntime> {\n const connection = await this.getConnection();\n const namespace = connection.createNamespace(this.namespaceId);\n const runtimeOptions = this.buildRuntimeOptions(options);\n const runtime = await namespace.createRuntime(runtimeOptions);\n\n try {\n await runtime.eval(\n `import ${JSON.stringify(options.entry)};`,\n options.entryFilename ?? \"/isolate_server_entry.js\"\n );\n return runtime;\n } catch (error) {\n await this.disposeRuntime(runtime);\n if (!allowRetry || !isLinkerConflictError(error)) {\n throw error;\n }\n\n const retryRuntime = await namespace.createRuntime(runtimeOptions);\n try {\n await retryRuntime.eval(\n `import ${JSON.stringify(options.entry)};`,\n options.entryFilename ?? \"/isolate_server_entry.js\"\n );\n return retryRuntime;\n } catch (retryError) {\n await this.disposeRuntime(retryRuntime);\n throw retryError;\n }\n }\n }\n\n private async disposeRuntime(\n runtime: RemoteRuntime,\n options?: { hard?: boolean; reason?: string }\n ): Promise<void> {\n try {\n await runtime.dispose(options);\n } catch (error) {\n if (!isBenignDisposeError(error)) {\n throw error;\n }\n }\n }\n\n private async ensureStarted(): Promise<void> {\n if (this.runtime) {\n return;\n }\n\n if (!this.lastStartOptions) {\n throw new Error(\"Server not configured. Call start() first.\");\n }\n\n if (this.closed) {\n this.closed = false;\n }\n\n await this.start(this.lastStartOptions);\n }\n\n private async getActiveRuntime(): Promise<RemoteRuntime> {\n await this.ensureStarted();\n if (!this.runtime) {\n throw new Error(\"Server runtime failed to start.\");\n }\n return this.runtime;\n }\n\n private async dispatchRequestWithRetry(\n request: Request,\n options?: DispatchOptions\n ): Promise<Response> {\n const runtime = await this.getActiveRuntime();\n try {\n return await runtime.fetch.dispatchRequest(request, options);\n } catch (error) {\n if (!isLinkerConflictError(error)) {\n throw error;\n }\n\n await this.reload();\n const retryRuntime = await this.getActiveRuntime();\n return retryRuntime.fetch.dispatchRequest(request, options);\n }\n }\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "92DF47A502A2457564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -60,7 +60,7 @@ var __export = (target, all) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// src/internal/test-environment/index.ts
|
|
64
64
|
var exports_test_environment = {};
|
|
65
65
|
__export(exports_test_environment, {
|
|
66
66
|
setupTestEnvironment: () => setupTestEnvironment,
|
|
@@ -1412,4 +1412,4 @@ function getTestCount(context) {
|
|
|
1412
1412
|
return context.evalSync("__getTestCount()");
|
|
1413
1413
|
}
|
|
1414
1414
|
|
|
1415
|
-
//# debugId=
|
|
1415
|
+
//# debugId=542BC6119019237B64756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import type ivm from \"isolated-vm\";\nimport IsolatedVM from \"isolated-vm\";\n\n// ============================================================\n// Test Environment Options\n// ============================================================\n\nexport interface TestEnvironmentOptions {\n /** Receive test lifecycle events */\n onEvent?: (event: TestEvent) => void;\n /** Timeout for individual tests (ms) */\n testTimeout?: number;\n}\n\n// ============================================================\n// Event Types (discriminated union)\n// ============================================================\n\nexport type TestEvent =\n | { type: \"runStart\"; testCount: number; suiteCount: number }\n | { type: \"suiteStart\"; suite: SuiteInfo }\n | { type: \"suiteEnd\"; suite: SuiteResult }\n | { type: \"testStart\"; test: TestInfo }\n | { type: \"testEnd\"; test: TestResult }\n | { type: \"runEnd\"; results: RunResults };\n\n// ============================================================\n// Suite Types\n// ============================================================\n\nexport interface SuiteInfo {\n name: string;\n /** Ancestry path: [\"outer\", \"inner\"] */\n path: string[];\n /** Full display name: \"outer > inner\" */\n fullName: string;\n /** Nesting depth (0 for root-level suites) */\n depth: number;\n}\n\nexport interface SuiteResult extends SuiteInfo {\n passed: number;\n failed: number;\n skipped: number;\n todo: number;\n duration: number;\n}\n\n// ============================================================\n// Test Types\n// ============================================================\n\nexport interface TestInfo {\n name: string;\n /** Suite ancestry */\n suitePath: string[];\n /** Full display name: \"suite > test name\" */\n fullName: string;\n}\n\nexport interface TestResult extends TestInfo {\n status: \"pass\" | \"fail\" | \"skip\" | \"todo\";\n duration: number;\n error?: TestError;\n}\n\nexport interface TestError {\n message: string;\n stack?: string;\n /** For assertion failures */\n expected?: unknown;\n actual?: unknown;\n /** e.g., \"toBe\", \"toEqual\", \"toContain\" */\n matcherName?: string;\n}\n\n// ============================================================\n// Run Results\n// ============================================================\n\nexport interface RunResults {\n passed: number;\n failed: number;\n skipped: number;\n todo: number;\n total: number;\n duration: number;\n success: boolean;\n suites: SuiteResult[];\n tests: TestResult[];\n}\n\n// ============================================================\n// Handle Interface\n// ============================================================\n\nexport interface TestEnvironmentHandle {\n dispose(): void;\n}\n\nconst testEnvironmentCode = `\n(function() {\n // ============================================================\n // Internal State\n // ============================================================\n\n // Mock registry and call counter\n let __mockCallOrder = 0;\n const __mockRegistry = [];\n\n // Assertion counting state\n let __expectedAssertions = null;\n let __assertionCount = 0;\n let __hasAssertionsFlag = false;\n\n function createMockState() {\n return {\n calls: [],\n results: [],\n contexts: [],\n instances: [],\n invocationCallOrder: [],\n lastCall: undefined,\n };\n }\n\n function createSuite(name, skip = false, only = false) {\n return {\n name,\n tests: [],\n children: [],\n beforeAll: [],\n afterAll: [],\n beforeEach: [],\n afterEach: [],\n skip,\n only,\n };\n }\n\n const rootSuite = createSuite('root');\n let currentSuite = rootSuite;\n const suiteStack = [rootSuite];\n\n // Event callback (set from host)\n let eventCallback = null;\n\n function emitEvent(event) {\n if (eventCallback) {\n try {\n eventCallback(JSON.stringify(event));\n } catch (e) {\n // Ignore callback errors\n }\n }\n }\n\n // ============================================================\n // TestError class for rich error info\n // ============================================================\n\n class TestError extends Error {\n constructor(message, matcherName, expected, actual) {\n super(message);\n this.name = 'TestError';\n this.matcherName = matcherName;\n this.expected = expected;\n this.actual = actual;\n }\n }\n\n // ============================================================\n // Asymmetric Matcher Infrastructure\n // ============================================================\n\n const ASYMMETRIC_MATCHER = Symbol('asymmetricMatcher');\n\n function isAsymmetricMatcher(obj) {\n return obj && obj[ASYMMETRIC_MATCHER] === true;\n }\n\n // Deep equality with asymmetric matcher support\n function asymmetricDeepEqual(a, b) {\n if (isAsymmetricMatcher(b)) return b.asymmetricMatch(a);\n if (isAsymmetricMatcher(a)) return a.asymmetricMatch(b);\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!asymmetricDeepEqual(a[key], b[key])) return false;\n }\n return true;\n }\n\n // ============================================================\n // Deep Equality Helper\n // ============================================================\n\n function deepEqual(a, b) {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || b === null) return false;\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n return true;\n }\n\n function strictDeepEqual(a, b) {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || b === null) return false;\n\n // Check prototypes\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false;\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n // For arrays, check sparse arrays (holes)\n if (Array.isArray(a)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const aHasIndex = i in a;\n const bHasIndex = i in b;\n if (aHasIndex !== bHasIndex) return false;\n if (aHasIndex && !strictDeepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n // Check for undefined properties vs missing properties\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!strictDeepEqual(a[key], b[key])) return false;\n }\n\n // Check for symbol properties\n const symbolsA = Object.getOwnPropertySymbols(a);\n const symbolsB = Object.getOwnPropertySymbols(b);\n if (symbolsA.length !== symbolsB.length) return false;\n\n for (const sym of symbolsA) {\n if (!symbolsB.includes(sym)) return false;\n if (!strictDeepEqual(a[sym], b[sym])) return false;\n }\n\n return true;\n }\n\n function getNestedProperty(obj, path) {\n const parts = path.split('.');\n let current = obj;\n for (const part of parts) {\n if (current == null || !(part in current)) {\n return { exists: false };\n }\n current = current[part];\n }\n return { exists: true, value: current };\n }\n\n function formatValue(val) {\n if (val === null) return 'null';\n if (val === undefined) return 'undefined';\n if (typeof val === 'string') return JSON.stringify(val);\n if (typeof val === 'object') {\n try {\n return JSON.stringify(val);\n } catch {\n return String(val);\n }\n }\n return String(val);\n }\n\n // ============================================================\n // expect() Implementation\n // ============================================================\n\n function expect(actual) {\n function createMatchers(negated = false) {\n const assert = (condition, message, matcherName, expected) => {\n __assertionCount++;\n const pass = negated ? !condition : condition;\n if (!pass) {\n throw new TestError(message, matcherName, expected, actual);\n }\n };\n\n const matchers = {\n toBe(expected) {\n assert(\n actual === expected,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to be \\${formatValue(expected)}\\`,\n 'toBe',\n expected\n );\n },\n\n toEqual(expected) {\n assert(\n asymmetricDeepEqual(actual, expected),\n negated\n ? \\`Expected \\${formatValue(actual)} not to equal \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to equal \\${formatValue(expected)}\\`,\n 'toEqual',\n expected\n );\n },\n\n toStrictEqual(expected) {\n assert(\n strictDeepEqual(actual, expected),\n negated\n ? \\`Expected \\${formatValue(actual)} not to strictly equal \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to strictly equal \\${formatValue(expected)}\\`,\n 'toStrictEqual',\n expected\n );\n },\n\n toBeTruthy() {\n assert(\n !!actual,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be truthy\\`\n : \\`Expected \\${formatValue(actual)} to be truthy\\`,\n 'toBeTruthy',\n true\n );\n },\n\n toBeFalsy() {\n assert(\n !actual,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be falsy\\`\n : \\`Expected \\${formatValue(actual)} to be falsy\\`,\n 'toBeFalsy',\n false\n );\n },\n\n toBeNull() {\n assert(\n actual === null,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be null\\`\n : \\`Expected \\${formatValue(actual)} to be null\\`,\n 'toBeNull',\n null\n );\n },\n\n toBeUndefined() {\n assert(\n actual === undefined,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be undefined\\`\n : \\`Expected \\${formatValue(actual)} to be undefined\\`,\n 'toBeUndefined',\n undefined\n );\n },\n\n toBeDefined() {\n assert(\n actual !== undefined,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be defined\\`\n : \\`Expected \\${formatValue(actual)} to be defined\\`,\n 'toBeDefined',\n 'defined'\n );\n },\n\n toContain(item) {\n let contains = false;\n if (Array.isArray(actual)) {\n contains = actual.includes(item);\n } else if (typeof actual === 'string') {\n contains = actual.includes(item);\n }\n assert(\n contains,\n negated\n ? \\`Expected \\${formatValue(actual)} not to contain \\${formatValue(item)}\\`\n : \\`Expected \\${formatValue(actual)} to contain \\${formatValue(item)}\\`,\n 'toContain',\n item\n );\n },\n\n toThrow(expected) {\n if (typeof actual !== 'function') {\n throw new Error('toThrow requires a function');\n }\n\n let threw = false;\n let error = null;\n try {\n actual();\n } catch (e) {\n threw = true;\n error = e;\n }\n\n if (expected !== undefined) {\n const matches = threw && (\n (typeof expected === 'string' && error.message.includes(expected)) ||\n (expected instanceof RegExp && expected.test(error.message)) ||\n (typeof expected === 'function' && error instanceof expected)\n );\n assert(\n matches,\n negated\n ? \\`Expected function not to throw \\${formatValue(expected)}\\`\n : \\`Expected function to throw \\${formatValue(expected)}, but \\${threw ? \\`threw: \\${error.message}\\` : 'did not throw'}\\`,\n 'toThrow',\n expected\n );\n } else {\n assert(\n threw,\n negated\n ? \\`Expected function not to throw\\`\n : \\`Expected function to throw\\`,\n 'toThrow',\n 'any error'\n );\n }\n },\n\n toBeInstanceOf(cls) {\n assert(\n actual instanceof cls,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be instance of \\${cls.name || cls}\\`\n : \\`Expected \\${formatValue(actual)} to be instance of \\${cls.name || cls}\\`,\n 'toBeInstanceOf',\n cls.name || cls\n );\n },\n\n toHaveLength(length) {\n const actualLength = actual?.length;\n assert(\n actualLength === length,\n negated\n ? \\`Expected length not to be \\${length}, but got \\${actualLength}\\`\n : \\`Expected length to be \\${length}, but got \\${actualLength}\\`,\n 'toHaveLength',\n length\n );\n },\n\n toMatch(pattern) {\n let matches = false;\n if (typeof pattern === 'string') {\n matches = actual.includes(pattern);\n } else if (pattern instanceof RegExp) {\n matches = pattern.test(actual);\n }\n assert(\n matches,\n negated\n ? \\`Expected \\${formatValue(actual)} not to match \\${pattern}\\`\n : \\`Expected \\${formatValue(actual)} to match \\${pattern}\\`,\n 'toMatch',\n pattern\n );\n },\n\n toHaveProperty(path, value) {\n const prop = getNestedProperty(actual, path);\n const hasProperty = prop.exists;\n const valueMatches = arguments.length < 2 || asymmetricDeepEqual(prop.value, value);\n\n assert(\n hasProperty && valueMatches,\n negated\n ? \\`Expected \\${formatValue(actual)} not to have property \\${path}\\${arguments.length >= 2 ? \\` with value \\${formatValue(value)}\\` : ''}\\`\n : \\`Expected \\${formatValue(actual)} to have property \\${path}\\${arguments.length >= 2 ? \\` with value \\${formatValue(value)}\\` : ''}\\`,\n 'toHaveProperty',\n arguments.length >= 2 ? { path, value } : { path }\n );\n },\n\n toBeGreaterThan(expected) {\n assert(\n actual > expected,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be greater than \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to be greater than \\${formatValue(expected)}\\`,\n 'toBeGreaterThan',\n expected\n );\n },\n\n toBeGreaterThanOrEqual(expected) {\n assert(\n actual >= expected,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be greater than or equal to \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to be greater than or equal to \\${formatValue(expected)}\\`,\n 'toBeGreaterThanOrEqual',\n expected\n );\n },\n\n toBeLessThan(expected) {\n assert(\n actual < expected,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be less than \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to be less than \\${formatValue(expected)}\\`,\n 'toBeLessThan',\n expected\n );\n },\n\n toBeLessThanOrEqual(expected) {\n assert(\n actual <= expected,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be less than or equal to \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to be less than or equal to \\${formatValue(expected)}\\`,\n 'toBeLessThanOrEqual',\n expected\n );\n },\n\n toBeCloseTo(expected, numDigits = 2) {\n const precision = Math.pow(10, -numDigits) / 2;\n const pass = Math.abs(actual - expected) < precision;\n assert(\n pass,\n negated\n ? \\`Expected \\${formatValue(actual)} not to be close to \\${formatValue(expected)} (precision: \\${numDigits} digits)\\`\n : \\`Expected \\${formatValue(actual)} to be close to \\${formatValue(expected)} (precision: \\${numDigits} digits)\\`,\n 'toBeCloseTo',\n expected\n );\n },\n\n toBeNaN() {\n assert(\n Number.isNaN(actual),\n negated\n ? \\`Expected \\${formatValue(actual)} not to be NaN\\`\n : \\`Expected \\${formatValue(actual)} to be NaN\\`,\n 'toBeNaN',\n NaN\n );\n },\n\n toMatchObject(expected) {\n function matchesObject(obj, pattern) {\n if (isAsymmetricMatcher(pattern)) return pattern.asymmetricMatch(obj);\n if (typeof pattern !== 'object' || pattern === null) return obj === pattern;\n if (typeof obj !== 'object' || obj === null) return false;\n for (const key of Object.keys(pattern)) {\n if (!(key in obj)) return false;\n if (!matchesObject(obj[key], pattern[key])) return false;\n }\n return true;\n }\n assert(\n matchesObject(actual, expected),\n negated\n ? \\`Expected \\${formatValue(actual)} not to match object \\${formatValue(expected)}\\`\n : \\`Expected \\${formatValue(actual)} to match object \\${formatValue(expected)}\\`,\n 'toMatchObject',\n expected\n );\n },\n\n toContainEqual(item) {\n const contains = Array.isArray(actual) && actual.some(el => asymmetricDeepEqual(el, item));\n assert(\n contains,\n negated\n ? \\`Expected array not to contain equal \\${formatValue(item)}\\`\n : \\`Expected array to contain equal \\${formatValue(item)}\\`,\n 'toContainEqual',\n item\n );\n },\n\n toBeTypeOf(expectedType) {\n const actualType = typeof actual;\n assert(\n actualType === expectedType,\n negated\n ? \\`Expected typeof \\${formatValue(actual)} not to be \"\\${expectedType}\"\\`\n : \\`Expected typeof \\${formatValue(actual)} to be \"\\${expectedType}\", got \"\\${actualType}\"\\`,\n 'toBeTypeOf',\n expectedType\n );\n },\n\n // Mock matchers\n toHaveBeenCalled() {\n if (!actual.__isMockFunction) throw new Error('toHaveBeenCalled requires a mock function');\n assert(actual.mock.calls.length > 0,\n negated ? \\`Expected mock not to have been called\\` : \\`Expected mock to have been called\\`,\n 'toHaveBeenCalled', 'called');\n },\n\n toHaveBeenCalledTimes(n) {\n if (!actual.__isMockFunction) throw new Error('toHaveBeenCalledTimes requires a mock function');\n assert(actual.mock.calls.length === n,\n negated ? \\`Expected mock not to have been called \\${n} times\\`\n : \\`Expected mock to be called \\${n} times, got \\${actual.mock.calls.length}\\`,\n 'toHaveBeenCalledTimes', n);\n },\n\n toHaveBeenCalledWith(...expectedArgs) {\n if (!actual.__isMockFunction) throw new Error('toHaveBeenCalledWith requires a mock function');\n const match = actual.mock.calls.some(args => asymmetricDeepEqual(args, expectedArgs));\n assert(match,\n negated ? \\`Expected mock not to have been called with \\${formatValue(expectedArgs)}\\`\n : \\`Expected mock to have been called with \\${formatValue(expectedArgs)}\\`,\n 'toHaveBeenCalledWith', expectedArgs);\n },\n\n toHaveBeenLastCalledWith(...expectedArgs) {\n if (!actual.__isMockFunction) throw new Error('toHaveBeenLastCalledWith requires a mock function');\n assert(actual.mock.lastCall && asymmetricDeepEqual(actual.mock.lastCall, expectedArgs),\n negated ? \\`Expected last call not to be \\${formatValue(expectedArgs)}\\`\n : \\`Expected last call to be \\${formatValue(expectedArgs)}, got \\${formatValue(actual.mock.lastCall)}\\`,\n 'toHaveBeenLastCalledWith', expectedArgs);\n },\n\n toHaveBeenNthCalledWith(n, ...expectedArgs) {\n if (!actual.__isMockFunction) throw new Error('toHaveBeenNthCalledWith requires a mock function');\n const nthCall = actual.mock.calls[n - 1];\n assert(nthCall && asymmetricDeepEqual(nthCall, expectedArgs),\n negated ? \\`Expected call \\${n} not to be \\${formatValue(expectedArgs)}\\`\n : \\`Expected call \\${n} to be \\${formatValue(expectedArgs)}, got \\${formatValue(nthCall)}\\`,\n 'toHaveBeenNthCalledWith', expectedArgs);\n },\n\n toHaveReturned() {\n if (!actual.__isMockFunction) throw new Error('toHaveReturned requires a mock function');\n const hasReturned = actual.mock.results.some(r => r.type === 'return');\n assert(hasReturned,\n negated ? \\`Expected mock not to have returned\\` : \\`Expected mock to have returned\\`,\n 'toHaveReturned', 'returned');\n },\n\n toHaveReturnedWith(value) {\n if (!actual.__isMockFunction) throw new Error('toHaveReturnedWith requires a mock function');\n const match = actual.mock.results.some(r => r.type === 'return' && asymmetricDeepEqual(r.value, value));\n assert(match,\n negated ? \\`Expected mock not to have returned \\${formatValue(value)}\\`\n : \\`Expected mock to have returned \\${formatValue(value)}\\`,\n 'toHaveReturnedWith', value);\n },\n\n toHaveLastReturnedWith(value) {\n if (!actual.__isMockFunction) throw new Error('toHaveLastReturnedWith requires a mock function');\n const returns = actual.mock.results.filter(r => r.type === 'return');\n const last = returns[returns.length - 1];\n assert(last && asymmetricDeepEqual(last.value, value),\n negated ? \\`Expected last return not to be \\${formatValue(value)}\\`\n : \\`Expected last return to be \\${formatValue(value)}, got \\${formatValue(last?.value)}\\`,\n 'toHaveLastReturnedWith', value);\n },\n\n toHaveReturnedTimes(n) {\n if (!actual.__isMockFunction) throw new Error('toHaveReturnedTimes requires a mock function');\n const returnCount = actual.mock.results.filter(r => r.type === 'return').length;\n assert(returnCount === n,\n negated ? \\`Expected mock not to have returned \\${n} times\\`\n : \\`Expected mock to have returned \\${n} times, got \\${returnCount}\\`,\n 'toHaveReturnedTimes', n);\n },\n\n toHaveNthReturnedWith(n, value) {\n if (!actual.__isMockFunction) throw new Error('toHaveNthReturnedWith requires a mock function');\n const returns = actual.mock.results.filter(r => r.type === 'return');\n const nthReturn = returns[n - 1];\n assert(nthReturn && asymmetricDeepEqual(nthReturn.value, value),\n negated ? \\`Expected return \\${n} not to be \\${formatValue(value)}\\`\n : \\`Expected return \\${n} to be \\${formatValue(value)}, got \\${formatValue(nthReturn?.value)}\\`,\n 'toHaveNthReturnedWith', value);\n },\n };\n\n return matchers;\n }\n\n const matchers = createMatchers(false);\n matchers.not = createMatchers(true);\n\n // Promise matchers using Proxy\n matchers.resolves = new Proxy({}, {\n get(_, matcherName) {\n if (matcherName === 'not') {\n return new Proxy({}, {\n get(_, negatedMatcherName) {\n return async (...args) => {\n const result = await actual;\n return expect(result).not[negatedMatcherName](...args);\n };\n }\n });\n }\n return async (...args) => {\n const result = await actual;\n return expect(result)[matcherName](...args);\n };\n }\n });\n\n matchers.rejects = new Proxy({}, {\n get(_, matcherName) {\n if (matcherName === 'not') {\n return new Proxy({}, {\n get(_, negatedMatcherName) {\n return async (...args) => {\n let error;\n try {\n await actual;\n throw new TestError('Expected promise to reject', 'rejects', 'rejection', undefined);\n } catch (e) {\n if (e instanceof TestError && e.matcherName === 'rejects') throw e;\n error = e;\n }\n return expect(error).not[negatedMatcherName](...args);\n };\n }\n });\n }\n return async (...args) => {\n let error;\n try {\n await actual;\n throw new TestError('Expected promise to reject', 'rejects', 'rejection', undefined);\n } catch (e) {\n if (e instanceof TestError && e.matcherName === 'rejects') throw e;\n error = e;\n }\n return expect(error)[matcherName](...args);\n };\n }\n });\n\n return matchers;\n }\n\n // Asymmetric matcher implementations\n expect.anything = () => ({\n [ASYMMETRIC_MATCHER]: true,\n asymmetricMatch: (other) => other !== null && other !== undefined,\n toString: () => 'anything()',\n });\n\n expect.any = (constructor) => ({\n [ASYMMETRIC_MATCHER]: true,\n asymmetricMatch: (other) => {\n if (constructor === String) return typeof other === 'string' || other instanceof String;\n if (constructor === Number) return typeof other === 'number' || other instanceof Number;\n if (constructor === Boolean) return typeof other === 'boolean' || other instanceof Boolean;\n if (constructor === Function) return typeof other === 'function';\n if (constructor === Object) return typeof other === 'object' && other !== null;\n if (constructor === Array) return Array.isArray(other);\n return other instanceof constructor;\n },\n toString: () => \\`any(\\${constructor.name || constructor})\\`,\n });\n\n expect.stringContaining = (str) => ({\n [ASYMMETRIC_MATCHER]: true,\n asymmetricMatch: (other) => typeof other === 'string' && other.includes(str),\n toString: () => \\`stringContaining(\"\\${str}\")\\`,\n });\n\n expect.stringMatching = (pattern) => ({\n [ASYMMETRIC_MATCHER]: true,\n asymmetricMatch: (other) => {\n if (typeof other !== 'string') return false;\n return typeof pattern === 'string' ? other.includes(pattern) : pattern.test(other);\n },\n toString: () => \\`stringMatching(\\${pattern})\\`,\n });\n\n expect.arrayContaining = (expected) => ({\n [ASYMMETRIC_MATCHER]: true,\n asymmetricMatch: (other) => {\n if (!Array.isArray(other)) return false;\n return expected.every(exp => other.some(item => asymmetricDeepEqual(item, exp)));\n },\n toString: () => \\`arrayContaining(\\${formatValue(expected)})\\`,\n });\n\n expect.objectContaining = (expected) => ({\n [ASYMMETRIC_MATCHER]: true,\n asymmetricMatch: (other) => {\n if (typeof other !== 'object' || other === null) return false;\n for (const key of Object.keys(expected)) {\n if (!(key in other)) return false;\n if (!asymmetricDeepEqual(other[key], expected[key])) return false;\n }\n return true;\n },\n toString: () => \\`objectContaining(\\${formatValue(expected)})\\`,\n });\n\n // Assertion counting\n expect.assertions = (n) => {\n __expectedAssertions = n;\n };\n\n expect.hasAssertions = () => {\n __hasAssertionsFlag = true;\n };\n\n // ============================================================\n // Test Registration Functions\n // ============================================================\n\n function describe(name, fn) {\n const suite = createSuite(name);\n currentSuite.children.push(suite);\n\n const parentSuite = currentSuite;\n currentSuite = suite;\n suiteStack.push(suite);\n\n fn();\n\n suiteStack.pop();\n currentSuite = parentSuite;\n }\n\n describe.skip = function(name, fn) {\n const suite = createSuite(name, true, false);\n currentSuite.children.push(suite);\n\n const parentSuite = currentSuite;\n currentSuite = suite;\n suiteStack.push(suite);\n\n fn();\n\n suiteStack.pop();\n currentSuite = parentSuite;\n };\n\n describe.only = function(name, fn) {\n const suite = createSuite(name, false, true);\n currentSuite.children.push(suite);\n\n const parentSuite = currentSuite;\n currentSuite = suite;\n suiteStack.push(suite);\n\n fn();\n\n suiteStack.pop();\n currentSuite = parentSuite;\n };\n\n function test(name, fn) {\n currentSuite.tests.push({\n name,\n fn,\n skip: false,\n only: false,\n });\n }\n\n test.skip = function(name, fn) {\n currentSuite.tests.push({\n name,\n fn,\n skip: true,\n only: false,\n });\n };\n\n test.only = function(name, fn) {\n currentSuite.tests.push({\n name,\n fn,\n skip: false,\n only: true,\n });\n };\n\n test.todo = function(name) {\n currentSuite.tests.push({\n name,\n fn: null,\n skip: false,\n only: false,\n todo: true,\n });\n };\n\n const it = test;\n it.skip = test.skip;\n it.only = test.only;\n it.todo = test.todo;\n\n // ============================================================\n // Lifecycle Hooks\n // ============================================================\n\n function beforeEach(fn) {\n currentSuite.beforeEach.push(fn);\n }\n\n function afterEach(fn) {\n currentSuite.afterEach.push(fn);\n }\n\n function beforeAll(fn) {\n currentSuite.beforeAll.push(fn);\n }\n\n function afterAll(fn) {\n currentSuite.afterAll.push(fn);\n }\n\n // ============================================================\n // Mock Implementation\n // ============================================================\n\n const mock = {\n fn(implementation) {\n const mockState = createMockState();\n let defaultImpl = implementation;\n const onceImpls = [];\n const onceReturns = [];\n let returnVal, resolvedVal, rejectedVal;\n let returnSet = false, resolvedSet = false, rejectedSet = false;\n\n function mockFn(...args) {\n mockState.calls.push(args);\n mockState.contexts.push(this);\n mockState.lastCall = args;\n mockState.invocationCallOrder.push(++__mockCallOrder);\n\n let result;\n try {\n if (onceImpls.length > 0) {\n result = onceImpls.shift().apply(this, args);\n } else if (onceReturns.length > 0) {\n result = onceReturns.shift();\n } else if (returnSet) {\n result = returnVal;\n } else if (resolvedSet) {\n result = Promise.resolve(resolvedVal);\n } else if (rejectedSet) {\n result = Promise.reject(rejectedVal);\n } else if (defaultImpl) {\n result = defaultImpl.apply(this, args);\n }\n mockState.results.push({ type: 'return', value: result });\n return result;\n } catch (e) {\n mockState.results.push({ type: 'throw', value: e });\n throw e;\n }\n }\n\n mockFn.__isMockFunction = true;\n mockFn.mock = mockState;\n\n // Configuration methods\n mockFn.mockReturnValue = (v) => { returnVal = v; returnSet = true; return mockFn; };\n mockFn.mockReturnValueOnce = (v) => { onceReturns.push(v); return mockFn; };\n mockFn.mockResolvedValue = (v) => { resolvedVal = v; resolvedSet = true; return mockFn; };\n mockFn.mockRejectedValue = (v) => { rejectedVal = v; rejectedSet = true; return mockFn; };\n mockFn.mockImplementation = (fn) => { defaultImpl = fn; return mockFn; };\n mockFn.mockImplementationOnce = (fn) => { onceImpls.push(fn); return mockFn; };\n\n // Clearing methods\n mockFn.mockClear = () => {\n mockState.calls = []; mockState.results = []; mockState.contexts = [];\n mockState.instances = []; mockState.invocationCallOrder = []; mockState.lastCall = undefined;\n return mockFn;\n };\n mockFn.mockReset = () => {\n mockFn.mockClear();\n defaultImpl = undefined; returnVal = resolvedVal = rejectedVal = undefined;\n returnSet = resolvedSet = rejectedSet = false;\n onceImpls.length = 0; onceReturns.length = 0;\n return mockFn;\n };\n mockFn.mockRestore = () => mockFn.mockReset();\n\n __mockRegistry.push(mockFn);\n return mockFn;\n },\n\n spyOn(object, methodName) {\n const original = object[methodName];\n if (typeof original !== 'function') {\n throw new Error(\\`Cannot spy on \\${methodName}: not a function\\`);\n }\n const spy = mock.fn(original);\n spy.__originalMethod = original;\n spy.__spyTarget = object;\n spy.__spyMethodName = methodName;\n spy.__isSpyFunction = true;\n spy.mockRestore = () => {\n object[methodName] = original;\n const idx = __mockRegistry.indexOf(spy);\n if (idx !== -1) __mockRegistry.splice(idx, 1);\n return spy;\n };\n object[methodName] = spy;\n return spy;\n },\n\n clearAllMocks() {\n for (const fn of __mockRegistry) fn.mockClear();\n },\n\n resetAllMocks() {\n for (const fn of __mockRegistry) fn.mockReset();\n },\n\n restoreAllMocks() {\n for (let i = __mockRegistry.length - 1; i >= 0; i--) {\n if (__mockRegistry[i].__isSpyFunction) __mockRegistry[i].mockRestore();\n }\n },\n };\n\n // ============================================================\n // Test Runner Helpers\n // ============================================================\n\n function checkForOnly(suite) {\n if (suite.only) return true;\n for (const t of suite.tests) {\n if (t.only) return true;\n }\n for (const child of suite.children) {\n if (checkForOnly(child)) return true;\n }\n return false;\n }\n\n function suiteHasOnly(suite) {\n if (suite.only) return true;\n for (const t of suite.tests) {\n if (t.only) return true;\n }\n for (const child of suite.children) {\n if (suiteHasOnly(child)) return true;\n }\n return false;\n }\n\n function countTests(suite, hasOnly) {\n let count = 0;\n if (hasOnly && !suiteHasOnly(suite)) return 0;\n if (suite.skip) return suite.tests.length;\n\n for (const t of suite.tests) {\n if (hasOnly && !t.only && !suite.only) continue;\n count++;\n }\n for (const child of suite.children) {\n count += countTests(child, hasOnly);\n }\n return count;\n }\n\n function countSuites(suite, hasOnly) {\n let count = 0;\n if (hasOnly && !suiteHasOnly(suite)) return 0;\n\n for (const child of suite.children) {\n count++;\n count += countSuites(child, hasOnly);\n }\n return count;\n }\n\n // ============================================================\n // Test Runner\n // ============================================================\n\n async function __runAllTests() {\n const testResults = [];\n const suiteResults = [];\n const hasOnly = checkForOnly(rootSuite);\n const runStart = Date.now();\n\n // Emit runStart\n const testCount = countTests(rootSuite, hasOnly);\n const suiteCount = countSuites(rootSuite, hasOnly);\n emitEvent({ type: 'runStart', testCount, suiteCount });\n\n async function runSuite(suite, parentHooks, pathArray, depth) {\n // Skip if this suite doesn't have any .only when .only exists elsewhere\n if (hasOnly && !suiteHasOnly(suite)) return;\n\n const suitePath = [...pathArray];\n const fullName = suitePath.join(' > ');\n const suiteInfo = {\n name: suite.name,\n path: suitePath.slice(0, -1),\n fullName,\n depth,\n };\n\n // Emit suiteStart (only for non-root suites)\n if (suite !== rootSuite) {\n emitEvent({ type: 'suiteStart', suite: suiteInfo });\n }\n\n const suiteStart = Date.now();\n let suitePassed = 0;\n let suiteFailed = 0;\n let suiteSkipped = 0;\n let suiteTodo = 0;\n\n // Skip if suite is marked as skip\n if (suite.skip) {\n // Mark all tests in this suite as skipped\n for (const t of suite.tests) {\n const testFullName = fullName ? fullName + ' > ' + t.name : t.name;\n const testInfo = {\n name: t.name,\n suitePath: suitePath,\n fullName: testFullName,\n };\n emitEvent({ type: 'testStart', test: testInfo });\n\n const testResult = {\n name: t.name,\n suitePath: suitePath,\n fullName: testFullName,\n status: 'skip',\n duration: 0,\n };\n testResults.push(testResult);\n suiteSkipped++;\n\n emitEvent({ type: 'testEnd', test: testResult });\n }\n } else {\n // Run beforeAll hooks\n for (const hook of suite.beforeAll) {\n await hook();\n }\n\n // Run tests\n for (const t of suite.tests) {\n const testFullName = fullName ? fullName + ' > ' + t.name : t.name;\n const testInfo = {\n name: t.name,\n suitePath: suitePath,\n fullName: testFullName,\n };\n\n // Skip if .only is used and this test isn't .only AND the suite doesn't have .only\n if (hasOnly && !t.only && !suite.only) continue;\n\n emitEvent({ type: 'testStart', test: testInfo });\n\n // Skip if test is marked as skip\n if (t.skip) {\n const testResult = {\n name: t.name,\n suitePath: suitePath,\n fullName: testFullName,\n status: 'skip',\n duration: 0,\n };\n testResults.push(testResult);\n suiteSkipped++;\n emitEvent({ type: 'testEnd', test: testResult });\n continue;\n }\n\n // Handle todo tests (no function provided)\n if (t.todo) {\n const testResult = {\n name: t.name,\n suitePath: suitePath,\n fullName: testFullName,\n status: 'todo',\n duration: 0,\n };\n testResults.push(testResult);\n suiteTodo++;\n emitEvent({ type: 'testEnd', test: testResult });\n continue;\n }\n\n const testStart = Date.now();\n // Reset assertion counting state before each test\n __expectedAssertions = null;\n __assertionCount = 0;\n __hasAssertionsFlag = false;\n\n try {\n // Run all beforeEach hooks (parent first, then current)\n for (const hook of [...parentHooks.beforeEach, ...suite.beforeEach]) {\n await hook();\n }\n\n // Run test\n await t.fn();\n\n // Run all afterEach hooks (current first, then parent)\n for (const hook of [...suite.afterEach, ...parentHooks.afterEach]) {\n await hook();\n }\n\n // Verify assertion counts after test passes\n if (__hasAssertionsFlag && __assertionCount === 0) {\n throw new TestError('Expected at least one assertion', 'hasAssertions', '>0', 0);\n }\n if (__expectedAssertions !== null && __assertionCount !== __expectedAssertions) {\n throw new TestError(\n \\`Expected \\${__expectedAssertions} assertions, got \\${__assertionCount}\\`,\n 'assertions', __expectedAssertions, __assertionCount\n );\n }\n\n const testResult = {\n name: t.name,\n suitePath: suitePath,\n fullName: testFullName,\n status: 'pass',\n duration: Date.now() - testStart,\n };\n testResults.push(testResult);\n suitePassed++;\n emitEvent({ type: 'testEnd', test: testResult });\n } catch (err) {\n const testError = {\n message: err.message || String(err),\n stack: err.stack,\n };\n // If it's a TestError, include matcher info\n if (err.matcherName !== undefined) {\n testError.matcherName = err.matcherName;\n testError.expected = err.expected;\n testError.actual = err.actual;\n }\n const testResult = {\n name: t.name,\n suitePath: suitePath,\n fullName: testFullName,\n status: 'fail',\n duration: Date.now() - testStart,\n error: testError,\n };\n testResults.push(testResult);\n suiteFailed++;\n emitEvent({ type: 'testEnd', test: testResult });\n }\n }\n\n // Run child suites\n for (const child of suite.children) {\n const childPath = [...suitePath, child.name];\n await runSuite(child, {\n beforeEach: [...parentHooks.beforeEach, ...suite.beforeEach],\n afterEach: [...suite.afterEach, ...parentHooks.afterEach],\n }, childPath, depth + 1);\n }\n\n // Run afterAll hooks\n for (const hook of suite.afterAll) {\n await hook();\n }\n }\n\n // Emit suiteEnd (only for non-root suites)\n if (suite !== rootSuite) {\n const suiteResult = {\n ...suiteInfo,\n passed: suitePassed,\n failed: suiteFailed,\n skipped: suiteSkipped,\n todo: suiteTodo,\n duration: Date.now() - suiteStart,\n };\n suiteResults.push(suiteResult);\n emitEvent({ type: 'suiteEnd', suite: suiteResult });\n }\n }\n\n await runSuite(rootSuite, { beforeEach: [], afterEach: [] }, [], -1);\n\n const passed = testResults.filter(r => r.status === 'pass').length;\n const failed = testResults.filter(r => r.status === 'fail').length;\n const skipped = testResults.filter(r => r.status === 'skip').length;\n const todo = testResults.filter(r => r.status === 'todo').length;\n\n const runResults = {\n passed,\n failed,\n skipped,\n todo,\n total: testResults.length,\n duration: Date.now() - runStart,\n success: failed === 0,\n suites: suiteResults,\n tests: testResults,\n };\n\n emitEvent({ type: 'runEnd', results: runResults });\n\n return JSON.stringify(runResults);\n }\n\n // ============================================================\n // Helper Functions\n // ============================================================\n\n function __hasTests() {\n function checkSuite(suite) {\n if (suite.tests.length > 0) return true;\n for (const child of suite.children) {\n if (checkSuite(child)) return true;\n }\n return false;\n }\n return checkSuite(rootSuite);\n }\n\n function __getTestCount() {\n function countInSuite(suite) {\n let count = suite.tests.length;\n for (const child of suite.children) {\n count += countInSuite(child);\n }\n return count;\n }\n return countInSuite(rootSuite);\n }\n\n // Reset function to clear state between runs\n function __resetTestEnvironment() {\n rootSuite.tests = [];\n rootSuite.children = [];\n rootSuite.beforeAll = [];\n rootSuite.afterAll = [];\n rootSuite.beforeEach = [];\n rootSuite.afterEach = [];\n currentSuite = rootSuite;\n suiteStack.length = 0;\n suiteStack.push(rootSuite);\n // Clear mocks\n __mockCallOrder = 0;\n mock.restoreAllMocks();\n __mockRegistry.length = 0;\n }\n\n function __setEventCallback(callback) {\n eventCallback = callback;\n }\n\n // ============================================================\n // Expose Globals\n // ============================================================\n\n globalThis.describe = describe;\n globalThis.test = test;\n globalThis.it = it;\n globalThis.expect = expect;\n globalThis.beforeEach = beforeEach;\n globalThis.afterEach = afterEach;\n globalThis.beforeAll = beforeAll;\n globalThis.afterAll = afterAll;\n globalThis.mock = mock;\n globalThis.jest = mock; // Jest compatibility alias\n globalThis.__runAllTests = __runAllTests;\n globalThis.__resetTestEnvironment = __resetTestEnvironment;\n globalThis.__hasTests = __hasTests;\n globalThis.__getTestCount = __getTestCount;\n globalThis.__setEventCallback = __setEventCallback;\n})();\n`;\n\n/**\n * Setup test environment primitives in an isolated-vm context\n *\n * Provides Jest/Vitest-compatible test primitives:\n * - describe, test, it\n * - beforeEach, afterEach, beforeAll, afterAll\n * - expect matchers\n *\n * @example\n * const handle = await setupTestEnvironment(context, {\n * onEvent: (event) => console.log(event),\n * });\n *\n * await context.eval(`\n * describe(\"my tests\", () => {\n * test(\"example\", () => {\n * expect(1 + 1).toBe(2);\n * });\n * });\n * `);\n */\nexport async function setupTestEnvironment(\n context: ivm.Context,\n options?: TestEnvironmentOptions\n): Promise<TestEnvironmentHandle> {\n context.evalSync(testEnvironmentCode);\n\n // Set up event callback if provided\n if (options?.onEvent) {\n const eventCallbackRef = new IsolatedVM.Reference((eventJson: string) => {\n try {\n const event = JSON.parse(eventJson);\n options.onEvent!(event);\n } catch {\n // Ignore parse errors\n }\n });\n\n const global = context.global;\n global.setSync(\"__eventCallbackRef\", eventCallbackRef);\n context.evalSync(`\n __setEventCallback((eventJson) => {\n __eventCallbackRef.applySync(undefined, [eventJson]);\n });\n `);\n }\n\n return {\n dispose() {\n // Reset the test environment state\n try {\n context.evalSync(\"__resetTestEnvironment()\");\n } catch {\n // Context may already be released\n }\n },\n };\n}\n\n/**\n * Run tests in the context and return results\n */\nexport async function runTests(context: ivm.Context): Promise<RunResults> {\n const resultJson = await context.eval(\"__runAllTests()\", { promise: true });\n return JSON.parse(resultJson as string);\n}\n\n/**\n * Check if any tests are registered\n */\nexport function hasTests(context: ivm.Context): boolean {\n return context.evalSync(\"__hasTests()\") as boolean;\n}\n\n/**\n * Get the count of registered tests\n */\nexport function getTestCount(context: ivm.Context): number {\n return context.evalSync(\"__getTestCount()\") as number;\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACuB,IAAvB;AAmGA,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgzC5B,eAAsB,oBAAoB,CACxC,SACA,SACgC;AAAA,EAChC,QAAQ,SAAS,mBAAmB;AAAA,EAGpC,IAAI,SAAS,SAAS;AAAA,IACpB,MAAM,mBAAmB,IAAI,2BAAW,UAAU,CAAC,cAAsB;AAAA,MACvE,IAAI;AAAA,QACF,MAAM,QAAQ,KAAK,MAAM,SAAS;AAAA,QAClC,QAAQ,QAAS,KAAK;AAAA,QACtB,MAAM;AAAA,KAGT;AAAA,IAED,MAAM,SAAS,QAAQ;AAAA,IACvB,OAAO,QAAQ,sBAAsB,gBAAgB;AAAA,IACrD,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA,KAIhB;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,GAAG;AAAA,MAER,IAAI;AAAA,QACF,QAAQ,SAAS,0BAA0B;AAAA,QAC3C,MAAM;AAAA;AAAA,EAIZ;AAAA;AAMF,eAAsB,QAAQ,CAAC,SAA2C;AAAA,EACxE,MAAM,aAAa,MAAM,QAAQ,KAAK,mBAAmB,EAAE,SAAS,KAAK,CAAC;AAAA,EAC1E,OAAO,KAAK,MAAM,UAAoB;AAAA;AAMjC,SAAS,QAAQ,CAAC,SAA+B;AAAA,EACtD,OAAO,QAAQ,SAAS,cAAc;AAAA;AAMjC,SAAS,YAAY,CAAC,SAA8B;AAAA,EACzD,OAAO,QAAQ,SAAS,kBAAkB;AAAA;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "542BC6119019237B64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -60,7 +60,7 @@ var __export = (target, all) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// src/internal/timers/index.ts
|
|
64
64
|
var exports_timers = {};
|
|
65
65
|
__export(exports_timers, {
|
|
66
66
|
setupTimers: () => setupTimers
|
|
@@ -197,4 +197,4 @@ async function setupTimers(context) {
|
|
|
197
197
|
};
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
//# debugId=
|
|
200
|
+
//# debugId=9FDA92E9C86B929164756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import ivm from \"isolated-vm\";\n\nexport interface TimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n /** Dispose the timers handle */\n dispose(): void;\n}\n\nfunction releaseIfSupported(handle: unknown): void {\n const maybeHandle = handle as { release?: () => void };\n if (typeof maybeHandle.release === \"function\") {\n maybeHandle.release();\n }\n}\n\n/**\n * Setup timer APIs in an isolated-vm context\n *\n * Injects setTimeout, setInterval, clearTimeout, clearInterval\n *\n * Uses real time - timers fire automatically based on actual elapsed time.\n *\n * @example\n * const handle = await setupTimers(context);\n * await context.eval(`\n * setTimeout(() => console.log(\"hello\"), 1000);\n * `);\n * // Timer will fire automatically after 1 second\n */\nexport async function setupTimers(\n context: ivm.Context\n): Promise<TimersHandle> {\n let nextTimerId = 1;\n const pendingTimers = new Map<number, NodeJS.Timeout>();\n let disposed = false;\n\n const global = context.global;\n\n // Register timeout on host, return ID\n const registerTimeoutCallback = new ivm.Callback((delay: number) => {\n const id = nextTimerId++;\n const normalizedDelay = Math.max(0, delay || 0);\n\n const handle = setTimeout(() => {\n if (disposed || !pendingTimers.has(id)) return;\n pendingTimers.delete(id);\n try {\n context.evalSync(`__timers_execute(${id})`);\n context.evalSync(`__timers_removeCallback(${id})`);\n } catch {\n // Context may have been disposed\n }\n }, normalizedDelay);\n\n pendingTimers.set(id, handle);\n return id;\n });\n global.setSync(\n \"__timers_registerTimeout\",\n registerTimeoutCallback\n );\n\n // Register interval on host, return ID\n const registerIntervalCallback = new ivm.Callback((delay: number) => {\n const id = nextTimerId++;\n const normalizedDelay = Math.max(0, delay || 0);\n\n const handle = setInterval(() => {\n if (disposed || !pendingTimers.has(id)) return;\n try {\n context.evalSync(`__timers_execute(${id})`);\n } catch {\n // Context may have been disposed\n }\n }, normalizedDelay);\n\n pendingTimers.set(id, handle);\n return id;\n });\n global.setSync(\n \"__timers_registerInterval\",\n registerIntervalCallback\n );\n\n // Clear timer by ID\n const clearTimerCallback = new ivm.Callback((id: number) => {\n const handle = pendingTimers.get(id);\n if (handle) {\n clearTimeout(handle); // works for both timeout and interval\n pendingTimers.delete(id);\n }\n });\n global.setSync(\n \"__timers_clear\",\n clearTimerCallback\n );\n\n // Inject JavaScript timer APIs\n const timersCode = `\n(function() {\n const __timers_callbacks = new Map();\n\n globalThis.setTimeout = function(callback, delay, ...args) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n const id = __timers_registerTimeout(delay || 0);\n __timers_callbacks.set(id, { callback, args });\n return id;\n };\n\n globalThis.setInterval = function(callback, delay, ...args) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n const id = __timers_registerInterval(delay || 0);\n __timers_callbacks.set(id, { callback, args });\n return id;\n };\n\n globalThis.clearTimeout = function(id) {\n __timers_clear(id);\n __timers_callbacks.delete(id);\n };\n\n globalThis.clearInterval = globalThis.clearTimeout;\n\n // Called by host to execute a timer callback\n globalThis.__timers_execute = function(id) {\n const entry = __timers_callbacks.get(id);\n if (entry) {\n entry.callback(...entry.args);\n }\n };\n\n // Called by host clearAll() to clear all callbacks\n globalThis.__timers_clearCallbacks = function() {\n __timers_callbacks.clear();\n };\n\n // Called to remove a one-shot timeout callback after execution\n globalThis.__timers_removeCallback = function(id) {\n __timers_callbacks.delete(id);\n };\n})();\n`;\n\n context.evalSync(timersCode);\n\n return {\n clearAll() {\n for (const handle of pendingTimers.values()) {\n clearTimeout(handle);\n }\n pendingTimers.clear();\n try {\n context.evalSync(\"__timers_clearCallbacks()\");\n } catch {\n // Context may have been disposed\n }\n },\n\n dispose() {\n disposed = true;\n for (const handle of pendingTimers.values()) {\n clearTimeout(handle);\n }\n pendingTimers.clear();\n try {\n context.evalSync(\"__timers_clearCallbacks()\");\n } catch {\n // Context may have been disposed\n }\n try {\n releaseIfSupported(registerTimeoutCallback);\n } catch {\n // Ignore repeated dispose races\n }\n try {\n releaseIfSupported(registerIntervalCallback);\n } catch {\n // Ignore repeated dispose races\n }\n try {\n releaseIfSupported(clearTimerCallback);\n } catch {\n // Ignore repeated dispose races\n }\n },\n };\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "9FDA92E9C86B929164756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -36,7 +36,7 @@ var __export = (target, all) => {
|
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// src/internal/transform/index.ts
|
|
40
40
|
var exports_transform = {};
|
|
41
41
|
__export(exports_transform, {
|
|
42
42
|
transformModuleCode: () => transformModuleCode,
|
|
@@ -358,4 +358,4 @@ function decodeMappingLineWithState(line, state) {
|
|
|
358
358
|
return results;
|
|
359
359
|
}
|
|
360
360
|
|
|
361
|
-
//# debugId=
|
|
361
|
+
//# debugId=AF4115A8648D3EDE64756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import { stripTypeScriptTypes } from \"node:module\";\nimport { createHash } from \"node:crypto\";\n\nexport interface SourceMap {\n version: number;\n sources: string[];\n sourcesContent?: string[];\n mappings: string;\n names: string[];\n file?: string;\n}\n\nexport interface TransformResult {\n code: string;\n sourceMap?: SourceMap;\n}\n\n/**\n * Named import regex (handles single-line and multi-line).\n * Captures: [1] optional default part, [2] specifier list, [3] module path\n */\nconst NAMED_IMPORT_RE =\n /import\\s+([\\w$]+\\s*,\\s*)?\\{([\\s\\S]*?)\\}\\s*from\\s*['\"]([^'\"]+)['\"];?/g;\n\nfunction getImportedLocalName(specifier: string): string {\n const trimmed = specifier.trim();\n const asMatch = trimmed.match(/^(.+?)\\s+as\\s+([A-Za-z_$][\\w$]*)$/);\n return asMatch ? asMatch[2]! : trimmed;\n}\n\nfunction createImportedNameReferenceRegex(localName: string): RegExp {\n const escaped = localName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`(?<![\\\\w$])${escaped}(?![\\\\w$])`);\n}\n\n/**\n * Find the 0-based line index of the last import declaration's closing line.\n * Returns -1 if no imports found.\n * Handles single-line imports, multi-line imports, `import type`, side-effect imports.\n */\nfunction findLastImportEnd(code: string): number {\n const lines = code.split(\"\\n\");\n let lastImportLine = -1;\n let inImport = false;\n\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i]!.trim();\n\n if (inImport) {\n // Inside a multi-line import, look for closing\n if (trimmed.includes(\"from \") && (trimmed.endsWith(\";\") || trimmed.endsWith(\"'\") || trimmed.endsWith('\"'))) {\n inImport = false;\n lastImportLine = i;\n } else if (trimmed.endsWith(\";\")) {\n inImport = false;\n lastImportLine = i;\n }\n continue;\n }\n\n if (trimmed.startsWith(\"import \") || trimmed.startsWith(\"import{\")) {\n // Check if it's a single-line import\n if (trimmed.includes(\" from \") || trimmed.endsWith(\";\")) {\n lastImportLine = i;\n } else if (/^import\\s+['\"]/.test(trimmed)) {\n // Side-effect import: import \"module\" or import 'module'\n lastImportLine = i;\n } else {\n // Multi-line import\n inImport = true;\n }\n }\n }\n\n return lastImportLine;\n}\n\n/**\n * Elide unused imports from full stripped code.\n * Works on the entire code: blanks out import declarations to build reference body,\n * then removes specifiers not referenced in the body.\n * Line-preserving: removed imports are replaced with equivalent newlines.\n */\nfunction elideUnusedImports(code: string): string {\n // Only search for imports in the import section at the top of the file.\n // Searching the entire code causes false matches inside strings/comments\n // in large bundled files (e.g. zod at 525KB).\n const lastImportLine = findLastImportEnd(code);\n if (lastImportLine < 0) return code;\n\n const lines = code.split(\"\\n\");\n const importSectionEnd = lines.slice(0, lastImportLine + 1).join(\"\\n\").length;\n const importSection = code.slice(0, importSectionEnd);\n\n const entries: Array<{\n fullMatch: string;\n start: number;\n end: number;\n defaultPart: string;\n specifiers: string[];\n modulePath: string;\n }> = [];\n\n NAMED_IMPORT_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = NAMED_IMPORT_RE.exec(importSection)) !== null) {\n entries.push({\n fullMatch: m[0],\n start: m.index,\n end: m.index + m[0].length,\n defaultPart: m[1] ?? \"\",\n specifiers: m[2]!\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n modulePath: m[3]!,\n });\n }\n\n if (entries.length === 0) return code;\n\n // Build reference body: the entire code with import declarations blanked out.\n // This ensures we check for references everywhere outside imports.\n let body = code;\n for (let i = entries.length - 1; i >= 0; i--) {\n const { start, end } = entries[i]!;\n body = body.slice(0, start) + \" \".repeat(end - start) + body.slice(end);\n }\n\n // Process imports in reverse order to preserve string indices\n let result = code;\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i]!;\n const kept: string[] = [];\n\n for (const spec of entry.specifiers) {\n const localName = getImportedLocalName(spec);\n const nameRe = createImportedNameReferenceRegex(localName);\n\n if (nameRe.test(body)) {\n kept.push(spec);\n }\n }\n\n if (kept.length === entry.specifiers.length) continue;\n\n // Count newlines in the original match to preserve line count\n const originalNewlines = (entry.fullMatch.match(/\\n/g) || []).length;\n\n let replacement: string;\n if (kept.length === 0 && !entry.defaultPart) {\n // Replace with equivalent newlines to preserve line positions\n replacement = \"\\n\".repeat(originalNewlines);\n } else if (kept.length === 0) {\n const def = entry.defaultPart.replace(/\\s*,\\s*$/, \"\").trim();\n replacement = `import ${def} from '${entry.modulePath}';` + \"\\n\".repeat(Math.max(0, originalNewlines));\n } else {\n replacement = `import ${entry.defaultPart}{ ${kept.join(\", \")} } from '${entry.modulePath}';` + \"\\n\".repeat(Math.max(0, originalNewlines));\n }\n\n result = result.slice(0, entry.start) + replacement + result.slice(entry.end);\n }\n\n return result;\n}\n\n/**\n * Build a simple line-offset source map.\n * Since strip mode preserves line/column positions (replaces types with whitespace),\n * we only need to account for the line offset from wrapping.\n */\nfunction buildOffsetSourceMap(\n filename: string,\n outputOffset: number,\n originalImportLines: number\n): SourceMap {\n const vlqChars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n function encodeVLQ(value: number): string {\n let vlq = value < 0 ? ((-value) << 1) | 1 : value << 1;\n let result = \"\";\n do {\n let digit = vlq & 31;\n vlq >>>= 5;\n if (vlq > 0) digit |= 32;\n result += vlqChars[digit];\n } while (vlq > 0);\n return result;\n }\n\n // First segment: genCol=0, sourceIdx=0, origLine=originalImportLines, origCol=0\n const firstSegment = encodeVLQ(0) + encodeVLQ(0) + encodeVLQ(originalImportLines) + encodeVLQ(0);\n\n // Subsequent body lines: genCol=0, sourceIdx=0, origLine=+1, origCol=0\n const nextSegment = encodeVLQ(0) + encodeVLQ(0) + encodeVLQ(1) + encodeVLQ(0);\n\n const prefix = Array(outputOffset).fill(\"\").join(\";\");\n const bodyMappings = [firstSegment, ...Array(999).fill(nextSegment)];\n const mappings = prefix + (prefix ? \";\" : \"\") + bodyMappings.join(\";\");\n\n return {\n version: 3,\n sources: [filename],\n mappings,\n names: [],\n };\n}\n\n/**\n * Transform user entry code:\n * 1. Find import/body boundary\n * 2. Validate body (on original code)\n * 3. Strip TypeScript types from full code\n * 4. Split at boundary, elide unused imports, clean blank lines\n * 5. Wrap body in `export default async function() { ... }`\n */\nexport async function transformEntryCode(\n code: string,\n filename: string\n): Promise<TransformResult> {\n // Step 1: Find import/body boundary on original code\n const lastImportLine = findLastImportEnd(code);\n const lines = code.split(\"\\n\");\n const bodyStartLine = lastImportLine + 1;\n\n // Step 2: Validate body on original code (before stripping)\n const originalBody = lines.slice(bodyStartLine).join(\"\\n\");\n validateBody(originalBody);\n\n // Step 3: Strip types on full code\n const stripped = stripTypeScriptTypes(code, { mode: \"strip\" });\n\n // Step 4: Split stripped code at the boundary\n const strippedLines = stripped.split(\"\\n\");\n const strippedImportLines = strippedLines.slice(0, bodyStartLine);\n const strippedBody = strippedLines.slice(bodyStartLine).join(\"\\n\");\n\n // Step 5: Clean up import section (remove blank lines left by stripped `import type` declarations)\n let importSection = strippedImportLines\n .filter((line) => line.trim() !== \"\")\n .join(\"\\n\");\n\n // Step 6: Wrap body in async function\n const parts: string[] = [];\n if (importSection.trim()) {\n parts.push(importSection);\n }\n parts.push(\"export default async function() {\");\n parts.push(strippedBody);\n parts.push(\"}\");\n const wrappedCode = parts.join(\"\\n\");\n\n // Step 7: Build source map\n const wrappedImportLineCount = importSection.trim() ? importSection.split(\"\\n\").length : 0;\n const sourceMap = buildOffsetSourceMap(filename, wrappedImportLineCount + 1, bodyStartLine);\n\n return {\n code: wrappedCode,\n sourceMap,\n };\n}\n\n/**\n * Transform module code:\n * 1. Strip TypeScript types from full code\n * 2. Elide unused imports (line-preserving)\n * 3. Return with identity source map\n */\nexport async function transformModuleCode(\n code: string,\n filename: string\n): Promise<TransformResult> {\n // Step 1: Strip types on full code\n const stripped = stripTypeScriptTypes(code, { mode: \"strip\" });\n\n // Step 2: Elide unused imports (line-preserving)\n const finalCode = elideUnusedImports(stripped);\n\n // Step 3: Identity source map (line positions preserved by strip + line-preserving elision)\n const sourceMap = buildOffsetSourceMap(filename, 0, 0);\n\n return {\n code: finalCode,\n sourceMap,\n };\n}\n\n/**\n * Compute SHA-256 content hash for caching.\n */\nexport function contentHash(code: string): string {\n return createHash(\"sha256\").update(code).digest(\"hex\");\n}\n\n/**\n * Map error stack traces through stored source maps back to original code.\n */\nexport function mapErrorStack(\n stack: string,\n sourceMaps: Map<string, SourceMap>\n): string {\n return stack.replace(\n /(\\s+at\\s+(?:.*?\\s+\\()?)([^:(\\s]+):(\\d+):(\\d+)(\\)?)/g,\n (match, prefix, file, lineStr, colStr, suffix) => {\n const sourceMap = sourceMaps.get(file);\n if (!sourceMap) return match;\n\n const line = parseInt(lineStr, 10);\n const col = parseInt(colStr, 10);\n const originalPos = resolveSourceMapPosition(sourceMap, line, col);\n if (!originalPos) return match;\n\n return `${prefix}${file}:${originalPos.line}:${originalPos.column}${suffix}`;\n }\n );\n}\n\n/**\n * Check if code contains a top-level return statement (not inside any braces).\n */\nfunction hasTopLevelReturn(body: string): boolean {\n let depth = 0;\n for (let i = 0; i < body.length; i++) {\n const ch = body[i];\n if (ch === \"{\") { depth++; continue; }\n if (ch === \"}\") { depth--; continue; }\n // Skip string literals\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n const quote = ch;\n i++;\n while (i < body.length && body[i] !== quote) {\n if (body[i] === \"\\\\\" && quote !== \"`\") i++; // skip escaped char\n if (quote === \"`\" && body[i] === \"\\\\\") i++; // skip escaped in template\n i++;\n }\n continue;\n }\n // Skip line comments\n if (ch === \"/\" && body[i + 1] === \"/\") {\n i += 2;\n while (i < body.length && body[i] !== \"\\n\") i++;\n continue;\n }\n // Skip block comments\n if (ch === \"/\" && body[i + 1] === \"*\") {\n i += 2;\n while (i < body.length && !(body[i] === \"*\" && body[i + 1] === \"/\")) i++;\n i++; // skip the closing /\n continue;\n }\n // Check for return keyword at depth 0\n if (depth === 0 && body.substring(i, i + 6) === \"return\" && !/[\\w$]/.test(body[i + 6] || \"\")) {\n // Make sure it's not part of a larger identifier\n if (i === 0 || !/[\\w$]/.test(body[i - 1]!)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Validate that body code doesn't use require(), dynamic import(), or top-level return.\n */\nfunction validateBody(body: string): void {\n if (/(?<![.\\w])require\\s*\\(/.test(body)) {\n throw new Error(\n \"require() is not allowed. Use ES module import statements instead.\"\n );\n }\n\n if (/\\bimport\\s*\\(/.test(body)) {\n throw new Error(\n \"Dynamic import() is not allowed in entry code. Use static import statements instead.\"\n );\n }\n\n // Check for top-level return statements (not inside braces)\n if (hasTopLevelReturn(body)) {\n throw new Error(\n \"Top-level return is not allowed. Code runs as a module, not a script.\"\n );\n }\n}\n\n/**\n * Resolve a position through a source map using VLQ decoding.\n */\nfunction resolveSourceMapPosition(\n sourceMap: SourceMap,\n line: number,\n column: number\n): { line: number; column: number } | null {\n const mappingLines = sourceMap.mappings.split(\";\");\n const lineIndex = line - 1;\n\n if (lineIndex < 0 || lineIndex >= mappingLines.length) return null;\n\n // We need cumulative state across all lines up to our target line\n const state = [0, 0, 0, 0, 0]; // genCol, sourceIdx, origLine, origCol, nameIdx\n\n for (let l = 0; l <= lineIndex; l++) {\n const lineMapping = mappingLines[l]!;\n if (!lineMapping) continue;\n\n // Reset genCol per line (it's relative within each line)\n state[0] = 0;\n\n const segments = decodeMappingLineWithState(lineMapping, state);\n if (l === lineIndex) {\n if (segments.length === 0) return null;\n\n const col0 = column - 1;\n let bestSegment: { genCol: number; origLine: number; origCol: number } | null = null;\n\n for (const seg of segments) {\n if (seg.genCol <= col0) {\n bestSegment = seg;\n } else {\n break;\n }\n }\n\n if (!bestSegment) return null;\n\n return {\n line: bestSegment.origLine + 1,\n column: bestSegment.origCol + 1,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Decode VLQ segments for a line, updating cumulative state.\n */\nfunction decodeMappingLineWithState(\n line: string,\n state: number[]\n): Array<{ genCol: number; origLine: number; origCol: number }> {\n const vlqChars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n const results: Array<{ genCol: number; origLine: number; origCol: number }> = [];\n let i = 0;\n\n while (i < line.length) {\n if (line[i] === \",\") { i++; continue; }\n\n let fieldCount = 0;\n\n while (i < line.length && line[i] !== \",\") {\n let value = 0;\n let shift = 0;\n let continuation = true;\n\n while (continuation && i < line.length) {\n const digit = vlqChars.indexOf(line[i]!);\n if (digit === -1) break;\n i++;\n continuation = (digit & 32) !== 0;\n value += (digit & 31) << shift;\n shift += 5;\n }\n\n const decoded = value & 1 ? -(value >> 1) : value >> 1;\n state[fieldCount] = state[fieldCount]! + decoded;\n fieldCount++;\n }\n\n if (fieldCount >= 4) {\n results.push({\n genCol: state[0]!,\n origLine: state[2]!,\n origCol: state[3]!,\n });\n }\n }\n\n return results;\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "AF4115A8648D3EDE64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -36,7 +36,7 @@ var __export = (target, all) => {
|
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// src/internal/typecheck/index.ts
|
|
40
40
|
var exports_typecheck = {};
|
|
41
41
|
__export(exports_typecheck, {
|
|
42
42
|
typecheckIsolateCode: () => import_typecheck.typecheckIsolateCode,
|
|
@@ -57,4 +57,4 @@ module.exports = __toCommonJS(exports_typecheck);
|
|
|
57
57
|
var import_isolate_types = require("./isolate-types.cjs");
|
|
58
58
|
var import_typecheck = require("./typecheck.cjs");
|
|
59
59
|
|
|
60
|
-
//# debugId=
|
|
60
|
+
//# debugId=98FB87EAF9759F7864756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"/**\n * ./index.ts\n *\n * Type definitions and type-checking utilities for isolated-vm V8 sandbox code.\n */\n\n// Re-export type definitions\nexport {\n CORE_TYPES,\n CONSOLE_TYPES,\n CRYPTO_TYPES,\n ENCODING_TYPES,\n FETCH_TYPES,\n FS_TYPES,\n PATH_TYPES,\n TEST_ENV_TYPES,\n TIMERS_TYPES,\n PLAYWRIGHT_TYPES,\n TYPE_DEFINITIONS,\n type TypeDefinitionKey,\n} from \"./isolate-types.cjs\";\n\n// Re-export typecheck utilities\nexport {\n typecheckIsolateCode,\n formatTypecheckErrors,\n type TypecheckResult,\n type TypecheckError,\n type TypecheckOptions,\n type LibraryTypes,\n type LibraryTypeFile,\n} from \"./typecheck.cjs\";\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,IAbP;AAwBO,IARP;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "98FB87EAF9759F7864756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -36,7 +36,7 @@ var __export = (target, all) => {
|
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// src/internal/typecheck/isolate-types.ts
|
|
40
40
|
var exports_isolate_types = {};
|
|
41
41
|
__export(exports_isolate_types, {
|
|
42
42
|
TYPE_DEFINITIONS: () => TYPE_DEFINITIONS,
|
|
@@ -2611,4 +2611,4 @@ var TYPE_DEFINITIONS = {
|
|
|
2611
2611
|
playwright: PLAYWRIGHT_TYPES
|
|
2612
2612
|
};
|
|
2613
2613
|
|
|
2614
|
-
//# debugId=
|
|
2614
|
+
//# debugId=40102DE3B6889F0C64756E2164756E21
|