vitest-pool-assemblyscript 0.10.0 → 0.10.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/dist/{addon-interface-DJB-K27u.mjs → addon-interface-BaUmn7uC.mjs} +2 -2
- package/dist/{addon-interface-DJB-K27u.mjs.map → addon-interface-BaUmn7uC.mjs.map} +1 -1
- package/dist/{compile-runner-D4SJWhMh.mjs → compile-runner-BGHM_85g.mjs} +5 -5
- package/dist/{compile-runner-D4SJWhMh.mjs.map → compile-runner-BGHM_85g.mjs.map} +1 -1
- package/dist/{compiler-DSKhQ5--.mjs → compiler-CXR5UJId.mjs} +4 -4
- package/dist/{compiler-DSKhQ5--.mjs.map → compiler-CXR5UJId.mjs.map} +1 -1
- package/dist/config/index.mjs +3 -3
- package/dist/coverage-provider/index.mjs +2 -2
- package/dist/{feature-check-DLfJqIrE.mjs → feature-check-BJpc4LoO.mjs} +3 -3
- package/dist/{feature-check-DLfJqIrE.mjs.map → feature-check-BJpc4LoO.mjs.map} +1 -1
- package/dist/index-internal.mjs +3 -3
- package/dist/index-v3.mjs +2 -2
- package/dist/index.mjs +3 -3
- package/dist/{load-user-imports-6Pv-9hRg.mjs → load-user-imports-Bcx9NOt9.mjs} +22 -9
- package/dist/load-user-imports-Bcx9NOt9.mjs.map +1 -0
- package/dist/{pool-errors-GWfwrsD7.mjs → pool-errors-Bn6YaguR.mjs} +4 -5
- package/dist/pool-errors-Bn6YaguR.mjs.map +1 -0
- package/dist/{pool-runner-init-Cta6aVJ6.mjs → pool-runner-init-DjRCbiX-.mjs} +3 -3
- package/dist/{pool-runner-init-Cta6aVJ6.mjs.map → pool-runner-init-DjRCbiX-.mjs.map} +1 -1
- package/dist/pool-thread/compile-worker-thread.mjs +6 -6
- package/dist/pool-thread/test-worker-thread.mjs +5 -5
- package/dist/pool-thread/v3-tinypool-thread.mjs +7 -7
- package/dist/{test-runner-M21HMDdH.mjs → test-runner-BeP8ClnE.mjs} +4 -4
- package/dist/{test-runner-M21HMDdH.mjs.map → test-runner-BeP8ClnE.mjs.map} +1 -1
- package/dist/{vitest-file-tasks-Coc4btUw.mjs → vitest-file-tasks-vvZzigcF.mjs} +2 -2
- package/dist/{vitest-file-tasks-Coc4btUw.mjs.map → vitest-file-tasks-vvZzigcF.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/load-user-imports-6Pv-9hRg.mjs.map +0 -1
- package/dist/pool-errors-GWfwrsD7.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { INTERNAL_PATH_LIB_PREFIX, POOL_ERROR_NAMES } from "./constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import { createPoolError, debug, getShortFunctionName, toForwardSlash } from "./pool-errors-
|
|
2
|
+
import { createPoolError, debug, getShortFunctionName, toForwardSlash } from "./pool-errors-Bn6YaguR.mjs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { dirname, resolve } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
@@ -204,4 +204,4 @@ const instrumentForCoverage = (wasmBuffer, sourceMapBuffer, instrumentationOptio
|
|
|
204
204
|
|
|
205
205
|
//#endregion
|
|
206
206
|
export { instrumentForCoverage };
|
|
207
|
-
//# sourceMappingURL=addon-interface-
|
|
207
|
+
//# sourceMappingURL=addon-interface-BaUmn7uC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addon-interface-DJB-K27u.mjs","names":[],"sources":["../src/instrumentation/addon-interface.ts"],"sourcesContent":["/**\n * Native addon interface for extracting debug information from WebAssembly binaries\n *\n * This module wraps Binaryen's C++ API to provide expression-level debug locations\n * and basic block information that the JavaScript API doesn't expose.\n *\n * The native addon outputs raw data (0-based columns, relative paths) which this\n * wrapper transforms into the final BinaryDebugInfo format (1-based columns,\n * absolute paths, grouped by file and position).\n */\n\nimport { createRequire } from 'node:module';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type {\n NativeAddon,\n NativeInstrumentationResult,\n NativeDebugInfoOutput,\n NativeFunctionDebugInfo,\n NativeExpressionDebugInfo,\n NativeSourceLocation,\n BinaryDebugInfo,\n FunctionDebugInfo,\n SourceLocation,\n ExpressionDebugInfo,\n InstrumentationResult,\n NativeInstrumentationOptions,\n InstrumentationOptions,\n InstrumentForCoverageFunc,\n} from '../types/types.js';\nimport {\n POOL_ERROR_NAMES,\n INTERNAL_PATH_LIB_PREFIX,\n} from '../types/constants.js';\nimport { debug } from '../util/debug.js';\nimport { toForwardSlash } from '../util/path-utils.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport { getShortFunctionName } from '../wasm-executor/wasm-names.js';\n\n// Load the native addon via node-gyp-build\n// node-gyp-build checks: prebuilds/ first, then build/Release/\n// It searches from the given directory for a package.json to find the package root.\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst rootFromDist = resolve(__dirname, '..');\n// TODO: Verify if this src fallback is still needed — pool always runs from dist/ even locally.\n// If confirmed dead code, remove this and simplify to a single nodeGypBuild call.\nconst rootFromSrc = resolve(__dirname, '../..');\n\nconst require = createRequire(import.meta.url);\nconst nodeGypBuild: (dir: string) => NativeAddon = require('node-gyp-build');\n\nlet addon: NativeAddon;\ntry {\n addon = nodeGypBuild(rootFromDist);\n} catch {\n try {\n addon = nodeGypBuild(rootFromSrc);\n } catch (err) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `vitest-pool-assemblyscript native instrumentation addon not found. Searched from ${rootFromDist} and ${rootFromSrc}. `\n + `Ensure prebuilds are available or run 'node node_modules/vitest-pool-assemblyscript/scripts/install-native-addon.js'`\n + ` to compile from source. Original error:`\n + `\\n${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Convert a raw location (0-indexed columns, path indexes) to\n * processed location (1-indexed columns, absolute path strings)\n *\n * Source map paths vary by import style and project structure:\n * - Relative imports: \"assembly/compare.ts\"\n * - Bare package imports: \"~lib/vitest-pool-assemblyscript/assembly/compare.ts\"\n * - Source outside project root: \"../assembly/compare.ts\" (e.g. test-external importing parent sources)\n *\n * All are normalized to absolute filesystem paths for consistent coverage key matching.\n */\nfunction convertLocation(\n rawLocation: NativeSourceLocation,\n debugSourceFiles: string[],\n projectRoot: string\n): SourceLocation {\n let filePath = debugSourceFiles[rawLocation.fileIndex];\n\n if (!filePath) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `No debug source file with index: ${rawLocation.fileIndex}}`,\n );\n }\n\n // Normalize to absolute path for consistent coverage key matching\n if (filePath.startsWith(INTERNAL_PATH_LIB_PREFIX)) {\n // ~lib/vitest-pool-assemblyscript/assembly/X.ts -> projectRoot/assembly/X.ts\n const relativePart = filePath.slice(INTERNAL_PATH_LIB_PREFIX.length);\n filePath = toForwardSlash(resolve(projectRoot, 'assembly', relativePart));\n } else {\n // Resolve relative path (handles both 'assembly/X.ts' and '../assembly/X.ts')\n filePath = toForwardSlash(resolve(projectRoot, filePath));\n }\n\n return {\n filePath,\n line: rawLocation.line,\n column: rawLocation.column + 1, // convert from 0-indexed to 1-indexed\n };\n}\n\n/**\n * Convert a raw expression to processed format\n */\nfunction convertExpression(\n rawExpr: NativeExpressionDebugInfo,\n debugSourceFiles: string[],\n projectRoot: string\n): ExpressionDebugInfo {\n const converted: ExpressionDebugInfo = {\n type: rawExpr.type,\n isBranch: rawExpr.isBranch,\n };\n\n if (rawExpr.branchPaths !== undefined) {\n converted.branchPaths = rawExpr.branchPaths;\n }\n\n if (rawExpr.location) {\n const convertedLocation = convertLocation(rawExpr.location, debugSourceFiles, projectRoot);\n if (convertedLocation) {\n converted.location = convertedLocation;\n }\n }\n\n return converted;\n}\n\n/**\n * Generate a position key to identify the SourceLocation uniquely\n * within a file. Does NOT include the file identifier.\n */\nfunction getPositionKey(location: SourceLocation) {\n return `${location.line}:${location.column}`;\n}\n\n/**\n * Convert a raw function to processed format and compute position key\n * Returns undefined if function has no valid representative location\n */\nfunction convertFunction(\n rawFunc: NativeFunctionDebugInfo,\n debugSourceFiles: string[],\n projectRoot: string\n): { func: FunctionDebugInfo; filePath: string; positionKey: string } | undefined {\n const representativeLocation = convertLocation(rawFunc.representativeLocation, debugSourceFiles, projectRoot);\n\n // Convert expressions\n const expressions: ExpressionDebugInfo[] = [];\n if (rawFunc.expressions) {\n for (const expr of rawFunc.expressions) {\n expressions.push(convertExpression(expr, debugSourceFiles, projectRoot));\n }\n }\n\n const converted: FunctionDebugInfo = {\n wasmIndex: rawFunc.wasmIndex,\n name: rawFunc.name,\n representativeLocation,\n coverageMemoryIndex: rawFunc.coverageMemoryIndex,\n expressions,\n basicBlocks: rawFunc.basicBlocks,\n };\n\n const filePath = representativeLocation.filePath;\n const positionKey = getPositionKey(representativeLocation);\n\n return { func: converted, filePath, positionKey };\n}\n\n/**\n * Check if two WASM function names are monomorphizations of the same generic function.\n * Generic monomorphizations share the same base name and suffix, differing only in\n * the type parameters inside angle brackets.\n *\n * e.g. \"assembly/compare/closeTo<bool\\2cbool>\" and \"assembly/compare/closeTo<bool\\2cu8>\"\n * e.g. \"assembly/expect/BaseExpectMatcher<bool>#constructor\" and \"assembly/expect/BaseExpectMatcher<i8>#constructor\"\n */\nfunction isGenericMonomorphizationMatch(nameA: string, nameB: string): boolean {\n const openA = nameA.indexOf('<');\n const openB = nameB.indexOf('<');\n\n // Both must contain generic type parameters\n if (openA === -1 || openB === -1) return false;\n\n const lastCloseA = nameA.lastIndexOf('>');\n const lastCloseB = nameB.lastIndexOf('>');\n\n if (lastCloseA === -1 || lastCloseB === -1) return false;\n\n // Prefix before '<' must match (includes module path, class, function name)\n const prefixA = nameA.substring(0, openA);\n const prefixB = nameB.substring(0, openB);\n if (prefixA !== prefixB) return false;\n\n // Suffix after last '>' must match (e.g. \"#constructor\", or empty)\n const suffixA = nameA.substring(lastCloseA + 1);\n const suffixB = nameB.substring(lastCloseB + 1);\n if (suffixA !== suffixB) return false;\n\n return true;\n}\n\n/**\n * Transform raw native addon output to processed BinaryDebugInfo\n */\nfunction transformDebugInfo(\n raw: NativeDebugInfoOutput,\n logPrefix: string,\n projectRoot: string,\n): BinaryDebugInfo {\n const functionsByFileAndPosition: Record<string, Record<string, FunctionDebugInfo[]>> = {};\n\n debug(`${logPrefix} - Converting ${raw.functions.length} functions`);\n\n let genericCollisionCount = 0;\n let skippedCount = 0;\n let instrumentedFunctionCount = 0;\n\n for (const rawFunc of raw.functions) {\n const result = convertFunction(rawFunc, raw.debugSourceFiles, projectRoot);\n if (!result) {\n debug(`${logPrefix} - WARNING: Skipped function (bad conversion): \"${rawFunc.name}\"`);\n skippedCount++;\n continue;\n }\n\n const { func, filePath, positionKey } = result;\n\n // Check for position collisions\n const existingAtPosition = functionsByFileAndPosition[filePath]?.[positionKey];\n if (existingAtPosition) {\n const existingName = existingAtPosition[0]!.name;\n\n // Only allow collision if both are monomorphizations of the same generic\n if (isGenericMonomorphizationMatch(existingName, func.name)) {\n existingAtPosition.push(func);\n genericCollisionCount++;\n instrumentedFunctionCount++;\n debug(\n `${logPrefix} - Generic monomorphization at ${filePath}:${positionKey}:`\n + ` \"${getShortFunctionName(func.name)}\" grouped with \"${getShortFunctionName(existingName)}\"`\n );\n continue;\n }\n\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `Function Debug Position Collision at ${filePath}:${positionKey}: \"${getShortFunctionName(existingName)}\"`\n + ` will be replaced by \"${getShortFunctionName(func.name)}\". This is a bug. Please report it at:`\n + ` https://github.com/themattspiral/vitest-pool-assemblyscript/issues/new`,\n );\n }\n\n instrumentedFunctionCount++;\n\n // Group by file and position\n if (!functionsByFileAndPosition[filePath]) {\n functionsByFileAndPosition[filePath] = {};\n }\n\n functionsByFileAndPosition[filePath][positionKey] = [func];\n }\n\n debug(\n `${logPrefix} - BinaryDebugInfo transform complete: ${instrumentedFunctionCount} instrumented functions`\n + ` (${genericCollisionCount} generic collisions, ${skippedCount} skipped)`\n );\n\n return {\n debugSourceFiles: raw.debugSourceFiles,\n functionsByFileAndPosition,\n instrumentedFunctionCount,\n };\n}\n\n/**\n * Instrument a WASM binary for coverage collection and regenerate source map\n *\n * This function:\n * 1. Adds __coverage_memory import (multi-memory for coverage counters)\n * 2. Injects coverage counter increments at each function entry\n * 3. Regenerates source map with correct offsets after instrumentation\n * 4. Extracts debug info with coverageMemoryIndex assigned\n *\n * @param wasmBuffer - Buffer containing the clean WASM binary\n * @param sourceMapBuffer - Buffer containing the source map JSON\n * @returns Instrumented binary, regenerated source map, and debug info\n *\n * @throws {TypeError} If wasmBuffer or sourceMapBuffer are not Buffers\n * @throws {Error} If WASM binary or source map is invalid\n */\nexport const instrumentForCoverage: InstrumentForCoverageFunc = (\n wasmBuffer: Buffer,\n sourceMapBuffer: Buffer,\n instrumentationOptions: InstrumentationOptions,\n logModule: string,\n logLabel: string,\n): InstrumentationResult => {\n if (!Buffer.isBuffer(wasmBuffer)) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `instrumentForCoverage - wasmBuffer must be a Buffer (got ${typeof wasmBuffer})`,\n );\n }\n if (!Buffer.isBuffer(sourceMapBuffer)) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `instrumentForCoverage - sourceMapBuffer must be a Buffer (got ${typeof sourceMapBuffer})`,\n );\n }\n\n const interfaceLogPrefix = `[${logModule} Inst] ${logLabel}`;\n const nativeLogPrefix = `[${logModule} InstNative] ${logLabel}`;\n\n debug(`${interfaceLogPrefix} - Calling native instrumentForCoverage`);\n const startTime = performance.now();\n\n const options: NativeInstrumentationOptions = {\n coverageMemoryPagesMin: instrumentationOptions.coverageMemoryPagesMin,\n coverageMemoryPagesMax: instrumentationOptions.coverageMemoryPagesMax,\n excludedFiles: instrumentationOptions.relativeExcludedFiles,\n excludedLibraryFilePrefix: instrumentationOptions.excludedLibraryFilePrefix,\n excludedLibraryFileOverridePrefix: instrumentationOptions.excludedLibraryFileOverridePrefix,\n excludedInternalFunctionSubstring: instrumentationOptions.excludedInternalFunctionSubstring,\n debug: instrumentationOptions.debug,\n logPrefix: nativeLogPrefix,\n coverageMemoryModule: instrumentationOptions.coverageMemoryModule,\n coverageMemoryName: instrumentationOptions.coverageMemoryName\n };\n const nativeResult: NativeInstrumentationResult = addon.instrumentForCoverage(wasmBuffer, sourceMapBuffer, options);\n const addonTime = performance.now();\n debug(`${interfaceLogPrefix} - TIMING Native addon: ${(addonTime - startTime).toFixed(2)} ms`);\n\n if (nativeResult.errors?.length) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `Errors encountered duriing native instrumentation: ${nativeResult.errors.join('\\n')}`,\n );\n }\n\n const debugInfo = transformDebugInfo(nativeResult.debugInfo, interfaceLogPrefix, instrumentationOptions.projectRoot);\n \n const transformTime = performance.now();\n debug(`${interfaceLogPrefix} - TIMING DebugInfo Transform: ${(transformTime - addonTime).toFixed(2)} ms`);\n debug(`${interfaceLogPrefix} - Binary size: ${nativeResult.instrumentedWasm.length} bytes | Source map size: ${nativeResult.sourceMap.length * 2} bytes`);\n\n return {\n instrumentedWasm: nativeResult.instrumentedWasm,\n sourceMap: nativeResult.sourceMap,\n debugInfo,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"addon-interface-BaUmn7uC.mjs","names":[],"sources":["../src/instrumentation/addon-interface.ts"],"sourcesContent":["/**\n * Native addon interface for extracting debug information from WebAssembly binaries\n *\n * This module wraps Binaryen's C++ API to provide expression-level debug locations\n * and basic block information that the JavaScript API doesn't expose.\n *\n * The native addon outputs raw data (0-based columns, relative paths) which this\n * wrapper transforms into the final BinaryDebugInfo format (1-based columns,\n * absolute paths, grouped by file and position).\n */\n\nimport { createRequire } from 'node:module';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type {\n NativeAddon,\n NativeInstrumentationResult,\n NativeDebugInfoOutput,\n NativeFunctionDebugInfo,\n NativeExpressionDebugInfo,\n NativeSourceLocation,\n BinaryDebugInfo,\n FunctionDebugInfo,\n SourceLocation,\n ExpressionDebugInfo,\n InstrumentationResult,\n NativeInstrumentationOptions,\n InstrumentationOptions,\n InstrumentForCoverageFunc,\n} from '../types/types.js';\nimport {\n POOL_ERROR_NAMES,\n INTERNAL_PATH_LIB_PREFIX,\n} from '../types/constants.js';\nimport { debug } from '../util/debug.js';\nimport { toForwardSlash } from '../util/path-utils.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport { getShortFunctionName } from '../wasm-executor/wasm-names.js';\n\n// Load the native addon via node-gyp-build\n// node-gyp-build checks: prebuilds/ first, then build/Release/\n// It searches from the given directory for a package.json to find the package root.\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst rootFromDist = resolve(__dirname, '..');\n// TODO: Verify if this src fallback is still needed — pool always runs from dist/ even locally.\n// If confirmed dead code, remove this and simplify to a single nodeGypBuild call.\nconst rootFromSrc = resolve(__dirname, '../..');\n\nconst require = createRequire(import.meta.url);\nconst nodeGypBuild: (dir: string) => NativeAddon = require('node-gyp-build');\n\nlet addon: NativeAddon;\ntry {\n addon = nodeGypBuild(rootFromDist);\n} catch {\n try {\n addon = nodeGypBuild(rootFromSrc);\n } catch (err) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `vitest-pool-assemblyscript native instrumentation addon not found. Searched from ${rootFromDist} and ${rootFromSrc}. `\n + `Ensure prebuilds are available or run 'node node_modules/vitest-pool-assemblyscript/scripts/install-native-addon.js'`\n + ` to compile from source. Original error:`\n + `\\n${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Convert a raw location (0-indexed columns, path indexes) to\n * processed location (1-indexed columns, absolute path strings)\n *\n * Source map paths vary by import style and project structure:\n * - Relative imports: \"assembly/compare.ts\"\n * - Bare package imports: \"~lib/vitest-pool-assemblyscript/assembly/compare.ts\"\n * - Source outside project root: \"../assembly/compare.ts\" (e.g. test-external importing parent sources)\n *\n * All are normalized to absolute filesystem paths for consistent coverage key matching.\n */\nfunction convertLocation(\n rawLocation: NativeSourceLocation,\n debugSourceFiles: string[],\n projectRoot: string\n): SourceLocation {\n let filePath = debugSourceFiles[rawLocation.fileIndex];\n\n if (!filePath) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `No debug source file with index: ${rawLocation.fileIndex}}`,\n );\n }\n\n // Normalize to absolute path for consistent coverage key matching\n if (filePath.startsWith(INTERNAL_PATH_LIB_PREFIX)) {\n // ~lib/vitest-pool-assemblyscript/assembly/X.ts -> projectRoot/assembly/X.ts\n const relativePart = filePath.slice(INTERNAL_PATH_LIB_PREFIX.length);\n filePath = toForwardSlash(resolve(projectRoot, 'assembly', relativePart));\n } else {\n // Resolve relative path (handles both 'assembly/X.ts' and '../assembly/X.ts')\n filePath = toForwardSlash(resolve(projectRoot, filePath));\n }\n\n return {\n filePath,\n line: rawLocation.line,\n column: rawLocation.column + 1, // convert from 0-indexed to 1-indexed\n };\n}\n\n/**\n * Convert a raw expression to processed format\n */\nfunction convertExpression(\n rawExpr: NativeExpressionDebugInfo,\n debugSourceFiles: string[],\n projectRoot: string\n): ExpressionDebugInfo {\n const converted: ExpressionDebugInfo = {\n type: rawExpr.type,\n isBranch: rawExpr.isBranch,\n };\n\n if (rawExpr.branchPaths !== undefined) {\n converted.branchPaths = rawExpr.branchPaths;\n }\n\n if (rawExpr.location) {\n const convertedLocation = convertLocation(rawExpr.location, debugSourceFiles, projectRoot);\n if (convertedLocation) {\n converted.location = convertedLocation;\n }\n }\n\n return converted;\n}\n\n/**\n * Generate a position key to identify the SourceLocation uniquely\n * within a file. Does NOT include the file identifier.\n */\nfunction getPositionKey(location: SourceLocation) {\n return `${location.line}:${location.column}`;\n}\n\n/**\n * Convert a raw function to processed format and compute position key\n * Returns undefined if function has no valid representative location\n */\nfunction convertFunction(\n rawFunc: NativeFunctionDebugInfo,\n debugSourceFiles: string[],\n projectRoot: string\n): { func: FunctionDebugInfo; filePath: string; positionKey: string } | undefined {\n const representativeLocation = convertLocation(rawFunc.representativeLocation, debugSourceFiles, projectRoot);\n\n // Convert expressions\n const expressions: ExpressionDebugInfo[] = [];\n if (rawFunc.expressions) {\n for (const expr of rawFunc.expressions) {\n expressions.push(convertExpression(expr, debugSourceFiles, projectRoot));\n }\n }\n\n const converted: FunctionDebugInfo = {\n wasmIndex: rawFunc.wasmIndex,\n name: rawFunc.name,\n representativeLocation,\n coverageMemoryIndex: rawFunc.coverageMemoryIndex,\n expressions,\n basicBlocks: rawFunc.basicBlocks,\n };\n\n const filePath = representativeLocation.filePath;\n const positionKey = getPositionKey(representativeLocation);\n\n return { func: converted, filePath, positionKey };\n}\n\n/**\n * Check if two WASM function names are monomorphizations of the same generic function.\n * Generic monomorphizations share the same base name and suffix, differing only in\n * the type parameters inside angle brackets.\n *\n * e.g. \"assembly/compare/closeTo<bool\\2cbool>\" and \"assembly/compare/closeTo<bool\\2cu8>\"\n * e.g. \"assembly/expect/BaseExpectMatcher<bool>#constructor\" and \"assembly/expect/BaseExpectMatcher<i8>#constructor\"\n */\nfunction isGenericMonomorphizationMatch(nameA: string, nameB: string): boolean {\n const openA = nameA.indexOf('<');\n const openB = nameB.indexOf('<');\n\n // Both must contain generic type parameters\n if (openA === -1 || openB === -1) return false;\n\n const lastCloseA = nameA.lastIndexOf('>');\n const lastCloseB = nameB.lastIndexOf('>');\n\n if (lastCloseA === -1 || lastCloseB === -1) return false;\n\n // Prefix before '<' must match (includes module path, class, function name)\n const prefixA = nameA.substring(0, openA);\n const prefixB = nameB.substring(0, openB);\n if (prefixA !== prefixB) return false;\n\n // Suffix after last '>' must match (e.g. \"#constructor\", or empty)\n const suffixA = nameA.substring(lastCloseA + 1);\n const suffixB = nameB.substring(lastCloseB + 1);\n if (suffixA !== suffixB) return false;\n\n return true;\n}\n\n/**\n * Transform raw native addon output to processed BinaryDebugInfo\n */\nfunction transformDebugInfo(\n raw: NativeDebugInfoOutput,\n logPrefix: string,\n projectRoot: string,\n): BinaryDebugInfo {\n const functionsByFileAndPosition: Record<string, Record<string, FunctionDebugInfo[]>> = {};\n\n debug(`${logPrefix} - Converting ${raw.functions.length} functions`);\n\n let genericCollisionCount = 0;\n let skippedCount = 0;\n let instrumentedFunctionCount = 0;\n\n for (const rawFunc of raw.functions) {\n const result = convertFunction(rawFunc, raw.debugSourceFiles, projectRoot);\n if (!result) {\n debug(`${logPrefix} - WARNING: Skipped function (bad conversion): \"${rawFunc.name}\"`);\n skippedCount++;\n continue;\n }\n\n const { func, filePath, positionKey } = result;\n\n // Check for position collisions\n const existingAtPosition = functionsByFileAndPosition[filePath]?.[positionKey];\n if (existingAtPosition) {\n const existingName = existingAtPosition[0]!.name;\n\n // Only allow collision if both are monomorphizations of the same generic\n if (isGenericMonomorphizationMatch(existingName, func.name)) {\n existingAtPosition.push(func);\n genericCollisionCount++;\n instrumentedFunctionCount++;\n debug(\n `${logPrefix} - Generic monomorphization at ${filePath}:${positionKey}:`\n + ` \"${getShortFunctionName(func.name)}\" grouped with \"${getShortFunctionName(existingName)}\"`\n );\n continue;\n }\n\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `Function Debug Position Collision at ${filePath}:${positionKey}: \"${getShortFunctionName(existingName)}\"`\n + ` will be replaced by \"${getShortFunctionName(func.name)}\". This is a bug. Please report it at:`\n + ` https://github.com/themattspiral/vitest-pool-assemblyscript/issues/new`,\n );\n }\n\n instrumentedFunctionCount++;\n\n // Group by file and position\n if (!functionsByFileAndPosition[filePath]) {\n functionsByFileAndPosition[filePath] = {};\n }\n\n functionsByFileAndPosition[filePath][positionKey] = [func];\n }\n\n debug(\n `${logPrefix} - BinaryDebugInfo transform complete: ${instrumentedFunctionCount} instrumented functions`\n + ` (${genericCollisionCount} generic collisions, ${skippedCount} skipped)`\n );\n\n return {\n debugSourceFiles: raw.debugSourceFiles,\n functionsByFileAndPosition,\n instrumentedFunctionCount,\n };\n}\n\n/**\n * Instrument a WASM binary for coverage collection and regenerate source map\n *\n * This function:\n * 1. Adds __coverage_memory import (multi-memory for coverage counters)\n * 2. Injects coverage counter increments at each function entry\n * 3. Regenerates source map with correct offsets after instrumentation\n * 4. Extracts debug info with coverageMemoryIndex assigned\n *\n * @param wasmBuffer - Buffer containing the clean WASM binary\n * @param sourceMapBuffer - Buffer containing the source map JSON\n * @returns Instrumented binary, regenerated source map, and debug info\n *\n * @throws {TypeError} If wasmBuffer or sourceMapBuffer are not Buffers\n * @throws {Error} If WASM binary or source map is invalid\n */\nexport const instrumentForCoverage: InstrumentForCoverageFunc = (\n wasmBuffer: Buffer,\n sourceMapBuffer: Buffer,\n instrumentationOptions: InstrumentationOptions,\n logModule: string,\n logLabel: string,\n): InstrumentationResult => {\n if (!Buffer.isBuffer(wasmBuffer)) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `instrumentForCoverage - wasmBuffer must be a Buffer (got ${typeof wasmBuffer})`,\n );\n }\n if (!Buffer.isBuffer(sourceMapBuffer)) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `instrumentForCoverage - sourceMapBuffer must be a Buffer (got ${typeof sourceMapBuffer})`,\n );\n }\n\n const interfaceLogPrefix = `[${logModule} Inst] ${logLabel}`;\n const nativeLogPrefix = `[${logModule} InstNative] ${logLabel}`;\n\n debug(`${interfaceLogPrefix} - Calling native instrumentForCoverage`);\n const startTime = performance.now();\n\n const options: NativeInstrumentationOptions = {\n coverageMemoryPagesMin: instrumentationOptions.coverageMemoryPagesMin,\n coverageMemoryPagesMax: instrumentationOptions.coverageMemoryPagesMax,\n excludedFiles: instrumentationOptions.relativeExcludedFiles,\n excludedLibraryFilePrefix: instrumentationOptions.excludedLibraryFilePrefix,\n excludedLibraryFileOverridePrefix: instrumentationOptions.excludedLibraryFileOverridePrefix,\n excludedInternalFunctionSubstring: instrumentationOptions.excludedInternalFunctionSubstring,\n debug: instrumentationOptions.debug,\n logPrefix: nativeLogPrefix,\n coverageMemoryModule: instrumentationOptions.coverageMemoryModule,\n coverageMemoryName: instrumentationOptions.coverageMemoryName\n };\n const nativeResult: NativeInstrumentationResult = addon.instrumentForCoverage(wasmBuffer, sourceMapBuffer, options);\n const addonTime = performance.now();\n debug(`${interfaceLogPrefix} - TIMING Native addon: ${(addonTime - startTime).toFixed(2)} ms`);\n\n if (nativeResult.errors?.length) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMInstrumentationError,\n `Errors encountered duriing native instrumentation: ${nativeResult.errors.join('\\n')}`,\n );\n }\n\n const debugInfo = transformDebugInfo(nativeResult.debugInfo, interfaceLogPrefix, instrumentationOptions.projectRoot);\n \n const transformTime = performance.now();\n debug(`${interfaceLogPrefix} - TIMING DebugInfo Transform: ${(transformTime - addonTime).toFixed(2)} ms`);\n debug(`${interfaceLogPrefix} - Binary size: ${nativeResult.instrumentedWasm.length} bytes | Source map size: ${nativeResult.sourceMap.length * 2} bytes`);\n\n return {\n instrumentedWasm: nativeResult.instrumentedWasm,\n sourceMap: nativeResult.sourceMap,\n debugInfo,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { INTERNAL_PATH_LIB_PREFIX, POOL_INTERNAL_PATHS } from "./constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import { failFile, getFullTaskHierarchy, getTaskLogLabel, getTaskLogPrefix, prepareFileTaskForCollection } from "./vitest-file-tasks-
|
|
3
|
-
import { buildEnhancedFileError, debug, toForwardSlash } from "./pool-errors-
|
|
4
|
-
import { executeWASMDiscovery, flushRpcUpdates, reportFileCollected, reportFileError, reportFileQueued, reportUserConsoleLogs } from "./load-user-imports-
|
|
5
|
-
import { compileAssemblyScript } from "./compiler-
|
|
2
|
+
import { failFile, getFullTaskHierarchy, getTaskLogLabel, getTaskLogPrefix, prepareFileTaskForCollection } from "./vitest-file-tasks-vvZzigcF.mjs";
|
|
3
|
+
import { buildEnhancedFileError, debug, toForwardSlash } from "./pool-errors-Bn6YaguR.mjs";
|
|
4
|
+
import { executeWASMDiscovery, flushRpcUpdates, reportFileCollected, reportFileError, reportFileQueued, reportUserConsoleLogs } from "./load-user-imports-Bcx9NOt9.mjs";
|
|
5
|
+
import { compileAssemblyScript } from "./compiler-CXR5UJId.mjs";
|
|
6
6
|
import { basename, relative } from "node:path";
|
|
7
7
|
|
|
8
8
|
//#region src/pool-thread/runner/compile-runner.ts
|
|
@@ -79,4 +79,4 @@ async function runCompileAndDiscover(file, logModule, rpc, asPoolOptions, projec
|
|
|
79
79
|
|
|
80
80
|
//#endregion
|
|
81
81
|
export { runCompileAndDiscover };
|
|
82
|
-
//# sourceMappingURL=compile-runner-
|
|
82
|
+
//# sourceMappingURL=compile-runner-BGHM_85g.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-runner-
|
|
1
|
+
{"version":3,"file":"compile-runner-BGHM_85g.mjs","names":[],"sources":["../src/pool-thread/runner/compile-runner.ts"],"sourcesContent":["/**\n * Worker thread test runner logic for AssemblyScript Pool\n */\n\nimport { basename, relative } from 'node:path';\nimport type { File } from '@vitest/runner/types';\nimport type { SerializedDiffOptions } from '@vitest/utils/diff';\n\nimport type {\n AssemblyScriptCompilerOptions,\n AssemblyScriptConsoleLog,\n AssemblyScriptConsoleLogHandler,\n InstrumentationOptions,\n ResolvedAssemblyScriptPoolOptions,\n ThreadImports,\n WASMCompilation,\n WorkerRPC,\n} from '../../types/types.js';\nimport {\n AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME,\n AS_POOL_WASM_IMPORTS_MODULE_NAME,\n ASSEMBLYSCRIPT_LIB_PREFIX,\n INTERNAL_FUNCTION_NAME_SUBSTRING,\n INTERNAL_PATH_LIB_PREFIX,\n POOL_INTERNAL_PATHS,\n} from '../../types/constants.js';\nimport { executeWASMDiscovery } from '../../wasm-executor/index.js';\nimport { debug } from '../../util/debug.js';\nimport { toForwardSlash } from '../../util/path-utils.js';\nimport {\n reportFileQueued,\n reportFileCollected,\n reportUserConsoleLogs,\n flushRpcUpdates,\n reportFileError,\n} from '../rpc-reporter.js';\nimport { compileAssemblyScript } from '../../compiler/index.js';\nimport { getTaskLogLabel, getTaskLogPrefix } from '../../util/vitest-tasks.js';\nimport {\n failFile,\n getFullTaskHierarchy,\n prepareFileTaskForCollection,\n} from '../../util/vitest-file-tasks.js';\nimport { buildEnhancedFileError } from '../../util/pool-errors.js';\n\nlet threadCompilationCount: number = 0;\n\nexport async function runCompileAndDiscover(\n file: File,\n logModule: string,\n rpc: WorkerRPC,\n asPoolOptions: ResolvedAssemblyScriptPoolOptions,\n projectRoot: string,\n collectCoverage: boolean,\n relativeUserCoverageExclusions: string[],\n threadImports: ThreadImports,\n diffOptions?: SerializedDiffOptions,\n testNamePattern?: RegExp,\n allowOnly?: boolean,\n): Promise<WASMCompilation | undefined> {\n const base = basename(file.filepath);\n const fileLogPrefix = getTaskLogPrefix(logModule, base, file);\n const fileLogLabel = getTaskLogLabel(base, file);\n\n debug(`${fileLogPrefix} - Beginning runCompileAndDiscover for \"${file.filepath}\" at ${Date.now()}`);\n\n let compilation: WASMCompilation | undefined;\n let reportedQueued: boolean = false;\n \n const runStartPerf = performance.now();\n\n try {\n await reportFileQueued(rpc, file, logModule, fileLogLabel);\n reportedQueued = true;\n\n const relativeTestFilePath = toForwardSlash(relative(projectRoot, file.filepath));\n const instrumentationOptions: InstrumentationOptions = {\n projectRoot,\n relativeExcludedFiles: [\n relativeTestFilePath,\n ...(asPoolOptions._instrumentPoolInternals ? [] : POOL_INTERNAL_PATHS),\n ...relativeUserCoverageExclusions,\n ],\n excludedLibraryFilePrefix: ASSEMBLYSCRIPT_LIB_PREFIX,\n excludedLibraryFileOverridePrefix: asPoolOptions._instrumentPoolInternals ? INTERNAL_PATH_LIB_PREFIX : undefined,\n excludedInternalFunctionSubstring: INTERNAL_FUNCTION_NAME_SUBSTRING,\n coverageMemoryPagesMin: asPoolOptions.coverageMemoryPagesInitial ?? 1,\n coverageMemoryPagesMax: asPoolOptions.coverageMemoryPagesMax,\n debug: asPoolOptions.debugNative,\n coverageMemoryModule: AS_POOL_WASM_IMPORTS_MODULE_NAME,\n coverageMemoryName: AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME\n };\n const compilerOptions: AssemblyScriptCompilerOptions = {\n stripInline: asPoolOptions.stripInline,\n projectRoot,\n shouldInstrument: collectCoverage,\n instrumentationOptions,\n extraFlags: asPoolOptions.extraCompilerFlags\n };\n\n compilation = await compileAssemblyScript(\n file.filepath,\n compilerOptions,\n logModule,\n fileLogLabel\n );\n file.setupDuration = compilation.compileTiming;\n threadCompilationCount++;\n\n debug(`${fileLogPrefix} - TIMING compileAssemblyScript total `\n + `(thread comp # ${threadCompilationCount}): ${compilation.compileTiming.toFixed(2)} ms`\n );\n \n const logMessages: AssemblyScriptConsoleLog[] = [];\n const handleLog: AssemblyScriptConsoleLogHandler = (msg: string, isError: boolean = false): void => {\n logMessages.push({ msg, time: Date.now(), isError });\n };\n \n const discoverStartPerf = performance.now();\n\n await executeWASMDiscovery(\n compilation,\n asPoolOptions,\n collectCoverage,\n handleLog,\n file,\n logModule,\n threadImports,\n );\n\n // set skips when using only and/or user test name pattern, skip file task if all tests skipped\n prepareFileTaskForCollection(file, testNamePattern, allowOnly);\n\n file.collectDuration = performance.now() - discoverStartPerf;\n debug(`${fileLogPrefix} - TIMING Discovery Phase: ${file.collectDuration.toFixed(2)} ms`);\n\n // vitest collect - report discovery results\n await Promise.all([\n // Report user console logs\n reportUserConsoleLogs(rpc, logMessages, logModule, base, file),\n\n // Report onCollected with collected and filtered tasks\n reportFileCollected(rpc, file, logModule, fileLogLabel),\n ]);\n\n debug(() => `${fileLogPrefix} - Collected Test Suite Hierarchy:\\n${getFullTaskHierarchy(file)}`);\n\n const totalTime = performance.now() - runStartPerf;\n debug(`${fileLogPrefix} - TIMING Compilation and Discovery: ${totalTime.toFixed(2)} ms`);\n } catch (error) {\n const testError = await buildEnhancedFileError(\n error,\n file,\n compilation?.sourceMap,\n fileLogPrefix,\n projectRoot,\n 'compile runner',\n diffOptions\n );\n\n failFile(file, testError, runStartPerf);\n\n if (!reportedQueued) {\n await reportFileQueued(rpc, file, logModule, fileLogLabel);\n }\n await reportFileError(rpc, file, logModule, fileLogLabel);\n\n debug(`${fileLogPrefix} - runCompileAndDiscover - Reported file error:`, testError);\n } finally {\n await flushRpcUpdates(rpc);\n debug(`${fileLogPrefix} - runCompileAndDiscover Completed`);\n }\n\n return compilation;\n}\n"],"mappings":";;;;;;;;;;;AA6CA,IAAI,yBAAiC;AAErC,eAAsB,sBACpB,MACA,WACA,KACA,eACA,aACA,iBACA,gCACA,eACA,aACA,iBACA,WACsC;CACtC,MAAM,OAAO,SAAS,KAAK,SAAS;CACpC,MAAM,gBAAgB,iBAAiB,WAAW,MAAM,KAAK;CAC7D,MAAM,eAAe,gBAAgB,MAAM,KAAK;AAEhD,OAAM,GAAG,cAAc,0CAA0C,KAAK,SAAS,OAAO,KAAK,KAAK,GAAG;CAEnG,IAAI;CACJ,IAAI,iBAA0B;CAE9B,MAAM,eAAe,YAAY,KAAK;AAEtC,KAAI;AACF,QAAM,iBAAiB,KAAK,MAAM,WAAW,aAAa;AAC1D,mBAAiB;EAGjB,MAAM,yBAAiD;GACrD;GACA,uBAAuB;IAHI,eAAe,SAAS,aAAa,KAAK,SAAS,CAAC;IAK7E,GAAI,cAAc,2BAA2B,EAAE,GAAG;IAClD,GAAG;IACJ;GACD;GACA,mCAAmC,cAAc,2BAA2B,2BAA2B;GACvG;GACA,wBAAwB,cAAc,8BAA8B;GACpE,wBAAwB,cAAc;GACtC,OAAO,cAAc;GACrB;GACA;GACD;EACD,MAAM,kBAAiD;GACrD,aAAa,cAAc;GAC3B;GACA,kBAAkB;GAClB;GACA,YAAY,cAAc;GAC3B;AAED,gBAAc,MAAM,sBAClB,KAAK,UACL,iBACA,WACA,aACD;AACD,OAAK,gBAAgB,YAAY;AACjC;AAEA,QAAM,GAAG,cAAc,uDACD,uBAAuB,KAAK,YAAY,cAAc,QAAQ,EAAE,CAAC,KACtF;EAED,MAAM,cAA0C,EAAE;EAClD,MAAM,aAA8C,KAAa,UAAmB,UAAgB;AAClG,eAAY,KAAK;IAAE;IAAK,MAAM,KAAK,KAAK;IAAE;IAAS,CAAC;;EAGtD,MAAM,oBAAoB,YAAY,KAAK;AAE3C,QAAM,qBACJ,aACA,eACA,iBACA,WACA,MACA,WACA,cACD;AAGD,+BAA6B,MAAM,iBAAiB,UAAU;AAE9D,OAAK,kBAAkB,YAAY,KAAK,GAAG;AAC3C,QAAM,GAAG,cAAc,6BAA6B,KAAK,gBAAgB,QAAQ,EAAE,CAAC,KAAK;AAGzF,QAAM,QAAQ,IAAI,CAEhB,sBAAsB,KAAK,aAAa,WAAW,MAAM,KAAK,EAG9D,oBAAoB,KAAK,MAAM,WAAW,aAAa,CACxD,CAAC;AAEF,cAAY,GAAG,cAAc,sCAAsC,qBAAqB,KAAK,GAAG;AAGhG,QAAM,GAAG,cAAc,wCADL,YAAY,KAAK,GAAG,cACkC,QAAQ,EAAE,CAAC,KAAK;UACjF,OAAO;EACd,MAAM,YAAY,MAAM,uBACtB,OACA,MACA,aAAa,WACb,eACA,aACA,kBACA,YACD;AAED,WAAS,MAAM,WAAW,aAAa;AAEvC,MAAI,CAAC,eACH,OAAM,iBAAiB,KAAK,MAAM,WAAW,aAAa;AAE5D,QAAM,gBAAgB,KAAK,MAAM,WAAW,aAAa;AAEzD,QAAM,GAAG,cAAc,kDAAkD,UAAU;WAC3E;AACR,QAAM,gBAAgB,IAAI;AAC1B,QAAM,GAAG,cAAc,oCAAoC;;AAG7D,QAAO"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { POOL_ERROR_NAMES } from "./constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import { createPoolError, debug, parseSourceMap, toForwardSlash } from "./pool-errors-
|
|
2
|
+
import { createPoolError, debug, parseSourceMap, toForwardSlash } from "./pool-errors-Bn6YaguR.mjs";
|
|
3
3
|
import { getWasmMemoryRequirements } from "./wasm-memory-C8Nkl2Sz.mjs";
|
|
4
|
-
import { clearNativeBuildError, hasNativeBuildError, warnASInstrumentationNotLoaded } from "./feature-check-
|
|
4
|
+
import { clearNativeBuildError, hasNativeBuildError, warnASInstrumentationNotLoaded } from "./feature-check-BJpc4LoO.mjs";
|
|
5
5
|
import { basename, resolve } from "node:path";
|
|
6
6
|
import { access, readFile } from "node:fs/promises";
|
|
7
7
|
import { main } from "assemblyscript/asc";
|
|
@@ -15,7 +15,7 @@ import { main } from "assemblyscript/asc";
|
|
|
15
15
|
*/
|
|
16
16
|
let nativeAddon;
|
|
17
17
|
try {
|
|
18
|
-
nativeAddon = await import("./addon-interface-
|
|
18
|
+
nativeAddon = await import("./addon-interface-BaUmn7uC.mjs");
|
|
19
19
|
clearNativeBuildError();
|
|
20
20
|
} catch (err) {
|
|
21
21
|
if (await hasNativeBuildError()) debug(`[Compiler] Native instrumentation addon not loaded (known build failure): ${err?.message ?? String(err)}`);
|
|
@@ -182,4 +182,4 @@ async function compileAssemblyScript(filename, options, logModule, logLabel) {
|
|
|
182
182
|
|
|
183
183
|
//#endregion
|
|
184
184
|
export { compileAssemblyScript };
|
|
185
|
-
//# sourceMappingURL=compiler-
|
|
185
|
+
//# sourceMappingURL=compiler-CXR5UJId.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler-DSKhQ5--.mjs","names":["ascMain"],"sources":["../src/compiler/index.ts"],"sourcesContent":["/**\n * AssemblyScript Compiler\n *\n * Handles compilation of AssemblyScript source code to WASM binaries.\n * Manages compiler options, transforms, and in-memory compilation.\n */\n\nimport { main as ascMain } from 'assemblyscript/asc';\nimport { basename, resolve } from 'node:path';\nimport { access, readFile, writeFile, mkdir } from 'node:fs/promises';\nimport type { RawSourceMap } from 'source-map';\n\nimport type {\n AssemblyScriptCompilerOptions,\n NativeAddonInterface,\n BinaryDebugInfo,\n WASMModuleMemoryRequirements,\n WASMCompilation\n} from '../types/types.js';\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\nimport { debug } from '../util/debug.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport { clearNativeBuildError, hasNativeBuildError, warnASInstrumentationNotLoaded } from '../util/feature-check.js';\nimport { toForwardSlash } from '../util/path-utils.js';\nimport { parseSourceMap } from '../wasm-executor/source-maps.js';\nimport { getWasmMemoryRequirements } from '../wasm-executor/wasm-memory.js';\n\nlet nativeAddon: NativeAddonInterface | undefined;\ntry {\n nativeAddon = await import('../instrumentation/addon-interface.js');\n // Addon loaded successfully — clear any stale build error marker (fire and forget)\n clearNativeBuildError();\n} catch (err: any) {\n const knownBuildFailure = await hasNativeBuildError();\n if (knownBuildFailure) {\n // Marker file exists — coverage provider will warn the user, just debug log here\n debug(`[Compiler] Native instrumentation addon not loaded (known build failure): ${err?.message ?? String(err)}`);\n } else {\n // Unexpected failure — no marker file, warn the user\n warnASInstrumentationNotLoaded(err?.message ?? String(err));\n }\n}\n\nconst DEBUG_WRITE_FILES = false;\n\n// Path prefix the AS compiler uses when resolving bare `vitest-pool-assemblyscript/assembly` imports\n// via node_modules. Used to detect self-imports and redirect to local assembly/ dir when running locally in-tree.\nconst POOL_ASSEMBLY_NODE_MODULES_PREFIX = 'node_modules/vitest-pool-assemblyscript/assembly/';\n\n// paths assume that we're running from dist/\nconst STRIP_INLINE_TRANSFORM = resolve(import.meta.dirname, './compiler/transforms/strip-inline.mjs');\nconst DEEP_EQUALS_TRANSFORM = resolve(import.meta.dirname, './compiler/transforms/deep-equals.mjs');\n\nsetImmediate(async () => {\n try {\n await access(STRIP_INLINE_TRANSFORM);\n } catch {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n `AS Compiler strip inline transform file not found at \"${STRIP_INLINE_TRANSFORM}\"`,\n );\n }\n\n try {\n await access(DEEP_EQUALS_TRANSFORM);\n } catch {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n `AS Compiler deep equals transform file not found at \"${DEEP_EQUALS_TRANSFORM}\"`,\n );\n }\n});\n\n/**\n * Compile AssemblyScript source code to WASM binary\n */\nexport async function compileAssemblyScript(\n filename: string,\n options: AssemblyScriptCompilerOptions,\n logModule: string,\n logLabel: string,\n): Promise<WASMCompilation> {\n const compileStart = performance.now();\n const logPrefix = `[${logModule} ASC] ${logLabel}`;\n\n const { shouldInstrument, instrumentationOptions, extraFlags } = options;\n\n if (shouldInstrument && !instrumentationOptions) {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n 'Instrumentation options are required for coverage instrumentation',\n );\n }\n\n const stdoutLines: string[] = [];\n const stderrLines: string[] = [];\n let binary: Uint8Array | undefined;\n let sourceMap: string | undefined;\n\n // Use full path as entry file so AS compiler can resolve relative imports\n const entryFile = filename;\n // Use simple output name to avoid AS compiler prepending it to source map paths\n const outputFile = 'output.wasm';\n\n debug(`${logPrefix} - Compiling: \"${filename}\"`);\n\n // Capture stdout/stderr (for potential error reporting)\n const stdout = {\n write: (text: string) => {\n stdoutLines.push(text);\n return true;\n }\n };\n\n const stderr = {\n write: (text: string) => {\n stderrLines.push(text);\n return true;\n }\n };\n\n // Build compiler flags\n const compilerFlags = [\n entryFile,\n\n // overrideable, though not recommended\n '--optimizeLevel', '0', // No optimization for easier debugging\n '--shrinkLevel', '0', // No shrink\n '--runtime', 'stub', // stub runtime (no GC)\n\n ...(extraFlags || []),\n\n // non-overrideable\n '--outFile', outputFile,\n '--importMemory', // Import memory from JS (enables imports during WASM start)\n '--debug', // Include debug info\n '--sourceMap', // Generate source maps for error reporting\n '--exportStart', '_start', // Export start function for explicit initialization control\n '--exportTable', // Export function table for direct test execution\n\n // Injects deep equality comparison method into user-defined classes for toEqual support\n '--transform', DEEP_EQUALS_TRANSFORM,\n ];\n\n // Add transform to strip @inline decorators if requested\n // This improves coverage accuracy by preventing functions from being inlined,\n // and enables correct source-mapped error reporting for errors originating\n // inside inlined functions.\n if (options.stripInline === true) {\n compilerFlags.push(\n '--transform', STRIP_INLINE_TRANSFORM\n );\n debug(`${logPrefix} - Added Transform - Stripping @inline decorators`);\n }\n\n // Compile with AssemblyScript compiler\n const ascStart = performance.now();\n const result = await ascMain(compilerFlags, {\n stdout,\n stderr,\n // Let AS read from filesystem for import resolution\n // WASM binary and source map are captured in memory via writeFile callback\n writeFile: (name: string, contents: string | Uint8Array, _baseDir: string) => {\n if (name.endsWith('.wasm') && contents instanceof Uint8Array) {\n binary = contents;\n debug(`${logPrefix} - Captured binary in memory: \"${name}\"`);\n } else if (name.endsWith('.wasm.map') && typeof contents === 'string') {\n debug(`${logPrefix} - Captured source map in memory: \"${name}\"`);\n sourceMap = contents;\n } else {\n debug(`${logPrefix} - WARNING - Captured Unexpected File: \"${name}\" at baseDir: \"${_baseDir}\"`);\n }\n },\n \n // Custom readFile enables in-tree resolution of bare pool assembly imports.\n // When a test file imports 'vitest-pool-assemblyscript/assembly', the AS compiler\n // resolves it to a node_modules path. This works when the package is installed,\n // but fails in-tree (the package isn't in its own node_modules). The fallback\n // redirects these to the local assembly/ directory when the normal path isn't found.\n readFile: async (filename, baseDir): Promise<string | null> => {\n const filePath = resolve(baseDir, filename);\n\n try {\n return await readFile(filePath, { encoding: 'utf-8' });\n } catch {\n // Fallback: when running in-tree, redirect pool assembly imports to local assembly/ dir\n const normalizedFilename = toForwardSlash(filename);\n if (normalizedFilename.startsWith(POOL_ASSEMBLY_NODE_MODULES_PREFIX)) {\n const localSubpath = normalizedFilename.substring(POOL_ASSEMBLY_NODE_MODULES_PREFIX.length);\n const localPath = resolve(baseDir, 'assembly', localSubpath);\n\n try {\n return await readFile(localPath, { encoding: 'utf-8' });\n } catch {\n return null;\n }\n }\n\n return null;\n }\n },\n });\n\n debug(`${logPrefix} - TIMING asc.main: ${(performance.now() - ascStart).toFixed(2)} ms`);\n\n if (result.error) {\n const errorMessage = stderrLines.length > 0\n ? `${result.error.message}\\n\\n${stderrLines.join('')}`\n : result.error.message;\n\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n errorMessage\n );\n }\n\n if (!binary) {\n const errorMessage = stderrLines.length > 0\n ? `No WASM binary was generated\\n\\nAS Compiler output:\\n${stderrLines.join('')}`\n : 'No WASM binary was generated';\n\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n errorMessage\n );\n }\n\n if (!sourceMap) {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n 'Source map not captured from AssemblyScript Compiler'\n );\n }\n\n const cleanBinary: Uint8Array = binary;\n const wasmSourceMap: string = sourceMap;\n\n debug(`${logPrefix} - Compilation successful, clean binary size: ${cleanBinary.length} bytes`);\n debug(`${logPrefix} - Source map generated, size: ${wasmSourceMap.length * 2} bytes`);\n \n if (DEBUG_WRITE_FILES) {\n // Write source map for debugging\n const dir = './debug';\n // TODO - handle non-.ts extensions\n const sourceMapFileName = `${basename(filename, '.ts')}.ts.map`;\n const sourceMapPath = `${dir}/${sourceMapFileName}`;\n\n // Create directory if it doesn't exist\n try {\n await mkdir(dir, { recursive: true });\n } catch {\n // Directory already exists or creation failed, continue\n }\n\n // Format as well-formed JSON\n const formattedSourceMap = JSON.stringify(JSON.parse(wasmSourceMap), null, 2);\n\n writeFile(sourceMapPath, formattedSourceMap, { encoding: 'utf8' });\n debug(`${logPrefix} - Wrote source map to: \"${sourceMapPath}\"`);\n\n // Also write WASM binary for inspection\n const wasmPath = sourceMapPath.replace('.map', '.wasm');\n writeFile(wasmPath, cleanBinary);\n debug(`${logPrefix} - Wrote WASM binary to: \"${wasmPath}\"`);\n }\n\n let compilationBinary: Uint8Array = cleanBinary;\n let compilationSourceMap: string = wasmSourceMap;\n let compilationDebugInfo: BinaryDebugInfo | undefined;\n let compilationIsInstrumented: boolean = false;\n \n // Instrument binary for coverage if requested and available\n if (options.shouldInstrument && nativeAddon) {\n const instrumentStart = performance.now();\n const wasmBuffer = Buffer.from(cleanBinary);\n const sourceMapBuffer = Buffer.from(wasmSourceMap);\n\n const instrumentResult = nativeAddon.instrumentForCoverage(wasmBuffer, sourceMapBuffer, options.instrumentationOptions!, logModule, logLabel);\n const instCount = instrumentResult.debugInfo.instrumentedFunctionCount;\n\n debug(`${logPrefix} - TIMING Instrumented ${instCount} functions: ${(performance.now() - instrumentStart).toFixed(2)} ms`);\n\n compilationBinary = instrumentResult.instrumentedWasm;\n compilationSourceMap = instrumentResult.sourceMap;\n compilationDebugInfo = instrumentResult.debugInfo;\n compilationIsInstrumented = true;\n }\n\n let parsedSourceMap: RawSourceMap;\n let compiledModule: WebAssembly.Module;\n let requiredMemory: WASMModuleMemoryRequirements;\n\n try {\n const s = performance.now();\n parsedSourceMap = parseSourceMap(compilationSourceMap);\n\n debug(`${logPrefix} - TIMING compileAssemblyScript - parseSourceMap:`\n + `${(performance.now() - s).toFixed(2)} ms`\n );\n } catch (error) {\n throw createPoolError(POOL_ERROR_NAMES.CompilationError, 'Error parsing WASM compilation source map', error, true);\n }\n \n try {\n const s = performance.now();\n compiledModule = await WebAssembly.compile(compilationBinary as BufferSource);\n\n debug(`${logPrefix} - TIMING compileAssemblyScript - WebAssembly.compile:`\n + `${(performance.now() - s).toFixed(2)} ms`\n );\n } catch (error) {\n throw createPoolError(POOL_ERROR_NAMES.CompilationError, 'Error running WebAssembly.compile on asc-compiled WASM binary', error, true);\n }\n\n try {\n const s = performance.now();\n requiredMemory = getWasmMemoryRequirements(compilationBinary);\n\n debug(`${logPrefix} - TIMING compileAssemblyScript - getWasmMemoryRequirements:`\n + `${(performance.now() - s).toFixed(2)} ms`\n );\n debug(`${logPrefix} - Required Memory:`, JSON.stringify(requiredMemory));\n } catch (error) {\n throw createPoolError(POOL_ERROR_NAMES.CompilationError, 'Error extracting memory requirements from asc-compiled WASM binary', error, true);\n }\n\n return {\n filePath: filename,\n sourceMap: parsedSourceMap,\n debugInfo: compilationDebugInfo,\n compiledModule,\n requiredMemory,\n isInstrumented: compilationIsInstrumented,\n compileTiming: performance.now() - compileStart,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compiler-CXR5UJId.mjs","names":["ascMain"],"sources":["../src/compiler/index.ts"],"sourcesContent":["/**\n * AssemblyScript Compiler\n *\n * Handles compilation of AssemblyScript source code to WASM binaries.\n * Manages compiler options, transforms, and in-memory compilation.\n */\n\nimport { main as ascMain } from 'assemblyscript/asc';\nimport { basename, resolve } from 'node:path';\nimport { access, readFile, writeFile, mkdir } from 'node:fs/promises';\nimport type { RawSourceMap } from 'source-map';\n\nimport type {\n AssemblyScriptCompilerOptions,\n NativeAddonInterface,\n BinaryDebugInfo,\n WASMModuleMemoryRequirements,\n WASMCompilation\n} from '../types/types.js';\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\nimport { debug } from '../util/debug.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport { clearNativeBuildError, hasNativeBuildError, warnASInstrumentationNotLoaded } from '../util/feature-check.js';\nimport { toForwardSlash } from '../util/path-utils.js';\nimport { parseSourceMap } from '../wasm-executor/source-maps.js';\nimport { getWasmMemoryRequirements } from '../wasm-executor/wasm-memory.js';\n\nlet nativeAddon: NativeAddonInterface | undefined;\ntry {\n nativeAddon = await import('../instrumentation/addon-interface.js');\n // Addon loaded successfully — clear any stale build error marker (fire and forget)\n clearNativeBuildError();\n} catch (err: any) {\n const knownBuildFailure = await hasNativeBuildError();\n if (knownBuildFailure) {\n // Marker file exists — coverage provider will warn the user, just debug log here\n debug(`[Compiler] Native instrumentation addon not loaded (known build failure): ${err?.message ?? String(err)}`);\n } else {\n // Unexpected failure — no marker file, warn the user\n warnASInstrumentationNotLoaded(err?.message ?? String(err));\n }\n}\n\nconst DEBUG_WRITE_FILES = false;\n\n// Path prefix the AS compiler uses when resolving bare `vitest-pool-assemblyscript/assembly` imports\n// via node_modules. Used to detect self-imports and redirect to local assembly/ dir when running locally in-tree.\nconst POOL_ASSEMBLY_NODE_MODULES_PREFIX = 'node_modules/vitest-pool-assemblyscript/assembly/';\n\n// paths assume that we're running from dist/\nconst STRIP_INLINE_TRANSFORM = resolve(import.meta.dirname, './compiler/transforms/strip-inline.mjs');\nconst DEEP_EQUALS_TRANSFORM = resolve(import.meta.dirname, './compiler/transforms/deep-equals.mjs');\n\nsetImmediate(async () => {\n try {\n await access(STRIP_INLINE_TRANSFORM);\n } catch {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n `AS Compiler strip inline transform file not found at \"${STRIP_INLINE_TRANSFORM}\"`,\n );\n }\n\n try {\n await access(DEEP_EQUALS_TRANSFORM);\n } catch {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n `AS Compiler deep equals transform file not found at \"${DEEP_EQUALS_TRANSFORM}\"`,\n );\n }\n});\n\n/**\n * Compile AssemblyScript source code to WASM binary\n */\nexport async function compileAssemblyScript(\n filename: string,\n options: AssemblyScriptCompilerOptions,\n logModule: string,\n logLabel: string,\n): Promise<WASMCompilation> {\n const compileStart = performance.now();\n const logPrefix = `[${logModule} ASC] ${logLabel}`;\n\n const { shouldInstrument, instrumentationOptions, extraFlags } = options;\n\n if (shouldInstrument && !instrumentationOptions) {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n 'Instrumentation options are required for coverage instrumentation',\n );\n }\n\n const stdoutLines: string[] = [];\n const stderrLines: string[] = [];\n let binary: Uint8Array | undefined;\n let sourceMap: string | undefined;\n\n // Use full path as entry file so AS compiler can resolve relative imports\n const entryFile = filename;\n // Use simple output name to avoid AS compiler prepending it to source map paths\n const outputFile = 'output.wasm';\n\n debug(`${logPrefix} - Compiling: \"${filename}\"`);\n\n // Capture stdout/stderr (for potential error reporting)\n const stdout = {\n write: (text: string) => {\n stdoutLines.push(text);\n return true;\n }\n };\n\n const stderr = {\n write: (text: string) => {\n stderrLines.push(text);\n return true;\n }\n };\n\n // Build compiler flags\n const compilerFlags = [\n entryFile,\n\n // overrideable, though not recommended\n '--optimizeLevel', '0', // No optimization for easier debugging\n '--shrinkLevel', '0', // No shrink\n '--runtime', 'stub', // stub runtime (no GC)\n\n ...(extraFlags || []),\n\n // non-overrideable\n '--outFile', outputFile,\n '--importMemory', // Import memory from JS (enables imports during WASM start)\n '--debug', // Include debug info\n '--sourceMap', // Generate source maps for error reporting\n '--exportStart', '_start', // Export start function for explicit initialization control\n '--exportTable', // Export function table for direct test execution\n\n // Injects deep equality comparison method into user-defined classes for toEqual support\n '--transform', DEEP_EQUALS_TRANSFORM,\n ];\n\n // Add transform to strip @inline decorators if requested\n // This improves coverage accuracy by preventing functions from being inlined,\n // and enables correct source-mapped error reporting for errors originating\n // inside inlined functions.\n if (options.stripInline === true) {\n compilerFlags.push(\n '--transform', STRIP_INLINE_TRANSFORM\n );\n debug(`${logPrefix} - Added Transform - Stripping @inline decorators`);\n }\n\n // Compile with AssemblyScript compiler\n const ascStart = performance.now();\n const result = await ascMain(compilerFlags, {\n stdout,\n stderr,\n // Let AS read from filesystem for import resolution\n // WASM binary and source map are captured in memory via writeFile callback\n writeFile: (name: string, contents: string | Uint8Array, _baseDir: string) => {\n if (name.endsWith('.wasm') && contents instanceof Uint8Array) {\n binary = contents;\n debug(`${logPrefix} - Captured binary in memory: \"${name}\"`);\n } else if (name.endsWith('.wasm.map') && typeof contents === 'string') {\n debug(`${logPrefix} - Captured source map in memory: \"${name}\"`);\n sourceMap = contents;\n } else {\n debug(`${logPrefix} - WARNING - Captured Unexpected File: \"${name}\" at baseDir: \"${_baseDir}\"`);\n }\n },\n \n // Custom readFile enables in-tree resolution of bare pool assembly imports.\n // When a test file imports 'vitest-pool-assemblyscript/assembly', the AS compiler\n // resolves it to a node_modules path. This works when the package is installed,\n // but fails in-tree (the package isn't in its own node_modules). The fallback\n // redirects these to the local assembly/ directory when the normal path isn't found.\n readFile: async (filename, baseDir): Promise<string | null> => {\n const filePath = resolve(baseDir, filename);\n\n try {\n return await readFile(filePath, { encoding: 'utf-8' });\n } catch {\n // Fallback: when running in-tree, redirect pool assembly imports to local assembly/ dir\n const normalizedFilename = toForwardSlash(filename);\n if (normalizedFilename.startsWith(POOL_ASSEMBLY_NODE_MODULES_PREFIX)) {\n const localSubpath = normalizedFilename.substring(POOL_ASSEMBLY_NODE_MODULES_PREFIX.length);\n const localPath = resolve(baseDir, 'assembly', localSubpath);\n\n try {\n return await readFile(localPath, { encoding: 'utf-8' });\n } catch {\n return null;\n }\n }\n\n return null;\n }\n },\n });\n\n debug(`${logPrefix} - TIMING asc.main: ${(performance.now() - ascStart).toFixed(2)} ms`);\n\n if (result.error) {\n const errorMessage = stderrLines.length > 0\n ? `${result.error.message}\\n\\n${stderrLines.join('')}`\n : result.error.message;\n\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n errorMessage\n );\n }\n\n if (!binary) {\n const errorMessage = stderrLines.length > 0\n ? `No WASM binary was generated\\n\\nAS Compiler output:\\n${stderrLines.join('')}`\n : 'No WASM binary was generated';\n\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n errorMessage\n );\n }\n\n if (!sourceMap) {\n throw createPoolError(\n POOL_ERROR_NAMES.CompilationError,\n 'Source map not captured from AssemblyScript Compiler'\n );\n }\n\n const cleanBinary: Uint8Array = binary;\n const wasmSourceMap: string = sourceMap;\n\n debug(`${logPrefix} - Compilation successful, clean binary size: ${cleanBinary.length} bytes`);\n debug(`${logPrefix} - Source map generated, size: ${wasmSourceMap.length * 2} bytes`);\n \n if (DEBUG_WRITE_FILES) {\n // Write source map for debugging\n const dir = './debug';\n // TODO - handle non-.ts extensions\n const sourceMapFileName = `${basename(filename, '.ts')}.ts.map`;\n const sourceMapPath = `${dir}/${sourceMapFileName}`;\n\n // Create directory if it doesn't exist\n try {\n await mkdir(dir, { recursive: true });\n } catch {\n // Directory already exists or creation failed, continue\n }\n\n // Format as well-formed JSON\n const formattedSourceMap = JSON.stringify(JSON.parse(wasmSourceMap), null, 2);\n\n writeFile(sourceMapPath, formattedSourceMap, { encoding: 'utf8' });\n debug(`${logPrefix} - Wrote source map to: \"${sourceMapPath}\"`);\n\n // Also write WASM binary for inspection\n const wasmPath = sourceMapPath.replace('.map', '.wasm');\n writeFile(wasmPath, cleanBinary);\n debug(`${logPrefix} - Wrote WASM binary to: \"${wasmPath}\"`);\n }\n\n let compilationBinary: Uint8Array = cleanBinary;\n let compilationSourceMap: string = wasmSourceMap;\n let compilationDebugInfo: BinaryDebugInfo | undefined;\n let compilationIsInstrumented: boolean = false;\n \n // Instrument binary for coverage if requested and available\n if (options.shouldInstrument && nativeAddon) {\n const instrumentStart = performance.now();\n const wasmBuffer = Buffer.from(cleanBinary);\n const sourceMapBuffer = Buffer.from(wasmSourceMap);\n\n const instrumentResult = nativeAddon.instrumentForCoverage(wasmBuffer, sourceMapBuffer, options.instrumentationOptions!, logModule, logLabel);\n const instCount = instrumentResult.debugInfo.instrumentedFunctionCount;\n\n debug(`${logPrefix} - TIMING Instrumented ${instCount} functions: ${(performance.now() - instrumentStart).toFixed(2)} ms`);\n\n compilationBinary = instrumentResult.instrumentedWasm;\n compilationSourceMap = instrumentResult.sourceMap;\n compilationDebugInfo = instrumentResult.debugInfo;\n compilationIsInstrumented = true;\n }\n\n let parsedSourceMap: RawSourceMap;\n let compiledModule: WebAssembly.Module;\n let requiredMemory: WASMModuleMemoryRequirements;\n\n try {\n const s = performance.now();\n parsedSourceMap = parseSourceMap(compilationSourceMap);\n\n debug(`${logPrefix} - TIMING compileAssemblyScript - parseSourceMap:`\n + `${(performance.now() - s).toFixed(2)} ms`\n );\n } catch (error) {\n throw createPoolError(POOL_ERROR_NAMES.CompilationError, 'Error parsing WASM compilation source map', error, true);\n }\n \n try {\n const s = performance.now();\n compiledModule = await WebAssembly.compile(compilationBinary as BufferSource);\n\n debug(`${logPrefix} - TIMING compileAssemblyScript - WebAssembly.compile:`\n + `${(performance.now() - s).toFixed(2)} ms`\n );\n } catch (error) {\n throw createPoolError(POOL_ERROR_NAMES.CompilationError, 'Error running WebAssembly.compile on asc-compiled WASM binary', error, true);\n }\n\n try {\n const s = performance.now();\n requiredMemory = getWasmMemoryRequirements(compilationBinary);\n\n debug(`${logPrefix} - TIMING compileAssemblyScript - getWasmMemoryRequirements:`\n + `${(performance.now() - s).toFixed(2)} ms`\n );\n debug(`${logPrefix} - Required Memory:`, JSON.stringify(requiredMemory));\n } catch (error) {\n throw createPoolError(POOL_ERROR_NAMES.CompilationError, 'Error extracting memory requirements from asc-compiled WASM binary', error, true);\n }\n\n return {\n filePath: filename,\n sourceMap: parsedSourceMap,\n debugInfo: compilationDebugInfo,\n compiledModule,\n requiredMemory,\n isInstrumented: compilationIsInstrumented,\n compileTiming: performance.now() - compileStart,\n };\n}\n"],"mappings":"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"}
|
package/dist/config/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import "../vitest-file-tasks-
|
|
3
|
-
import "../pool-errors-
|
|
2
|
+
import "../vitest-file-tasks-vvZzigcF.mjs";
|
|
3
|
+
import "../pool-errors-Bn6YaguR.mjs";
|
|
4
4
|
import "../worker-rpc-channel-CvCrc8aa.mjs";
|
|
5
|
-
import { createAssemblyScriptPool } from "../pool-runner-init-
|
|
5
|
+
import { createAssemblyScriptPool } from "../pool-runner-init-DjRCbiX-.mjs";
|
|
6
6
|
|
|
7
7
|
export { createAssemblyScriptPool };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ASCommonFlags, ASNodeKind, COVERAGE_PAYLOAD_FORMATS, POOL_ERROR_NAMES } from "../constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import { createPoolError, debug, debugOverride, toForwardSlash } from "../pool-errors-
|
|
3
|
-
import { warnIfASCoverageNotSupportedByNode, warnIfNativeBuildFailed } from "../feature-check-
|
|
2
|
+
import { createPoolError, debug, debugOverride, toForwardSlash } from "../pool-errors-Bn6YaguR.mjs";
|
|
3
|
+
import { warnIfASCoverageNotSupportedByNode, warnIfNativeBuildFailed } from "../feature-check-BJpc4LoO.mjs";
|
|
4
4
|
import { mergeCoverageData } from "../coverage-merge-0WqdC-dq.mjs";
|
|
5
5
|
import { ASTVisitor } from "../ast-visitor-w1HMbuJR.mjs";
|
|
6
6
|
import { Parser } from "assemblyscript";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { dirname, resolve } from "node:path";
|
|
2
2
|
import { access, readFile, unlink } from "node:fs/promises";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
3
|
import c from "tinyrainbow";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { versions } from "node:process";
|
|
6
6
|
|
|
7
7
|
//#region src/util/feature-check.ts
|
|
@@ -66,7 +66,7 @@ async function warnIfNativeBuildFailed() {
|
|
|
66
66
|
const buildError = await readNativeBuildError();
|
|
67
67
|
if (!buildError) return;
|
|
68
68
|
try {
|
|
69
|
-
await import("./addon-interface-
|
|
69
|
+
await import("./addon-interface-BaUmn7uC.mjs");
|
|
70
70
|
await clearNativeBuildError();
|
|
71
71
|
return;
|
|
72
72
|
} catch {}
|
|
@@ -79,4 +79,4 @@ async function warnIfNativeBuildFailed() {
|
|
|
79
79
|
|
|
80
80
|
//#endregion
|
|
81
81
|
export { clearNativeBuildError, hasNativeBuildError, isNodeVersionSupportedForCoverage, warnASInstrumentationNotLoaded, warnIfASCoverageNotSupportedByNode, warnIfNativeBuildFailed };
|
|
82
|
-
//# sourceMappingURL=feature-check-
|
|
82
|
+
//# sourceMappingURL=feature-check-BJpc4LoO.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-check-
|
|
1
|
+
{"version":3,"file":"feature-check-BJpc4LoO.mjs","names":[],"sources":["../src/util/feature-check.ts"],"sourcesContent":["import { versions } from 'node:process';\nimport { access, readFile, unlink } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport c from 'tinyrainbow';\n\nimport type { NativeBuildError } from '../types/types.js';\n\n// Marker file written by install script when native build fails\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageRoot = resolve(__dirname, '..');\nconst NATIVE_BUILD_ERROR_FILE = resolve(packageRoot, '.native-build-error');\n\n/**\n * Read the native build error marker file if it exists.\n * Returns undefined if file doesn't exist or can't be parsed.\n */\nasync function readNativeBuildError(): Promise<NativeBuildError | undefined> {\n try {\n const content = await readFile(NATIVE_BUILD_ERROR_FILE, 'utf8');\n return JSON.parse(content) as NativeBuildError;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if a native build error marker file exists.\n * Used by compiler threads to distinguish known build failures (marker present,\n * user already warned by coverage provider) from unexpected addon load failures.\n */\nexport async function hasNativeBuildError(): Promise<boolean> {\n try {\n await access(NATIVE_BUILD_ERROR_FILE);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Remove the native build error marker file.\n * Called when the addon loads successfully at runtime, clearing any stale marker\n * left from a previous failed install (e.g. after a manual rebuild).\n */\nexport async function clearNativeBuildError(): Promise<void> {\n try {\n await unlink(NATIVE_BUILD_ERROR_FILE);\n } catch {\n // File doesn't exist or can't be removed — non-critical\n }\n}\n\nconst NODE_VERSION = versions.node;\nconst NODE_MAJOR_VERSION = parseInt(NODE_VERSION.split('.')[0]!, 10);\n\nexport function isNodeVersionSupportedForCoverage(): boolean {\n return NODE_MAJOR_VERSION >= 22;\n}\n\nexport function warnIfASCoverageNotSupportedByNode(): void {\n if (!isNodeVersionSupportedForCoverage()) {\n console.warn(`\\n`\n + c.yellow(`Warning:`)\n + c.gray(` Coverage config is enabled, but current Node version (${versions.node})\\n`\n + ` does not support required WASM multi-memory features.\\n`\n + ` Coverage collection will be `) + c.yellow(`disabled`) + c.gray(` for AssemblyScript WASM.\\n`\n + ` Please upgrade to Node 22 or above if you need WASM coverage support.`)\n );\n }\n}\n\n/**\n * Warn that the native instrumentation addon could not be loaded.\n * Used by compiler threads for unexpected failures (no marker file present).\n */\nexport function warnASInstrumentationNotLoaded(errorMessage: string): void {\n console.warn(`\\n`\n + c.yellow(`Warning:`)\n + c.gray(` Coverage config is enabled, but instrumentation native addon module\\n`\n + ` was not loaded. Tests will run with ` + c.yellow(`coverage disabled`) + `. Error:\\n\\n`\n + `${errorMessage}`)\n );\n}\n\nconst ERROR_PREVIEW_MAX_LINES = 10;\n\n/**\n * Check for a native build error marker file and warn if present.\n * Called once from the coverage provider (main process), so the warning\n * is not duplicated across compiler threads.\n */\nexport async function warnIfNativeBuildFailed(): Promise<void> {\n const buildError = await readNativeBuildError();\n if (!buildError) return;\n\n // Before warning, check if the addon actually loads (e.g. after a manual rebuild).\n // If it loads, the marker file is stale — clear it and skip the warning.\n try {\n await import('../instrumentation/addon-interface.js');\n await clearNativeBuildError();\n return;\n } catch {\n // Addon still can't load — proceed with warning\n }\n\n const stageName = buildError.stage === 'binaryen-download'\n ? 'Binaryen dependency download'\n : 'native addon compilation';\n\n // Truncate error for display, point to file for full details\n const errorLines = buildError.error.split('\\n');\n const truncated = errorLines.length > ERROR_PREVIEW_MAX_LINES;\n const preview = errorLines.slice(-ERROR_PREVIEW_MAX_LINES).join('\\n');\n\n console.warn(`\\n`\n + c.yellow(`Warning:`) + c.gray(` Build failed during \"${stageName}\" while installing.\\n`)\n + c.gray(` vitest-pool-assemblyscript. AssemblyScript tests will run,\\n`)\n + c.gray(` but `) + c.yellow(`coverage will be disabled`) + c.gray(`. Platform: `)\n + c.yellowBright(`${buildError.platform}\\n`)\n + c.gray(` Build Error Message:\\n`)\n + `\\n`\n + (truncated ? c.gray(`... (truncated)\\n`) : ``)+ c.redBright(`${preview}`) + `\\n`\n + `\\n`\n + c.gray(` Full error details: `) + c.cyan(`${NATIVE_BUILD_ERROR_FILE}`) + `\\n`\n + `\\n`\n + c.gray(` To resolve, inspect the error above, ensure a C++ compiler toolchain\\n`)\n + c.gray(` is installed (`) + c.cyan(`https://github.com/nodejs/node-gyp#installation`) + c.gray(`)\\n`)\n + c.gray(` and then reinstall: `) + c.cyan(`npm install vitest-pool-assemblyscript`)\n + `\\n`\n );\n}\n"],"mappings":";;;;;;;AAYA,MAAM,0BAA0B,QADZ,QADF,QADC,cAAc,OAAO,KAAK,IAAI,CACZ,EACE,KAAK,EACS,sBAAsB;;;;;AAM3E,eAAe,uBAA8D;AAC3E,KAAI;EACF,MAAM,UAAU,MAAM,SAAS,yBAAyB,OAAO;AAC/D,SAAO,KAAK,MAAM,QAAQ;SACpB;AACN;;;;;;;;AASJ,eAAsB,sBAAwC;AAC5D,KAAI;AACF,QAAM,OAAO,wBAAwB;AACrC,SAAO;SACD;AACN,SAAO;;;;;;;;AASX,eAAsB,wBAAuC;AAC3D,KAAI;AACF,QAAM,OAAO,wBAAwB;SAC/B;;AAKV,MAAM,eAAe,SAAS;AAC9B,MAAM,qBAAqB,SAAS,aAAa,MAAM,IAAI,CAAC,IAAK,GAAG;AAEpE,SAAgB,oCAA6C;AAC3D,QAAO,sBAAsB;;AAG/B,SAAgB,qCAA2C;AACzD,KAAI,CAAC,mCAAmC,CACtC,SAAQ,KAAK,OACT,EAAE,OAAO,WAAW,GACpB,EAAE,KAAK,0DAA0D,SAAS,KAAK,0GAEvC,GAAG,EAAE,OAAO,WAAW,GAAG,EAAE,KAAK,4GACQ,CACpF;;;;;;AAQL,SAAgB,+BAA+B,cAA4B;AACzE,SAAQ,KAAK,OACT,EAAE,OAAO,WAAW,GACpB,EAAE,KAAK,wHAC2C,EAAE,OAAO,oBAAoB,GAAG,eAC/E,eAAe,CACrB;;AAGH,MAAM,0BAA0B;;;;;;AAOhC,eAAsB,0BAAyC;CAC7D,MAAM,aAAa,MAAM,sBAAsB;AAC/C,KAAI,CAAC,WAAY;AAIjB,KAAI;AACF,QAAM,OAAO;AACb,QAAM,uBAAuB;AAC7B;SACM;CAIR,MAAM,YAAY,WAAW,UAAU,sBACnC,iCACA;CAGJ,MAAM,aAAa,WAAW,MAAM,MAAM,KAAK;CAC/C,MAAM,YAAY,WAAW,SAAS;CACtC,MAAM,UAAU,WAAW,MAAM,CAAC,wBAAwB,CAAC,KAAK,KAAK;AAErE,SAAQ,KAAK,OACT,EAAE,OAAO,WAAW,GAAG,EAAE,KAAK,yBAAyB,UAAU,uBAAuB,GACxF,EAAE,KAAK,sEAAsE,GAC7E,EAAE,KAAK,cAAc,GAAG,EAAE,OAAO,4BAA4B,GAAG,EAAE,KAAK,eAAe,GACtF,EAAE,aAAa,GAAG,WAAW,SAAS,IAAI,GAC1C,EAAE,KAAK,gCAAgC,GACvC,QACC,YAAY,EAAE,KAAK,oBAAoB,GAAG,MAAK,EAAE,UAAU,GAAG,UAAU,GAAG,SAE5E,EAAE,KAAK,8BAA8B,GAAG,EAAE,KAAK,GAAG,0BAA0B,GAAG,SAE/E,EAAE,KAAK,gFAAgF,GACvF,EAAE,KAAK,wBAAwB,GAAG,EAAE,KAAK,kDAAkD,GAAG,EAAE,KAAK,MAAM,GAC3G,EAAE,KAAK,8BAA8B,GAAG,EAAE,KAAK,yCAAyC,GACxF,KACH"}
|
package/dist/index-internal.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import "./pool-errors-
|
|
2
|
+
import "./pool-errors-Bn6YaguR.mjs";
|
|
3
3
|
import "./wasm-memory-C8Nkl2Sz.mjs";
|
|
4
|
-
import "./feature-check-
|
|
5
|
-
import { compileAssemblyScript } from "./compiler-
|
|
4
|
+
import "./feature-check-BJpc4LoO.mjs";
|
|
5
|
+
import { compileAssemblyScript } from "./compiler-CXR5UJId.mjs";
|
|
6
6
|
|
|
7
7
|
export { compileAssemblyScript };
|
package/dist/index-v3.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { POOL_ERROR_NAMES } from "./constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import { createInitialFileTask, failTestWithTimeoutError, flagTestTerminated, getCompatConfig, getConfigs } from "./vitest-file-tasks-
|
|
3
|
-
import { debug, isAbortError, setGlobalDebugMode } from "./pool-errors-
|
|
2
|
+
import { createInitialFileTask, failTestWithTimeoutError, flagTestTerminated, getCompatConfig, getConfigs } from "./vitest-file-tasks-vvZzigcF.mjs";
|
|
3
|
+
import { debug, isAbortError, setGlobalDebugMode } from "./pool-errors-Bn6YaguR.mjs";
|
|
4
4
|
import { createWorkerRPCChannel } from "./worker-rpc-channel-CvCrc8aa.mjs";
|
|
5
5
|
import { basename, resolve } from "node:path";
|
|
6
6
|
import { access } from "node:fs/promises";
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import "./vitest-file-tasks-
|
|
3
|
-
import "./pool-errors-
|
|
2
|
+
import "./vitest-file-tasks-vvZzigcF.mjs";
|
|
3
|
+
import "./pool-errors-Bn6YaguR.mjs";
|
|
4
4
|
import "./worker-rpc-channel-CvCrc8aa.mjs";
|
|
5
|
-
import { createAssemblyScriptPool } from "./pool-runner-init-
|
|
5
|
+
import { createAssemblyScriptPool } from "./pool-runner-init-DjRCbiX-.mjs";
|
|
6
6
|
|
|
7
7
|
export { createAssemblyScriptPool };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { COVERAGE_PAYLOAD_FORMATS, POOL_ERROR_NAMES, TEST_ERROR_NAMES } from "./constants-Bq5KNxXJ.mjs";
|
|
2
|
-
import { createAfterSuiteRunMeta, createSuiteTask, createTestTask, failTestAssertionError, failTestRuntimeError, getTaskLogLabel, isSuiteOwnFile } from "./vitest-file-tasks-
|
|
3
|
-
import { abortWASMExecution, abortWASMExecutionOnSuccess, createPoolError, debug, debugOverride, enhanceTestError, extractCallStack, getExpectedMessageOrAny, wrapPoolError } from "./pool-errors-
|
|
2
|
+
import { createAfterSuiteRunMeta, createSuiteTask, createTestTask, failTestAssertionError, failTestRuntimeError, getTaskLogLabel, isSuiteOwnFile } from "./vitest-file-tasks-vvZzigcF.mjs";
|
|
3
|
+
import { abortWASMExecution, abortWASMExecutionOnSuccess, createPoolError, debug, debugOverride, enhanceTestError, extractCallStack, getExpectedMessageOrAny, wrapPoolError } from "./pool-errors-Bn6YaguR.mjs";
|
|
4
4
|
import { createMemory, decodeAbortInfo, liftString } from "./wasm-memory-C8Nkl2Sz.mjs";
|
|
5
5
|
import { basename, resolve } from "node:path";
|
|
6
6
|
import { pathToFileURL } from "node:url";
|
|
@@ -97,10 +97,8 @@ function createUserWasmImports(createWasmImports, memory, module, logPrefix) {
|
|
|
97
97
|
});
|
|
98
98
|
debug(`${logPrefix} Created user WASM imports for test execution in ${(performance.now() - start).toFixed(2)} ms`);
|
|
99
99
|
userEnvImports = userImports?.env;
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
delete userCustomEnvImports.env;
|
|
103
|
-
}
|
|
100
|
+
userCustomEnvImports = { ...userImports };
|
|
101
|
+
if (userEnvImports) delete userCustomEnvImports.env;
|
|
104
102
|
} catch (error) {
|
|
105
103
|
throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, "Could not create user WasmImportsFactory. Ensure that your module has a default export matching () => WebAssembly.Imports", error, true);
|
|
106
104
|
}
|
|
@@ -291,9 +289,24 @@ async function executeWASMDiscovery(compilation, poolOptions, isBinaryInstrument
|
|
|
291
289
|
if (typeof exports._start === "function") exports._start();
|
|
292
290
|
else throw createPoolError(POOL_ERROR_NAMES.WASMExecutionHarnessError, "no _start() export found on compiled WASM binary");
|
|
293
291
|
} catch (error) {
|
|
294
|
-
if (error instanceof WebAssembly.RuntimeError && error?.message.includes("null function or function signature mismatch")) throw createPoolError(POOL_ERROR_NAMES.PoolSyntaxError, SIG_MISMATCH_ERROR_MSG, error);
|
|
295
292
|
if (error && error["__as_pool_error__"]) throw error;
|
|
296
|
-
|
|
293
|
+
if (error instanceof WebAssembly.RuntimeError && error.message.includes("null function or function signature mismatch")) throw createPoolError(POOL_ERROR_NAMES.PoolSyntaxError, SIG_MISMATCH_ERROR_MSG, error);
|
|
294
|
+
if (error instanceof Error) {
|
|
295
|
+
let match = null;
|
|
296
|
+
let moduleName;
|
|
297
|
+
let functionName;
|
|
298
|
+
let errorMessage;
|
|
299
|
+
if (match = /"(.+)": module is not an object or function/.exec(error.message)) {
|
|
300
|
+
moduleName = match[1];
|
|
301
|
+
errorMessage = `Expected module "${moduleName}" to be defined as an object or function within user WASM imports (returned by WasmImportsFactory).`;
|
|
302
|
+
} else if (match = /"(.+)" (function=)?"(.+)": function import requires a callable/.exec(error.message)) {
|
|
303
|
+
moduleName = match[1];
|
|
304
|
+
functionName = match[3];
|
|
305
|
+
errorMessage = `Expected function "${functionName}" to be defined in module "${moduleName}" within user WASM imports (returned by WasmImportsFactory).`;
|
|
306
|
+
}
|
|
307
|
+
if (errorMessage) throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, errorMessage, error);
|
|
308
|
+
}
|
|
309
|
+
throw wrapPoolError(POOL_ERROR_NAMES.WASMExecutionHarnessError, error, true);
|
|
297
310
|
}
|
|
298
311
|
debug(`${logPrefix} - Discovered ${file.tasks.length} top-level tasks`);
|
|
299
312
|
}
|
|
@@ -553,4 +566,4 @@ async function loadUserWasmImportsFactory(relativePath, projectRoot, logModule)
|
|
|
553
566
|
|
|
554
567
|
//#endregion
|
|
555
568
|
export { createRpcClient, executeWASMDiscovery, executeWASMTest, flushRpcUpdates, loadUserWasmImportsFactory, reportFileCollected, reportFileError, reportFileQueued, reportSuiteFinished, reportSuitePrepare, reportTestFinished, reportTestPrepare, reportTestRetried, reportUserConsoleLogs };
|
|
556
|
-
//# sourceMappingURL=load-user-imports-
|
|
569
|
+
//# sourceMappingURL=load-user-imports-Bcx9NOt9.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-user-imports-Bcx9NOt9.mjs","names":[],"sources":["../src/wasm-executor/wasm-console.ts","../src/wasm-executor/collect-options.ts","../src/wasm-executor/wasm-imports.ts","../src/wasm-executor/index.ts","../src/pool-thread/rpc-reporter.ts","../src/pool-thread/load-user-imports.ts"],"sourcesContent":["import type { AssemblyScriptConsoleLogHandler } from '../types/types.js';\nimport { liftString } from '../util/assemblyscript/binding-helpers.js';\n\nexport function createWasmConsole(\n memory: WebAssembly.Memory,\n handleLog: AssemblyScriptConsoleLogHandler\n) {\n const getMessage = (msgPtr: number, memory: WebAssembly.Memory, prefix: string = ''): string => {\n return `${prefix}${msgPtr ? liftString(memory, msgPtr) : '<no message>'}`;\n };\n\n const timersByLabel: { [label: string]: number } = {};\n\n // provides the AssemblyScript \"brower-like console\" from AS std lib\n // see https://github.com/AssemblyScript/assemblyscript/blob/v0.28.9/std/assembly/index.d.ts#L2609\n return {\n 'console.assert': <T>(assertion: T, msgPtr: number): void => {\n if (!assertion) {\n const msg = getMessage(msgPtr, memory);\n handleLog(`Assertion failed${msg ? `: ${msg}` : ''}`);\n }\n },\n 'console.log': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory));\n },\n 'console.debug': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Debug: '));\n },\n 'console.info': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Info: '));\n },\n 'console.warn': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Warning: '), true);\n },\n 'console.error': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Error: '), true);\n },\n 'console.time': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n timersByLabel[label] = performance.now();\n },\n 'console.timeLog': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n const start = timersByLabel[label];\n let msg = '';\n if (start === undefined) {\n msg = `Warning: No such label '${label}' for console.timeLog()`;\n } else {\n msg = `${label}: ${(performance.now() - start).toFixed(3)}ms`;\n }\n handleLog(msg);\n },\n 'console.timeEnd': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n const start = timersByLabel[label];\n let msg = '';\n if (start === undefined) {\n msg = `Warning: No such label '${label}' for console.timeLog()`;\n } else {\n msg = `${label}: ${(performance.now() - start).toFixed(3)}ms`;\n }\n handleLog(msg);\n delete timersByLabel[label];\n },\n\n trace(msgPtr: number, n: number, a0: any, a1: any, a2: any, a3: any): void {\n const msg = liftString(memory, msgPtr);\n const args: any[] = [a0, a1, a2, a3];\n const nArgs: any[] = n && n > 0 ? args.slice(0, n) : args;\n\n console.trace(`WASM Trace:${msg ? ` ${msg}` : ''}`, ...nArgs);\n },\n };\n}\n","import { AssemblyScriptTestOptions } from '../types/types.js';\n\nconst TEST_OPTION_UNDEFINED: number = -1;\nconst TEST_OPTION_TRUE: number = 1;\n\nexport function mergeAssemblyScriptTestOptions(\n baseOptions: AssemblyScriptTestOptions,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n): AssemblyScriptTestOptions {\n const options: AssemblyScriptTestOptions = { ...baseOptions };\n \n // numerical options\n if (timeout > TEST_OPTION_UNDEFINED) {\n options.timeout = timeout;\n }\n if (retry > TEST_OPTION_UNDEFINED) {\n options.retry = retry;\n }\n\n // boolean options\n if (skip > TEST_OPTION_UNDEFINED) {\n options.skip = skip === TEST_OPTION_TRUE ? true : false;\n }\n if (only > TEST_OPTION_UNDEFINED) {\n options.only = only === TEST_OPTION_TRUE ? true : false;\n }\n if (fails > TEST_OPTION_UNDEFINED) {\n options.fails = fails === TEST_OPTION_TRUE ? true : false;\n }\n\n return options;\n}\n","import type { File, Suite, Test } from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLogHandler,\n AssemblyScriptSuiteTaskMeta,\n AssemblyScriptTestError,\n AssemblyScriptTestTaskMeta,\n FailedAssertion,\n WasmImportsFactory,\n} from '../types/types.js';\nimport {\n AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME,\n AS_POOL_WASM_IMPORTS_MODULE_NAME,\n POOL_ERROR_NAMES,\n TEST_ERROR_NAMES\n} from '../types/constants.js';\nimport { debug } from '../util/debug.js';\nimport { abortWASMExecution, abortWASMExecutionOnSuccess, createPoolError, getExpectedMessageOrAny } from '../util/pool-errors.js';\nimport { liftString } from '../util/assemblyscript/binding-helpers.js';\nimport { decodeAbortInfo } from './wasm-memory.js';\nimport { createWasmConsole } from './wasm-console.js';\nimport { mergeAssemblyScriptTestOptions } from './collect-options.js';\nimport { createSuiteTask, createTestTask, failTestAssertionError, failTestRuntimeError } from '../util/vitest-tasks.js';\n\nfunction createUserWasmImports(\n createWasmImports: WasmImportsFactory | undefined,\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n logPrefix: string\n) {\n let userEnvImports: WebAssembly.ModuleImports | undefined;\n let userCustomEnvImports: WebAssembly.Imports | undefined;\n\n if (createWasmImports) {\n try {\n const start = performance.now();\n const userImports: WebAssembly.Imports = createWasmImports({\n memory,\n module,\n utils: {\n liftString: (stringPtr: number) => liftString(memory, stringPtr)\n }\n });\n debug(`${logPrefix} Created user WASM imports for test execution in ${(performance.now() - start).toFixed(2)} ms`);\n\n userEnvImports = userImports?.env;\n userCustomEnvImports = { ...userImports };\n \n if (userEnvImports) {\n delete userCustomEnvImports.env;\n }\n } catch (error) {\n const msg = `Could not create user WasmImportsFactory.`\n + ` Ensure that your module has a default export matching () => WebAssembly.Imports`;\n throw createPoolError(\n POOL_ERROR_NAMES.WASMUserImportsError,\n msg,\n error,\n true\n );\n }\n }\n\n return { userEnvImports, userCustomEnvImports };\n}\n\n/**\n * Create import object for test discovery\n */\nexport function createDiscoveryImports(\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n file: File,\n handleLog: AssemblyScriptConsoleLogHandler,\n logPrefix: string,\n coverageMemory?: WebAssembly.Memory,\n createWasmImports?: WasmImportsFactory,\n): WebAssembly.Imports {\n const suiteStack: Suite[] = [file];\n\n const {\n userEnvImports,\n userCustomEnvImports\n } = createUserWasmImports(createWasmImports, memory, module, logPrefix);\n \n return {\n env: {\n // users can choose to hide these with their own\n ...createWasmConsole(memory, handleLog),\n\n // user imports for \"env\"\n ...(userEnvImports ?? {}),\n\n memory,\n\n // handle runtime aborts, which are always unexpected during discovery\n abort(msgPtr: number, filePtr: number, line: number, column: number) {\n const { message, location } = decodeAbortInfo(memory, msgPtr, filePtr, line, column);\n const msgAtLoc = `${message}${location ? ` at ${location}` : ''}`;\n \n debug(`${logPrefix} - Unexpected abort during test discovery: ${msgAtLoc}`);\n\n const testError: AssemblyScriptTestError = {\n message,\n name: TEST_ERROR_NAMES.WASMRuntimeError,\n };\n\n throw abortWASMExecution(testError, new Error());\n },\n },\n\n [AS_POOL_WASM_IMPORTS_MODULE_NAME]: {\n\n ...(coverageMemory ? { [AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME]: coverageMemory } : {}),\n\n // stubs during discovery\n __assertion_pass() {},\n __assertion_fail() {},\n __expect_throw() {},\n __end_expect_throw() {},\n\n __begin_register_suite(\n namePtr: number,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n ) {\n const parentSuite = suiteStack[suiteStack.length - 1]!;\n const defaultTestOptions = (parentSuite.meta as AssemblyScriptSuiteTaskMeta).defaultTestOptions;\n const suiteName = liftString(memory, namePtr) ?? 'unknown suite';\n const options = mergeAssemblyScriptTestOptions(defaultTestOptions, timeout, retry, skip, only, fails);\n const suite = createSuiteTask(suiteName, file, parentSuite, options);\n suiteStack.push(suite);\n\n debug(\n `${logPrefix} - Registering Suite \"${suite.name}\" | timeout: ${options.timeout} ms | retry: ${options.retry}`\n + ` | skip: ${options.skip} | only: ${options.only} | fails: ${options.fails} `\n + ` | parent: \"${suite.suite?.name}\" (parent idx: ${(suite.meta as AssemblyScriptSuiteTaskMeta).idxInParentTasks})`\n );\n },\n \n __end_register_suite(_namePtr: number) {\n const suite = suiteStack.pop();\n\n debug(\n `${logPrefix} - Registered Suite \"${suite?.name}\" | ${suite?.tasks.length} top-level tasks | mode: \"${suite?.mode}\"`\n + ` | parent: \"${suite?.suite?.name}\" (parent idx: ${(suite?.meta as AssemblyScriptSuiteTaskMeta)?.idxInParentTasks})`\n );\n },\n\n // called by test() to register test names and function indices\n __register_test(\n namePtr: number,\n fnIndex: number,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n ) {\n const parentSuite = suiteStack[suiteStack.length - 1]!;\n const defaultTestOptions = (parentSuite.meta as AssemblyScriptSuiteTaskMeta).defaultTestOptions;\n const testName = liftString(memory, namePtr) ?? 'unknown test';\n const options = mergeAssemblyScriptTestOptions(defaultTestOptions, timeout, retry, skip, only, fails);\n const test = createTestTask(testName, fnIndex, file, parentSuite, options);\n \n debug(`${logPrefix} - Registered test \"${test.name}\" | mode (pre-interp): \"${test.mode}\"`\n + ` | fnIndex ${fnIndex} | timeout: ${options.timeout} ms | retry: ${options.retry} | skip: ${options.skip}`\n + ` | only: ${options.only} | fails: ${options.fails} | suite: \"${test.suite?.name}\"`\n + ` (parent idx: ${(test.meta as AssemblyScriptTestTaskMeta).idxInParentTasks})`\n );\n },\n },\n\n // user imports for any other environments they defined\n ...(userCustomEnvImports ?? {}),\n };\n}\n\n/**\n * Create import object for test execution\n *\n * Used during test execution to capture test results / assertions, and to handle\n * runtime aborts as expected cases for test execution by capturing the error on the test meta.\n */\nexport function createTestExecutionImports(\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n test: Test,\n handleLog: AssemblyScriptConsoleLogHandler,\n logPrefix: string,\n coverageMemory?: WebAssembly.Memory,\n createWasmImports?: WasmImportsFactory,\n): { imports: WebAssembly.Imports; provideFunctionTable: (table: WebAssembly.Table) => void; } {\n // execution imports are created per-test, so these represent per-test state\n let lastFailedAssertion: FailedAssertion | undefined;\n let isExpectingError: boolean = false;\n let expectedErrorMsgStr: string | undefined;\n let wasmFunctionTable: WebAssembly.Table | undefined;\n\n const {\n userEnvImports,\n userCustomEnvImports\n } = createUserWasmImports(createWasmImports, memory, module, logPrefix);\n\n const imports = {\n env: {\n // users can choose to hide these with their own\n ...createWasmConsole(memory, handleLog),\n\n // user imports for \"env\"\n ...(userEnvImports ?? {}),\n\n memory,\n\n abort(msgPtr: number, filePtr: number, line: number, column: number) {\n const { message, location } = decodeAbortInfo(memory, msgPtr, filePtr, line, column);\n const msgAtLoc = `${message}${location ? ` at ${location}` : ''}`;\n \n debug(`${logPrefix} - Handling test execution abort: ${msgAtLoc}`);\n\n let failureMessage = message;\n\n // handle expected aborts for thrown errors\n if (isExpectingError) {\n // TODO: decide if .includes is correct here or not\n if (!expectedErrorMsgStr || message.includes(expectedErrorMsgStr)) {\n // either no specifically expected error (any error), or error message matches\n (test.meta as AssemblyScriptTestTaskMeta).assertionsPassedCount++;\n \n debug(`${logPrefix} - Thrown error matches expected - assertion passes`);\n\n // abort without failing the test\n throw abortWASMExecutionOnSuccess();\n } else {\n const expected = getExpectedMessageOrAny(expectedErrorMsgStr);\n\n // error message mismatch\n failureMessage = `expected function to throw error ${expected}, but received error \"${message}\"`;\n\n lastFailedAssertion = {\n message: failureMessage,\n actualTypeName: 'string',\n expectedTypeName: 'string',\n valuesProvided: true,\n actual: message,\n expected: expectedErrorMsgStr\n };\n\n const errStr = `Thrown error does not match expected | Expected: ${expected} | Actual: \"${message}\"`;\n debug(`${logPrefix} - Assertion failed: ${errStr}`);\n }\n }\n\n const testError = lastFailedAssertion\n ? failTestAssertionError(test, lastFailedAssertion)\n : failTestRuntimeError(test, '', failureMessage);\n\n throw abortWASMExecution(testError, new Error());\n },\n },\n\n [AS_POOL_WASM_IMPORTS_MODULE_NAME]: {\n \n ...(coverageMemory ? { [AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME]: coverageMemory } : {}),\n\n // stubs during execution\n __register_test() {},\n __begin_register_suite() {},\n __end_register_suite() {},\n\n __assertion_pass() {\n (test.meta as AssemblyScriptTestTaskMeta).assertionsPassedCount++;\n },\n\n __assertion_fail(msgPtr: number, actualTypeNamePtr: number, expectedTypeNamePtr: number, valuesProvided: boolean, actualPtr?: number, expectedPtr?: number) {\n const errorMsg = liftString(memory, msgPtr) ?? '';\n const actualTypeName = liftString(memory, actualTypeNamePtr) ?? '';\n const expectedTypeName = liftString(memory, expectedTypeNamePtr) ?? '';\n let valuesMsg = ' | No Values Provided';\n \n lastFailedAssertion = {\n actualTypeName,\n expectedTypeName,\n message: errorMsg,\n valuesProvided: Boolean(valuesProvided)\n };\n\n (test.meta as AssemblyScriptTestTaskMeta).assertionsFailed.push(lastFailedAssertion);\n \n if (valuesProvided && actualPtr && expectedPtr) {\n lastFailedAssertion.actual = liftString(memory, actualPtr);\n lastFailedAssertion.expected = liftString(memory, expectedPtr);\n valuesMsg = ` | Actual Type: ${actualTypeName} | Expected Type: ${expectedTypeName}`\n + ` | Actual Value: \\`${lastFailedAssertion.actual}\\` | Expected Value: \\`${lastFailedAssertion.expected}\\``;\n }\n \n debug(`${logPrefix} - Assertion failed: ${errorMsg}${valuesMsg}`);\n },\n\n __expect_throw(fnIndex: number, expectedErrorMsgPtr?: number) {\n isExpectingError = true;\n if (expectedErrorMsgPtr) {\n expectedErrorMsgStr = liftString(memory, expectedErrorMsgPtr);\n }\n\n debug(`${logPrefix} - Registered expected error throw: ${getExpectedMessageOrAny(expectedErrorMsgStr)}`);\n\n if (wasmFunctionTable && typeof wasmFunctionTable.get === 'function') {\n const fn = wasmFunctionTable.get(fnIndex);\n if (!fn) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Could not access function (fnPtr ${fnIndex}) which is expected to throw in test \"${test.name}\"`,\n );\n }\n\n // successful:\n // - throws in WASM, calls abort handler\n // - abort handler confirms error matches expected, does NOT fail test, halts execution with WASMExecutionAbortError\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report passed test\n // failure (wrong error):\n // - throws in WASM, calls abort handler\n // - abort handler confirms error matches mismatch, failTest packages up an appropriate test error\n // - abort handler halts execution with WASMExecutionAbortError containing test error\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report test error\n // failure (no error):\n // - does NOT throw in WASM\n // - WASM continues executing and calls __end_expect_throw\n // - __end_expect_throw sees it is STILL expecting an error, failTest packages up an appropriate test error\n // - __end_expect_throw halts execution with WASMExecutionAbortError containing test error\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report test error\n debug(`${logPrefix} - Calling function (idx ${fnIndex})`);\n fn();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Could not access WASM function table to call function expected to throw`,\n );\n }\n },\n\n __end_expect_throw() {\n if (isExpectingError) {\n const errStr = `Expected thrown error but got none | Expected: \"${expectedErrorMsgStr}\"`;\n debug(`${logPrefix} - Assertion failed: ${errStr}`);\n \n const failureMessage = `function did not throw, but was expected to throw error: ${getExpectedMessageOrAny(expectedErrorMsgStr)}`;\n const testError = failTestAssertionError(test, {\n message: failureMessage,\n actualTypeName: 'undefined',\n expectedTypeName: 'string',\n valuesProvided: true,\n actual: undefined,\n expected: expectedErrorMsgStr\n });\n\n // Must throw here to halt WASM execution on an assertion or runtime failure for this test.\n // This will be caught by the executor and reported as an appropriate test error\n throw abortWASMExecution(testError);\n }\n },\n },\n\n // user imports for any other environments they defined\n ...(userCustomEnvImports ?? {}),\n };\n\n return {\n imports,\n provideFunctionTable: (table: WebAssembly.Table) => {\n debug(`${logPrefix} - Got WASM function table | length: ${table.length}`);\n wasmFunctionTable = table;\n },\n };\n}\n","import { basename } from 'node:path';\nimport type { SerializedDiffOptions } from '@vitest/utils/diff';\nimport type { File, Test } from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLogHandler,\n AssemblyScriptPoolError,\n AssemblyScriptTestError,\n AssemblyScriptTestTaskMeta,\n CoverageData,\n ResolvedAssemblyScriptPoolOptions,\n ThreadImports,\n WASMCompilation,\n WASMExecutorPerfTimings,\n} from '../types/types.js';\nimport { AS_POOL_ERROR_FLAG, POOL_ERROR_NAMES } from '../types/constants.js';\nimport { debug, debugOverride } from '../util/debug.js';\nimport { createMemory } from './wasm-memory.js';\nimport { createDiscoveryImports, createTestExecutionImports } from './wasm-imports.js';\nimport { enhanceTestError } from './wasm-errors.js';\nimport { createPoolError, wrapPoolError } from '../util/pool-errors.js';\nimport { failTestRuntimeError, getTaskLogLabel } from '../util/vitest-tasks.js';\nimport { extractCallStack } from './source-maps.js';\n\nconst SIG_MISMATCH_ERROR_MSG = `WASM function signature type mismatch during test collection.`\n + ` This is most likely caused by passing a type-inferred, non-void callback to expect().`\n + ` To fix, either explicitly define the non-void return type on the callback`\n + ` e.g. \\`expect((): i32 => failingFunction()).toThrowError()\\``\n + ` or use braces to make it void e.g. \\`expect(() => { failingFunction(); }).toThrowError()\\`.`\n + ` Look for the failing expect() within the describe() block indicated in the stack trace.`;\n\nfunction verifyMemoryRequirements(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n) {\n if (poolOptions.testMemoryPagesInitial && poolOptions.testMemoryPagesInitial < compilation.requiredMemory.testMemory.initialPages) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires initial test memory pages (${compilation.requiredMemory.testMemory.initialPages}) exceeding configured \"testMemoryPagesInitial\"`\n + ` (${poolOptions.testMemoryPagesInitial}). Increase value, or remove for auto sizing.`,\n );\n }\n \n if (poolOptions.testMemoryPagesMax && compilation.requiredMemory.testMemory.maximumPages\n && poolOptions.testMemoryPagesMax < compilation.requiredMemory.testMemory.maximumPages\n ) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires maximum test memory pages (${compilation.requiredMemory.testMemory.maximumPages}) exceeding configured \"testMemoryPagesMax\"`\n + ` (${poolOptions.testMemoryPagesMax}). Increase value, or remove for auto sizing.`,\n );\n }\n \n if (poolOptions.coverageMemoryPagesInitial && poolOptions.coverageMemoryPagesInitial < compilation.requiredMemory.coverageMemory.initialPages) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires initial coverage memory pages (${compilation.requiredMemory.coverageMemory.initialPages}) exceeding configured \"coverageMemoryPagesInitial\"`\n + ` (${poolOptions.coverageMemoryPagesInitial}). Increase value, or remove for auto sizing.`,\n );\n }\n\n if (poolOptions.coverageMemoryPagesMax && compilation.requiredMemory.coverageMemory.maximumPages\n && poolOptions.coverageMemoryPagesMax < compilation.requiredMemory.coverageMemory.maximumPages\n ) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires maximum coverage memory pages (${compilation.requiredMemory.coverageMemory.maximumPages}) exceeding configured \"coverageMemoryPagesMax\"`\n + ` (${poolOptions.coverageMemoryPagesMax}). Increase value, or remove for auto sizing.`,\n );\n }\n}\n\nfunction createExecutorMemories(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n includeCoverageMemory: boolean,\n): { testMemory: WebAssembly.Memory; coverageMemory?: WebAssembly.Memory } {\n verifyMemoryRequirements(compilation, poolOptions);\n\n const testMemory = createMemory(\n poolOptions.testMemoryPagesInitial ?? compilation.requiredMemory.testMemory.initialPages,\n poolOptions.testMemoryPagesMax ?? compilation.requiredMemory.testMemory.maximumPages\n );\n const coverageMemory = includeCoverageMemory ?\n createMemory(\n poolOptions.coverageMemoryPagesInitial ?? compilation.requiredMemory.coverageMemory.initialPages,\n poolOptions.coverageMemoryPagesMax ?? compilation.requiredMemory.coverageMemory.maximumPages\n )\n : undefined;\n\n return { testMemory, coverageMemory };\n}\n\n/**\n * Discover tests via test() and suites via describe() registration calls\n */\nexport async function executeWASMDiscovery(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n isBinaryInstrumented: boolean,\n handleLog: AssemblyScriptConsoleLogHandler,\n file: File,\n moduleLabel: string,\n threadImports: ThreadImports,\n): Promise<void> {\n const base = basename(file.filepath);\n const logPrefix = `[${moduleLabel} Exec] ${getTaskLogLabel(base, file)}`;\n \n try {\n const { testMemory, coverageMemory } = createExecutorMemories(compilation, poolOptions, isBinaryInstrumented);\n\n const importObject = createDiscoveryImports(\n testMemory,\n compilation.compiledModule,\n file,\n handleLog,\n logPrefix,\n coverageMemory,\n threadImports.createUserWasmImports\n );\n\n // Instantiate WASM module\n const instance = new WebAssembly.Instance(compilation.compiledModule, importObject);\n const exports = instance.exports as Record<string, unknown>;\n\n // Call _start to run top-level test() and describe()\n if (typeof exports._start === 'function') {\n exports._start();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'no _start() export found on compiled WASM binary'\n );\n }\n } catch (error: any) {\n if (error && error[AS_POOL_ERROR_FLAG]) {\n throw error;\n }\n\n // void type inference issue\n if (error instanceof WebAssembly.RuntimeError && error.message.includes('null function or function signature mismatch')) {\n throw createPoolError(POOL_ERROR_NAMES.PoolSyntaxError, SIG_MISMATCH_ERROR_MSG, error);\n }\n\n if (error instanceof Error) {\n let match: RegExpExecArray | null = null;\n let moduleName: string | undefined;\n let functionName: string | undefined;\n let errorMessage: string | undefined;\n \n if (match = /\"(.+)\": module is not an object or function/.exec(error.message)) {\n // module import error\n moduleName = match[1];\n errorMessage = `Expected module \"${moduleName}\" to be defined as an object`\n + ` or function within user WASM imports (returned by WasmImportsFactory).`;\n } else if (match = /\"(.+)\" (function=)?\"(.+)\": function import requires a callable/.exec(error.message)) {\n // function import error\n moduleName = match[1];\n functionName = match[3];\n errorMessage = `Expected function \"${functionName}\" to be defined in module \"${moduleName}\"`\n + ` within user WASM imports (returned by WasmImportsFactory).`;\n }\n\n if (errorMessage) {\n throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, errorMessage, error);\n }\n }\n \n // any other error\n throw wrapPoolError(POOL_ERROR_NAMES.WASMExecutionHarnessError, error, true);\n }\n\n debug(`${logPrefix} - Discovered ${file.tasks.length} top-level tasks`);\n return;\n}\n\n/**\n * Execute a single test with crash isolation\n */\nexport async function executeWASMTest(\n test: Test,\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n collectCoverage: boolean,\n handleLog: AssemblyScriptConsoleLogHandler,\n moduleLabel: string,\n threadImports: ThreadImports,\n projectRoot: string,\n diffOptions?: SerializedDiffOptions,\n): Promise<{ test: Test, testTimings: WASMExecutorPerfTimings }> {\n const testTimings: WASMExecutorPerfTimings = {\n fnInit: performance.now(),\n execStart: 0,\n execEnd: 0,\n fnfinal: 0\n };\n const base = basename(test.file.filepath);\n const fullModuleLabel = `${moduleLabel} Exec`;\n const taskLabel = getTaskLogLabel(base, test);\n const logPrefix = `[${fullModuleLabel}] ${taskLabel}`;\n\n function covDebug(...args: any[]): void {\n if (poolOptions.debugCoverageExtract) {\n debugOverride(...args);\n }\n };\n\n const { testMemory, coverageMemory } = createExecutorMemories(compilation, poolOptions, collectCoverage);\n\n // Create import object with pool-side functions for capturing test execution results\n const { imports, provideFunctionTable } = createTestExecutionImports(\n testMemory,\n compilation.compiledModule,\n test,\n handleLog,\n logPrefix,\n coverageMemory,\n threadImports.createUserWasmImports\n );\n\n // Instantiate fresh WASM instance for this test\n const instance = new WebAssembly.Instance(compilation.compiledModule, imports);\n const exports = instance.exports as Record<string, unknown>;\n\n // Func table accessable because we're using the AS compiler --exportTable flag\n const table = exports.table as WebAssembly.Table | undefined;\n \n // allow imports to access table\n if (table && typeof table.get === 'function') {\n provideFunctionTable(table);\n }\n\n // Call _start to run top-level code. Test registration is stubbed/noop duing execution,\n // but this call is still needed to initialize any user-defined globals / other top level code.\n if (typeof exports._start === 'function') {\n // Not explicitly handling with try-catch here because failures in _start should be\n // caught during discovery and source-mapped. If this somehow fails, the worker still catches it.\n exports._start();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'no _start() export found on compiled WASM binary'\n );\n }\n\n let testFn: (() => void) | null | undefined;\n \n if (table && typeof table.get === 'function') {\n const idx = (test.meta as AssemblyScriptTestTaskMeta).fnIndex;\n testFn = table.get(idx) as (() => void) | null;\n\n if (!testFn) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Test function at index ${idx} not found in function table`\n );\n }\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'Function table not found in WASM exports (missing --exportTable flag?)'\n );\n }\n\n // try-catch to ensure we capture known test errors to report\n // as AssemblyScriptTestErrors to vitest\n try {\n // Execute this test\n testTimings.execStart = performance.now();\n testFn();\n testTimings.execEnd = performance.now();\n\n // If we reach here, test passed, i.e. No abort occurred.\n // Proceed below to prepare the test result\n } catch (error: any) {\n testTimings.execEnd = performance.now();\n\n let testError: AssemblyScriptTestError;\n let stack: NodeJS.CallSite[];\n let allowStackJS: boolean;\n let applyStackToTestErrorCause: boolean;\n\n if (error && error[AS_POOL_ERROR_FLAG]) {\n const wrapper = error as AssemblyScriptPoolError;\n testError = wrapper.testError;\n stack = wrapper.originalErrorRawStack;\n allowStackJS = wrapper.originalErrorMayContainJS;\n applyStackToTestErrorCause = wrapper.applyStackToTestErrorCause;\n } else if (error instanceof Error) {\n testError = failTestRuntimeError(test, error.name, error.message);\n stack = extractCallStack(error);\n allowStackJS = true;\n applyStackToTestErrorCause = false;\n } else {\n testError = failTestRuntimeError(test, '', `Unexpected WASM test execution error: ${String(error)}`);\n stack = extractCallStack(new Error());\n allowStackJS = true;\n applyStackToTestErrorCause = false;\n }\n\n await enhanceTestError(\n testError,\n test,\n compilation.sourceMap,\n logPrefix,\n allowStackJS,\n projectRoot,\n applyStackToTestErrorCause,\n stack,\n diffOptions\n );\n }\n\n const meta = test.meta as AssemblyScriptTestTaskMeta;\n\n // Extract coverage hits from coverage memory\n if (collectCoverage && compilation.debugInfo) {\n if (!coverageMemory) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'Coverage memory not created despite collectCoverage=true'\n );\n }\n\n const coverage: CoverageData = {\n hitCountsByFileAndPosition: {},\n };\n\n // Read counters from coverage memory\n const extractedHitCounters = new Uint32Array(coverageMemory.buffer, 0, compilation.debugInfo.instrumentedFunctionCount);\n covDebug(`${logPrefix} - Read coverage memory for ${compilation.debugInfo.instrumentedFunctionCount} instrumented functions`);\n\n // Iterate all instrumented functions and build coverage data with hit counts extracted from coverage memory\n let functionsHit = 0;\n for (const [filePath, debugFunctions] of Object.entries(compilation.debugInfo.functionsByFileAndPosition)) {\n if (!coverage.hitCountsByFileAndPosition[filePath]) {\n coverage.hitCountsByFileAndPosition[filePath] = {};\n covDebug(`${logPrefix} - Extracting hits for source file \"${filePath}\"`);\n }\n\n for (const [positionKey, funcInfos] of Object.entries(debugFunctions)) {\n // Sum hit counts across all functions at this position (multiple for generic monomorphizations)\n let positionHitCount = 0;\n for (const funcInfo of funcInfos) {\n if (funcInfo.coverageMemoryIndex === undefined) {\n debug(`${logPrefix} - WARNING: NO COVERAGE MEMORY INDEX`\n + ` - func \"${funcInfo.name}\" (${positionKey}) Skipping hit extraction`\n );\n continue;\n }\n\n const hitCount = extractedHitCounters[funcInfo.coverageMemoryIndex] ?? 0;\n covDebug(`${logPrefix} - func \"${funcInfo.name}\" (${positionKey}) `\n + `[idx: ${funcInfo.coverageMemoryIndex}]: ${hitCount} hits`\n );\n positionHitCount += hitCount;\n }\n\n coverage.hitCountsByFileAndPosition[filePath][positionKey] = positionHitCount;\n\n if (positionHitCount > 0) {\n functionsHit++;\n }\n }\n }\n\n meta.coverageData = coverage;\n debug(`${logPrefix} - Extracted coverage data | ${functionsHit} functions hit`);\n }\n\n testTimings.fnfinal = performance.now();\n\n return { test, testTimings };\n}\n","/**\n * RPC Reporting Helpers\n *\n * This module provides helper functions for reporting test lifecycle events\n * to Vitest via RPC. All helpers are designed to be composable and reusable.\n */\n\nimport type { MessagePort } from 'node:worker_threads';\nimport { createBirpc } from 'birpc';\nimport type { RunnerRPC, RuntimeRPC, UserConsoleLog } from 'vitest';\nimport type {\n File,\n Suite,\n Test,\n Task,\n TaskEventPack, \n TaskResultPack,\n CancelReason,\n} from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLog,\n AssemblyScriptCoveragePayload,\n AssemblyScriptSuiteTaskMeta,\n VitestVersion,\n WorkerRPC\n} from '../types/types.js';\nimport { debug } from '../util/debug.js';\nimport { COVERAGE_PAYLOAD_FORMATS } from '../types/constants.js';\nimport {\n createAfterSuiteRunMeta,\n getTaskLogLabel,\n isSuiteOwnFile\n} from '../util/vitest-tasks.js';\n\n// ============================================================================\n// RPC Client Factory\n// ============================================================================\n\n/** Create RPC client from MessagePort */\nexport function createRpcClient(port: MessagePort): WorkerRPC {\n return createBirpc<RuntimeRPC, RunnerRPC>(\n {\n onCancel: (_reason: CancelReason) => void { }\n },\n {\n post: (v) => port.postMessage(v),\n on: (fn) => port.on('message', fn),\n }\n );\n}\n\n// ============================================================================\n// File Task Reporting\n// ============================================================================\n\n/** Report file as queued (before compilation & discovery starts) */\nexport async function reportFileQueued(\n rpc: WorkerRPC,\n fileTask: File,\n logModule: string,\n logLabel: string,\n): Promise<void> {\n await rpc.onQueued(fileTask);\n debug(`[${logModule} RPC] ${logLabel} - Reported onQueued for file \"${fileTask.filepath}\"`\n + ` | mode: \"${fileTask.mode}\" | state: \"${fileTask.result ? fileTask.result.state : '--'}\"`\n );\n}\n\n/** Report file collection complete with full task tree */\nexport async function reportFileCollected(\n rpc: WorkerRPC,\n fileTask: File,\n logModule: string,\n logLabel: string,\n): Promise<void> {\n await rpc.onCollected([fileTask]);\n debug(`[${logModule} RPC] ${logLabel} - Reported onCollected for file \"${fileTask.filepath}\"`\n + ` | ${fileTask.tasks.length} tasks | mode: \"${fileTask.mode}\" | state: \"${fileTask.result?.state}\"`\n );\n}\n\n/** Report file-level error (compilation/discovery failure) as \"suite-failed-early\" */\nexport async function reportFileError(\n rpc: WorkerRPC,\n fileTask: File, \n logModule: string,\n logLabel: string,\n): Promise<void> {\n const taskPack: TaskResultPack = [fileTask.id, fileTask.result, {}];\n const eventPack: TaskEventPack = [fileTask.id, \"suite-failed-early\", undefined];\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n\n debug(`[${logModule} RPC] ${logLabel} - Reported \"suite-failed-early\" task update for \"${fileTask.filepath}\"`);\n}\n\n// ============================================================================\n// Suite Lifecycle Reporting\n// ============================================================================\n\n/** Report suite-prepare event */\nexport async function reportSuitePrepare(\n rpc: WorkerRPC,\n suite: Suite,\n logModule: string,\n base: string,\n): Promise<void> {\n // Report suite event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [suite.id, suite.result, {}];\n const eventPack: TaskEventPack = [suite.id, 'suite-prepare', undefined];\n\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, suite)} - Reported \"suite-prepare\" task update`\n + ` | state: \"${suite.result?.state}\"`\n );\n}\n\n/** Report suite-finished event */\nexport async function reportSuiteFinished(\n rpc: WorkerRPC,\n suite: Suite,\n logModule: string,\n base: string,\n vitestVersion: VitestVersion = 'v4',\n): Promise<void> {\n const suiteLabel = getTaskLogLabel(base, suite);\n const rpcLogPrefix = `[${logModule} RPC] ${suiteLabel}`;\n const meta = suite.meta as AssemblyScriptSuiteTaskMeta;\n const coverageKeys: number = Object.keys(meta.coverageData?.hitCountsByFileAndPosition ?? {}).length;\n let coveragePromise: Promise<void> = Promise.resolve();\n \n // Report coverage if this is a file task, and coverage is available\n if (isSuiteOwnFile(suite) && coverageKeys > 0) {\n const coverage: AssemblyScriptCoveragePayload = {\n __format: COVERAGE_PAYLOAD_FORMATS.AssemblyScript,\n coverageData: meta.coverageData!,\n suiteLogLabel: suiteLabel\n };\n \n const afterSuiteMeta = createAfterSuiteRunMeta(\n coverage,\n [suite.file.filepath],\n suite.file.projectName,\n vitestVersion\n );\n coveragePromise = rpc.onAfterSuiteRun(afterSuiteMeta);\n\n debug(`${rpcLogPrefix} - onAfterSuiteRun: Reported suite coverage (${coverageKeys} unique positions)`);\n } else if (coverageKeys === 0) {\n debug(`${rpcLogPrefix} - onAfterSuiteRun: No suite coverage to report`);\n }\n\n // Report suite event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [suite.id, suite.result, {}];\n const eventPack: TaskEventPack = [suite.id, \"suite-finished\", undefined];\n\n await Promise.all([\n coveragePromise,\n rpc.onTaskUpdate([taskPack], [eventPack])\n ]);\n\n debug(`${rpcLogPrefix} - Reported \"suite-finished\" task update | state: \"${suite.result?.state}\"`\n + ` | duration: ${suite.result?.duration?.toFixed(2) ?? '--'} ms`\n );\n}\n\n// ============================================================================\n// Test Lifecycle Reporting\n// ============================================================================\n\nasync function reportTestTaskUpdate(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n updateEvent: 'test-prepare' | 'test-finished' | 'test-retried'\n): Promise<void> {\n // Report test event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [test.id, test.result, {}];\n const eventPack: TaskEventPack = [test.id, updateEvent, undefined];\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, test)} - Reporting \"${updateEvent}\" task update...`\n + ` | state: \"${test.result?.state}\"`\n + `${updateEvent === 'test-prepare' ? '' : ` | duration: ${test.result?.duration?.toFixed(2) ?? '--'} ms`}`\n );\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, test)} - Reported \"${updateEvent}\" task update`\n + ` | state: \"${test.result?.state}\"`\n + `${updateEvent === 'test-prepare' ? '' : ` | duration: ${test.result?.duration?.toFixed(2) ?? '--'} ms`}`\n );\n}\n\n/** Report test starting execution */\nexport async function reportTestPrepare(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-prepare');\n}\n\n/** Report test finished execution */\nexport async function reportTestFinished(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-finished');\n}\n\n/** Report test retried (sent when test failed and is going to be retried) */\nexport async function reportTestRetried(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-retried');\n}\n\n// ============================================================================\n// Other Reporting\n// ============================================================================\n\n/** Report user console log messages */\nexport async function reportUserConsoleLogs(\n rpc: WorkerRPC,\n logs: AssemblyScriptConsoleLog[],\n logModule: string,\n base: string,\n task: Task,\n): Promise<void> {\n if (logs.length === 0) {\n return;\n }\n\n const stdLogs = logs.filter(l => !l.isError);\n const errorLogs = logs.filter(l => l.isError);\n\n const stdContent: string = stdLogs.map(l => `${l.msg}`).join('\\n');\n const errorContent: string = errorLogs.filter(l => l.isError).map(l => `${l.msg}`).join('\\n');\n\n const stdLog: UserConsoleLog = {\n content: `${stdContent}\\n`,\n size: stdContent.length,\n browser: false,\n type: 'stdout',\n time: stdLogs.length > 0 ? stdLogs[0]!.time : Date.now(),\n taskId: task.id,\n origin: task.id\n };\n \n const errorLog: UserConsoleLog = {\n content: `${errorContent}\\n`,\n size: errorContent.length,\n browser: false,\n type: 'stderr',\n time: errorLogs.length > 0 ? errorLogs[0]!.time : Date.now(),\n taskId: task.id,\n origin: task.id\n };\n\n const reportPromises: Promise<void>[] = [];\n if (stdContent.length > 0) {\n reportPromises.push(rpc.onUserConsoleLog(stdLog));\n }\n if (errorContent.length > 0) {\n reportPromises.push(rpc.onUserConsoleLog(errorLog));\n }\n\n await Promise.all(reportPromises);\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, task)} - Reported onUserConsoleLog | ${logs.length} messages`);\n}\n\n// ============================================================================\n// Final Flush\n// ============================================================================\n\n/** Flush any pending RPC updates */\nexport async function flushRpcUpdates(\n rpc: WorkerRPC,\n): Promise<void> {\n await rpc.onTaskUpdate([], []);\n}\n","import { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { WasmImportsFactory } from '../types/types.js';\nimport { debug } from '../util/debug.js';\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\nimport { createPoolError } from '../util/pool-errors.js';\n\nexport async function loadUserWasmImportsFactory(\n relativePath: string | undefined,\n projectRoot: string,\n logModule: string,\n): Promise<WasmImportsFactory | undefined> {\n if (!relativePath) {\n return undefined;\n }\n\n const path = resolve(projectRoot, relativePath);\n const safeUrl = pathToFileURL(path).href;\n\n try {\n const start = performance.now();\n const createWasmImports = (await import(safeUrl)).default;\n debug(`[${logModule}] Imported user WasmImportsFactory \"${safeUrl}\" | TIMING ${(performance.now() - start).toFixed(2)} ms`);\n\n if (typeof createWasmImports !== 'function') {\n const msg = `Could not load user WasmImportsFactory from \"${safeUrl}\".`\n + ` Ensure that your module has a default export matching () => WebAssembly.Imports`\n + ` \\nDefault export type is currently \"${typeof createWasmImports}\"`;\n \n throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, msg);\n } else {\n return createWasmImports;\n }\n } catch (error) {\n const msg = `Could not load user WasmImportsFactory from \"${safeUrl}\".`\n + ` Ensure that your module path is relative to the project root`\n + ` (location of shallowest vitest config), and that it has a`\n + ` default export matching () => WebAssembly.Imports`;\n throw createPoolError(\n POOL_ERROR_NAMES.WASMUserImportsError,\n msg,\n error,\n true\n );\n }\n};\n"],"mappings":"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"}
|