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.
Files changed (102) hide show
  1. package/BINARYEN_VERSION +1 -1
  2. package/assembly/compare.ts +11 -12
  3. package/assembly/describe.ts +4 -4
  4. package/assembly/expect.ts +44 -26
  5. package/assembly/test.ts +9 -9
  6. package/assembly/utils.ts +218 -62
  7. package/binding.gyp +4 -4
  8. package/dist/{addon-interface-CYFXMbK7.mjs → addon-interface-DJB-K27u.mjs} +12 -12
  9. package/dist/addon-interface-DJB-K27u.mjs.map +1 -0
  10. package/dist/{ast-visitor-CWEOd3UH.mjs → ast-visitor-w1HMbuJR.mjs} +2 -2
  11. package/dist/{ast-visitor-CWEOd3UH.mjs.map → ast-visitor-w1HMbuJR.mjs.map} +1 -1
  12. package/dist/compile-runner-D4SJWhMh.mjs +82 -0
  13. package/dist/compile-runner-D4SJWhMh.mjs.map +1 -0
  14. package/dist/compiler/transforms/deep-equals.d.mts.map +1 -1
  15. package/dist/compiler/transforms/deep-equals.mjs +61 -22
  16. package/dist/compiler/transforms/deep-equals.mjs.map +1 -1
  17. package/dist/compiler/transforms/strip-inline.mjs +2 -2
  18. package/dist/{compiler-hUlDr5vL.mjs → compiler-DSKhQ5--.mjs} +58 -28
  19. package/dist/compiler-DSKhQ5--.mjs.map +1 -0
  20. package/dist/config/index-v3.d.mts +1 -1
  21. package/dist/config/index-v3.d.mts.map +1 -1
  22. package/dist/config/index-v3.mjs.map +1 -1
  23. package/dist/config/index.d.mts +2 -2
  24. package/dist/config/index.mjs +5 -7
  25. package/dist/{constants-DbxJ3hzg.mjs → constants-Bq5KNxXJ.mjs} +4 -2
  26. package/dist/constants-Bq5KNxXJ.mjs.map +1 -0
  27. package/dist/{coverage-merge-CBXkpM1O.mjs → coverage-merge-0WqdC-dq.mjs} +1 -1
  28. package/dist/{coverage-merge-CBXkpM1O.mjs.map → coverage-merge-0WqdC-dq.mjs.map} +1 -1
  29. package/dist/coverage-provider/index.mjs +36 -36
  30. package/dist/coverage-provider/index.mjs.map +1 -1
  31. package/dist/{feature-check-Bje3ntpV.mjs → feature-check-DLfJqIrE.mjs} +4 -4
  32. package/dist/{feature-check-Bje3ntpV.mjs.map → feature-check-DLfJqIrE.mjs.map} +1 -1
  33. package/dist/index-internal.d.mts +3 -3
  34. package/dist/index-internal.d.mts.map +1 -1
  35. package/dist/index-internal.mjs +5 -4
  36. package/dist/index-v3.d.mts.map +1 -1
  37. package/dist/index-v3.mjs +19 -33
  38. package/dist/index-v3.mjs.map +1 -1
  39. package/dist/index.d.mts +1 -1
  40. package/dist/index.mjs +5 -7
  41. package/dist/{load-user-imports-Bx5ZlhSm.mjs → load-user-imports-6Pv-9hRg.mjs} +103 -229
  42. package/dist/load-user-imports-6Pv-9hRg.mjs.map +1 -0
  43. package/dist/pool-errors-GWfwrsD7.mjs +631 -0
  44. package/dist/pool-errors-GWfwrsD7.mjs.map +1 -0
  45. package/dist/{pool-runner-init-CNpRdA5u.d.mts → pool-runner-init-CCvnKt5o.d.mts} +2 -2
  46. package/dist/pool-runner-init-CCvnKt5o.d.mts.map +1 -0
  47. package/dist/{pool-runner-init-BqkwQ2tk.mjs → pool-runner-init-Cta6aVJ6.mjs} +15 -30
  48. package/dist/pool-runner-init-Cta6aVJ6.mjs.map +1 -0
  49. package/dist/pool-thread/compile-worker-thread.d.mts +1 -1
  50. package/dist/pool-thread/compile-worker-thread.d.mts.map +1 -1
  51. package/dist/pool-thread/compile-worker-thread.mjs +29 -19
  52. package/dist/pool-thread/compile-worker-thread.mjs.map +1 -1
  53. package/dist/pool-thread/test-worker-thread.d.mts +1 -1
  54. package/dist/pool-thread/test-worker-thread.d.mts.map +1 -1
  55. package/dist/pool-thread/test-worker-thread.mjs +25 -18
  56. package/dist/pool-thread/test-worker-thread.mjs.map +1 -1
  57. package/dist/pool-thread/v3-tinypool-thread.d.mts +1 -1
  58. package/dist/pool-thread/v3-tinypool-thread.d.mts.map +1 -1
  59. package/dist/pool-thread/v3-tinypool-thread.mjs +43 -33
  60. package/dist/pool-thread/v3-tinypool-thread.mjs.map +1 -1
  61. package/dist/test-runner-M21HMDdH.mjs +147 -0
  62. package/dist/test-runner-M21HMDdH.mjs.map +1 -0
  63. package/dist/{types-DHVk5iAx.d.mts → types-CoroKYxB.d.mts} +39 -16
  64. package/dist/types-CoroKYxB.d.mts.map +1 -0
  65. package/dist/vitest-file-tasks-Coc4btUw.mjs +473 -0
  66. package/dist/vitest-file-tasks-Coc4btUw.mjs.map +1 -0
  67. package/dist/wasm-memory-C8Nkl2Sz.mjs +134 -0
  68. package/dist/wasm-memory-C8Nkl2Sz.mjs.map +1 -0
  69. package/dist/{worker-rpc-channel-CZZIxtv5.mjs → worker-rpc-channel-CvCrc8aa.mjs} +1 -1
  70. package/dist/{worker-rpc-channel-CZZIxtv5.mjs.map → worker-rpc-channel-CvCrc8aa.mjs.map} +1 -1
  71. package/package.json +2 -2
  72. package/prebuilds/darwin-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  73. package/prebuilds/darwin-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  74. package/prebuilds/linux-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  75. package/prebuilds/linux-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  76. package/prebuilds/linux-x64/vitest-pool-assemblyscript.musl.node +0 -0
  77. package/prebuilds/win32-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  78. package/prebuilds/win32-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  79. package/src/instrumentation/native/addon.cpp +71 -32
  80. package/dist/addon-interface-CYFXMbK7.mjs.map +0 -1
  81. package/dist/compile-runner-BGQhBkBo.mjs +0 -85
  82. package/dist/compile-runner-BGQhBkBo.mjs.map +0 -1
  83. package/dist/compiler-hUlDr5vL.mjs.map +0 -1
  84. package/dist/constants-DbxJ3hzg.mjs.map +0 -1
  85. package/dist/debug-DtRAL4rM.mjs +0 -232
  86. package/dist/debug-DtRAL4rM.mjs.map +0 -1
  87. package/dist/load-user-imports-Bx5ZlhSm.mjs.map +0 -1
  88. package/dist/path-utils-t9OzjXYF.mjs +0 -24
  89. package/dist/path-utils-t9OzjXYF.mjs.map +0 -1
  90. package/dist/pool-runner-init-BqkwQ2tk.mjs.map +0 -1
  91. package/dist/pool-runner-init-CNpRdA5u.d.mts.map +0 -1
  92. package/dist/resolve-config-s9gSJSMc.mjs +0 -85
  93. package/dist/resolve-config-s9gSJSMc.mjs.map +0 -1
  94. package/dist/test-runner-BGqc9uCK.mjs +0 -138
  95. package/dist/test-runner-BGqc9uCK.mjs.map +0 -1
  96. package/dist/types-DHVk5iAx.d.mts.map +0 -1
  97. package/dist/vitest-file-tasks-D8sOClGX.mjs +0 -149
  98. package/dist/vitest-file-tasks-D8sOClGX.mjs.map +0 -1
  99. package/dist/vitest-tasks-BZ24sghI.mjs +0 -321
  100. package/dist/vitest-tasks-BZ24sghI.mjs.map +0 -1
  101. package/dist/wasm-names-BFtzQCH4.mjs +0 -124
  102. package/dist/wasm-names-BFtzQCH4.mjs.map +0 -1
package/dist/index-v3.mjs CHANGED
@@ -1,9 +1,7 @@
1
- import { POOL_ERROR_NAMES } from "./constants-DbxJ3hzg.mjs";
2
- import { getCompatConfig, getProjectSerializedOrGlobalConfig } from "./resolve-config-s9gSJSMc.mjs";
3
- import { createPoolErrorFromAnyError, debug, isAbortError, setGlobalDebugMode } from "./debug-DtRAL4rM.mjs";
4
- import { createInitialFileTask } from "./vitest-file-tasks-D8sOClGX.mjs";
5
- import { failTestWithTimeoutError, flagTestTerminated } from "./vitest-tasks-BZ24sghI.mjs";
6
- import { createWorkerRPCChannel } from "./worker-rpc-channel-CZZIxtv5.mjs";
1
+ import { POOL_ERROR_NAMES } from "./constants-Bq5KNxXJ.mjs";
2
+ import { createInitialFileTask, failTestWithTimeoutError, flagTestTerminated, getCompatConfig, getConfigs } from "./vitest-file-tasks-Coc4btUw.mjs";
3
+ import { debug, isAbortError, setGlobalDebugMode } from "./pool-errors-GWfwrsD7.mjs";
4
+ import { createWorkerRPCChannel } from "./worker-rpc-channel-CvCrc8aa.mjs";
7
5
  import { basename, resolve } from "node:path";
8
6
  import { access } from "node:fs/promises";
9
7
  import Tinypool from "tinypool";
@@ -14,7 +12,7 @@ import Tinypool from "tinypool";
14
12
  */
15
13
  const WORKER_PATH = resolve(import.meta.dirname, "pool-thread/v3-tinypool-thread.mjs");
16
14
  const POOL_THREAD_IDLE_TIMEOUT_MS = 36e5;
17
- async function dispatchFullWorkerRun(spec, config, isCollectTestsMode, pool, poolAbortSignal, fileCache, testTimeoutCache, previousTimedOutTest) {
15
+ async function dispatchFullWorkerRun(spec, config, asPoolOptions, isCollectTestsMode, pool, poolAbortSignal, fileCache, testTimeoutCache, previousTimedOutTest) {
18
16
  const fileRunStart = Date.now();
19
17
  const testFilePath = spec.moduleId;
20
18
  const base = basename(testFilePath);
@@ -75,6 +73,7 @@ async function dispatchFullWorkerRun(spec, config, isCollectTestsMode, pool, poo
75
73
  port: workerPort,
76
74
  file,
77
75
  config,
76
+ asPoolOptions,
78
77
  isCollectTestsMode,
79
78
  timedOutTest: previousTimedOutTest,
80
79
  timedOutCompilation: fileCompilation
@@ -95,8 +94,7 @@ async function dispatchFullWorkerRun(spec, config, isCollectTestsMode, pool, poo
95
94
  debug(`[Pool] ${base} - file worker aborted during run: ${String(error)}`);
96
95
  if (!!timedOutTestThisRun) return timedOutTestThisRun;
97
96
  else return;
98
- }
99
- throw createPoolErrorFromAnyError(`${base} - unhandled file worker failure`, POOL_ERROR_NAMES.PoolError, error);
97
+ } else throw error;
100
98
  } finally {
101
99
  debug(`[Pool] ${base} - Finished File Worker Execution`);
102
100
  }
@@ -104,7 +102,7 @@ async function dispatchFullWorkerRun(spec, config, isCollectTestsMode, pool, poo
104
102
  /**
105
103
  * Run / Collect tests
106
104
  */
107
- async function runTests(specs, isCollectTestsMode, pool, poolAbortController, _invalidatedFiles) {
105
+ async function runTests(specs, projectConfigs, fallbackPoolOptions, isCollectTestsMode, pool, poolAbortController, _invalidatedFiles) {
108
106
  const mode = isCollectTestsMode ? "collectTests" : "runTests";
109
107
  debug(`[Pool] -------- ${mode} called for ${specs.length} specs --------`);
110
108
  const fileCache = /* @__PURE__ */ new Map();
@@ -112,8 +110,9 @@ async function runTests(specs, isCollectTestsMode, pool, poolAbortController, _i
112
110
  const fileWorkers = specs.map(async (spec) => {
113
111
  const { serializedConfig } = spec.project;
114
112
  const compatConfig = getCompatConfig(serializedConfig);
115
- let timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache);
116
- while (timedOutTest) timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache, timedOutTest);
113
+ const asPoolOptions = projectConfigs[spec.project.name]?.v3PoolOptions ?? fallbackPoolOptions;
114
+ let timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, asPoolOptions, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache);
115
+ while (timedOutTest) timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, asPoolOptions, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache, timedOutTest);
117
116
  });
118
117
  if (isCollectTestsMode) try {
119
118
  await Promise.all(fileWorkers);
@@ -148,34 +147,21 @@ async function runTests(specs, isCollectTestsMode, pool, poolAbortController, _i
148
147
  debug(`[Pool] -------- ${mode} completed --------`);
149
148
  }
150
149
  function createAssemblyScriptProcessPool(ctx) {
151
- const { config, foundProjectSerializedConfig, v3PoolOptions } = getProjectSerializedOrGlobalConfig(ctx);
152
- if (!v3PoolOptions) throw {
153
- name: POOL_ERROR_NAMES.PoolError,
154
- message: `Could not parse poot options or generate defaults. This is a bug in vitest-pool-assemblyscript, please report it.`
155
- };
156
- setGlobalDebugMode(v3PoolOptions.debug);
150
+ const { coverage, projects, fallbackPoolOptions } = getConfigs(ctx);
151
+ setGlobalDebugMode(fallbackPoolOptions.debug);
157
152
  debug("[Pool] Initializing AssemblyScript Pool");
158
- if (foundProjectSerializedConfig) debug(`[Pool] Multi-project mode: Using config from project: "${config.name}"`);
159
- else debug("[Pool] Single-project mode: No project config found using vitest-pool-assemblyscript pool - Using global config with AssemblyScript pool defaults");
160
153
  debug(`[Pool] Worker thread path: "${WORKER_PATH}"`);
161
- debug(`[Pool] Worker thread configuration - maxThreads: ${v3PoolOptions.maxThreadsV3}`);
154
+ debug(`[Pool] Worker thread configuration - maxThreads: ${fallbackPoolOptions.maxThreadsV3}`);
162
155
  setImmediate(async () => {
163
- const userImportsFactoryPath = resolve(config.root, v3PoolOptions.wasmImportsFactory ?? "");
164
- const results = await Promise.allSettled([access(WORKER_PATH), v3PoolOptions.wasmImportsFactory ? access(userImportsFactoryPath) : Promise.resolve()]);
165
- if (results[0].status === "rejected") throw new Error(`Cannot access worker thread file at path: "${WORKER_PATH}"`);
166
- if (results[1].status === "rejected") throw new Error(`Cannot access user WasmImportsFactory at path: "${userImportsFactoryPath}". Ensure that your module path is relative to the project root (location of shallowest vitest config), and that it has a default export matching () => WebAssembly.Imports`);
156
+ if ((await Promise.allSettled([access(WORKER_PATH)]))[0].status === "rejected") throw new Error(`Cannot access worker thread file at path: "${WORKER_PATH}"`);
167
157
  });
168
158
  const pool = new Tinypool({
169
159
  filename: WORKER_PATH,
170
160
  minThreads: 1,
171
- maxThreads: v3PoolOptions.maxThreadsV3,
161
+ maxThreads: fallbackPoolOptions.maxThreadsV3,
172
162
  idleTimeout: POOL_THREAD_IDLE_TIMEOUT_MS,
173
163
  isolateWorkers: false,
174
- workerData: {
175
- asPoolOptions: v3PoolOptions,
176
- asCoverageOptions: config.coverage,
177
- projectRoot: config.root
178
- }
164
+ workerData: { asCoverageOptions: coverage }
179
165
  });
180
166
  const poolAbortController = new AbortController();
181
167
  ctx.onCancel((reason) => {
@@ -186,10 +172,10 @@ function createAssemblyScriptProcessPool(ctx) {
186
172
  return {
187
173
  name: "assemblyscript",
188
174
  async collectTests(specs) {
189
- return runTests(specs, true, pool, poolAbortController);
175
+ return runTests(specs, projects, fallbackPoolOptions, true, pool, poolAbortController);
190
176
  },
191
177
  async runTests(specs, invalidates) {
192
- return runTests(specs, false, pool, poolAbortController, invalidates);
178
+ return runTests(specs, projects, fallbackPoolOptions, false, pool, poolAbortController, invalidates);
193
179
  },
194
180
  async close() {
195
181
  debug("[Pool] AbortController called");
@@ -1 +1 @@
1
- {"version":3,"file":"index-v3.mjs","names":[],"sources":["../src/pool/v3-process-pool.ts","../src/index-v3.ts"],"sourcesContent":["/**\n * AssemblyScript Pool for Vitest\n */\n\nimport { resolve, basename } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport Tinypool from 'tinypool';\nimport type { Vitest, ProcessPool, TestSpecification } from 'vitest/node';\nimport type { Test } from '@vitest/runner/types';\n\nimport {\n AS_POOL_WORKER_MSG_FLAG,\n ASSEMBLYSCRIPT_POOL_NAME,\n POOL_ERROR_NAMES,\n} from '../types/constants.js';\nimport type {\n ResolvedHybridProviderOptions,\n ProcessPoolRunFileTask,\n WASMCompilation,\n TestRunRecord,\n AssemblyScriptPoolWorkerMessage,\n WorkerThreadInitData,\n SerializedConfigCompat,\n} from '../types/types.js';\nimport { setGlobalDebugMode, debug } from '../util/debug.js';\nimport { createWorkerRPCChannel } from './worker-rpc-channel.js';\nimport {\n createPoolErrorFromAnyError,\n isAbortError,\n} from '../util/pool-errors.js';\nimport {\n failTestWithTimeoutError,\n flagTestTerminated,\n} from '../util/vitest-tasks.js';\nimport { createInitialFileTask } from '../util/vitest-file-tasks.js';\nimport { getCompatConfig, getProjectSerializedOrGlobalConfig } from '../util/resolve-config.js';\n\n// path assumes that we're running from dist/\nconst WORKER_PATH = resolve(import.meta.dirname, 'pool-thread/v3-tinypool-thread.mjs');\n\nconst POOL_THREAD_IDLE_TIMEOUT_MS = 3_600_000;\n\nasync function dispatchFullWorkerRun(\n spec: TestSpecification,\n config: SerializedConfigCompat,\n isCollectTestsMode: boolean,\n pool: Tinypool,\n poolAbortSignal: AbortSignal,\n fileCache: Map<string, WASMCompilation>,\n testTimeoutCache: Map<string, TestRunRecord>,\n previousTimedOutTest?: Test,\n): Promise<Test | undefined> {\n const fileRunStart = Date.now();\n const testFilePath: string = spec.moduleId; // absolute path\n const base = basename(testFilePath);\n\n debug(`[Pool] ${base} - Starting file worker run at ${fileRunStart} for \"${testFilePath}\"`);\n\n let fileCompilation: WASMCompilation | undefined = fileCache.get(spec.moduleId);\n const isTimeoutRedispatch: boolean = !!previousTimedOutTest && !!fileCompilation;\n\n let timedOutTestThisRun: Test | undefined;\n\n try {\n const fileAbortController = new AbortController();\n const file = isTimeoutRedispatch\n ? previousTimedOutTest!.file\n : createInitialFileTask(spec.moduleId, spec.project.name, config.root, config.testTimeout, config.retry);\n\n const { workerPort, poolPort } = createWorkerRPCChannel(spec.project, isCollectTestsMode);\n\n // Enforce test timeout using setTimeout() and worker messages.\n // 1. worker sends a start message to indicate when the test has started\n // 2. pool starts a timer using setTimeout() when worker start message is received\n // 3. worker sends an end message to indicate when the test has completed\n // - if test completes before the timeout expires, the timer is cleared and everything proceeds\n // - if timeout expires, the test worker is actively aborted using the test-specific AbortController\n //\n // Monitoring from the pool main thread and actively aborting the runner allows for accurate enforcement of the test timeout,\n // which is much harder/impossible to control from within the worker thread itself, which is busy/blocked running \n // the long-running WASM test.\n poolPort.on('message', event => {\n if (!event[AS_POOL_WORKER_MSG_FLAG]) return;\n\n const msg = event as AssemblyScriptPoolWorkerMessage;\n if (msg.type === 'file-compiled') {\n const { compilation } = msg;\n fileCache.set(compilation.filePath, compilation);\n debug(`[Pool] ${basename(compilation.filePath)} - Got compiled file cache for \"${compilation.filePath}\"`);\n } else if (msg.type === 'execution-start') {\n const poolReceivedExecutionStart = Date.now();\n const { executionStart, test } = msg;\n\n const transitDuration = poolReceivedExecutionStart - executionStart;\n const adjustedTimeout = Math.max(test.timeout - transitDuration, 0);\n\n debug(`[Pool] ${base} - \"${test.name}\": Received worker execution start (transit ${transitDuration} ms)`\n + ` - Beginning test timeout timer ${test.timeout} ms (adjusted timeout: ${adjustedTimeout} ms)`\n );\n \n // Enforce test timeout\n const testTimeoutId = setTimeout(async () => {\n const poolTimeoutTime = Date.now();\n const record = testTimeoutCache.get(test.id);\n testTimeoutCache.delete(test.id);\n\n if (record) {\n const elapsedFromWorkerExecutionStart = poolTimeoutTime - record.executionStart;\n\n failTestWithTimeoutError(record.test, poolTimeoutTime, elapsedFromWorkerExecutionStart);\n\n flagTestTerminated(record.test);\n\n timedOutTestThisRun = test;\n fileAbortController.abort(POOL_ERROR_NAMES.WASMExecutionTimeoutError);\n\n debug(`[Pool] ${base} - \"${record.test.name}\" timed out (threshold ${record.test.timeout} ms)`\n + ` - Aborted worker job (duration before abort: ${elapsedFromWorkerExecutionStart} ms)`\n );\n }\n }, adjustedTimeout);\n\n testTimeoutCache.set(test.id, {\n test: test,\n executionStart: executionStart,\n timeoutId: testTimeoutId,\n });\n\n } else if (msg.type === 'execution-end') {\n const poolReceivedExecutionEnd = Date.now();\n const { executionEnd, testTaskId } = msg;\n const record = testTimeoutCache.get(testTaskId);\n testTimeoutCache.delete(testTaskId);\n\n if (record) {\n clearTimeout(record.timeoutId);\n\n const elapsedFromWorkerExecutionStart = executionEnd - record.executionStart!;\n const transitDuration = poolReceivedExecutionEnd - executionEnd;\n debug(`[Pool] ${base} - \"${record.test.name}\": Received worker execution end (transit: ${transitDuration} ms)`\n + ` - Clearing test timeout timer - Actual duration from worker exection start: ${elapsedFromWorkerExecutionStart} ms`\n );\n }\n }\n });\n \n const workerTaskData: ProcessPoolRunFileTask = {\n dispatchStart: Date.now(),\n port: workerPort,\n file,\n config,\n isCollectTestsMode,\n timedOutTest: previousTimedOutTest,\n timedOutCompilation: fileCompilation\n };\n\n try {\n await pool.run(workerTaskData, {\n name: 'runTestFile',\n transferList: [workerPort],\n signal: AbortSignal.any([poolAbortSignal, fileAbortController.signal]),\n });\n } finally {\n workerPort.close();\n poolPort.close();\n }\n \n return;\n } catch (error) {\n if (isAbortError(error)) {\n debug(`[Pool] ${base} - file worker aborted during run: ${String(error)}`);\n \n if (!!timedOutTestThisRun) {\n // swallow abort error, return timed out test so worker can be re-launched\n return timedOutTestThisRun;\n } else {\n // swallow abort error, this file worker run is done\n return;\n }\n }\n\n throw createPoolErrorFromAnyError(`${base} - unhandled file worker failure`, POOL_ERROR_NAMES.PoolError, error);\n } finally {\n debug(`[Pool] ${base} - Finished File Worker Execution`);\n }\n}\n\n/**\n * Run / Collect tests\n */\nasync function runTests(\n specs: TestSpecification[],\n isCollectTestsMode: boolean,\n pool: Tinypool,\n poolAbortController: AbortController,\n _invalidatedFiles?: string[]\n): Promise<void> {\n const mode = isCollectTestsMode ? 'collectTests' : 'runTests';\n debug(`[Pool] -------- ${mode} called for ${specs.length} specs --------`);\n\n // TODO - invalidation\n // const invalidCount = invalidatedFiles?.length ?? 0;\n // debug('[Pool] Invalidated files:', invalidCount);\n\n // if (invalidCount > 0) {\n // // probably:\n // // 0. pre-build a cached map of source files to specs that import them (using debuginfo?)\n // // 1. check if invalidated file is in map: if NOT ignore & continue loop to next file\n // // 2. create file worker for each spec the invalidated file maps to\n // }\n\n const fileCache: Map<string, WASMCompilation> = new Map();\n const testTimeoutCache: Map<string, TestRunRecord> = new Map();\n\n // Create worker for each file\n const fileWorkers: Promise<void>[] = specs.map(async (spec: TestSpecification): Promise<void> => {\n const { serializedConfig } = spec.project;\n const compatConfig: SerializedConfigCompat = getCompatConfig(serializedConfig);\n \n let timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache);\n \n while (timedOutTest) {\n timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache, timedOutTest);\n }\n });\n\n if (isCollectTestsMode) {\n try {\n await Promise.all(fileWorkers);\n debug('[Pool] collectTests - All file workers resolved');\n } catch (err) {\n debug('[Pool] collectTests - File worker REJECTED, Calling Pool Abort to bail this collectTests run');\n poolAbortController.abort();\n }\n } else {\n const results = await Promise.allSettled(fileWorkers);\n const unexpectedErrors: any[] = [];\n results.forEach(r => {\n if (r.status === 'rejected') {\n unexpectedErrors.push(r.reason);\n }\n });\n\n if (unexpectedErrors.length === 0) {\n debug(`[Pool] ${mode} - All file workers resolved`);\n } else {\n debug(`[Pool] ${mode} - Some file workers REJECTED unexpectedly. Throwing error(s) to vitest:`, unexpectedErrors);\n throw {\n name: POOL_ERROR_NAMES.PoolError,\n message: `Unexpected AssemblyScript Pool Error(s) Encountered during ${mode}`,\n cause: unexpectedErrors[0]\n };\n }\n }\n\n debug(`[Pool] Timeout Cache Size: ${testTimeoutCache.size}`);\n testTimeoutCache.forEach((record: TestRunRecord, testId: string) => {\n if (record) {\n debug(`[Pool] Leftover timeout entry for task: ${record.test.name}`);\n clearTimeout(record.timeoutId);\n } else {\n debug(`[Pool] Empty test timeout entry for task: ${testId}`);\n }\n });\n\n debug(`[Pool] -------- ${mode} completed --------`);\n}\n\nexport function createAssemblyScriptProcessPool(ctx: Vitest): ProcessPool {\n const { config, foundProjectSerializedConfig, v3PoolOptions } = getProjectSerializedOrGlobalConfig(ctx);\n \n if (!v3PoolOptions) {\n throw {\n name: POOL_ERROR_NAMES.PoolError,\n message: `Could not parse poot options or generate defaults. This is a bug in vitest-pool-assemblyscript, please report it.`,\n };\n }\n setGlobalDebugMode(v3PoolOptions.debug);\n\n debug('[Pool] Initializing AssemblyScript Pool');\n\n if (foundProjectSerializedConfig) {\n debug(`[Pool] Multi-project mode: Using config from project: \"${config.name}\"`);\n } else {\n debug('[Pool] Single-project mode: No project config found using vitest-pool-assemblyscript pool - Using global config with AssemblyScript pool defaults');\n }\n\n debug(`[Pool] Worker thread path: \"${WORKER_PATH}\"`);\n debug(`[Pool] Worker thread configuration - maxThreads: ${v3PoolOptions.maxThreadsV3}`);\n\n setImmediate(async () => {\n const userImportsFactoryPath = resolve(config.root, v3PoolOptions.wasmImportsFactory ?? '');\n const results = await Promise.allSettled([\n access(WORKER_PATH),\n v3PoolOptions.wasmImportsFactory ? access(userImportsFactoryPath) : Promise.resolve()\n ]);\n\n if (results[0].status === 'rejected') {\n throw new Error(`Cannot access worker thread file at path: \"${WORKER_PATH}\"`);\n }\n if (results[1].status === 'rejected') {\n throw new Error(`Cannot access user WasmImportsFactory at path: \"${userImportsFactoryPath}\".`\n + ` Ensure that your module path is relative to the project root (location of shallowest vitest config),`\n + ` and that it has a default export matching () => WebAssembly.Imports`\n );\n }\n });\n\n // Initialize Tinypool for worker management\n const pool = new Tinypool({\n filename: WORKER_PATH,\n minThreads: 1,\n maxThreads: v3PoolOptions.maxThreadsV3,\n idleTimeout: POOL_THREAD_IDLE_TIMEOUT_MS,\n isolateWorkers: false,\n workerData: {\n asPoolOptions: v3PoolOptions,\n asCoverageOptions: config.coverage as ResolvedHybridProviderOptions,\n projectRoot: config.root,\n } satisfies WorkerThreadInitData,\n });\n\n // For explicitly terminating all worker threads because of\n // ctrl+c in terminal, or bail after test failures exceed bail count\n const poolAbortController = new AbortController();\n ctx.onCancel(reason => {\n const reasonMsg = reason === 'test-failure' ? 'Bail after test failure' : reason;\n console.log(`${ASSEMBLYSCRIPT_POOL_NAME} - Aborting all tests: ${reasonMsg}`);\n poolAbortController.abort();\n });\n\n return {\n name: ASSEMBLYSCRIPT_POOL_NAME,\n\n // runs when executing vitest list\n async collectTests(specs: TestSpecification[]) {\n const isCollectTestsMode = true;\n return runTests(specs, isCollectTestsMode, pool, poolAbortController);\n },\n\n async runTests(specs: TestSpecification[], invalidates?: string[]) {\n const isCollectTestsMode = false;\n return runTests(specs, isCollectTestsMode, pool, poolAbortController, invalidates);\n },\n\n // Cleanup when shutting down\n async close() {\n debug('[Pool] AbortController called');\n poolAbortController.abort();\n \n debug('[Pool] Tinypool destroyed');\n await pool.destroy();\n\n debug('[Pool] Exiting');\n },\n };\n}\n","// default export for v3 pool\nimport { createAssemblyScriptProcessPool } from './pool/v3-process-pool.js';\nexport default createAssemblyScriptProcessPool;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index-v3.mjs","names":[],"sources":["../src/pool/v3-process-pool.ts","../src/index-v3.ts"],"sourcesContent":["/**\n * AssemblyScript Pool for Vitest\n */\n\nimport { resolve, basename } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport Tinypool from 'tinypool';\nimport type { Vitest, ProcessPool, TestSpecification } from 'vitest/node';\nimport type { Test } from '@vitest/runner/types';\n\nimport {\n AS_POOL_WORKER_MSG_FLAG,\n ASSEMBLYSCRIPT_POOL_NAME,\n POOL_ERROR_NAMES,\n} from '../types/constants.js';\nimport type {\n ProcessPoolRunFileTask,\n WASMCompilation,\n TestRunRecord,\n AssemblyScriptPoolWorkerMessage,\n WorkerThreadInitData,\n SerializedConfigCompat,\n ResolvedAssemblyScriptPoolOptions,\n} from '../types/types.js';\nimport { setGlobalDebugMode, debug } from '../util/debug.js';\nimport { createWorkerRPCChannel } from './worker-rpc-channel.js';\nimport {\n isAbortError,\n} from '../util/pool-errors.js';\nimport {\n failTestWithTimeoutError,\n flagTestTerminated,\n} from '../util/vitest-tasks.js';\nimport { createInitialFileTask } from '../util/vitest-file-tasks.js';\nimport { getCompatConfig, getConfigs } from '../util/resolve-config.js';\n\n// path assumes that we're running from dist/\nconst WORKER_PATH = resolve(import.meta.dirname, 'pool-thread/v3-tinypool-thread.mjs');\n\nconst POOL_THREAD_IDLE_TIMEOUT_MS = 3_600_000;\n\nasync function dispatchFullWorkerRun(\n spec: TestSpecification,\n config: SerializedConfigCompat,\n asPoolOptions: ResolvedAssemblyScriptPoolOptions,\n isCollectTestsMode: boolean,\n pool: Tinypool,\n poolAbortSignal: AbortSignal,\n fileCache: Map<string, WASMCompilation>,\n testTimeoutCache: Map<string, TestRunRecord>,\n previousTimedOutTest?: Test,\n): Promise<Test | undefined> {\n const fileRunStart = Date.now();\n const testFilePath: string = spec.moduleId; // absolute path\n const base = basename(testFilePath);\n\n debug(`[Pool] ${base} - Starting file worker run at ${fileRunStart} for \"${testFilePath}\"`);\n\n let fileCompilation: WASMCompilation | undefined = fileCache.get(spec.moduleId);\n const isTimeoutRedispatch: boolean = !!previousTimedOutTest && !!fileCompilation;\n\n let timedOutTestThisRun: Test | undefined;\n\n try {\n const fileAbortController = new AbortController();\n const file = isTimeoutRedispatch\n ? previousTimedOutTest!.file\n : createInitialFileTask(spec.moduleId, spec.project.name, config.root, config.testTimeout, config.retry);\n\n const { workerPort, poolPort } = createWorkerRPCChannel(spec.project, isCollectTestsMode);\n\n // Enforce test timeout using setTimeout() and worker messages.\n // 1. worker sends a start message to indicate when the test has started\n // 2. pool starts a timer using setTimeout() when worker start message is received\n // 3. worker sends an end message to indicate when the test has completed\n // - if test completes before the timeout expires, the timer is cleared and everything proceeds\n // - if timeout expires, the test worker is actively aborted using the test-specific AbortController\n //\n // Monitoring from the pool main thread and actively aborting the runner allows for accurate enforcement of the test timeout,\n // which is much harder/impossible to control from within the worker thread itself, which is busy/blocked running \n // the long-running WASM test.\n poolPort.on('message', event => {\n if (!event[AS_POOL_WORKER_MSG_FLAG]) return;\n\n const msg = event as AssemblyScriptPoolWorkerMessage;\n if (msg.type === 'file-compiled') {\n const { compilation } = msg;\n fileCache.set(compilation.filePath, compilation);\n debug(`[Pool] ${basename(compilation.filePath)} - Got compiled file cache for \"${compilation.filePath}\"`);\n } else if (msg.type === 'execution-start') {\n const poolReceivedExecutionStart = Date.now();\n const { executionStart, test } = msg;\n\n const transitDuration = poolReceivedExecutionStart - executionStart;\n const adjustedTimeout = Math.max(test.timeout - transitDuration, 0);\n\n debug(`[Pool] ${base} - \"${test.name}\": Received worker execution start (transit ${transitDuration} ms)`\n + ` - Beginning test timeout timer ${test.timeout} ms (adjusted timeout: ${adjustedTimeout} ms)`\n );\n \n // Enforce test timeout\n const testTimeoutId = setTimeout(async () => {\n const poolTimeoutTime = Date.now();\n const record = testTimeoutCache.get(test.id);\n testTimeoutCache.delete(test.id);\n\n if (record) {\n const elapsedFromWorkerExecutionStart = poolTimeoutTime - record.executionStart;\n\n failTestWithTimeoutError(record.test, poolTimeoutTime, elapsedFromWorkerExecutionStart);\n\n flagTestTerminated(record.test);\n\n timedOutTestThisRun = test;\n fileAbortController.abort(POOL_ERROR_NAMES.WASMExecutionTimeoutError);\n\n debug(`[Pool] ${base} - \"${record.test.name}\" timed out (threshold ${record.test.timeout} ms)`\n + ` - Aborted worker job (duration before abort: ${elapsedFromWorkerExecutionStart} ms)`\n );\n }\n }, adjustedTimeout);\n\n testTimeoutCache.set(test.id, {\n test: test,\n executionStart: executionStart,\n timeoutId: testTimeoutId,\n });\n\n } else if (msg.type === 'execution-end') {\n const poolReceivedExecutionEnd = Date.now();\n const { executionEnd, testTaskId } = msg;\n const record = testTimeoutCache.get(testTaskId);\n testTimeoutCache.delete(testTaskId);\n\n if (record) {\n clearTimeout(record.timeoutId);\n\n const elapsedFromWorkerExecutionStart = executionEnd - record.executionStart!;\n const transitDuration = poolReceivedExecutionEnd - executionEnd;\n debug(`[Pool] ${base} - \"${record.test.name}\": Received worker execution end (transit: ${transitDuration} ms)`\n + ` - Clearing test timeout timer - Actual duration from worker exection start: ${elapsedFromWorkerExecutionStart} ms`\n );\n }\n }\n });\n \n const workerTaskData: ProcessPoolRunFileTask = {\n dispatchStart: Date.now(),\n port: workerPort,\n file,\n config,\n asPoolOptions,\n isCollectTestsMode,\n timedOutTest: previousTimedOutTest,\n timedOutCompilation: fileCompilation\n };\n\n try {\n await pool.run(workerTaskData, {\n name: 'runTestFile',\n transferList: [workerPort],\n signal: AbortSignal.any([poolAbortSignal, fileAbortController.signal]),\n });\n } finally {\n workerPort.close();\n poolPort.close();\n }\n \n return;\n } catch (error) {\n if (isAbortError(error)) {\n debug(`[Pool] ${base} - file worker aborted during run: ${String(error)}`);\n \n if (!!timedOutTestThisRun) {\n // swallow abort error, return timed out test so worker can be re-launched\n return timedOutTestThisRun;\n } else {\n // swallow abort error, this file worker run is done\n return;\n }\n } else {\n // abort errors are expected, otherwise rethrow\n throw error;\n }\n } finally {\n debug(`[Pool] ${base} - Finished File Worker Execution`);\n }\n}\n\n/**\n * Run / Collect tests\n */\nasync function runTests(\n specs: TestSpecification[],\n projectConfigs: {\n [key: string]: {\n config: SerializedConfigCompat,\n v3PoolOptions?: ResolvedAssemblyScriptPoolOptions\n }\n },\n fallbackPoolOptions: ResolvedAssemblyScriptPoolOptions,\n isCollectTestsMode: boolean,\n pool: Tinypool,\n poolAbortController: AbortController,\n _invalidatedFiles?: string[]\n): Promise<void> {\n const mode = isCollectTestsMode ? 'collectTests' : 'runTests';\n debug(`[Pool] -------- ${mode} called for ${specs.length} specs --------`);\n\n // TODO - invalidation\n // const invalidCount = invalidatedFiles?.length ?? 0;\n // debug('[Pool] Invalidated files:', invalidCount);\n\n // if (invalidCount > 0) {\n // // probably:\n // // 0. pre-build a cached map of source files to specs that import them (using debuginfo?)\n // // 1. check if invalidated file is in map: if NOT ignore & continue loop to next file\n // // 2. create file worker for each spec the invalidated file maps to\n // }\n\n const fileCache: Map<string, WASMCompilation> = new Map();\n const testTimeoutCache: Map<string, TestRunRecord> = new Map();\n\n // Create worker for each file\n const fileWorkers: Promise<void>[] = specs.map(async (spec: TestSpecification): Promise<void> => {\n const { serializedConfig } = spec.project;\n const compatConfig: SerializedConfigCompat = getCompatConfig(serializedConfig);\n const asPoolOptions = projectConfigs[spec.project.name]?.v3PoolOptions ?? fallbackPoolOptions;\n \n let timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, asPoolOptions, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache);\n \n while (timedOutTest) {\n timedOutTest = await dispatchFullWorkerRun(spec, compatConfig, asPoolOptions, isCollectTestsMode, pool, poolAbortController.signal, fileCache, testTimeoutCache, timedOutTest);\n }\n });\n\n if (isCollectTestsMode) {\n try {\n await Promise.all(fileWorkers);\n debug('[Pool] collectTests - All file workers resolved');\n } catch (err) {\n debug('[Pool] collectTests - File worker REJECTED, Calling Pool Abort to bail this collectTests run');\n poolAbortController.abort();\n }\n } else {\n const results = await Promise.allSettled(fileWorkers);\n const unexpectedErrors: any[] = [];\n results.forEach(r => {\n if (r.status === 'rejected') {\n unexpectedErrors.push(r.reason);\n }\n });\n\n if (unexpectedErrors.length === 0) {\n debug(`[Pool] ${mode} - All file workers resolved`);\n } else {\n debug(`[Pool] ${mode} - Some file workers REJECTED unexpectedly. Throwing error(s) to vitest:`, unexpectedErrors);\n throw {\n name: POOL_ERROR_NAMES.PoolError,\n message: `Unexpected AssemblyScript Pool Error(s) Encountered during ${mode}`,\n cause: unexpectedErrors[0]\n };\n }\n }\n\n debug(`[Pool] Timeout Cache Size: ${testTimeoutCache.size}`);\n testTimeoutCache.forEach((record: TestRunRecord, testId: string) => {\n if (record) {\n debug(`[Pool] Leftover timeout entry for task: ${record.test.name}`);\n clearTimeout(record.timeoutId);\n } else {\n debug(`[Pool] Empty test timeout entry for task: ${testId}`);\n }\n });\n\n debug(`[Pool] -------- ${mode} completed --------`);\n}\n\nexport function createAssemblyScriptProcessPool(ctx: Vitest): ProcessPool {\n const { coverage, projects, fallbackPoolOptions } = getConfigs(ctx);\n \n setGlobalDebugMode(fallbackPoolOptions.debug);\n\n debug('[Pool] Initializing AssemblyScript Pool');\n debug(`[Pool] Worker thread path: \"${WORKER_PATH}\"`);\n debug(`[Pool] Worker thread configuration - maxThreads: ${fallbackPoolOptions.maxThreadsV3}`);\n\n setImmediate(async () => {\n const results = await Promise.allSettled([\n access(WORKER_PATH)\n ]);\n\n if (results[0].status === 'rejected') {\n throw new Error(`Cannot access worker thread file at path: \"${WORKER_PATH}\"`);\n }\n });\n\n // Initialize Tinypool for worker management\n const pool = new Tinypool({\n filename: WORKER_PATH,\n minThreads: 1,\n maxThreads: fallbackPoolOptions.maxThreadsV3,\n idleTimeout: POOL_THREAD_IDLE_TIMEOUT_MS,\n isolateWorkers: false,\n workerData: {\n asCoverageOptions: coverage,\n } satisfies WorkerThreadInitData,\n });\n\n // For explicitly terminating all worker threads because of\n // ctrl+c in terminal, or bail after test failures exceed bail count\n const poolAbortController = new AbortController();\n ctx.onCancel(reason => {\n const reasonMsg = reason === 'test-failure' ? 'Bail after test failure' : reason;\n console.log(`${ASSEMBLYSCRIPT_POOL_NAME} - Aborting all tests: ${reasonMsg}`);\n poolAbortController.abort();\n });\n\n return {\n name: ASSEMBLYSCRIPT_POOL_NAME,\n\n // runs when executing vitest list\n async collectTests(specs: TestSpecification[]) {\n const isCollectTestsMode = true;\n return runTests(specs, projects, fallbackPoolOptions, isCollectTestsMode, pool, poolAbortController);\n },\n\n async runTests(specs: TestSpecification[], invalidates?: string[]) {\n const isCollectTestsMode = false;\n return runTests(specs, projects, fallbackPoolOptions, isCollectTestsMode, pool, poolAbortController, invalidates);\n },\n\n // Cleanup when shutting down\n async close() {\n debug('[Pool] AbortController called');\n poolAbortController.abort();\n \n debug('[Pool] Tinypool destroyed');\n await pool.destroy();\n\n debug('[Pool] Exiting');\n },\n };\n}\n","// default export for v3 pool\nimport { createAssemblyScriptProcessPool } from './pool/v3-process-pool.js';\nexport default createAssemblyScriptProcessPool;\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { createAssemblyScriptPool } from "./pool-runner-init-CNpRdA5u.mjs";
1
+ import { createAssemblyScriptPool } from "./pool-runner-init-CCvnKt5o.mjs";
2
2
  export { createAssemblyScriptPool };
package/dist/index.mjs CHANGED
@@ -1,9 +1,7 @@
1
- import "./constants-DbxJ3hzg.mjs";
2
- import "./resolve-config-s9gSJSMc.mjs";
3
- import "./debug-DtRAL4rM.mjs";
4
- import "./vitest-file-tasks-D8sOClGX.mjs";
5
- import "./vitest-tasks-BZ24sghI.mjs";
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 };