vitest-pool-assemblyscript 0.9.0 → 0.10.0
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/BINARYEN_VERSION +1 -1
- package/assembly/compare.ts +11 -12
- package/assembly/describe.ts +4 -4
- package/assembly/expect.ts +44 -26
- package/assembly/test.ts +9 -9
- package/assembly/utils.ts +218 -62
- package/binding.gyp +4 -4
- package/dist/{addon-interface-CYFXMbK7.mjs → addon-interface-DJB-K27u.mjs} +12 -12
- package/dist/addon-interface-DJB-K27u.mjs.map +1 -0
- package/dist/{ast-visitor-CWEOd3UH.mjs → ast-visitor-w1HMbuJR.mjs} +2 -2
- package/dist/{ast-visitor-CWEOd3UH.mjs.map → ast-visitor-w1HMbuJR.mjs.map} +1 -1
- package/dist/compile-runner-D4SJWhMh.mjs +82 -0
- package/dist/compile-runner-D4SJWhMh.mjs.map +1 -0
- package/dist/compiler/transforms/deep-equals.d.mts.map +1 -1
- package/dist/compiler/transforms/deep-equals.mjs +61 -22
- package/dist/compiler/transforms/deep-equals.mjs.map +1 -1
- package/dist/compiler/transforms/strip-inline.mjs +2 -2
- package/dist/{compiler-hUlDr5vL.mjs → compiler-DSKhQ5--.mjs} +58 -28
- package/dist/compiler-DSKhQ5--.mjs.map +1 -0
- package/dist/config/index-v3.d.mts +1 -1
- package/dist/config/index-v3.d.mts.map +1 -1
- package/dist/config/index-v3.mjs.map +1 -1
- package/dist/config/index.d.mts +2 -2
- package/dist/config/index.mjs +5 -7
- package/dist/{constants-DbxJ3hzg.mjs → constants-Bq5KNxXJ.mjs} +4 -2
- package/dist/constants-Bq5KNxXJ.mjs.map +1 -0
- package/dist/{coverage-merge-CBXkpM1O.mjs → coverage-merge-0WqdC-dq.mjs} +1 -1
- package/dist/{coverage-merge-CBXkpM1O.mjs.map → coverage-merge-0WqdC-dq.mjs.map} +1 -1
- package/dist/coverage-provider/index.mjs +36 -36
- package/dist/coverage-provider/index.mjs.map +1 -1
- package/dist/{feature-check-Bje3ntpV.mjs → feature-check-DLfJqIrE.mjs} +4 -4
- package/dist/{feature-check-Bje3ntpV.mjs.map → feature-check-DLfJqIrE.mjs.map} +1 -1
- package/dist/index-internal.d.mts +3 -3
- package/dist/index-internal.d.mts.map +1 -1
- package/dist/index-internal.mjs +5 -4
- package/dist/index-v3.d.mts.map +1 -1
- package/dist/index-v3.mjs +19 -33
- package/dist/index-v3.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +5 -7
- package/dist/{load-user-imports-Bx5ZlhSm.mjs → load-user-imports-6Pv-9hRg.mjs} +103 -229
- package/dist/load-user-imports-6Pv-9hRg.mjs.map +1 -0
- package/dist/pool-errors-GWfwrsD7.mjs +631 -0
- package/dist/pool-errors-GWfwrsD7.mjs.map +1 -0
- package/dist/{pool-runner-init-CNpRdA5u.d.mts → pool-runner-init-CCvnKt5o.d.mts} +2 -2
- package/dist/pool-runner-init-CCvnKt5o.d.mts.map +1 -0
- package/dist/{pool-runner-init-BqkwQ2tk.mjs → pool-runner-init-Cta6aVJ6.mjs} +15 -30
- package/dist/pool-runner-init-Cta6aVJ6.mjs.map +1 -0
- package/dist/pool-thread/compile-worker-thread.d.mts +1 -1
- package/dist/pool-thread/compile-worker-thread.d.mts.map +1 -1
- package/dist/pool-thread/compile-worker-thread.mjs +29 -19
- package/dist/pool-thread/compile-worker-thread.mjs.map +1 -1
- package/dist/pool-thread/test-worker-thread.d.mts +1 -1
- package/dist/pool-thread/test-worker-thread.d.mts.map +1 -1
- package/dist/pool-thread/test-worker-thread.mjs +25 -18
- package/dist/pool-thread/test-worker-thread.mjs.map +1 -1
- package/dist/pool-thread/v3-tinypool-thread.d.mts +1 -1
- package/dist/pool-thread/v3-tinypool-thread.d.mts.map +1 -1
- package/dist/pool-thread/v3-tinypool-thread.mjs +43 -33
- package/dist/pool-thread/v3-tinypool-thread.mjs.map +1 -1
- package/dist/test-runner-M21HMDdH.mjs +147 -0
- package/dist/test-runner-M21HMDdH.mjs.map +1 -0
- package/dist/{types-DHVk5iAx.d.mts → types-CoroKYxB.d.mts} +39 -16
- package/dist/types-CoroKYxB.d.mts.map +1 -0
- package/dist/vitest-file-tasks-Coc4btUw.mjs +473 -0
- package/dist/vitest-file-tasks-Coc4btUw.mjs.map +1 -0
- package/dist/wasm-memory-C8Nkl2Sz.mjs +134 -0
- package/dist/wasm-memory-C8Nkl2Sz.mjs.map +1 -0
- package/dist/{worker-rpc-channel-CZZIxtv5.mjs → worker-rpc-channel-CvCrc8aa.mjs} +1 -1
- package/dist/{worker-rpc-channel-CZZIxtv5.mjs.map → worker-rpc-channel-CvCrc8aa.mjs.map} +1 -1
- package/package.json +2 -2
- package/prebuilds/darwin-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
- package/prebuilds/darwin-x64/vitest-pool-assemblyscript.glibc.node +0 -0
- package/prebuilds/linux-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
- package/prebuilds/linux-x64/vitest-pool-assemblyscript.glibc.node +0 -0
- package/prebuilds/linux-x64/vitest-pool-assemblyscript.musl.node +0 -0
- package/prebuilds/win32-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
- package/prebuilds/win32-x64/vitest-pool-assemblyscript.glibc.node +0 -0
- package/src/instrumentation/native/addon.cpp +71 -32
- package/dist/addon-interface-CYFXMbK7.mjs.map +0 -1
- package/dist/compile-runner-BGQhBkBo.mjs +0 -85
- package/dist/compile-runner-BGQhBkBo.mjs.map +0 -1
- package/dist/compiler-hUlDr5vL.mjs.map +0 -1
- package/dist/constants-DbxJ3hzg.mjs.map +0 -1
- package/dist/debug-DtRAL4rM.mjs +0 -232
- package/dist/debug-DtRAL4rM.mjs.map +0 -1
- package/dist/load-user-imports-Bx5ZlhSm.mjs.map +0 -1
- package/dist/path-utils-t9OzjXYF.mjs +0 -24
- package/dist/path-utils-t9OzjXYF.mjs.map +0 -1
- package/dist/pool-runner-init-BqkwQ2tk.mjs.map +0 -1
- package/dist/pool-runner-init-CNpRdA5u.d.mts.map +0 -1
- package/dist/resolve-config-s9gSJSMc.mjs +0 -85
- package/dist/resolve-config-s9gSJSMc.mjs.map +0 -1
- package/dist/test-runner-BGqc9uCK.mjs +0 -138
- package/dist/test-runner-BGqc9uCK.mjs.map +0 -1
- package/dist/types-DHVk5iAx.d.mts.map +0 -1
- package/dist/vitest-file-tasks-D8sOClGX.mjs +0 -149
- package/dist/vitest-file-tasks-D8sOClGX.mjs.map +0 -1
- package/dist/vitest-tasks-BZ24sghI.mjs +0 -321
- package/dist/vitest-tasks-BZ24sghI.mjs.map +0 -1
- package/dist/wasm-names-BFtzQCH4.mjs +0 -124
- package/dist/wasm-names-BFtzQCH4.mjs.map +0 -1
package/dist/config/index.mjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import "../constants-
|
|
2
|
-
import "../
|
|
3
|
-
import "../
|
|
4
|
-
import "../
|
|
5
|
-
import "../
|
|
6
|
-
import "../worker-rpc-channel-CZZIxtv5.mjs";
|
|
7
|
-
import { createAssemblyScriptPool } from "../pool-runner-init-BqkwQ2tk.mjs";
|
|
1
|
+
import "../constants-Bq5KNxXJ.mjs";
|
|
2
|
+
import "../vitest-file-tasks-Coc4btUw.mjs";
|
|
3
|
+
import "../pool-errors-GWfwrsD7.mjs";
|
|
4
|
+
import "../worker-rpc-channel-CvCrc8aa.mjs";
|
|
5
|
+
import { createAssemblyScriptPool } from "../pool-runner-init-Cta6aVJ6.mjs";
|
|
8
6
|
|
|
9
7
|
export { createAssemblyScriptPool };
|
|
@@ -31,14 +31,16 @@ const TEST_ERROR_NAMES = {
|
|
|
31
31
|
const POOL_ERROR_NAMES = {
|
|
32
32
|
CompilationError: "CompilationError",
|
|
33
33
|
WASMInstrumentationError: "WASMInstrumentationError",
|
|
34
|
+
WASMUserImportsError: "WASMUserImportsError",
|
|
34
35
|
WASMExecutionHarnessError: "WASMExecutionHarnessError",
|
|
35
36
|
HybridCoverageProviderError: "HybridCoverageProviderError",
|
|
36
37
|
PoolReportingError: "PoolReportingError",
|
|
37
38
|
PoolConfigError: "PoolConfigError",
|
|
38
|
-
PoolError: "PoolError",
|
|
39
39
|
PoolSyntaxError: "PoolSyntaxError",
|
|
40
|
+
PoolError: "PoolError",
|
|
40
41
|
PoolRunAbortedError: "PoolRunAbortedError",
|
|
41
42
|
WASMExecutionAbortError: "WASMExecutionAbortError",
|
|
43
|
+
WASMExecutionAbortSuccess: "WASMExecutionAbortSuccess",
|
|
42
44
|
WASMExecutionTimeoutError: "WASMExecutionTimeoutError"
|
|
43
45
|
};
|
|
44
46
|
const asRuntime = ascript;
|
|
@@ -49,4 +51,4 @@ const ASSourceKind = asRuntime.SourceKind;
|
|
|
49
51
|
|
|
50
52
|
//#endregion
|
|
51
53
|
export { ASCommonFlags, ASDecoratorKind, ASNodeKind, ASSourceKind, COVERAGE_PAYLOAD_FORMATS, INTERNAL_PATH_LIB_PREFIX, POOL_ERROR_NAMES, POOL_INTERNAL_PATHS, TEST_ERROR_NAMES };
|
|
52
|
-
//# sourceMappingURL=constants-
|
|
54
|
+
//# sourceMappingURL=constants-Bq5KNxXJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants-Bq5KNxXJ.mjs","names":[],"sources":["../src/types/constants.ts"],"sourcesContent":["/**\n * Plain Constants\n * \n * Only things that don't require importing ./types to avoid circular dependencies.\n */\n\n\n// ============================================================================\n// General / Shared Constants\n// ============================================================================\n\nexport const ASSEMBLYSCRIPT_POOL_NAME = 'assemblyscript' as const;\n\nexport const AS_POOL_ERROR_FLAG = '__as_pool_error__' as const;\n\nexport const AS_POOL_WORKER_MSG_FLAG = '__as_pool__' as const;\n\nexport const AS_POOL_WASM_IMPORTS_MODULE_NAME = '__as_pool_env__' as const;\n\nexport const AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME = '__coverage_memory' as const;\n\nexport const VITEST_WORKER_REQUEST_MSG_FLAG = '__vitest_worker_request__' as const;\n\nexport const VITEST_WORKER_RESPONSE_MSG_FLAG = '__vitest_worker_response__' as const;\n\nexport const COVERAGE_PAYLOAD_FORMATS = {\n AssemblyScript: 'assemblyscript',\n} as const;\n\n/** Prefix for AssemblyScript compiler strip-inline exclusions and instrumentation exclusions */\nexport const ASSEMBLYSCRIPT_LIB_PREFIX = '~lib/' as const;\n\nexport const INTERNAL_PATH_LIB_PREFIX: string = `${ASSEMBLYSCRIPT_LIB_PREFIX}vitest-pool-assemblyscript/assembly/` as const;\n\nexport const INTERNAL_FUNCTION_NAME_SUBSTRING = '__vitest_assemblyscript_' as const;\n\n/** Paths instrumentation exclusions and assetion error stack frame filtering */\nexport const POOL_INTERNAL_PATHS: string[] = [\n // AS compiler source maps these as relative paths when running locally\n 'assembly/compare.ts',\n 'assembly/describe.ts',\n 'assembly/expect.ts',\n 'assembly/index.ts',\n 'assembly/options.ts',\n 'assembly/utils.ts',\n 'assembly/test.ts',\n\n // AS compiler source maps these as library paths when running published version\n `${INTERNAL_PATH_LIB_PREFIX}compare.ts`,\n `${INTERNAL_PATH_LIB_PREFIX}describe.ts`,\n `${INTERNAL_PATH_LIB_PREFIX}expect.ts`,\n `${INTERNAL_PATH_LIB_PREFIX}index.ts`,\n `${INTERNAL_PATH_LIB_PREFIX}options.ts`,\n `${INTERNAL_PATH_LIB_PREFIX}stringify.ts`,\n `${INTERNAL_PATH_LIB_PREFIX}test.ts`,\n] as const;\n\n/** Error names for AssemblyScript test failures reported to vitest */\nexport const TEST_ERROR_NAMES = {\n /** Assertion evaluated to false within a test function */\n AssertionError: 'AssertionError',\n /** WASM runtime called abort after a non-planned user code error */\n WASMRuntimeError: 'WASMRuntimeError',\n} as const;\n\n/** Error names for internal AssemblyScript pool failures */\nexport const POOL_ERROR_NAMES = {\n /** AssemblyScript compiler (asc) error */\n CompilationError: 'CompilationError',\n /** Native instrumentation and debug info extraction error */\n WASMInstrumentationError: 'WASMInstrumentationError',\n /** Error importing/creating user imports for WASM environment */\n WASMUserImportsError: 'WASMUserImportsError',\n /** Unexpected WASM execution error */\n WASMExecutionHarnessError: 'WASMExecutionHarnessError',\n /** Hybrid coverage provider error */\n HybridCoverageProviderError: 'HybridCoverageProviderError',\n /** vitest RPC reporting error */\n PoolReportingError: 'PoolReportingError',\n /** User configuration error */\n PoolConfigError: 'PoolConfigError',\n /** User syntax error in `test`/`suite`/`expect` */\n PoolSyntaxError: 'PoolSyntaxError',\n /** Generic AssemblyScript pool error */\n PoolError: 'PoolError',\n\n /** Flow Control: Indicates intentional abort */\n PoolRunAbortedError: 'PoolRunAbortedError',\n /**\n * Flow Control: Indicates WASM execution halt through abort() handler,\n * and should be handled by reporting an AssemblyScriptTestError to vitest\n */\n WASMExecutionAbortError: 'WASMExecutionAbortError',\n WASMExecutionAbortSuccess: 'WASMExecutionAbortSuccess',\n /** Flow Control: Indicates WASM execution halt because test timeout elapsed */\n WASMExecutionTimeoutError: 'WASMExecutionTimeoutError',\n} as const;\n\n\n// ============================================================================\n// AssemblyScript Deep Equals & Stringify Transform\n// ============================================================================\n\n/** Name of the method injected by the deep-equals compiler transform */\nexport const DEEP_EQUALS_INJECTED_METHOD_NAME = '__vitest_assemblyscript_deep_equals' as const;\n\n/** Name of the method injected by the compiler transform that returns the runtime class name */\nexport const TYPENAME_INJECTED_METHOD_NAME = '__vitest_assemblyscript_typename' as const;\n\n/** Name of the method injected by the compiler transform that returns stringified field contents */\nexport const STRINGIFY_INJECTED_METHOD_NAME = '__vitest_assemblyscript_stringify' as const;\n\n/**\n * Name of the @global enum in assembly/compare.ts that represents deep equality comparison results.\n * Used in transform-generated code to reference enum members (e.g. EqualityResult.Equal).\n */\nexport const EQUALITY_RESULT_ENUM_NAME = '__vitest_assemblyscript_EqualityResult' as const;\n\n/**\n * Export alias for pool's equals() function used by injected deep equal method comparison body.\n */\nexport const COMPARE_EQUALS_GLOBAL_ALIAS = '__vitest_assemblyscript_compare_equals' as const;\n\n/**\n * Global alias for the path push function used by injected deep equality method field comparisons.\n */\nexport const COMPARE_EQUALS_PATH_PUSH_GLOBAL_ALIAS = '__vitest_assemblyscript_compare_equals_path_push' as const;\n\n/**\n * Global alias for the path pop function used by injected deep equality method field comparisons.\n */\nexport const COMPARE_EQUALS_PATH_POP_GLOBAL_ALIAS = '__vitest_assemblyscript_compare_equals_path_pop' as const;\n\n/**\n * Global alias for the stringifyValue() wrapper used by injected stringify method bodies.\n */\nexport const STRINGIFY_VALUE_GLOBAL_ALIAS = '__vitest_assemblyscript_stringify_value' as const;\n\n/**\n * Global alias for the escapeToDiffString() wrapper used by injected stringify method bodies.\n */\nexport const ESCAPE_TO_DIFF_STRING_GLOBAL_ALIAS = '__vitest_assemblyscript_escape_to_diff_string' as const;\n\n/**\n * Global alias for the depth-to-indent helper used by injected stringify method bodies.\n */\nexport const STRINGIFY_INDENT_GLOBAL_ALIAS = '__vitest_assemblyscript_stringify_indent' as const;\n\n/**\n * Global alias for the short-form budget overflow predicate used by injected stringify method bodies.\n */\nexport const STRINGIFY_EXCEEDS_BUDGET_GLOBAL_ALIAS = '__vitest_assemblyscript_stringify_exceeds_budget' as const;\n\n\n// ============================================================================\n// AssemblyScript Compiler Internals\n// ============================================================================\n\n// Original const enum values defined in assemblyscript.generated.d.ts.\n// These are reexported to avoid access issues with `const enum` exports \n// in assemblyscript, because we're using isolatedModules & isolatedDeclarations\n\nimport * as ascript from 'assemblyscript';\nimport type * as AS from 'assemblyscript';\n\ntype NodeKindMap = Record<keyof typeof AS.NodeKind, number>;\ntype CommonFlagsMap = Record<keyof typeof AS.CommonFlags, number>;\ntype DecoratorKindMap = Record<keyof typeof AS.DecoratorKind, number>;\ntype SourceKindMap = Record<keyof typeof AS.SourceKind, number>;\n\nconst asRuntime = ascript as unknown as {\n NodeKind: NodeKindMap;\n CommonFlags: CommonFlagsMap;\n DecoratorKind: DecoratorKindMap;\n SourceKind: SourceKindMap;\n};\n\nexport const ASNodeKind: NodeKindMap = asRuntime.NodeKind;\nexport const ASCommonFlags: CommonFlagsMap = asRuntime.CommonFlags;\nexport const ASDecoratorKind: DecoratorKindMap = asRuntime.DecoratorKind;\nexport const ASSourceKind: SourceKindMap = asRuntime.SourceKind;\n"],"mappings":";;;AAyBA,MAAa,2BAA2B,EACtC,gBAAgB,kBACjB;;AAGD,MAAa,4BAA4B;AAEzC,MAAa,2BAAmC,WAA6B;;AAK7E,MAAa,sBAAgC;CAE3C;CACA;CACA;CACA;CACA;CACA;CACA;CAGA,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC7B;;AAGD,MAAa,mBAAmB;CAE9B,gBAAgB;CAEhB,kBAAkB;CACnB;;AAGD,MAAa,mBAAmB;CAE9B,kBAAkB;CAElB,0BAA0B;CAE1B,sBAAsB;CAEtB,2BAA2B;CAE3B,6BAA6B;CAE7B,oBAAoB;CAEpB,iBAAiB;CAEjB,iBAAiB;CAEjB,WAAW;CAGX,qBAAqB;CAKrB,yBAAyB;CACzB,2BAA2B;CAE3B,2BAA2B;CAC5B;AA0ED,MAAM,YAAY;AAOlB,MAAa,aAA0B,UAAU;AACjD,MAAa,gBAAgC,UAAU;AACvD,MAAa,kBAAoC,UAAU;AAC3D,MAAa,eAA8B,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-merge-
|
|
1
|
+
{"version":3,"file":"coverage-merge-0WqdC-dq.mjs","names":[],"sources":["../src/coverage-provider/coverage-merge.ts"],"sourcesContent":["/**\n * Coverage Data Merge Utilities\n *\n * Functions for merging CoverageData objects\n */\n\nimport type { CoverageData } from '../types/types.js';\n\n/**\n * Merge incoming CoverageData into accumulated CoverageData\n *\n * Combines by filepath + position, summing hit counts.\n * Mutates the accumulated object in place.\n *\n * @param accumulated - Accumulated coverage data (mutated)\n * @param incoming - New coverage data to merge in\n */\nexport function mergeCoverageData(\n accumulated: CoverageData,\n incoming: CoverageData\n): void {\n for (const [filePath, positions] of Object.entries(incoming.hitCountsByFileAndPosition)) {\n // Ensure file exists in accumulated\n if (!accumulated.hitCountsByFileAndPosition[filePath]) {\n accumulated.hitCountsByFileAndPosition[filePath] = {};\n }\n\n const accumulatedPositions = accumulated.hitCountsByFileAndPosition[filePath];\n\n for (const [positionKey, hitCount] of Object.entries(positions)) {\n if (accumulatedPositions[positionKey] !== undefined) {\n // Position exists - sum hit counts\n accumulatedPositions[positionKey] += hitCount;\n } else {\n // New position - set hit count\n accumulatedPositions[positionKey] = hitCount;\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,kBACd,aACA,UACM;AACN,MAAK,MAAM,CAAC,UAAU,cAAc,OAAO,QAAQ,SAAS,2BAA2B,EAAE;AAEvF,MAAI,CAAC,YAAY,2BAA2B,UAC1C,aAAY,2BAA2B,YAAY,EAAE;EAGvD,MAAM,uBAAuB,YAAY,2BAA2B;AAEpE,OAAK,MAAM,CAAC,aAAa,aAAa,OAAO,QAAQ,UAAU,CAC7D,KAAI,qBAAqB,iBAAiB,OAExC,sBAAqB,gBAAgB;MAGrC,sBAAqB,eAAe"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { ASCommonFlags, ASNodeKind, COVERAGE_PAYLOAD_FORMATS, POOL_ERROR_NAMES } from "../constants-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { mergeCoverageData } from "../coverage-merge-CBXkpM1O.mjs";
|
|
7
|
-
import { ASTVisitor } from "../ast-visitor-CWEOd3UH.mjs";
|
|
1
|
+
import { ASCommonFlags, ASNodeKind, COVERAGE_PAYLOAD_FORMATS, POOL_ERROR_NAMES } from "../constants-Bq5KNxXJ.mjs";
|
|
2
|
+
import { createPoolError, debug, debugOverride, toForwardSlash } from "../pool-errors-GWfwrsD7.mjs";
|
|
3
|
+
import { warnIfASCoverageNotSupportedByNode, warnIfNativeBuildFailed } from "../feature-check-DLfJqIrE.mjs";
|
|
4
|
+
import { mergeCoverageData } from "../coverage-merge-0WqdC-dq.mjs";
|
|
5
|
+
import { ASTVisitor } from "../ast-visitor-w1HMbuJR.mjs";
|
|
8
6
|
import { Parser } from "assemblyscript";
|
|
9
7
|
import { basename, parse, relative } from "node:path";
|
|
10
8
|
import { readFile } from "node:fs/promises";
|
|
@@ -383,16 +381,18 @@ var HybridCoverageProvider = class {
|
|
|
383
381
|
name = "hybrid-assemblyscript-v8";
|
|
384
382
|
v8Provider;
|
|
385
383
|
accumulatedCoverageData = { hitCountsByFileAndPosition: {} };
|
|
386
|
-
|
|
387
|
-
|
|
384
|
+
projectRoot = "";
|
|
385
|
+
definedCoverageOptions = {};
|
|
386
|
+
resolvedProviderOptions = {};
|
|
388
387
|
/**
|
|
389
388
|
* Initialize the provider and get reference to v8 provider
|
|
390
389
|
*/
|
|
391
390
|
async initialize(ctx) {
|
|
392
|
-
this.
|
|
391
|
+
this.projectRoot = ctx.config.root;
|
|
392
|
+
this.definedCoverageOptions = ctx.config.coverage;
|
|
393
393
|
debug("[HybridCoverageProvider] Initializing Provider");
|
|
394
394
|
this.v8Provider = await v8CoverageModule.getProvider();
|
|
395
|
-
if (!this.v8Provider) throw createPoolError("
|
|
395
|
+
if (!this.v8Provider) throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "initialize failed to get delegated v8 provider");
|
|
396
396
|
await this.v8Provider.initialize(ctx);
|
|
397
397
|
this.v8Provider.name = "hybrid-assemblyscript-v8 (delegated v8 reporter)";
|
|
398
398
|
debug("[HybridCoverageProvider] Initialized with delegated v8 provider");
|
|
@@ -421,12 +421,12 @@ var HybridCoverageProvider = class {
|
|
|
421
421
|
return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun - Accumulated coverage: ${positionCount} unique positions over ${fileCount} source files`;
|
|
422
422
|
});
|
|
423
423
|
} else {
|
|
424
|
-
if (!this.v8Provider) throw createPoolError("
|
|
424
|
+
if (!this.v8Provider) throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "onAfterSuiteRun failed to delegate to v8 provider");
|
|
425
425
|
debug(`[HybridCoverageProvider] ${suiteLogLabel} - Delegating to v8 provider`);
|
|
426
426
|
await this.v8Provider.onAfterSuiteRun(meta);
|
|
427
427
|
}
|
|
428
428
|
debug(() => {
|
|
429
|
-
const files = meta.testFiles.map((tf) => relative(this.
|
|
429
|
+
const files = meta.testFiles.map((tf) => relative(this.projectRoot, tf)).join(",");
|
|
430
430
|
return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun complete - TIMING ${(performance.now() - start).toFixed(2)} ms | testFiles: "${files}"`;
|
|
431
431
|
});
|
|
432
432
|
}
|
|
@@ -443,20 +443,20 @@ var HybridCoverageProvider = class {
|
|
|
443
443
|
async generateCoverage(context) {
|
|
444
444
|
const start = performance.now();
|
|
445
445
|
debug("[HybridCoverageProvider] Generating coverage for test run");
|
|
446
|
-
if (!this.v8Provider) throw createPoolError("
|
|
446
|
+
if (!this.v8Provider) throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "generateCoverage failed to delegate to v8 provider");
|
|
447
447
|
let asCoverageMap = createCoverageMap();
|
|
448
|
-
if (this.
|
|
449
|
-
debug(`[HybridCoverageProvider] Building AS coverage map with ${this.
|
|
448
|
+
if (this.resolvedProviderOptions.globbedAssemblyScriptInclude.length > 0) {
|
|
449
|
+
debug(`[HybridCoverageProvider] Building AS coverage map with ${this.resolvedProviderOptions.globbedAssemblyScriptInclude.length} source files `);
|
|
450
450
|
debug(() => {
|
|
451
451
|
return `[HybridCoverageProvider] Accumulated coverage data has ${Object.values(this.accumulatedCoverageData.hitCountsByFileAndPosition).reduce((sum, positions) => sum + Object.keys(positions)?.length, 0)} unique positions hit across ${Object.keys(this.accumulatedCoverageData.hitCountsByFileAndPosition).length} debug source files`;
|
|
452
452
|
});
|
|
453
|
-
const fileProcessingPromises = this.
|
|
453
|
+
const fileProcessingPromises = this.resolvedProviderOptions.globbedAssemblyScriptInclude.map(async (include) => {
|
|
454
454
|
debug(`[HybridCoverageProvider] Parsing AS source for expected coverage: "${include.absolute}"`);
|
|
455
455
|
const functionsByStartLine = await parseFunctionsFromFile(include.absolute, include.projectRootRelative) || {};
|
|
456
456
|
debug(`[HybridCoverageProvider] Parsed ${Object.keys(functionsByStartLine).length} AS source functions in "${include.absolute}"`);
|
|
457
457
|
const fileHitCountsByPosition = this.accumulatedCoverageData.hitCountsByFileAndPosition[include.absolute] ?? {};
|
|
458
458
|
debug(`[HybridCoverageProvider] Accumulated AS coverage has ${Object.keys(fileHitCountsByPosition).length} positions for "${include.absolute}"`);
|
|
459
|
-
return convertToIstanbulFormat(functionsByStartLine, fileHitCountsByPosition, include.absolute, this.
|
|
459
|
+
return convertToIstanbulFormat(functionsByStartLine, fileHitCountsByPosition, include.absolute, this.resolvedProviderOptions.debugIstanbul);
|
|
460
460
|
});
|
|
461
461
|
const istanbulResults = await Promise.all(fileProcessingPromises);
|
|
462
462
|
for (const istanbulData of istanbulResults) asCoverageMap.addFileCoverage(istanbulData);
|
|
@@ -480,7 +480,7 @@ var HybridCoverageProvider = class {
|
|
|
480
480
|
* Report coverage - delegate to v8 provider
|
|
481
481
|
*/
|
|
482
482
|
async reportCoverage(coverageMap, context) {
|
|
483
|
-
if (!this.v8Provider) throw createPoolError("
|
|
483
|
+
if (!this.v8Provider) throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "reportCoverage failed to delegate to v8 provider");
|
|
484
484
|
debug(`[HybridCoverageProvider] Reporting coverage (allTestsRun=${context.allTestsRun})`);
|
|
485
485
|
await this.v8Provider.reportCoverage(coverageMap, context);
|
|
486
486
|
}
|
|
@@ -488,36 +488,36 @@ var HybridCoverageProvider = class {
|
|
|
488
488
|
* Resolve options
|
|
489
489
|
*/
|
|
490
490
|
resolveOptions() {
|
|
491
|
-
if (!this.v8Provider) throw createPoolError("
|
|
491
|
+
if (!this.v8Provider) throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "resolveOptions failed to delegate to v8 provider");
|
|
492
492
|
debug(`[HybridCoverageProvider] Resolving Coverage Options`);
|
|
493
|
-
const definedCoverageOptions = this.projectConfig.coverage;
|
|
494
493
|
const resolvedV8Options = this.v8Provider.resolveOptions();
|
|
495
494
|
const sanitizedV8Options = {
|
|
496
495
|
...resolvedV8Options,
|
|
497
496
|
include: resolvedV8Options.include?.map((i) => i.replace(/\0/g, "")) || void 0,
|
|
498
497
|
exclude: resolvedV8Options.exclude?.map((i) => i.replace(/\0/g, "")) || void 0
|
|
499
498
|
};
|
|
500
|
-
debug(`[HybridCoverageProvider] AS include: ${(definedCoverageOptions.assemblyScriptInclude || []).join(", ") || "(none)"}`);
|
|
501
|
-
debug(`[HybridCoverageProvider] AS exclude: ${(definedCoverageOptions.assemblyScriptExclude || []).join(", ") || "(none)"}`);
|
|
499
|
+
debug(`[HybridCoverageProvider] AS include: ${(this.definedCoverageOptions.assemblyScriptInclude || []).join(", ") || "(none)"}`);
|
|
500
|
+
debug(`[HybridCoverageProvider] AS exclude: ${(this.definedCoverageOptions.assemblyScriptExclude || []).join(", ") || "(none)"}`);
|
|
502
501
|
debug(`[HybridCoverageProvider] JS include: ${(sanitizedV8Options.include || []).join(", ") || "(none)"}`);
|
|
503
502
|
debug(`[HybridCoverageProvider] JS exclude: ${(sanitizedV8Options.exclude || []).join(", ") || "(none)"}`);
|
|
504
503
|
debug(`[HybridCoverageProvider] Globbing AS source files to include for coverage map basis`);
|
|
505
|
-
const globbedAssemblyScriptInclude = globFiles(definedCoverageOptions.assemblyScriptInclude || [], definedCoverageOptions.assemblyScriptExclude || [], this.
|
|
504
|
+
const globbedAssemblyScriptInclude = globFiles(this.definedCoverageOptions.assemblyScriptInclude || [], this.definedCoverageOptions.assemblyScriptExclude || [], this.projectRoot);
|
|
506
505
|
debug(`[HybridCoverageProvider] Including ${globbedAssemblyScriptInclude.length} AS files in coverage map`);
|
|
507
|
-
const globbedAssemblyScriptExcludeOnly = globFiles(definedCoverageOptions.assemblyScriptExclude || [], [], this.
|
|
506
|
+
const globbedAssemblyScriptExcludeOnly = globFiles(this.definedCoverageOptions.assemblyScriptExclude || [], [], this.projectRoot);
|
|
508
507
|
debug(`[HybridCoverageProvider] Excluding ${globbedAssemblyScriptExcludeOnly.length} AS files from coverage map & instrumentation`);
|
|
509
|
-
const
|
|
508
|
+
const resolved = {
|
|
510
509
|
...resolvedV8Options,
|
|
511
510
|
provider: "custom",
|
|
512
|
-
customProviderModule: definedCoverageOptions.customProviderModule || "",
|
|
513
|
-
debugIstanbul: definedCoverageOptions.debugIstanbul ?? false,
|
|
514
|
-
assemblyScriptInclude: definedCoverageOptions.assemblyScriptInclude ?? [],
|
|
515
|
-
assemblyScriptExclude: definedCoverageOptions.assemblyScriptExclude ?? [],
|
|
511
|
+
customProviderModule: this.definedCoverageOptions.customProviderModule || "",
|
|
512
|
+
debugIstanbul: this.definedCoverageOptions.debugIstanbul ?? false,
|
|
513
|
+
assemblyScriptInclude: this.definedCoverageOptions.assemblyScriptInclude ?? [],
|
|
514
|
+
assemblyScriptExclude: this.definedCoverageOptions.assemblyScriptExclude ?? [],
|
|
516
515
|
globbedAssemblyScriptInclude,
|
|
517
|
-
globbedAssemblyScriptProjectRelativeExcludeOnly: globbedAssemblyScriptExcludeOnly.map((gr) => gr.projectRootRelative)
|
|
516
|
+
globbedAssemblyScriptProjectRelativeExcludeOnly: globbedAssemblyScriptExcludeOnly.map((gr) => gr.projectRootRelative),
|
|
517
|
+
isResolved: true
|
|
518
518
|
};
|
|
519
|
-
this.
|
|
520
|
-
return
|
|
519
|
+
this.resolvedProviderOptions = resolved;
|
|
520
|
+
return resolved;
|
|
521
521
|
}
|
|
522
522
|
async clean(clean = true) {
|
|
523
523
|
debug("[HybridCoverageProvider] Clean coverage data - clean:", clean);
|
|
@@ -546,15 +546,15 @@ const hybridProviderModule = {
|
|
|
546
546
|
getProvider: () => new HybridCoverageProvider(),
|
|
547
547
|
startCoverage: async (runtimeOptions) => {
|
|
548
548
|
if (v8CoverageModule.startCoverage) return await v8CoverageModule.startCoverage(runtimeOptions);
|
|
549
|
-
else throw createPoolError("HybridCoverageProvider - v8 coverage module does not provide `startCoverage`"
|
|
549
|
+
else throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "HybridCoverageProvider - v8 coverage module does not provide `startCoverage`");
|
|
550
550
|
},
|
|
551
551
|
takeCoverage: async (runtimeOptions) => {
|
|
552
552
|
if (v8CoverageModule.takeCoverage) return await v8CoverageModule.takeCoverage(runtimeOptions);
|
|
553
|
-
else throw createPoolError("HybridCoverageProvider - v8 coverage module does not provide `takeCoverage`"
|
|
553
|
+
else throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "HybridCoverageProvider - v8 coverage module does not provide `takeCoverage`");
|
|
554
554
|
},
|
|
555
555
|
stopCoverage: async (runtimeOptions) => {
|
|
556
556
|
if (v8CoverageModule.stopCoverage) return await v8CoverageModule.stopCoverage(runtimeOptions);
|
|
557
|
-
else throw createPoolError("HybridCoverageProvider - v8 coverage module does not provide `stopCoverage`"
|
|
557
|
+
else throw createPoolError(POOL_ERROR_NAMES.HybridCoverageProviderError, "HybridCoverageProvider - v8 coverage module does not provide `stopCoverage`");
|
|
558
558
|
}
|
|
559
559
|
};
|
|
560
560
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["parsePath","AssemblyScriptParser"],"sources":["../../src/coverage-provider/containment-matcher.ts","../../src/coverage-provider/istanbul-converter.ts","../../src/coverage-provider/ast-parser.ts","../../src/coverage-provider/glob-utils.ts","../../src/coverage-provider/hybrid-coverage-provider.ts","../../src/coverage-provider/index.ts"],"sourcesContent":["/**\n * Containment Matcher\n *\n * Provides containment-based matching for coverage mapping.\n * Binary debug info provides points (representativeLocation), source parsing provides ranges.\n * We find which source range contains each binary point.\n *\n * Usage by version:\n * - v1: Function containment matching (binary representativeLocation → source function range)\n * - v2: Function containment (same) + statement containment + branch path containment\n *\n * Why containment matching (not direct position lookup):\n * AS compiler generates source map entries differently by statement type:\n * - Variable declarations: source map points to statement start (keyword)\n * - Control flow (if/switch/for): source map points to condition EXPRESSION, not keyword\n *\n * Example: `if (n < 0)` → binary reports column 7 ('n'), not column 3 ('i' of 'if')\n *\n * Containment matching is more robust:\n * - Binary gives us a position (representativeLocation) somewhere in the function\n * - Source gives us function ranges (start/end line/column)\n * - We find which source function range contains the binary position\n * - Handles nested functions with \"tightest fit\" (innermost function wins)\n */\n\nimport type { ParsedSourceFunctionInfo, SourceRange } from '../types/types.js';\n\n/**\n * Functions indexed by file path, then by start line.\n * Multiple functions can start on the same line (e.g., nested arrow functions).\n */\nexport type FunctionsByFileAndStartLine = Record<string, Record<number, ParsedSourceFunctionInfo[]>>;\n\n/**\n * Find the source function whose range contains the given position.\n *\n * For nested functions, uses \"tightest fit\" - returns the innermost function\n * (the one with the largest start position among all containing functions).\n *\n * @param functionsByStartLine - Functions for a single file, indexed by start line\n * @param line - Target line number (1-based)\n * @param column - Target column number (1-based)\n * @returns The containing function, or undefined if no match\n */\nexport function findFunctionContainingPosition(\n functionsByStartLine: Record<number, ParsedSourceFunctionInfo[]>,\n line: number,\n column: number\n): ParsedSourceFunctionInfo | undefined {\n let bestMatch: ParsedSourceFunctionInfo | undefined;\n let bestStartLine = -1;\n let bestStartColumn = -1;\n\n // Check functions starting on lines <= target line\n for (const [startLineStr, functions] of Object.entries(functionsByStartLine)) {\n const startLine = Number(startLineStr);\n if (startLine > line) continue;\n\n for (const func of functions) {\n const { range } = func;\n\n // Check if position is within this function's range\n if (!isPositionInRange(line, column, range)) continue;\n\n // Tightest fit: prefer function with largest start position (innermost)\n if (startLine > bestStartLine ||\n (startLine === bestStartLine && range.startColumn > bestStartColumn)) {\n bestMatch = func;\n bestStartLine = startLine;\n bestStartColumn = range.startColumn;\n }\n }\n }\n\n return bestMatch;\n}\n\n/**\n * Check if a position (line, column) falls within a source range.\n *\n * @param line - Target line number (1-based)\n * @param column - Target column number (1-based)\n * @param range - Source range to check against\n * @returns true if position is within range (inclusive)\n */\nexport function isPositionInRange(\n line: number,\n column: number,\n range: SourceRange\n): boolean {\n // Outside line range entirely\n if (line < range.startLine || line > range.endLine) return false;\n\n // On start line but before start column\n if (line === range.startLine && column < range.startColumn) return false;\n\n // On end line but after end column\n if (line === range.endLine && column > range.endColumn) return false;\n\n return true;\n}\n","/**\n * Istanbul Format Converter\n *\n * Converts AssemblyScript coverage data to Istanbul's FileCoverageData format.\n * This enables integration with Vitest's coverage reporting system and standard\n * coverage tools like Codecov, Coveralls, etc.\n *\n * Current Implementation: Function-level coverage only\n * - Uses containment matching: binary positions → source function ranges\n * - Each function maps to both a function entry AND a statement entry\n * - Statement coverage matches function coverage (function-level granularity)\n * - Branch coverage is 0% (no branches tracked yet)\n * - Line coverage derived from statement coverage\n *\n * Future Enhancement (v2): Block-level statement and branch coverage\n */\n\nimport type { FileCoverageData, Range, FunctionMapping, BranchMapping } from 'istanbul-lib-coverage';\nimport type { ParsedSourceFunctionInfo } from '../types/types.js';\nimport { findFunctionContainingPosition } from './containment-matcher.js';\nimport { debugOverride } from '../util/debug.js';\n\n/**\n * Convert AssemblyScript coverage data to Istanbul format for a single file\n *\n * Algorithm (containment matching):\n * 1. For each hit position in fileHitCountsByPosition:\n * - Use containment matcher to find which source function contains this position\n * - Record the hit count for that function\n * 2. For each function in fileFunctionsByStartLine:\n * - Add function mapping to fnMap\n * - Add function hit count to f (from matched hits, or 0 if not hit)\n * - Add corresponding statement mapping to statementMap\n * - Add same hit count to s (statement coverage matches function coverage)\n *\n * @param fileFunctionsByStartLine - Functions for this file, keyed by start line (from AST parser)\n * @param fileHitCountsByPosition - Hit counts for this file, keyed by position \"line:column\" (from accumulated coverage)\n * @param absoluteFilePath - Absolute path to the source file (for Istanbul output)\n * @returns Istanbul FileCoverage object\n */\nexport async function convertToIstanbulFormat(\n fileFunctionsByStartLine: Record<number, ParsedSourceFunctionInfo[]>,\n fileHitCountsByPosition: Record<string, number>,\n absoluteFilePath: string,\n istanbulDebugEnabled: boolean\n): Promise<FileCoverageData> {\n const startMatch = performance.now();\n\n function istanbulDebug(...args: any[]): void {\n if (istanbulDebugEnabled) {\n debugOverride(...args);\n }\n };\n\n istanbulDebug(() => {\n const sourceFunctionCount = Object.values(fileFunctionsByStartLine).reduce((sum, funcs) => sum + funcs.length, 0);\n const uniqueHitPosCount = Object.keys(fileHitCountsByPosition).length;\n const coverageEstimate = sourceFunctionCount === 0 ? Infinity : ((uniqueHitPosCount * 100) / sourceFunctionCount).toFixed(2);\n\n return `[IstanbulConverter] Processing source file: \"${absoluteFilePath}\"\\n`\n + `[IstanbulConverter] Source: ${sourceFunctionCount} total functions, Coverage: ${uniqueHitPosCount} unique hit positions\\n`\n + `[IstanbulConverter] Sanity Check - AS File Coverage Estimate: ${coverageEstimate}%\\n`\n + `[IstanbulConverter] Containment matching functions: coverage hit positions to source functions by range`;\n });\n\n // Build a map of function → hit count using containment matching\n // Key: function source identity (qualifiedName), Value: hit count\n const hitCountsBySourceFunctionName = new Map<ParsedSourceFunctionInfo, number>();\n\n // For each hit position, find which function contains it\n for (const [positionKey, hitCount] of Object.entries(fileHitCountsByPosition)) {\n // Position key format is \"line:column\"\n const parts = positionKey.split(':');\n const lineStr = parts[0];\n const columnStr = parts[1];\n\n if (lineStr && columnStr) {\n const line = parseInt(lineStr, 10);\n const column = parseInt(columnStr, 10);\n\n const containingFunction = findFunctionContainingPosition(fileFunctionsByStartLine, line, column);\n if (containingFunction) {\n // Accumulate hits (in case multiple positions map to same function)\n const existingHits = hitCountsBySourceFunctionName.get(containingFunction);\n const existingHitsCount = existingHits ?? 0;\n const max = Math.max(existingHitsCount, hitCount);\n hitCountsBySourceFunctionName.set(containingFunction, max); // <-- TODO: Explain this max logic\n\n if (existingHits !== undefined) {\n istanbulDebug(`[IstanbulConverter] Position ${positionKey} → function \"${containingFunction.shortName}\" EXISTING HITS: ${existingHits} NEW COUNT: ${max}`);\n } else {\n istanbulDebug(`[IstanbulConverter] Position ${positionKey} → function \"${containingFunction.shortName}\" (hits: ${hitCount})`);\n }\n } else {\n istanbulDebug(`[IstanbulConverter] Position ${positionKey} has no containing function`);\n }\n }\n }\n\n const startConvert = performance.now();\n istanbulDebug(`[IstanbulConverter] Matching Complete - Converting to Istanbul format`);\n\n // Initialize Istanbul data structures\n const fnMap: { [key: string]: FunctionMapping } = {};\n const f: { [key: string]: number } = {};\n const statementMap: { [key: string]: Range } = {};\n const s: { [key: string]: number } = {};\n const branchMap: { [key: string]: BranchMapping } = {};\n const b: { [key: string]: number[] } = {};\n\n // Convert function coverage to Istanbul format\n // Iterate all functions from parsed source (ensures 0-hit functions are included)\n let funcIdx = 0;\n for (const functions of Object.values(fileFunctionsByStartLine)) {\n for (const funcInfo of functions) {\n const { range, shortName } = funcInfo;\n\n // Defensive: skip functions with invalid metadata (shouldn't happen - AST parser filters these)\n if (range.startLine === 0) {\n continue;\n }\n\n // Get hit count from containment matching (or 0 if not hit)\n const hitCount = hitCountsBySourceFunctionName.get(funcInfo) ?? 0;\n const displayShortName = shortName && shortName !== '' ? shortName : '<anonymous>';\n istanbulDebug(\n `[IstanbulConverter] Istanbul function index ${funcIdx}: \"${displayShortName}\"`\n + ` (source ${range.startLine}:${range.startColumn} - ${range.endLine}:${range.endColumn}), hits: ${hitCount}`\n );\n\n // Create function mapping\n // Both 'decl' (declaration) and 'loc' (location) use the same range\n // Internal ParsedSourceFunctionInfo uses 1-based columns, Istanbul expects 0-based\n const istanbulRange: Range = {\n start: { line: range.startLine, column: range.startColumn - 1 },\n end: { line: range.endLine, column: range.endColumn - 1 }\n };\n\n const idxStr = funcIdx.toString();\n fnMap[idxStr] = {\n name: shortName,\n decl: istanbulRange,\n loc: istanbulRange,\n line: range.startLine\n };\n f[idxStr] = hitCount;\n\n // Create corresponding statement mapping\n // For function-level coverage, each function is one \"statement\"\n // The statement range matches the function range\n // This gives us statement coverage at function granularity\n statementMap[idxStr] = istanbulRange;\n s[idxStr] = hitCount;\n\n funcIdx++;\n }\n }\n\n const done = performance.now();\n const matchingMs = (startConvert - startMatch).toFixed(2);\n const convertMs = (done - startConvert).toFixed(2);\n const totalMs = (done - startMatch).toFixed(2);\n\n istanbulDebug(\n `[IstanbulConverter] Coverage Coversion Complete: ${Object.keys(fnMap).length} functions,` \n + ` ${totalMs} ms total (matching: ${matchingMs} ms, convert: ${convertMs} ms)`\n );\n\n return {\n path: absoluteFilePath,\n fnMap,\n f,\n statementMap,\n s,\n branchMap,\n b\n };\n}\n","/**\n * AST Parser for AssemblyScript Source Files\n *\n * Parses AS source files to extract function metadata for coverage.\n * Used by generateCoverage to build empty coverage map from all source files.\n *\n * Source AST is the source of truth for what SHOULD be covered.\n * Binary instrumentation tells us what we CAN measure (hit counts).\n *\n * Functions are grouped by start line for efficient containment matching.\n *\n * Architecture:\n * - Uses shared ASTVisitor for complete NodeKind coverage\n * - Overrides hooks to extract function information during traversal\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { parse as parsePath } from 'node:path';\nimport {\n Parser as AssemblyScriptParser,\n Source,\n BlockStatement,\n Node,\n FunctionDeclaration,\n MethodDeclaration,\n ClassDeclaration,\n NamespaceDeclaration,\n VariableDeclaration,\n FunctionExpression,\n} from 'assemblyscript';\n\nimport type { ParsedSourceFunctionInfo, SourceRange } from '../types/types.js';\nimport { ASCommonFlags, ASNodeKind } from '../types/constants.js';\nimport { ASTVisitor } from '../util/ast-visitor.js';\n\n/**\n * Visitor that extracts function information from AST nodes\n */\nclass FunctionExtractorVisitor extends ASTVisitor {\n /** Source file being parsed */\n private source: Source;\n /** Module path for building qualified names */\n private modulePath: string;\n /** Absolute file path */\n private filePath: string;\n /** Accumulated function records, keyed by start line */\n readonly functions: Record<number, ParsedSourceFunctionInfo[]> = {};\n /** Namespace context stack (supports nested namespaces) */\n private namespaceStack: string[] = [];\n /** Current class name (when inside a class) */\n private currentClassName: string | null = null;\n\n constructor(source: Source, modulePath: string, filePath: string) {\n super();\n this.source = source;\n this.modulePath = modulePath;\n this.filePath = filePath;\n }\n\n /**\n * Track namespace context when entering a namespace.\n * Supports nesting — push onto the stack.\n */\n protected onNamespaceEnter(node: NamespaceDeclaration): void {\n this.namespaceStack.push(node.name?.text ?? 'Anonymous');\n }\n\n /**\n * Restore namespace context when exiting a namespace.\n */\n protected onNamespaceExit(_node: NamespaceDeclaration): void {\n this.namespaceStack.pop();\n }\n\n /**\n * Track class context when entering a class.\n * Includes namespace prefix when inside a namespace, matching binary naming convention\n * (e.g. \"NS_A.Item\" for class Item inside namespace NS_A).\n */\n protected onClassEnter(node: ClassDeclaration): void {\n const className = node.name?.text ?? 'Anonymous';\n if (this.namespaceStack.length > 0) {\n this.currentClassName = `${this.namespaceStack.join('.')}.${className}`;\n } else {\n this.currentClassName = className;\n }\n }\n\n /**\n * Restore class context when exiting a class\n */\n protected onClassExit(_node: ClassDeclaration): void {\n this.currentClassName = null;\n }\n\n /**\n * Extract function info from function declarations\n */\n protected onFunctionDeclaration(node: FunctionDeclaration): boolean {\n if (node.body && this.hasBodyStatements(node.body)) {\n const funcName = node.name?.text ?? '~anonymous';\n const shortName = this.namespaceStack.length > 0\n ? `${this.namespaceStack.join('.')}.${funcName}`\n : funcName;\n const qualifiedName = `${this.modulePath}/${shortName}`;\n const range = this.buildRange(node, node.name ?? null);\n this.addFunction(qualifiedName, shortName, range);\n }\n return true; // Continue recursion into body\n }\n\n /**\n * Extract function info from method declarations\n */\n protected onMethodDeclaration(node: MethodDeclaration): boolean {\n if (node.body && this.hasBodyStatements(node.body)) {\n const methodName = node.name?.text ?? 'constructor';\n const className = this.currentClassName ?? 'Unknown';\n const flags = node.flags;\n\n // Determine method type from flags\n const isStatic = (flags & ASCommonFlags.Static) !== 0;\n const isGetter = (flags & ASCommonFlags.Get) !== 0;\n const isSetter = (flags & ASCommonFlags.Set) !== 0;\n\n // Build short name to match binary naming convention:\n // - Static: ClassName.methodName\n // - Getter: ClassName#get:propertyName\n // - Setter: ClassName#set:propertyName\n // - Instance: ClassName#methodName\n let shortName: string;\n if (isStatic) {\n shortName = `${className}.${methodName}`;\n } else if (isGetter) {\n shortName = `${className}#get:${methodName}`;\n } else if (isSetter) {\n shortName = `${className}#set:${methodName}`;\n } else {\n shortName = `${className}#${methodName}`;\n }\n\n const qualifiedName = `${this.modulePath}/${shortName}`;\n const range = this.buildRange(node, node.name ?? null);\n this.addFunction(qualifiedName, shortName, range);\n }\n return true; // Continue recursion into body\n }\n\n /**\n * Extract function info from variable declarations (arrow functions)\n */\n protected onVariableDeclaration(node: VariableDeclaration): boolean {\n if (node.initializer && node.initializer.kind === ASNodeKind.Function) {\n const funcExpr = node.initializer as FunctionExpression;\n const funcDecl = funcExpr.declaration;\n\n if (funcDecl.body && this.hasBodyStatements(funcDecl.body)) {\n // Use variable name for the function\n const shortName = node.name.text;\n const qualifiedName = `${this.modulePath}/${shortName}`;\n\n // Use the variable declaration's range\n const range: SourceRange = {\n filePath: this.filePath,\n startLine: this.source.lineAt(node.range.start),\n startColumn: this.source.columnAt(),\n endLine: this.source.lineAt(node.range.end),\n endColumn: this.source.columnAt(),\n };\n\n this.addFunction(qualifiedName, shortName, range);\n }\n\n // Visit the function body manually since we're handling this specially\n if (funcDecl.body) {\n this.visitNode(funcDecl.body);\n }\n return false; // Don't recurse again - we handled it\n }\n return true; // Continue recursion for non-function initializers\n }\n\n /**\n * Check if a function body has statements (non-empty body)\n */\n private hasBodyStatements(body: Node): boolean {\n if (body.kind === ASNodeKind.Block) {\n const blockBody = body as BlockStatement;\n return blockBody.statements.length > 0;\n }\n // Expression body (braceless arrow) - always has the expression\n return true;\n }\n\n /**\n * Add a function to the functions record, keyed by start line\n */\n private addFunction(qualifiedName: string, shortName: string, range: SourceRange): void {\n const startLine = range.startLine;\n if (!this.functions[startLine]) {\n this.functions[startLine] = [];\n }\n this.functions[startLine].push({ qualifiedName, shortName, range });\n }\n\n /**\n * Build a SourceRange for a node, using name.range.start to skip decorators\n */\n private buildRange(node: Node, nameNode: Node | null): SourceRange {\n const startNode = nameNode ?? node;\n return {\n filePath: this.filePath,\n startLine: this.source.lineAt(startNode.range.start),\n startColumn: this.source.columnAt(),\n endLine: this.source.lineAt(node.range.end),\n endColumn: this.source.columnAt(),\n };\n }\n}\n\n/**\n * Parse functions from a single AS source file\n *\n * @param absoluteSourceFilePath - Absolute path to AS source file\n * @param relativeSourceFilePath - Relative path to AS source file (derived once in caller and used several places)\n * @returns Record of start line to array of ParsedSourceFunctionInfo (multiple functions can start on same line)\n */\nexport async function parseFunctionsFromFile(\n absoluteSourceFilePath: string,\n relativeSourceFilePath: string,\n): Promise<Record<number, ParsedSourceFunctionInfo[]>> {\n const sourceCode = await readFile(absoluteSourceFilePath, 'utf8');\n\n // Build the module path (strip any extension, use forward slashes)\n const parsed = parsePath(relativeSourceFilePath);\n const modulePath = parsed.dir ? `${parsed.dir}/${parsed.name}` : parsed.name;\n\n // Parse with AssemblyScript parser\n const asParser = new AssemblyScriptParser();\n asParser.parseFile(sourceCode, relativeSourceFilePath, true);\n\n const source = asParser.currentSource;\n if (!source) {\n return {};\n }\n\n // Create visitor and traverse\n const visitor = new FunctionExtractorVisitor(source, modulePath, absoluteSourceFilePath);\n visitor.visitSource(source);\n\n return visitor.functions || {};\n}\n","/**\n * Glob Utilities for Coverage\n *\n * Uses tinyglobby to glob AssemblyScript files matching coverage include/exclude patterns.\n * Supports ../ path traversals for projects that import source from outside the project root.\n *\n * Note: tinyglobby docs warn of a performance cost when globbing outside cwd (e.g. ../ patterns)\n * due to recalculating relative paths. Acceptable here since this runs once at startup.\n */\n\nimport { relative } from 'node:path';\nimport { globSync } from 'tinyglobby';\n\nimport { GlobResult } from '../types/types.js';\nimport { toForwardSlash } from '../util/path-utils.js';\n\nconst NODE_MODULES_GLOB = '**/node_modules/**';\n\n/**\n * Glob files matching coverage include/exclude patterns\n *\n * @param include - Include patterns (e.g., ['assembly/**\\/*.ts'])\n * @param exclude - Exclude patterns (e.g., ['**\\/*.test.ts'])\n * @param projectRoot - Project root directory\n * @returns Array of glob results with absolute and project-root-relative paths\n */\nexport function globFiles(\n include: string[],\n exclude: string[],\n projectRoot: string\n): GlobResult[] {\n if (include.length === 0) {\n return [];\n }\n\n const absolutePaths = globSync(include, {\n cwd: projectRoot,\n ignore: [NODE_MODULES_GLOB, ...exclude],\n absolute: true,\n });\n\n return absolutePaths.map((absolute) => ({\n absolute: toForwardSlash(absolute),\n projectRootRelative: toForwardSlash(relative(projectRoot, absolute)),\n }));\n}\n","/**\n * Hybrid Coverage Provider\n *\n * This provider handles both AssemblyScript and JavaScript and coverage\n * - Converts AS coverage to Istanbul format\n * - Delegates JS coverage to Vitest's v8 provider\n * - Merges both into a unified coverage report\n */\n\nimport { basename, relative } from 'node:path';\nimport type {\n CoverageProvider,\n Vitest,\n ReportContext,\n CoverageOptions,\n ResolvedCoverageOptions,\n ResolvedConfig,\n} from 'vitest/node';\nimport type { AfterSuiteRunMeta, SerializedConfig } from 'vitest';\nimport v8CoverageModule from '@vitest/coverage-v8';\nimport type { CoverageMap } from 'istanbul-lib-coverage';\nimport istanbulCoverage from 'istanbul-lib-coverage';\nconst { createCoverageMap } = istanbulCoverage;\n\nimport { convertToIstanbulFormat } from './istanbul-converter.js';\nimport { parseFunctionsFromFile } from './ast-parser.js';\nimport { globFiles } from './glob-utils.js';\nimport { getProjectSerializedOrGlobalConfig } from '../util/resolve-config.js';\nimport { mergeCoverageData } from './coverage-merge.js';\nimport { debug } from '../util/debug.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport type {\n AssemblyScriptCoveragePayload,\n CoverageData,\n GlobResult,\n ResolvedHybridProviderOptions,\n} from '../types/types.js';\nimport {\n POOL_ERROR_NAMES,\n COVERAGE_PAYLOAD_FORMATS\n} from '../types/constants.js';\nimport { warnIfASCoverageNotSupportedByNode, warnIfNativeBuildFailed } from '../util/feature-check.js';\n\nexport class HybridCoverageProvider implements CoverageProvider {\n name = 'hybrid-assemblyscript-v8' as const;\n\n private v8Provider: CoverageProvider | undefined;\n private accumulatedCoverageData: CoverageData = { hitCountsByFileAndPosition: {} };\n private projectConfig: SerializedConfig | ResolvedConfig = {} as SerializedConfig;\n private coverageOptions: ResolvedHybridProviderOptions = {} as ResolvedHybridProviderOptions;\n\n /**\n * Initialize the provider and get reference to v8 provider\n */\n async initialize(ctx: Vitest): Promise<void> {\n this.projectConfig = getProjectSerializedOrGlobalConfig(ctx).config;\n\n debug('[HybridCoverageProvider] Initializing Provider');\n\n // Get v8 provider from the coverage module\n this.v8Provider = await v8CoverageModule.getProvider();\n\n if (!this.v8Provider) {\n throw createPoolError(\n 'HybridCoverageProvider - initialize failed to get delegated v8 provider',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n\n await this.v8Provider.initialize(ctx);\n this.v8Provider.name = 'hybrid-assemblyscript-v8 (delegated v8 reporter)' as const;\n debug('[HybridCoverageProvider] Initialized with delegated v8 provider');\n\n warnIfASCoverageNotSupportedByNode();\n await warnIfNativeBuildFailed();\n }\n\n /**\n * Handle suite completion - delegate based on coverage format marker\n */\n async onAfterSuiteRun(meta: AfterSuiteRunMeta): Promise<void> {\n const start = performance.now();\n const format: string | undefined = (meta?.coverage as any)?.__format;\n let suiteLogLabel = meta.testFiles.length > 0 ? basename(meta.testFiles[0]!) : '';\n\n // Check for AssemblyScript format marker\n if (format === COVERAGE_PAYLOAD_FORMATS.AssemblyScript) {\n const payload = meta.coverage as AssemblyScriptCoveragePayload;\n const { coverageData, suiteLogLabel: label } = payload;\n suiteLogLabel = label;\n\n debug(() => {\n const fileCount = Object.keys(coverageData.hitCountsByFileAndPosition).length;\n const positionCount = Object.values(coverageData.hitCountsByFileAndPosition)\n .reduce((sum, positions) => sum + Object.keys(positions).length, 0);\n return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun - Suite payload: ${positionCount} unique positions over ${fileCount} source files`;\n });\n\n // Merge incoming coverage data into accumulated (by position, summing hit counts)\n mergeCoverageData(this.accumulatedCoverageData, coverageData);\n\n debug(() => {\n const fileCount = Object.keys(this.accumulatedCoverageData.hitCountsByFileAndPosition).length;\n const positionCount = Object.values(this.accumulatedCoverageData.hitCountsByFileAndPosition)\n .reduce((sum, positions) => sum + Object.keys(positions).length, 0);\n return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun - Accumulated coverage: ${positionCount} unique positions over ${fileCount} source files`;\n });\n } else {\n // Delegate to v8 provider for all other formats (JS, etc.)\n if (!this.v8Provider) {\n throw createPoolError(\n 'HybridCoverageProvider - onAfterSuiteRun failed to delegate to v8 provider',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n\n debug(`[HybridCoverageProvider] ${suiteLogLabel} - Delegating to v8 provider`);\n await this.v8Provider.onAfterSuiteRun(meta);\n }\n\n debug(() => {\n const files = meta.testFiles.map(tf => relative(this.projectConfig.root, tf)).join(',');\n return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun complete - TIMING ${(performance.now() - start).toFixed(2)} ms | testFiles: \"${files}\"`;\n });\n }\n\n /**\n * Generate unified coverage map (merging JS and AS coverage)\n *\n * Flow:\n * 1. Parse included AS source files to get sourceDebugInfo (source of truth for line numbers)\n * 1. Build merged CoverageData (all source functions + accumulated hit counts)\n * 4. Convert merged CoverageData to Istanbul format\n * 5. Get JS coverage from v8 provider\n * 6. Merge AS coverage into JS coverage\n */\n async generateCoverage(context: ReportContext): Promise<unknown> {\n const start = performance.now();\n\n debug('[HybridCoverageProvider] Generating coverage for test run');\n\n if (!this.v8Provider) {\n throw createPoolError(\n 'HybridCoverageProvider - generateCoverage failed to delegate to v8 provider',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n\n // Build AS coverage map\n let asCoverageMap = createCoverageMap();\n\n if (this.coverageOptions.globbedAssemblyScriptInclude?.length > 0) {\n debug(`[HybridCoverageProvider] Building AS coverage map with ${this.coverageOptions.globbedAssemblyScriptInclude.length} source files `);\n debug(() => {\n const accumulatedPositionCount = Object.values(this.accumulatedCoverageData.hitCountsByFileAndPosition)\n .reduce((sum, positions) => sum + Object.keys(positions)?.length, 0);\n const files = Object.keys(this.accumulatedCoverageData.hitCountsByFileAndPosition).length;\n return `[HybridCoverageProvider] Accumulated coverage data has ${accumulatedPositionCount} unique positions hit across ${files} debug source files`;\n });\n\n // parse source files with AST parser, then match to hits and convert to istanbul format\n const fileProcessingPromises = this.coverageOptions.globbedAssemblyScriptInclude.map(async (include: GlobResult) => {\n debug(`[HybridCoverageProvider] Parsing AS source for expected coverage: \"${include.absolute}\"`);\n \n const functionsByStartLine = await parseFunctionsFromFile(include.absolute, include.projectRootRelative) || {};\n debug(`[HybridCoverageProvider] Parsed ${Object.keys(functionsByStartLine).length} AS source functions in \"${include.absolute}\"`);\n\n const fileHitCountsByPosition = this.accumulatedCoverageData.hitCountsByFileAndPosition[include.absolute] ?? {};\n debug(`[HybridCoverageProvider] Accumulated AS coverage has ${Object.keys(fileHitCountsByPosition).length} positions for \"${include.absolute}\"`);\n\n // Containment matching (binary hit position → source) is performed during istanbul conversion\n return convertToIstanbulFormat(functionsByStartLine, fileHitCountsByPosition, include.absolute, this.coverageOptions.debugIstanbul);\n });\n\n // Wait for all files to complete\n const istanbulResults = await Promise.all(fileProcessingPromises);\n\n // Add all results to coverage map\n for (const istanbulData of istanbulResults) {\n asCoverageMap.addFileCoverage(istanbulData);\n }\n\n debug(`[HybridCoverageProvider] Built AS coverage map with ${Object.keys(asCoverageMap.data).length} files`);\n } else {\n debug('[HybridCoverageProvider] WARNING: No assemblyScriptInclude patterns yieldled files - Coverage Map will be empty!');\n }\n\n const asGenerateEnd = performance.now();\n debug(`[HybridCoverageProvider] TIMING AS generateCoverage: ${(asGenerateEnd - start).toFixed(2)} ms`);\n\n // Get JS coverage from v8 provider\n debug('[HybridCoverageProvider] Getting JS coverage from v8 provider');\n const jsCoverage = await this.v8Provider.generateCoverage(context) as CoverageMap;\n debug(`[HybridCoverageProvider] JS coverage has ${Object.keys(jsCoverage.data).length} files`);\n debug(`[HybridCoverageProvider] TIMING JS generateCoverage: ${(performance.now() - asGenerateEnd).toFixed(2)} ms`);\n\n // Merge AS coverage into JS coverage.\n // Use toJSON() to pass plain data instead of the CoverageMap instance. This avoids\n // instanceof failures when istanbul-lib-coverage is loaded from different module paths\n // (e.g. the pool workers resolve one copy while the coverage provider resolves another).\n if (asCoverageMap.files().length) {\n debug('[HybridCoverageProvider] Merging AS coverage into JS coverage');\n jsCoverage.merge(asCoverageMap.toJSON());\n } else {\n debug('[HybridCoverageProvider] AS coverage map empty, not merging into JS coverage');\n }\n debug(`[HybridCoverageProvider] Final merged coverage has ${Object.keys(jsCoverage.data).length} files`);\n\n debug(`[HybridCoverageProvider] TIMING Total generateCoverage: ${(performance.now() - start).toFixed(2)} ms`);\n\n return jsCoverage;\n }\n\n /**\n * Report coverage - delegate to v8 provider\n */\n async reportCoverage(coverageMap: unknown, context: ReportContext): Promise<void> {\n if (!this.v8Provider) {\n throw createPoolError(\n 'HybridCoverageProvider - reportCoverage failed to delegate to v8 provider',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n\n debug(`[HybridCoverageProvider] Reporting coverage (allTestsRun=${context.allTestsRun})`);\n await this.v8Provider.reportCoverage(coverageMap, context);\n }\n\n /**\n * Resolve options\n */\n resolveOptions(): ResolvedHybridProviderOptions {\n if (!this.v8Provider) {\n throw createPoolError(\n 'HybridCoverageProvider - resolveOptions failed to delegate to v8 provider',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n \n debug(`[HybridCoverageProvider] Resolving Coverage Options`);\n \n const definedCoverageOptions = this.projectConfig.coverage as CoverageOptions;\n const resolvedV8Options = this.v8Provider.resolveOptions() as ResolvedCoverageOptions;\n\n // For some reason the v8 provider builds its `excludes` values to include a null byte.\n // Remove null bytes for logging purposes so tools like grep won't complain about binary content.\n const sanitizedV8Options: ResolvedCoverageOptions = {\n ...resolvedV8Options,\n include: resolvedV8Options.include?.map(i => i.replace(/\\0/g, '')) || undefined,\n exclude: resolvedV8Options.exclude?.map(i => i.replace(/\\0/g, '')) || undefined\n };\n\n debug(`[HybridCoverageProvider] AS include: ${(definedCoverageOptions.assemblyScriptInclude || []).join(', ') || '(none)'}`);\n debug(`[HybridCoverageProvider] AS exclude: ${(definedCoverageOptions.assemblyScriptExclude || []).join(', ') || '(none)'}`);\n debug(`[HybridCoverageProvider] JS include: ${(sanitizedV8Options.include || []).join(', ') || '(none)'}`);\n debug(`[HybridCoverageProvider] JS exclude: ${(sanitizedV8Options.exclude || []).join(', ') || '(none)'}`);\n\n debug(`[HybridCoverageProvider] Globbing AS source files to include for coverage map basis`);\n const globbedAssemblyScriptInclude = globFiles(\n definedCoverageOptions.assemblyScriptInclude || [],\n definedCoverageOptions.assemblyScriptExclude || [],\n this.projectConfig.root\n );\n debug(`[HybridCoverageProvider] Including ${globbedAssemblyScriptInclude.length} AS files in coverage map`);\n \n const globbedAssemblyScriptExcludeOnly = globFiles(\n definedCoverageOptions.assemblyScriptExclude || [],\n [],\n this.projectConfig.root\n );\n debug(`[HybridCoverageProvider] Excluding ${globbedAssemblyScriptExcludeOnly.length} AS files from coverage map & instrumentation`);\n \n const resolvedCoverageOptions: ResolvedHybridProviderOptions = {\n ...resolvedV8Options,\n provider: 'custom',\n customProviderModule: definedCoverageOptions.customProviderModule || '',\n debugIstanbul: definedCoverageOptions.debugIstanbul ?? false,\n assemblyScriptInclude: definedCoverageOptions.assemblyScriptInclude ?? [],\n assemblyScriptExclude: definedCoverageOptions.assemblyScriptExclude ?? [],\n globbedAssemblyScriptInclude,\n globbedAssemblyScriptProjectRelativeExcludeOnly : globbedAssemblyScriptExcludeOnly.map(gr => gr.projectRootRelative)\n }; \n\n this.coverageOptions = resolvedCoverageOptions;\n return resolvedCoverageOptions;\n }\n\n async clean(clean: boolean = true): Promise<void> {\n debug('[HybridCoverageProvider] Clean coverage data - clean:', clean);\n if (clean) {\n this.accumulatedCoverageData = { hitCountsByFileAndPosition: {} };\n debug('[HybridCoverageProvider] Cleaned all internal coverage data');\n }\n\n if (this.v8Provider) {\n await this.v8Provider.clean(clean);\n debug(`[HybridCoverageProvider] V8 provider finished clean(${clean})`);\n }\n }\n}\n","/**\n * Coverage Provider Module Export\n *\n * This module exports the hybrid coverage provider for Vitest to load.\n * Users configure this via:\n * coverage.provider = 'custom'\n * coverage.customProviderModule = 'vitest-pool-assemblyscript/coverage'\n */\n\nimport { CoverageProviderModule } from 'vitest/node';\nimport v8CoverageModule from '@vitest/coverage-v8';\n\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport { HybridCoverageProvider } from './hybrid-coverage-provider.js';\n\n/**\n * Hybrid Coverage Provider\n *\n * This provider handles both AssemblyScript and JavaScript and coverage\n * - Converts AS coverage to Istanbul format\n * - Delegates JS coverage to Vitest's v8 provider\n * - Merges both into a unified coverage report\n */\nconst hybridProviderModule: CoverageProviderModule = {\n getProvider: (): HybridCoverageProvider => new HybridCoverageProvider(),\n\n startCoverage: async (runtimeOptions: {\n isolate: boolean\n }): Promise<unknown> => {\n if (v8CoverageModule.startCoverage) {\n return await v8CoverageModule.startCoverage(runtimeOptions);\n } else {\n throw createPoolError(\n 'HybridCoverageProvider - v8 coverage module does not provide `startCoverage`',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n },\n \n takeCoverage: async (runtimeOptions?: any): Promise<unknown> => {\n if (v8CoverageModule.takeCoverage) {\n return await v8CoverageModule.takeCoverage(runtimeOptions);\n } else {\n throw createPoolError(\n 'HybridCoverageProvider - v8 coverage module does not provide `takeCoverage`',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n },\n \n stopCoverage: async (runtimeOptions: {\n isolate: boolean\n }): Promise<unknown> => {\n if (v8CoverageModule.stopCoverage) {\n return await v8CoverageModule.stopCoverage(runtimeOptions);\n } else {\n throw createPoolError(\n 'HybridCoverageProvider - v8 coverage module does not provide `stopCoverage`',\n POOL_ERROR_NAMES.HybridCoverageProviderError\n );\n }\n },\n};\n\nexport default hybridProviderModule;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["parsePath","AssemblyScriptParser"],"sources":["../../src/coverage-provider/containment-matcher.ts","../../src/coverage-provider/istanbul-converter.ts","../../src/coverage-provider/ast-parser.ts","../../src/coverage-provider/glob-utils.ts","../../src/coverage-provider/hybrid-coverage-provider.ts","../../src/coverage-provider/index.ts"],"sourcesContent":["/**\n * Containment Matcher\n *\n * Provides containment-based matching for coverage mapping.\n * Binary debug info provides points (representativeLocation), source parsing provides ranges.\n * We find which source range contains each binary point.\n *\n * Usage by version:\n * - v1: Function containment matching (binary representativeLocation → source function range)\n * - v2: Function containment (same) + statement containment + branch path containment\n *\n * Why containment matching (not direct position lookup):\n * AS compiler generates source map entries differently by statement type:\n * - Variable declarations: source map points to statement start (keyword)\n * - Control flow (if/switch/for): source map points to condition EXPRESSION, not keyword\n *\n * Example: `if (n < 0)` → binary reports column 7 ('n'), not column 3 ('i' of 'if')\n *\n * Containment matching is more robust:\n * - Binary gives us a position (representativeLocation) somewhere in the function\n * - Source gives us function ranges (start/end line/column)\n * - We find which source function range contains the binary position\n * - Handles nested functions with \"tightest fit\" (innermost function wins)\n */\n\nimport type { ParsedSourceFunctionInfo, SourceRange } from '../types/types.js';\n\n/**\n * Functions indexed by file path, then by start line.\n * Multiple functions can start on the same line (e.g., nested arrow functions).\n */\nexport type FunctionsByFileAndStartLine = Record<string, Record<number, ParsedSourceFunctionInfo[]>>;\n\n/**\n * Find the source function whose range contains the given position.\n *\n * For nested functions, uses \"tightest fit\" - returns the innermost function\n * (the one with the largest start position among all containing functions).\n *\n * @param functionsByStartLine - Functions for a single file, indexed by start line\n * @param line - Target line number (1-based)\n * @param column - Target column number (1-based)\n * @returns The containing function, or undefined if no match\n */\nexport function findFunctionContainingPosition(\n functionsByStartLine: Record<number, ParsedSourceFunctionInfo[]>,\n line: number,\n column: number\n): ParsedSourceFunctionInfo | undefined {\n let bestMatch: ParsedSourceFunctionInfo | undefined;\n let bestStartLine = -1;\n let bestStartColumn = -1;\n\n // Check functions starting on lines <= target line\n for (const [startLineStr, functions] of Object.entries(functionsByStartLine)) {\n const startLine = Number(startLineStr);\n if (startLine > line) continue;\n\n for (const func of functions) {\n const { range } = func;\n\n // Check if position is within this function's range\n if (!isPositionInRange(line, column, range)) continue;\n\n // Tightest fit: prefer function with largest start position (innermost)\n if (startLine > bestStartLine ||\n (startLine === bestStartLine && range.startColumn > bestStartColumn)) {\n bestMatch = func;\n bestStartLine = startLine;\n bestStartColumn = range.startColumn;\n }\n }\n }\n\n return bestMatch;\n}\n\n/**\n * Check if a position (line, column) falls within a source range.\n *\n * @param line - Target line number (1-based)\n * @param column - Target column number (1-based)\n * @param range - Source range to check against\n * @returns true if position is within range (inclusive)\n */\nexport function isPositionInRange(\n line: number,\n column: number,\n range: SourceRange\n): boolean {\n // Outside line range entirely\n if (line < range.startLine || line > range.endLine) return false;\n\n // On start line but before start column\n if (line === range.startLine && column < range.startColumn) return false;\n\n // On end line but after end column\n if (line === range.endLine && column > range.endColumn) return false;\n\n return true;\n}\n","/**\n * Istanbul Format Converter\n *\n * Converts AssemblyScript coverage data to Istanbul's FileCoverageData format.\n * This enables integration with Vitest's coverage reporting system and standard\n * coverage tools like Codecov, Coveralls, etc.\n *\n * Current Implementation: Function-level coverage only\n * - Uses containment matching: binary positions → source function ranges\n * - Each function maps to both a function entry AND a statement entry\n * - Statement coverage matches function coverage (function-level granularity)\n * - Branch coverage is 0% (no branches tracked yet)\n * - Line coverage derived from statement coverage\n *\n * Future Enhancement (v2): Block-level statement and branch coverage\n */\n\nimport type { FileCoverageData, Range, FunctionMapping, BranchMapping } from 'istanbul-lib-coverage';\nimport type { ParsedSourceFunctionInfo } from '../types/types.js';\nimport { findFunctionContainingPosition } from './containment-matcher.js';\nimport { debugOverride } from '../util/debug.js';\n\n/**\n * Convert AssemblyScript coverage data to Istanbul format for a single file\n *\n * Algorithm (containment matching):\n * 1. For each hit position in fileHitCountsByPosition:\n * - Use containment matcher to find which source function contains this position\n * - Record the hit count for that function\n * 2. For each function in fileFunctionsByStartLine:\n * - Add function mapping to fnMap\n * - Add function hit count to f (from matched hits, or 0 if not hit)\n * - Add corresponding statement mapping to statementMap\n * - Add same hit count to s (statement coverage matches function coverage)\n *\n * @param fileFunctionsByStartLine - Functions for this file, keyed by start line (from AST parser)\n * @param fileHitCountsByPosition - Hit counts for this file, keyed by position \"line:column\" (from accumulated coverage)\n * @param absoluteFilePath - Absolute path to the source file (for Istanbul output)\n * @returns Istanbul FileCoverage object\n */\nexport async function convertToIstanbulFormat(\n fileFunctionsByStartLine: Record<number, ParsedSourceFunctionInfo[]>,\n fileHitCountsByPosition: Record<string, number>,\n absoluteFilePath: string,\n istanbulDebugEnabled: boolean\n): Promise<FileCoverageData> {\n const startMatch = performance.now();\n\n function istanbulDebug(...args: any[]): void {\n if (istanbulDebugEnabled) {\n debugOverride(...args);\n }\n };\n\n istanbulDebug(() => {\n const sourceFunctionCount = Object.values(fileFunctionsByStartLine).reduce((sum, funcs) => sum + funcs.length, 0);\n const uniqueHitPosCount = Object.keys(fileHitCountsByPosition).length;\n const coverageEstimate = sourceFunctionCount === 0 ? Infinity : ((uniqueHitPosCount * 100) / sourceFunctionCount).toFixed(2);\n\n return `[IstanbulConverter] Processing source file: \"${absoluteFilePath}\"\\n`\n + `[IstanbulConverter] Source: ${sourceFunctionCount} total functions, Coverage: ${uniqueHitPosCount} unique hit positions\\n`\n + `[IstanbulConverter] Sanity Check - AS File Coverage Estimate: ${coverageEstimate}%\\n`\n + `[IstanbulConverter] Containment matching functions: coverage hit positions to source functions by range`;\n });\n\n // Build a map of function → hit count using containment matching\n // Key: function source identity (qualifiedName), Value: hit count\n const hitCountsBySourceFunctionName = new Map<ParsedSourceFunctionInfo, number>();\n\n // For each hit position, find which function contains it\n for (const [positionKey, hitCount] of Object.entries(fileHitCountsByPosition)) {\n // Position key format is \"line:column\"\n const parts = positionKey.split(':');\n const lineStr = parts[0];\n const columnStr = parts[1];\n\n if (lineStr && columnStr) {\n const line = parseInt(lineStr, 10);\n const column = parseInt(columnStr, 10);\n\n const containingFunction = findFunctionContainingPosition(fileFunctionsByStartLine, line, column);\n if (containingFunction) {\n // Accumulate hits (in case multiple positions map to same function)\n const existingHits = hitCountsBySourceFunctionName.get(containingFunction);\n const existingHitsCount = existingHits ?? 0;\n const max = Math.max(existingHitsCount, hitCount);\n hitCountsBySourceFunctionName.set(containingFunction, max); // <-- TODO: Explain this max logic\n\n if (existingHits !== undefined) {\n istanbulDebug(`[IstanbulConverter] Position ${positionKey} → function \"${containingFunction.shortName}\" EXISTING HITS: ${existingHits} NEW COUNT: ${max}`);\n } else {\n istanbulDebug(`[IstanbulConverter] Position ${positionKey} → function \"${containingFunction.shortName}\" (hits: ${hitCount})`);\n }\n } else {\n istanbulDebug(`[IstanbulConverter] Position ${positionKey} has no containing function`);\n }\n }\n }\n\n const startConvert = performance.now();\n istanbulDebug(`[IstanbulConverter] Matching Complete - Converting to Istanbul format`);\n\n // Initialize Istanbul data structures\n const fnMap: { [key: string]: FunctionMapping } = {};\n const f: { [key: string]: number } = {};\n const statementMap: { [key: string]: Range } = {};\n const s: { [key: string]: number } = {};\n const branchMap: { [key: string]: BranchMapping } = {};\n const b: { [key: string]: number[] } = {};\n\n // Convert function coverage to Istanbul format\n // Iterate all functions from parsed source (ensures 0-hit functions are included)\n let funcIdx = 0;\n for (const functions of Object.values(fileFunctionsByStartLine)) {\n for (const funcInfo of functions) {\n const { range, shortName } = funcInfo;\n\n // Defensive: skip functions with invalid metadata (shouldn't happen - AST parser filters these)\n if (range.startLine === 0) {\n continue;\n }\n\n // Get hit count from containment matching (or 0 if not hit)\n const hitCount = hitCountsBySourceFunctionName.get(funcInfo) ?? 0;\n const displayShortName = shortName && shortName !== '' ? shortName : '<anonymous>';\n istanbulDebug(\n `[IstanbulConverter] Istanbul function index ${funcIdx}: \"${displayShortName}\"`\n + ` (source ${range.startLine}:${range.startColumn} - ${range.endLine}:${range.endColumn}), hits: ${hitCount}`\n );\n\n // Create function mapping\n // Both 'decl' (declaration) and 'loc' (location) use the same range\n // Internal ParsedSourceFunctionInfo uses 1-based columns, Istanbul expects 0-based\n const istanbulRange: Range = {\n start: { line: range.startLine, column: range.startColumn - 1 },\n end: { line: range.endLine, column: range.endColumn - 1 }\n };\n\n const idxStr = funcIdx.toString();\n fnMap[idxStr] = {\n name: shortName,\n decl: istanbulRange,\n loc: istanbulRange,\n line: range.startLine\n };\n f[idxStr] = hitCount;\n\n // Create corresponding statement mapping\n // For function-level coverage, each function is one \"statement\"\n // The statement range matches the function range\n // This gives us statement coverage at function granularity\n statementMap[idxStr] = istanbulRange;\n s[idxStr] = hitCount;\n\n funcIdx++;\n }\n }\n\n const done = performance.now();\n const matchingMs = (startConvert - startMatch).toFixed(2);\n const convertMs = (done - startConvert).toFixed(2);\n const totalMs = (done - startMatch).toFixed(2);\n\n istanbulDebug(\n `[IstanbulConverter] Coverage Coversion Complete: ${Object.keys(fnMap).length} functions,` \n + ` ${totalMs} ms total (matching: ${matchingMs} ms, convert: ${convertMs} ms)`\n );\n\n return {\n path: absoluteFilePath,\n fnMap,\n f,\n statementMap,\n s,\n branchMap,\n b\n };\n}\n","/**\n * AST Parser for AssemblyScript Source Files\n *\n * Parses AS source files to extract function metadata for coverage.\n * Used by generateCoverage to build empty coverage map from all source files.\n *\n * Source AST is the source of truth for what SHOULD be covered.\n * Binary instrumentation tells us what we CAN measure (hit counts).\n *\n * Functions are grouped by start line for efficient containment matching.\n *\n * Architecture:\n * - Uses shared ASTVisitor for complete NodeKind coverage\n * - Overrides hooks to extract function information during traversal\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { parse as parsePath } from 'node:path';\nimport {\n Parser as AssemblyScriptParser,\n Source,\n BlockStatement,\n Node,\n FunctionDeclaration,\n MethodDeclaration,\n ClassDeclaration,\n NamespaceDeclaration,\n VariableDeclaration,\n FunctionExpression,\n} from 'assemblyscript';\n\nimport type { ParsedSourceFunctionInfo, SourceRange } from '../types/types.js';\nimport { ASCommonFlags, ASNodeKind } from '../types/constants.js';\nimport { ASTVisitor } from '../util/ast-visitor.js';\n\n/**\n * Visitor that extracts function information from AST nodes\n */\nclass FunctionExtractorVisitor extends ASTVisitor {\n /** Source file being parsed */\n private source: Source;\n /** Module path for building qualified names */\n private modulePath: string;\n /** Absolute file path */\n private filePath: string;\n /** Accumulated function records, keyed by start line */\n readonly functions: Record<number, ParsedSourceFunctionInfo[]> = {};\n /** Namespace context stack (supports nested namespaces) */\n private namespaceStack: string[] = [];\n /** Current class name (when inside a class) */\n private currentClassName: string | null = null;\n\n constructor(source: Source, modulePath: string, filePath: string) {\n super();\n this.source = source;\n this.modulePath = modulePath;\n this.filePath = filePath;\n }\n\n /**\n * Track namespace context when entering a namespace.\n * Supports nesting — push onto the stack.\n */\n protected onNamespaceEnter(node: NamespaceDeclaration): void {\n this.namespaceStack.push(node.name?.text ?? 'Anonymous');\n }\n\n /**\n * Restore namespace context when exiting a namespace.\n */\n protected onNamespaceExit(_node: NamespaceDeclaration): void {\n this.namespaceStack.pop();\n }\n\n /**\n * Track class context when entering a class.\n * Includes namespace prefix when inside a namespace, matching binary naming convention\n * (e.g. \"NS_A.Item\" for class Item inside namespace NS_A).\n */\n protected onClassEnter(node: ClassDeclaration): void {\n const className = node.name?.text ?? 'Anonymous';\n if (this.namespaceStack.length > 0) {\n this.currentClassName = `${this.namespaceStack.join('.')}.${className}`;\n } else {\n this.currentClassName = className;\n }\n }\n\n /**\n * Restore class context when exiting a class\n */\n protected onClassExit(_node: ClassDeclaration): void {\n this.currentClassName = null;\n }\n\n /**\n * Extract function info from function declarations\n */\n protected onFunctionDeclaration(node: FunctionDeclaration): boolean {\n if (node.body && this.hasBodyStatements(node.body)) {\n const funcName = node.name?.text ?? '~anonymous';\n const shortName = this.namespaceStack.length > 0\n ? `${this.namespaceStack.join('.')}.${funcName}`\n : funcName;\n const qualifiedName = `${this.modulePath}/${shortName}`;\n const range = this.buildRange(node, node.name ?? null);\n this.addFunction(qualifiedName, shortName, range);\n }\n return true; // Continue recursion into body\n }\n\n /**\n * Extract function info from method declarations\n */\n protected onMethodDeclaration(node: MethodDeclaration): boolean {\n if (node.body && this.hasBodyStatements(node.body)) {\n const methodName = node.name?.text ?? 'constructor';\n const className = this.currentClassName ?? 'Unknown';\n const flags = node.flags;\n\n // Determine method type from flags\n const isStatic = (flags & ASCommonFlags.Static) !== 0;\n const isGetter = (flags & ASCommonFlags.Get) !== 0;\n const isSetter = (flags & ASCommonFlags.Set) !== 0;\n\n // Build short name to match binary naming convention:\n // - Static: ClassName.methodName\n // - Getter: ClassName#get:propertyName\n // - Setter: ClassName#set:propertyName\n // - Instance: ClassName#methodName\n let shortName: string;\n if (isStatic) {\n shortName = `${className}.${methodName}`;\n } else if (isGetter) {\n shortName = `${className}#get:${methodName}`;\n } else if (isSetter) {\n shortName = `${className}#set:${methodName}`;\n } else {\n shortName = `${className}#${methodName}`;\n }\n\n const qualifiedName = `${this.modulePath}/${shortName}`;\n const range = this.buildRange(node, node.name ?? null);\n this.addFunction(qualifiedName, shortName, range);\n }\n return true; // Continue recursion into body\n }\n\n /**\n * Extract function info from variable declarations (arrow functions)\n */\n protected onVariableDeclaration(node: VariableDeclaration): boolean {\n if (node.initializer && node.initializer.kind === ASNodeKind.Function) {\n const funcExpr = node.initializer as FunctionExpression;\n const funcDecl = funcExpr.declaration;\n\n if (funcDecl.body && this.hasBodyStatements(funcDecl.body)) {\n // Use variable name for the function\n const shortName = node.name.text;\n const qualifiedName = `${this.modulePath}/${shortName}`;\n\n // Use the variable declaration's range\n const range: SourceRange = {\n filePath: this.filePath,\n startLine: this.source.lineAt(node.range.start),\n startColumn: this.source.columnAt(),\n endLine: this.source.lineAt(node.range.end),\n endColumn: this.source.columnAt(),\n };\n\n this.addFunction(qualifiedName, shortName, range);\n }\n\n // Visit the function body manually since we're handling this specially\n if (funcDecl.body) {\n this.visitNode(funcDecl.body);\n }\n return false; // Don't recurse again - we handled it\n }\n return true; // Continue recursion for non-function initializers\n }\n\n /**\n * Check if a function body has statements (non-empty body)\n */\n private hasBodyStatements(body: Node): boolean {\n if (body.kind === ASNodeKind.Block) {\n const blockBody = body as BlockStatement;\n return blockBody.statements.length > 0;\n }\n // Expression body (braceless arrow) - always has the expression\n return true;\n }\n\n /**\n * Add a function to the functions record, keyed by start line\n */\n private addFunction(qualifiedName: string, shortName: string, range: SourceRange): void {\n const startLine = range.startLine;\n if (!this.functions[startLine]) {\n this.functions[startLine] = [];\n }\n this.functions[startLine].push({ qualifiedName, shortName, range });\n }\n\n /**\n * Build a SourceRange for a node, using name.range.start to skip decorators\n */\n private buildRange(node: Node, nameNode: Node | null): SourceRange {\n const startNode = nameNode ?? node;\n return {\n filePath: this.filePath,\n startLine: this.source.lineAt(startNode.range.start),\n startColumn: this.source.columnAt(),\n endLine: this.source.lineAt(node.range.end),\n endColumn: this.source.columnAt(),\n };\n }\n}\n\n/**\n * Parse functions from a single AS source file\n *\n * @param absoluteSourceFilePath - Absolute path to AS source file\n * @param relativeSourceFilePath - Relative path to AS source file (derived once in caller and used several places)\n * @returns Record of start line to array of ParsedSourceFunctionInfo (multiple functions can start on same line)\n */\nexport async function parseFunctionsFromFile(\n absoluteSourceFilePath: string,\n relativeSourceFilePath: string,\n): Promise<Record<number, ParsedSourceFunctionInfo[]>> {\n const sourceCode = await readFile(absoluteSourceFilePath, 'utf8');\n\n // Build the module path (strip any extension, use forward slashes)\n const parsed = parsePath(relativeSourceFilePath);\n const modulePath = parsed.dir ? `${parsed.dir}/${parsed.name}` : parsed.name;\n\n // Parse with AssemblyScript parser\n const asParser = new AssemblyScriptParser();\n asParser.parseFile(sourceCode, relativeSourceFilePath, true);\n\n const source = asParser.currentSource;\n if (!source) {\n return {};\n }\n\n // Create visitor and traverse\n const visitor = new FunctionExtractorVisitor(source, modulePath, absoluteSourceFilePath);\n visitor.visitSource(source);\n\n return visitor.functions || {};\n}\n","/**\n * Glob Utilities for Coverage\n *\n * Uses tinyglobby to glob AssemblyScript files matching coverage include/exclude patterns.\n * Supports ../ path traversals for projects that import source from outside the project root.\n *\n * Note: tinyglobby docs warn of a performance cost when globbing outside cwd (e.g. ../ patterns)\n * due to recalculating relative paths. Acceptable here since this runs once at startup.\n */\n\nimport { relative } from 'node:path';\nimport { globSync } from 'tinyglobby';\n\nimport { GlobResult } from '../types/types.js';\nimport { toForwardSlash } from '../util/path-utils.js';\n\nconst NODE_MODULES_GLOB = '**/node_modules/**';\n\n/**\n * Glob files matching coverage include/exclude patterns\n *\n * @param include - Include patterns (e.g., ['assembly/**\\/*.ts'])\n * @param exclude - Exclude patterns (e.g., ['**\\/*.test.ts'])\n * @param projectRoot - Project root directory\n * @returns Array of glob results with absolute and project-root-relative paths\n */\nexport function globFiles(\n include: string[],\n exclude: string[],\n projectRoot: string\n): GlobResult[] {\n if (include.length === 0) {\n return [];\n }\n\n const absolutePaths = globSync(include, {\n cwd: projectRoot,\n ignore: [NODE_MODULES_GLOB, ...exclude],\n absolute: true,\n });\n\n return absolutePaths.map((absolute) => ({\n absolute: toForwardSlash(absolute),\n projectRootRelative: toForwardSlash(relative(projectRoot, absolute)),\n }));\n}\n","/**\n * Hybrid Coverage Provider\n *\n * This provider handles both AssemblyScript and JavaScript and coverage\n * - Converts AS coverage to Istanbul format\n * - Delegates JS coverage to Vitest's v8 provider\n * - Merges both into a unified coverage report\n */\n\nimport { basename, relative } from 'node:path';\nimport type {\n CoverageProvider,\n Vitest,\n ReportContext,\n ResolvedCoverageOptions,\n} from 'vitest/node';\nimport type { AfterSuiteRunMeta } from 'vitest';\nimport v8CoverageModule from '@vitest/coverage-v8';\nimport type { CoverageMap } from 'istanbul-lib-coverage';\nimport istanbulCoverage from 'istanbul-lib-coverage';\nconst { createCoverageMap } = istanbulCoverage;\n\nimport { convertToIstanbulFormat } from './istanbul-converter.js';\nimport { parseFunctionsFromFile } from './ast-parser.js';\nimport { globFiles } from './glob-utils.js';\nimport { mergeCoverageData } from './coverage-merge.js';\nimport { debug } from '../util/debug.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport type {\n AssemblyScriptCoveragePayload,\n CoverageData,\n GlobResult,\n ResolvedHybridProviderOptions,\n} from '../types/types.js';\nimport {\n POOL_ERROR_NAMES,\n COVERAGE_PAYLOAD_FORMATS\n} from '../types/constants.js';\nimport { warnIfASCoverageNotSupportedByNode, warnIfNativeBuildFailed } from '../util/feature-check.js';\n\nexport class HybridCoverageProvider implements CoverageProvider {\n name = 'hybrid-assemblyscript-v8' as const;\n\n private v8Provider: CoverageProvider | undefined;\n private accumulatedCoverageData: CoverageData = { hitCountsByFileAndPosition: {} };\n private projectRoot: string = '';\n private definedCoverageOptions: ResolvedCoverageOptions = {} as ResolvedCoverageOptions;\n private resolvedProviderOptions: ResolvedHybridProviderOptions = {} as ResolvedHybridProviderOptions;\n\n /**\n * Initialize the provider and get reference to v8 provider\n */\n async initialize(ctx: Vitest): Promise<void> {\n this.projectRoot = ctx.config.root;\n this.definedCoverageOptions = ctx.config.coverage;\n\n debug('[HybridCoverageProvider] Initializing Provider');\n\n // Get v8 provider from the coverage module\n this.v8Provider = await v8CoverageModule.getProvider();\n\n if (!this.v8Provider) {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'initialize failed to get delegated v8 provider',\n );\n }\n\n await this.v8Provider.initialize(ctx);\n this.v8Provider.name = 'hybrid-assemblyscript-v8 (delegated v8 reporter)' as const;\n debug('[HybridCoverageProvider] Initialized with delegated v8 provider');\n\n warnIfASCoverageNotSupportedByNode();\n await warnIfNativeBuildFailed();\n }\n\n /**\n * Handle suite completion - delegate based on coverage format marker\n */\n async onAfterSuiteRun(meta: AfterSuiteRunMeta): Promise<void> {\n const start = performance.now();\n const format: string | undefined = (meta?.coverage as any)?.__format;\n let suiteLogLabel = meta.testFiles.length > 0 ? basename(meta.testFiles[0]!) : '';\n\n // Check for AssemblyScript format marker\n if (format === COVERAGE_PAYLOAD_FORMATS.AssemblyScript) {\n const payload = meta.coverage as AssemblyScriptCoveragePayload;\n const { coverageData, suiteLogLabel: label } = payload;\n suiteLogLabel = label;\n\n debug(() => {\n const fileCount = Object.keys(coverageData.hitCountsByFileAndPosition).length;\n const positionCount = Object.values(coverageData.hitCountsByFileAndPosition)\n .reduce((sum, positions) => sum + Object.keys(positions).length, 0);\n return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun - Suite payload: ${positionCount} unique positions over ${fileCount} source files`;\n });\n\n // Merge incoming coverage data into accumulated (by position, summing hit counts)\n mergeCoverageData(this.accumulatedCoverageData, coverageData);\n\n debug(() => {\n const fileCount = Object.keys(this.accumulatedCoverageData.hitCountsByFileAndPosition).length;\n const positionCount = Object.values(this.accumulatedCoverageData.hitCountsByFileAndPosition)\n .reduce((sum, positions) => sum + Object.keys(positions).length, 0);\n return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun - Accumulated coverage: ${positionCount} unique positions over ${fileCount} source files`;\n });\n } else {\n // Delegate to v8 provider for all other formats (JS, etc.)\n if (!this.v8Provider) {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'onAfterSuiteRun failed to delegate to v8 provider',\n );\n }\n\n debug(`[HybridCoverageProvider] ${suiteLogLabel} - Delegating to v8 provider`);\n await this.v8Provider.onAfterSuiteRun(meta);\n }\n\n debug(() => {\n const files = meta.testFiles.map(tf => relative(this.projectRoot, tf)).join(',');\n return `[HybridCoverageProvider] ${suiteLogLabel} - onAfterSuiteRun complete - TIMING ${(performance.now() - start).toFixed(2)} ms | testFiles: \"${files}\"`;\n });\n }\n\n /**\n * Generate unified coverage map (merging JS and AS coverage)\n *\n * Flow:\n * 1. Parse included AS source files to get sourceDebugInfo (source of truth for line numbers)\n * 1. Build merged CoverageData (all source functions + accumulated hit counts)\n * 4. Convert merged CoverageData to Istanbul format\n * 5. Get JS coverage from v8 provider\n * 6. Merge AS coverage into JS coverage\n */\n async generateCoverage(context: ReportContext): Promise<unknown> {\n const start = performance.now();\n\n debug('[HybridCoverageProvider] Generating coverage for test run');\n\n if (!this.v8Provider) {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'generateCoverage failed to delegate to v8 provider',\n );\n }\n\n // Build AS coverage map\n let asCoverageMap = createCoverageMap();\n\n if (this.resolvedProviderOptions.globbedAssemblyScriptInclude.length > 0) {\n debug(`[HybridCoverageProvider] Building AS coverage map with ${this.resolvedProviderOptions.globbedAssemblyScriptInclude.length} source files `);\n debug(() => {\n const accumulatedPositionCount = Object.values(this.accumulatedCoverageData.hitCountsByFileAndPosition)\n .reduce((sum, positions) => sum + Object.keys(positions)?.length, 0);\n const files = Object.keys(this.accumulatedCoverageData.hitCountsByFileAndPosition).length;\n return `[HybridCoverageProvider] Accumulated coverage data has ${accumulatedPositionCount} unique positions hit across ${files} debug source files`;\n });\n\n // parse source files with AST parser, then match to hits and convert to istanbul format\n const fileProcessingPromises = this.resolvedProviderOptions.globbedAssemblyScriptInclude.map(async (include: GlobResult) => {\n debug(`[HybridCoverageProvider] Parsing AS source for expected coverage: \"${include.absolute}\"`);\n \n const functionsByStartLine = await parseFunctionsFromFile(include.absolute, include.projectRootRelative) || {};\n debug(`[HybridCoverageProvider] Parsed ${Object.keys(functionsByStartLine).length} AS source functions in \"${include.absolute}\"`);\n\n const fileHitCountsByPosition = this.accumulatedCoverageData.hitCountsByFileAndPosition[include.absolute] ?? {};\n debug(`[HybridCoverageProvider] Accumulated AS coverage has ${Object.keys(fileHitCountsByPosition).length} positions for \"${include.absolute}\"`);\n\n // Containment matching (binary hit position → source) is performed during istanbul conversion\n return convertToIstanbulFormat(functionsByStartLine, fileHitCountsByPosition, include.absolute, this.resolvedProviderOptions.debugIstanbul);\n });\n\n // Wait for all files to complete\n const istanbulResults = await Promise.all(fileProcessingPromises);\n\n // Add all results to coverage map\n for (const istanbulData of istanbulResults) {\n asCoverageMap.addFileCoverage(istanbulData);\n }\n\n debug(`[HybridCoverageProvider] Built AS coverage map with ${Object.keys(asCoverageMap.data).length} files`);\n } else {\n debug('[HybridCoverageProvider] WARNING: No assemblyScriptInclude patterns yieldled files - Coverage Map will be empty!');\n }\n\n const asGenerateEnd = performance.now();\n debug(`[HybridCoverageProvider] TIMING AS generateCoverage: ${(asGenerateEnd - start).toFixed(2)} ms`);\n\n // Get JS coverage from v8 provider\n debug('[HybridCoverageProvider] Getting JS coverage from v8 provider');\n const jsCoverage = await this.v8Provider.generateCoverage(context) as CoverageMap;\n debug(`[HybridCoverageProvider] JS coverage has ${Object.keys(jsCoverage.data).length} files`);\n debug(`[HybridCoverageProvider] TIMING JS generateCoverage: ${(performance.now() - asGenerateEnd).toFixed(2)} ms`);\n\n // Merge AS coverage into JS coverage.\n // Use toJSON() to pass plain data instead of the CoverageMap instance. This avoids\n // instanceof failures when istanbul-lib-coverage is loaded from different module paths\n // (e.g. the pool workers resolve one copy while the coverage provider resolves another).\n if (asCoverageMap.files().length) {\n debug('[HybridCoverageProvider] Merging AS coverage into JS coverage');\n jsCoverage.merge(asCoverageMap.toJSON());\n } else {\n debug('[HybridCoverageProvider] AS coverage map empty, not merging into JS coverage');\n }\n debug(`[HybridCoverageProvider] Final merged coverage has ${Object.keys(jsCoverage.data).length} files`);\n\n debug(`[HybridCoverageProvider] TIMING Total generateCoverage: ${(performance.now() - start).toFixed(2)} ms`);\n\n return jsCoverage;\n }\n\n /**\n * Report coverage - delegate to v8 provider\n */\n async reportCoverage(coverageMap: unknown, context: ReportContext): Promise<void> {\n if (!this.v8Provider) {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'reportCoverage failed to delegate to v8 provider',\n );\n }\n\n debug(`[HybridCoverageProvider] Reporting coverage (allTestsRun=${context.allTestsRun})`);\n await this.v8Provider.reportCoverage(coverageMap, context);\n }\n\n /**\n * Resolve options\n */\n resolveOptions(): ResolvedHybridProviderOptions {\n if (!this.v8Provider) {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'resolveOptions failed to delegate to v8 provider',\n );\n }\n \n debug(`[HybridCoverageProvider] Resolving Coverage Options`);\n \n const resolvedV8Options = this.v8Provider.resolveOptions() as ResolvedCoverageOptions;\n\n // For some reason the v8 provider builds its `excludes` values to include a null byte.\n // Remove null bytes for logging purposes so tools like grep won't complain about binary content.\n const sanitizedV8Options: ResolvedCoverageOptions = {\n ...resolvedV8Options,\n include: resolvedV8Options.include?.map(i => i.replace(/\\0/g, '')) || undefined,\n exclude: resolvedV8Options.exclude?.map(i => i.replace(/\\0/g, '')) || undefined\n };\n\n debug(`[HybridCoverageProvider] AS include: ${(this.definedCoverageOptions.assemblyScriptInclude || []).join(', ') || '(none)'}`);\n debug(`[HybridCoverageProvider] AS exclude: ${(this.definedCoverageOptions.assemblyScriptExclude || []).join(', ') || '(none)'}`);\n debug(`[HybridCoverageProvider] JS include: ${(sanitizedV8Options.include || []).join(', ') || '(none)'}`);\n debug(`[HybridCoverageProvider] JS exclude: ${(sanitizedV8Options.exclude || []).join(', ') || '(none)'}`);\n\n debug(`[HybridCoverageProvider] Globbing AS source files to include for coverage map basis`);\n const globbedAssemblyScriptInclude = globFiles(\n this.definedCoverageOptions.assemblyScriptInclude || [],\n this.definedCoverageOptions.assemblyScriptExclude || [],\n this.projectRoot\n );\n debug(`[HybridCoverageProvider] Including ${globbedAssemblyScriptInclude.length} AS files in coverage map`);\n \n const globbedAssemblyScriptExcludeOnly = globFiles(\n this.definedCoverageOptions.assemblyScriptExclude || [],\n [],\n this.projectRoot\n );\n debug(`[HybridCoverageProvider] Excluding ${globbedAssemblyScriptExcludeOnly.length} AS files from coverage map & instrumentation`);\n \n const resolved: ResolvedHybridProviderOptions = {\n ...resolvedV8Options,\n provider: 'custom',\n customProviderModule: this.definedCoverageOptions.customProviderModule || '',\n debugIstanbul: this.definedCoverageOptions.debugIstanbul ?? false,\n assemblyScriptInclude: this.definedCoverageOptions.assemblyScriptInclude ?? [],\n assemblyScriptExclude: this.definedCoverageOptions.assemblyScriptExclude ?? [],\n globbedAssemblyScriptInclude,\n globbedAssemblyScriptProjectRelativeExcludeOnly : globbedAssemblyScriptExcludeOnly.map(gr => gr.projectRootRelative),\n isResolved: true\n }; \n\n this.resolvedProviderOptions = resolved;\n return resolved;\n }\n\n async clean(clean: boolean = true): Promise<void> {\n debug('[HybridCoverageProvider] Clean coverage data - clean:', clean);\n if (clean) {\n this.accumulatedCoverageData = { hitCountsByFileAndPosition: {} };\n debug('[HybridCoverageProvider] Cleaned all internal coverage data');\n }\n\n if (this.v8Provider) {\n await this.v8Provider.clean(clean);\n debug(`[HybridCoverageProvider] V8 provider finished clean(${clean})`);\n }\n }\n}\n","/**\n * Coverage Provider Module Export\n *\n * This module exports the hybrid coverage provider for Vitest to load.\n * Users configure this via:\n * coverage.provider = 'custom'\n * coverage.customProviderModule = 'vitest-pool-assemblyscript/coverage'\n */\n\nimport { CoverageProviderModule } from 'vitest/node';\nimport v8CoverageModule from '@vitest/coverage-v8';\n\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\nimport { createPoolError } from '../util/pool-errors.js';\nimport { HybridCoverageProvider } from './hybrid-coverage-provider.js';\n\n/**\n * Hybrid Coverage Provider\n *\n * This provider handles both AssemblyScript and JavaScript and coverage\n * - Converts AS coverage to Istanbul format\n * - Delegates JS coverage to Vitest's v8 provider\n * - Merges both into a unified coverage report\n */\nconst hybridProviderModule: CoverageProviderModule = {\n getProvider: (): HybridCoverageProvider => new HybridCoverageProvider(),\n\n startCoverage: async (runtimeOptions: {\n isolate: boolean\n }): Promise<unknown> => {\n if (v8CoverageModule.startCoverage) {\n return await v8CoverageModule.startCoverage(runtimeOptions);\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'HybridCoverageProvider - v8 coverage module does not provide `startCoverage`',\n );\n }\n },\n \n takeCoverage: async (runtimeOptions?: any): Promise<unknown> => {\n if (v8CoverageModule.takeCoverage) {\n return await v8CoverageModule.takeCoverage(runtimeOptions);\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'HybridCoverageProvider - v8 coverage module does not provide `takeCoverage`',\n );\n }\n },\n \n stopCoverage: async (runtimeOptions: {\n isolate: boolean\n }): Promise<unknown> => {\n if (v8CoverageModule.stopCoverage) {\n return await v8CoverageModule.stopCoverage(runtimeOptions);\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.HybridCoverageProviderError,\n 'HybridCoverageProvider - v8 coverage module does not provide `stopCoverage`',\n );\n }\n },\n};\n\nexport default hybridProviderModule;\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import c from "tinyrainbow";
|
|
2
1
|
import { dirname, resolve } from "node:path";
|
|
3
2
|
import { access, readFile, unlink } from "node:fs/promises";
|
|
4
|
-
import { versions } from "node:process";
|
|
5
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
+
import c from "tinyrainbow";
|
|
5
|
+
import { versions } from "node:process";
|
|
6
6
|
|
|
7
7
|
//#region src/util/feature-check.ts
|
|
8
8
|
const NATIVE_BUILD_ERROR_FILE = resolve(resolve(dirname(fileURLToPath(import.meta.url)), ".."), ".native-build-error");
|
|
@@ -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-DJB-K27u.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-DLfJqIrE.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-check-
|
|
1
|
+
{"version":3,"file":"feature-check-DLfJqIrE.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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { AssemblyScriptCompilerOptions,
|
|
1
|
+
import { AssemblyScriptCompilerOptions, AssemblyScriptPoolOptions, WASMCompilation } from "./types-CoroKYxB.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/compiler/index.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Compile AssemblyScript source code to WASM binary
|
|
6
6
|
*/
|
|
7
|
-
declare function compileAssemblyScript(filename: string, options: AssemblyScriptCompilerOptions, logModule: string, logLabel: string
|
|
7
|
+
declare function compileAssemblyScript(filename: string, options: AssemblyScriptCompilerOptions, logModule: string, logLabel: string): Promise<WASMCompilation>;
|
|
8
8
|
//#endregion
|
|
9
|
-
export { type
|
|
9
|
+
export { type AssemblyScriptPoolOptions, type WASMCompilation, compileAssemblyScript };
|
|
10
10
|
//# sourceMappingURL=index-internal.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-internal.d.mts","names":[],"sources":["../src/compiler/index.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index-internal.d.mts","names":[],"sources":["../src/compiler/index.ts"],"mappings":";;;;;AA4EA;iBAAsB,qBAAA,CACpB,QAAA,UACA,OAAA,EAAS,6BAAA,EACT,SAAA,UACA,QAAA,WACC,OAAA,CAAQ,eAAA"}
|
package/dist/index-internal.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import "./constants-
|
|
2
|
-
import "./
|
|
3
|
-
import "./
|
|
4
|
-
import
|
|
1
|
+
import "./constants-Bq5KNxXJ.mjs";
|
|
2
|
+
import "./pool-errors-GWfwrsD7.mjs";
|
|
3
|
+
import "./wasm-memory-C8Nkl2Sz.mjs";
|
|
4
|
+
import "./feature-check-DLfJqIrE.mjs";
|
|
5
|
+
import { compileAssemblyScript } from "./compiler-DSKhQ5--.mjs";
|
|
5
6
|
|
|
6
7
|
export { compileAssemblyScript };
|
package/dist/index-v3.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-v3.d.mts","names":[],"sources":["../src/pool/v3-process-pool.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index-v3.d.mts","names":[],"sources":["../src/pool/v3-process-pool.ts"],"mappings":";;;iBAsRgB,+BAAA,CAAgC,GAAA,EAAK,MAAA,GAAS,WAAA"}
|