@gfdelarue/testkit 0.4.3 → 0.4.5

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 (276) hide show
  1. package/README.md +109 -22
  2. package/bin/testkit-windows-owner-arm64.exe +0 -0
  3. package/bin/testkit-windows-owner-x64.exe +0 -0
  4. package/dist/app/bugs/categories.js +1 -1
  5. package/dist/app/bugs/draft.js +3 -3
  6. package/dist/app/bugs/facts.d.ts +3 -2
  7. package/dist/app/bugs/facts.js +2 -2
  8. package/dist/app/bugs/guide.js +1 -1
  9. package/dist/app/bugs/run-reading.js +1 -1
  10. package/dist/app/db-schema/prepare.js +1 -1
  11. package/dist/app/destroy/index.js +1 -1
  12. package/dist/app/doctor/index.js +1 -1
  13. package/dist/app/environments/config-driven.d.ts +5 -0
  14. package/dist/app/environments/config-driven.js +1 -0
  15. package/dist/app/environments/routing.d.ts +6 -0
  16. package/dist/app/environments/routing.js +1 -0
  17. package/dist/app/environments/supplied.d.ts +3 -0
  18. package/dist/app/environments/supplied.js +1 -0
  19. package/dist/app/file-selection.js +1 -1
  20. package/dist/app/lint/native.js +1 -1
  21. package/dist/app/lint/options.d.ts +0 -1
  22. package/dist/app/lint/options.js +1 -1
  23. package/dist/app/lint/shared.d.ts +0 -2
  24. package/dist/app/lint/shared.js +1 -1
  25. package/dist/app/package-inspection.js +1 -1
  26. package/dist/app/reports/files.d.ts +13 -0
  27. package/dist/app/reports/files.js +1 -0
  28. package/dist/app/reports/prepare.d.ts +20 -0
  29. package/dist/app/reports/prepare.js +2 -0
  30. package/dist/app/reports/publish.d.ts +21 -0
  31. package/dist/app/reports/publish.js +1 -0
  32. package/dist/app/run/engine-evidence-persistence.js +1 -1
  33. package/dist/app/run/engine-execution-cleanup.js +1 -1
  34. package/dist/app/run/engine-execution-failures.js +1 -1
  35. package/dist/app/run/engine-execution.d.ts +10 -8
  36. package/dist/app/run/engine-execution.js +1 -1
  37. package/dist/app/run/engine-orchestration.d.ts +15 -34
  38. package/dist/app/run/engine-orchestration.js +1 -1
  39. package/dist/app/run/environment.d.ts +33 -0
  40. package/dist/app/run/environment.js +1 -0
  41. package/dist/app/run/failure-details.js +1 -1
  42. package/dist/app/run/live-run.d.ts +3 -1
  43. package/dist/app/run/live-run.js +1 -1
  44. package/dist/app/run/orchestrator.d.ts +8 -1
  45. package/dist/app/run/orchestrator.js +1 -1
  46. package/dist/app/run/planning.d.ts +1 -2
  47. package/dist/app/run/planning.js +1 -1
  48. package/dist/app/run/results.d.ts +1 -1
  49. package/dist/app/run/results.js +1 -1
  50. package/dist/app/run/run-finalization.d.ts +6 -2
  51. package/dist/app/run/run-finalization.js +1 -1
  52. package/dist/app/run/runtime-fixtures.js +1 -1
  53. package/dist/app/run/runtime-task-types.d.ts +1 -1
  54. package/dist/app/run/scheduler/index.js +1 -1
  55. package/dist/app/run/scheduler/locks.d.ts +6 -0
  56. package/dist/app/run/scheduler/locks.js +1 -0
  57. package/dist/app/run/selection.d.ts +0 -1
  58. package/dist/app/run/selection.js +1 -1
  59. package/dist/app/run/setup/runtime-node-setup-protocol.js +1 -1
  60. package/dist/app/run/setup/runtime-node-setup-worker.js +1 -1
  61. package/dist/app/run/task-leases.d.ts +15 -0
  62. package/dist/app/run/task-leases.js +1 -0
  63. package/dist/app/run/worker-loop.d.ts +13 -4
  64. package/dist/app/run/worker-loop.js +1 -1
  65. package/dist/app/tracker/index.d.ts +6 -1
  66. package/dist/app/tracker/index.js +1 -1
  67. package/dist/app/typecheck/index.js +4 -4
  68. package/dist/cli/command-catalog.d.ts +19 -0
  69. package/dist/cli/command-catalog.js +1 -1
  70. package/dist/cli/command-registry.js +1 -1
  71. package/dist/cli/commands/report/prepare.d.ts +12 -0
  72. package/dist/cli/commands/report/prepare.js +5 -0
  73. package/dist/cli/commands/report/publish.d.ts +13 -0
  74. package/dist/cli/commands/report/publish.js +2 -0
  75. package/dist/cli/json-errors.js +1 -1
  76. package/dist/cli/operations/run/operation.d.ts +3 -1
  77. package/dist/cli/operations/run/operation.js +2 -2
  78. package/dist/cli/renderers/doctor/text.js +1 -1
  79. package/dist/cli/renderers/run/formatting.js +1 -1
  80. package/dist/config/authoring/index.d.ts +4 -13
  81. package/dist/config/authoring/index.js +1 -1
  82. package/dist/config/authoring/preset-env.js +1 -1
  83. package/dist/config/loader/config-loader.js +1 -1
  84. package/dist/config/loader/database.js +1 -1
  85. package/dist/config/loader/decode-execution.d.ts +0 -2
  86. package/dist/config/loader/decode-execution.js +1 -1
  87. package/dist/config/loader/discover-tests.js +1 -1
  88. package/dist/config/loader/discovery.d.ts +0 -1
  89. package/dist/config/loader/discovery.js +2 -2
  90. package/dist/config/loader/env.js +1 -1
  91. package/dist/config/loader/execution-model.d.ts +0 -1
  92. package/dist/config/loader/execution-model.js +1 -1
  93. package/dist/config/loader/file-metadata.d.ts +1 -1
  94. package/dist/config/loader/file-metadata.js +1 -1
  95. package/dist/config/loader/groups.d.ts +33 -0
  96. package/dist/config/loader/groups.js +1 -0
  97. package/dist/config/loader/load.d.ts +0 -2
  98. package/dist/config/loader/load.js +1 -1
  99. package/dist/config/loader/runtime-isolation.js +1 -1
  100. package/dist/config/loader/runtime.d.ts +0 -9
  101. package/dist/config/loader/runtime.js +1 -1
  102. package/dist/config/loader/skip-config.js +1 -1
  103. package/dist/config/loader/validation.d.ts +1 -2
  104. package/dist/config/loader/validation.js +1 -1
  105. package/dist/config/loader/values.d.ts +0 -1
  106. package/dist/config/loader/values.js +1 -1
  107. package/dist/database/activity-gate.js +1 -1
  108. package/dist/database/admin.js +2 -2
  109. package/dist/database/lifecycle-cleanup.d.ts +1 -0
  110. package/dist/database/lifecycle-cleanup.js +1 -1
  111. package/dist/database/local-postgres.js +1 -1
  112. package/dist/database/naming.js +1 -1
  113. package/dist/database/schema-operations.d.ts +1 -1
  114. package/dist/database/schema-operations.js +1 -1
  115. package/dist/database/schema-source.js +3 -3
  116. package/dist/database/source-url.d.ts +0 -1
  117. package/dist/database/source-url.js +2 -2
  118. package/dist/database/state.js +1 -1
  119. package/dist/database/steps.js +3 -3
  120. package/dist/domain/file-timeout.d.ts +0 -3
  121. package/dist/domain/file-timeout.js +1 -1
  122. package/dist/domain/operation-display.js +1 -1
  123. package/dist/domain/test-outcomes.d.ts +0 -1
  124. package/dist/domain/test-outcomes.js +1 -1
  125. package/dist/engines/adapters/evidence-identity.js +1 -1
  126. package/dist/engines/adapters/execution.d.ts +0 -1
  127. package/dist/engines/adapters/execution.js +1 -1
  128. package/dist/engines/api/capabilities.d.ts +0 -10
  129. package/dist/engines/api/capabilities.js +1 -1
  130. package/dist/engines/api/execution-scope.js +1 -1
  131. package/dist/engines/api/k6-runtime-input.js +1 -1
  132. package/dist/engines/bundle-cache.js +1 -1
  133. package/dist/engines/contracts/fixture-manifest.js +1 -1
  134. package/dist/engines/definitions.d.ts +1 -0
  135. package/dist/engines/definitions.js +1 -1
  136. package/dist/engines/installations/playwright-resolution-child.js +1 -1
  137. package/dist/engines/installations/playwright.js +1 -1
  138. package/dist/engines/k6/adapter/evidence.js +4 -4
  139. package/dist/engines/k6/adapter/executor.js +1 -1
  140. package/dist/engines/k6/adapter/native-summary.js +1 -1
  141. package/dist/engines/k6/runtime/checks.js +1 -1
  142. package/dist/engines/k6/runtime/dal-fixtures.js +1 -1
  143. package/dist/engines/k6/runtime/dal-suite.js +1 -1
  144. package/dist/engines/k6/runtime/http-suite-runtime.js +1 -1
  145. package/dist/engines/k6/runtime/http.js +1 -1
  146. package/dist/engines/k6/runtime/shared/db-normalization.js +1 -1
  147. package/dist/engines/k6/runtime/shared/fixture-engine.js +2 -2
  148. package/dist/engines/k6/runtime/shared/http-parsing.js +3 -3
  149. package/dist/engines/managed-module-resolution-policy-input.d.ts +0 -1
  150. package/dist/engines/managed-module-resolution-policy-input.js +1 -1
  151. package/dist/engines/managed-module-resolution-policy.js +1 -1
  152. package/dist/engines/node-vitest/adapter/adapter.js +1 -1
  153. package/dist/engines/node-vitest/adapter/evidence.js +2 -2
  154. package/dist/engines/node-vitest/adapter/workspace.js +22 -21
  155. package/dist/engines/node-vitest/runtime/contract/index.js +1 -1
  156. package/dist/engines/node-vitest/runtime/data/http.js +1 -1
  157. package/dist/engines/node-vitest/runtime/data/index.d.ts +2 -2
  158. package/dist/engines/node-vitest/runtime/data/index.js +1 -1
  159. package/dist/engines/node-vitest/runtime/data/report.js +5 -5
  160. package/dist/engines/node-vitest/runtime/data/scenario.d.ts +0 -1
  161. package/dist/engines/node-vitest/runtime/data/scenario.js +2 -2
  162. package/dist/engines/node-vitest/runtime/data/types.d.ts +1 -29
  163. package/dist/engines/node-vitest/runtime/runtime-input.js +1 -1
  164. package/dist/engines/playwright/adapter/adapter.js +1 -1
  165. package/dist/engines/playwright/adapter/config.d.ts +1 -1
  166. package/dist/engines/playwright/adapter/config.js +4 -4
  167. package/dist/engines/playwright/adapter/evidence-validation.d.ts +0 -3
  168. package/dist/engines/playwright/adapter/evidence-validation.js +1 -1
  169. package/dist/engines/playwright/adapter/evidence.js +1 -1
  170. package/dist/engines/playwright/runtime/config-file.js +1 -1
  171. package/dist/engines/playwright/runtime/config.js +1 -1
  172. package/dist/engines/playwright/runtime/runtime-input.d.ts +2 -2
  173. package/dist/engines/playwright/runtime/runtime-input.js +16 -12
  174. package/dist/environment/lifecycle-artifacts.js +1 -1
  175. package/dist/environment/lifecycle-controller.d.ts +1 -11
  176. package/dist/environment/lifecycle-controller.js +1 -1
  177. package/dist/environment/lifecycle.d.ts +14 -11
  178. package/dist/environment/lifecycle.js +1 -1
  179. package/dist/environment/planning-types.d.ts +0 -2
  180. package/dist/environment/ports.d.ts +10 -0
  181. package/dist/environment/ports.js +1 -0
  182. package/dist/environment/ready-environment.d.ts +2 -5
  183. package/dist/environment/ready-environment.js +1 -1
  184. package/dist/environment/run-environment.d.ts +1 -0
  185. package/dist/environment/run-environment.js +1 -1
  186. package/dist/environment/runtime-contexts.d.ts +11 -7
  187. package/dist/environment/runtime-contexts.js +1 -1
  188. package/dist/environment/runtime-manager.d.ts +1 -9
  189. package/dist/environment/runtime-manager.js +1 -1
  190. package/dist/environment/runtime-planning.js +1 -1
  191. package/dist/environment/runtime-preparation.js +1 -1
  192. package/dist/environment/runtime-service.d.ts +0 -6
  193. package/dist/environment/services.d.ts +11 -3
  194. package/dist/environment/services.js +3 -1
  195. package/dist/environment/state.d.ts +1 -4
  196. package/dist/environment/state.js +1 -1
  197. package/dist/environment/template.d.ts +6 -22
  198. package/dist/environment/template.js +1 -1
  199. package/dist/evidence/artifact-config.js +1 -1
  200. package/dist/evidence/artifact-validation.d.ts +1 -2
  201. package/dist/evidence/artifact-validation.js +1 -1
  202. package/dist/evidence/artifacts.js +2 -2
  203. package/dist/evidence/bundles.js +1 -1
  204. package/dist/evidence/environment-record.d.ts +22 -0
  205. package/dist/evidence/environment-record.js +1 -0
  206. package/dist/evidence/index.d.ts +1 -1
  207. package/dist/evidence/logs.js +2 -2
  208. package/dist/evidence/operation-timings.js +1 -1
  209. package/dist/evidence/read-fields.d.ts +0 -1
  210. package/dist/evidence/read-fields.js +1 -1
  211. package/dist/evidence/read-run.js +1 -1
  212. package/dist/evidence/reading.js +1 -1
  213. package/dist/evidence/reporting-types.d.ts +19 -0
  214. package/dist/evidence/reporting.d.ts +2 -2
  215. package/dist/evidence/reporting.js +1 -1
  216. package/dist/evidence/storage.d.ts +0 -2
  217. package/dist/evidence/storage.js +2 -2
  218. package/dist/evidence/timing.js +1 -1
  219. package/dist/kernel/error-serialization.d.ts +2 -0
  220. package/dist/kernel/error-serialization.js +1 -1
  221. package/dist/kernel/unknown-values.d.ts +5 -0
  222. package/dist/kernel/unknown-values.js +1 -1
  223. package/dist/process/environment.js +1 -1
  224. package/dist/process/execa-bundle.json +3 -3
  225. package/dist/process/files/json-file.d.ts +0 -1
  226. package/dist/process/files/json-file.js +1 -1
  227. package/dist/process/files/paths.d.ts +2 -0
  228. package/dist/process/files/paths.js +1 -1
  229. package/dist/process/host/metadata.js +1 -1
  230. package/dist/process/host/platform.js +1 -1
  231. package/dist/process/host-process.js +1 -1
  232. package/dist/process/lifecycle-fence.d.ts +1 -2
  233. package/dist/process/lifecycle-fence.js +1 -1
  234. package/dist/process/locks.js +2 -2
  235. package/dist/process/process-group.js +1 -1
  236. package/dist/process/process-identity.js +1 -1
  237. package/dist/process/process.js +30 -30
  238. package/dist/process/readiness.d.ts +7 -1
  239. package/dist/process/readiness.js +1 -1
  240. package/dist/process/recovery.js +1 -1
  241. package/dist/process/runs/manifest.js +1 -1
  242. package/dist/process/runs/ownership.js +1 -1
  243. package/dist/process/runs/product-state.js +1 -1
  244. package/dist/process/runs/stop.js +1 -1
  245. package/dist/process/stoppable-settlement.d.ts +26 -0
  246. package/dist/process/stoppable-settlement.js +1 -0
  247. package/dist/process/url-redaction.d.ts +1 -0
  248. package/dist/process/url-redaction.js +1 -0
  249. package/dist/process/windows-native.d.ts +6 -0
  250. package/dist/process/windows-native.js +1 -1
  251. package/dist/repo/ci-environment.js +1 -1
  252. package/dist/repo/fingerprint-policy.d.ts +0 -2
  253. package/dist/repo/fingerprint-policy.js +1 -1
  254. package/dist/repo/physical-tree.js +1 -1
  255. package/dist/repo/publish-directory.d.ts +20 -0
  256. package/dist/repo/publish-directory.js +3 -0
  257. package/dist/repo/state.js +4 -4
  258. package/dist/steps/build-config.d.ts +0 -1
  259. package/dist/steps/build-config.js +1 -1
  260. package/dist/steps/configured-steps.js +1 -1
  261. package/dist/steps/environment.d.ts +0 -2
  262. package/dist/steps/environment.js +1 -1
  263. package/dist/steps/index.d.ts +1 -1
  264. package/dist/steps/run.js +2 -2
  265. package/dist/toolchains/archive.js +1 -1
  266. package/dist/toolchains/index.js +3 -3
  267. package/dist/toolchains/node-provisioning.js +2 -2
  268. package/dist/toolchains/vitest/index.js +1 -1
  269. package/docs/bug-records.md +54 -52
  270. package/docs/engine-architecture.md +39 -11
  271. package/package.json +1 -1
  272. package/testkit-config-schema.md +43 -5
  273. package/dist/app/run/playwright-configuration.d.ts +0 -2
  274. package/dist/app/run/playwright-configuration.js +0 -1
  275. package/dist/environment/readiness.d.ts +0 -12
  276. package/dist/environment/readiness.js +0 -1
@@ -1 +1 @@
1
- export function resolveRuntimeFixtureEntry(t,r){const n=t.filter(e=>e.aliases.includes(r));if(n.length===0){const e=t.map(o=>o.path).join(", ")||"none";throw new Error(`Unknown testkit fixture "${r}". Available fixtures: ${e}`)}if(n.length>1)throw new Error(`Ambiguous testkit fixture "${r}". Use one of: ${n.map(e=>e.path).join(", ")}`);return n[0]}export function parseRuntimeFixtureManifestEntries(t,r){if(s(t)&&Object.keys(t).length===0)return[];if(!s(t))throw new Error(`${r} must contain an object`);if(Reflect.get(t,"version")!==1)throw new Error(`${r}.version must be 1`);i(t,"testFile",r);const n=Reflect.get(t,"entries");if(!Array.isArray(n))throw new Error(`${r}.entries must be an array`);return n.map((e,o)=>a(e,`${r}.entries[${String(o)}]`))}function a(t,r){if(!s(t))throw new Error(`${r} must be an object`);return{absolutePath:i(t,"absolutePath",r),aliases:c(t,"aliases",r),contentType:i(t,"contentType",r),filename:i(t,"filename",r),path:i(t,"path",r),root:i(t,"root",r),rootRelativePath:i(t,"rootRelativePath",r),sha256:i(t,"sha256",r),sizeBytes:g(t,"sizeBytes",r)}}function i(t,r,n){const e=Reflect.get(t,r);if(typeof e!="string"||e.length===0)throw new Error(`${n}.${String(r)} must be a non-empty string`);return e}function c(t,r,n){const e=Reflect.get(t,r);if(!Array.isArray(e))throw new Error(`${n}.${String(r)} must be an array`);return e.map((o,f)=>{if(typeof o!="string"||o.length===0)throw new Error(`${n}.${String(r)}[${String(f)}] must be a non-empty string`);return o})}function g(t,r,n){const e=Reflect.get(t,r);if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new Error(`${n}.${String(r)} must be a non-negative integer`);return e}function s(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}
1
+ import{isUnknownRecord as s}from"../../kernel/unknown-values.js";export function resolveRuntimeFixtureEntry(r,t){const n=r.filter(e=>e.aliases.includes(t));if(n.length===0){const e=r.map(o=>o.path).join(", ")||"none";throw new Error(`Unknown testkit fixture "${t}". Available fixtures: ${e}`)}if(n.length>1)throw new Error(`Ambiguous testkit fixture "${t}". Use one of: ${n.map(e=>e.path).join(", ")}`);return n[0]}export function parseRuntimeFixtureManifestEntries(r,t){if(s(r)&&Object.keys(r).length===0)return[];if(!s(r))throw new Error(`${t} must contain an object`);if(Reflect.get(r,"version")!==1)throw new Error(`${t}.version must be 1`);i(r,"testFile",t);const n=Reflect.get(r,"entries");if(!Array.isArray(n))throw new Error(`${t}.entries must be an array`);return n.map((e,o)=>a(e,`${t}.entries[${String(o)}]`))}function a(r,t){if(!s(r))throw new Error(`${t} must be an object`);return{absolutePath:i(r,"absolutePath",t),aliases:c(r,"aliases",t),contentType:i(r,"contentType",t),filename:i(r,"filename",t),path:i(r,"path",t),root:i(r,"root",t),rootRelativePath:i(r,"rootRelativePath",t),sha256:i(r,"sha256",t),sizeBytes:g(r,"sizeBytes",t)}}function i(r,t,n){const e=Reflect.get(r,t);if(typeof e!="string"||e.length===0)throw new Error(`${n}.${String(t)} must be a non-empty string`);return e}function c(r,t,n){const e=Reflect.get(r,t);if(!Array.isArray(e))throw new Error(`${n}.${String(t)} must be an array`);return e.map((o,f)=>{if(typeof o!="string"||o.length===0)throw new Error(`${n}.${String(t)}[${String(f)}] must be a non-empty string`);return o})}function g(r,t,n){const e=Reflect.get(r,t);if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new Error(`${n}.${String(t)} must be a non-negative integer`);return e}
@@ -12,6 +12,7 @@ type BuiltInDefinitions = {
12
12
  };
13
13
  export declare const BUILT_IN_ENGINE_DEFINITIONS: BuiltInDefinitions;
14
14
  export declare const BUILT_IN_RUNNER_PROFILES: readonly BuiltInRunnerProfile[];
15
+ export declare function resolveEndpointReadinessOwner(profile: Readonly<RunnerProfileDescriptor>): EndpointReadinessOwner;
15
16
  export interface EngineProfileIdentity {
16
17
  readonly engineId: EngineId;
17
18
  readonly profileId: RunnerProfileId;
@@ -1 +1 @@
1
- export const BUILT_IN_ENGINE_DEFINITIONS=Object.freeze({k6:Object.freeze({id:"k6",profiles:Object.freeze([t({capabilities:{applicationRuntime:"required",databaseRuntime:"optional",endpointAccess:"published-http",executionHost:"orchestrator",runtimeIsolation:"orchestrated",taskBatching:"isolated"},engineId:"k6",id:"k6-http",supportedTestTypes:["int","e2e","load"],endpointReadinessOwner:"orchestrator-http"}),t({capabilities:{applicationRuntime:"none",databaseRuntime:"required",endpointAccess:"none",executionHost:"orchestrator",runtimeIsolation:"orchestrated",taskBatching:"isolated"},engineId:"k6",id:"k6-dal",supportedTestTypes:["dal"],endpointReadinessOwner:"adapter"})]),async resolveInstallation(e){return(await import("./installations/k6.js")).resolveK6Installation(e)},async loadExecutor(){return(await import("./k6/adapter/index.js")).executeK6Engine}}),"node-vitest":Object.freeze({id:"node-vitest",profiles:Object.freeze([t({capabilities:{applicationRuntime:"required",databaseRuntime:"optional",endpointAccess:"published-http",executionHost:"orchestrator",runtimeIsolation:"orchestrated",taskBatching:"isolated"},engineId:"node-vitest",id:"node-vitest-data",supportedTestTypes:["data"],endpointReadinessOwner:"adapter"}),t({capabilities:{applicationRuntime:"required",databaseRuntime:"optional",endpointAccess:"published-http",executionHost:"orchestrator",runtimeIsolation:"orchestrated",taskBatching:"isolated"},engineId:"node-vitest",id:"node-vitest-contract",supportedTestTypes:["contract"],endpointReadinessOwner:"adapter"})]),async resolveInstallation(e){return(await import("./installations/node-vitest.js")).resolveNodeVitestInstallation(e)},async loadExecutor(){return(await import("./node-vitest/adapter/index.js")).executeNodeVitestEngine}}),playwright:Object.freeze({id:"playwright",profiles:Object.freeze([t({capabilities:{applicationRuntime:"required",databaseRuntime:"optional",endpointAccess:"published-http",executionHost:"orchestrator",runtimeIsolation:"orchestrated",taskBatching:"compatible"},engineId:"playwright",id:"playwright-ui",supportedTestTypes:["ui"],endpointReadinessOwner:"orchestrator-http"})]),async resolveInstallation(e){return(await import("./installations/playwright.js")).resolvePlaywrightInstallation(e)},async loadExecutor(){return(await import("./playwright/adapter/index.js")).executePlaywrightEngine}})}),BUILT_IN_RUNNER_PROFILES=Object.freeze(Object.values(BUILT_IN_ENGINE_DEFINITIONS).flatMap(e=>e.profiles));export function isEngineProfileIdentity(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;const i=e,n=BUILT_IN_RUNNER_PROFILES.find(a=>a.engineId===i.engineId&&a.supportedTestTypes.some(o=>o===i.testType));return n!==void 0&&n.id===i.profileId}function t(e){return Object.freeze(e.capabilities),Object.freeze(e.supportedTestTypes),Object.freeze(e)}
1
+ export const BUILT_IN_ENGINE_DEFINITIONS=Object.freeze({k6:Object.freeze({id:"k6",profiles:Object.freeze([n({capabilities:{executionHost:"orchestrator",taskBatching:"isolated"},engineId:"k6",id:"k6-http",supportedTestTypes:["int","e2e","load"],endpointReadinessOwner:"orchestrator-http"}),n({capabilities:{executionHost:"orchestrator",taskBatching:"isolated"},engineId:"k6",id:"k6-dal",supportedTestTypes:["dal"],endpointReadinessOwner:"adapter"})]),async resolveInstallation(e){return(await import("./installations/k6.js")).resolveK6Installation(e)},async loadExecutor(){return(await import("./k6/adapter/index.js")).executeK6Engine}}),"node-vitest":Object.freeze({id:"node-vitest",profiles:Object.freeze([n({capabilities:{executionHost:"orchestrator",taskBatching:"isolated"},engineId:"node-vitest",id:"node-vitest-data",supportedTestTypes:["data"],endpointReadinessOwner:"adapter"}),n({capabilities:{executionHost:"orchestrator",taskBatching:"isolated"},engineId:"node-vitest",id:"node-vitest-contract",supportedTestTypes:["contract"],endpointReadinessOwner:"adapter"})]),async resolveInstallation(e){return(await import("./installations/node-vitest.js")).resolveNodeVitestInstallation(e)},async loadExecutor(){return(await import("./node-vitest/adapter/index.js")).executeNodeVitestEngine}}),playwright:Object.freeze({id:"playwright",profiles:Object.freeze([n({capabilities:{executionHost:"orchestrator",taskBatching:"compatible"},engineId:"playwright",id:"playwright-ui",supportedTestTypes:["ui"],endpointReadinessOwner:"orchestrator-http"})]),async resolveInstallation(e){return(await import("./installations/playwright.js")).resolvePlaywrightInstallation(e)},async loadExecutor(){return(await import("./playwright/adapter/index.js")).executePlaywrightEngine}})}),BUILT_IN_RUNNER_PROFILES=Object.freeze(Object.values(BUILT_IN_ENGINE_DEFINITIONS).flatMap(e=>e.profiles));export function resolveEndpointReadinessOwner(e){const t=BUILT_IN_RUNNER_PROFILES.find(i=>i.engineId===e.engineId&&i.id===e.id);if(t===void 0)throw new Error(`No built-in runner profile ${e.engineId}/${e.id}`);return t.endpointReadinessOwner}export function isEngineProfileIdentity(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;const t=e,i=BUILT_IN_RUNNER_PROFILES.find(r=>r.engineId===t.engineId&&r.supportedTestTypes.some(s=>s===t.testType));return i!==void 0&&i.id===t.profileId}function n(e){return Object.freeze(e.capabilities),Object.freeze(e.supportedTestTypes),Object.freeze(e)}
@@ -1,2 +1,2 @@
1
- import{pathToFileURL as y}from"node:url";p();async function p(){try{const t=f(process.argv[2]);l(t.registry.canonicalValue);const e=await import(y(t.family.playwrightTest.entrypoint).href),r=m(e),n=h(r.chromium,"chromium"),s=n.executablePath;if(typeof s!="function")throw new TypeError("Authoritative @playwright/test module must expose chromium.executablePath()");const c=Reflect.apply(s,n,[]);if(typeof c!="string")throw new TypeError("chromium.executablePath() must return a string");u({browserExecutable:c,family:t.family,ok:!0,registry:t.registry})}catch(t){const e=d(t);u({error:{...e.code===void 0?{}:{code:e.code},message:e.message,name:e.name},ok:!1}),process.exitCode=1}}function f(t){if(t===void 0)throw new TypeError("Playwright resolution child requires one input");let e;try{e=JSON.parse(Buffer.from(t,"base64url").toString("utf8"))}catch(r){throw new TypeError("Playwright resolution child input is invalid",{cause:r})}if(!o(e)||!g(e.family)||!o(e.registry)||typeof e.registry.canonicalValue!="string"||typeof e.registry.mode!="string")throw new TypeError("Playwright resolution child input is invalid");return e}function l(t){if(process.env.PLAYWRIGHT_BROWSERS_PATH!==t)throw new Error("Playwright resolution child did not receive the canonical browser registry")}function m(t){const e=a(t,"@playwright/test module namespace"),r=e.default??e["module.exports"]??e;return a(r,"@playwright/test public module")}function g(t){return o(t)&&typeof t.cli=="string"&&i(t.playwrightTest,"@playwright/test")&&i(t.playwright,"playwright")&&i(t.playwrightCore,"playwright-core")}function i(t,e){return o(t)&&t.name===e&&typeof t.version=="string"&&typeof t.root=="string"&&typeof t.entrypoint=="string"}function h(t,e){if(!o(t))throw new TypeError(`${e} must be an object`);return t}function a(t,e){if((typeof t!="object"||t===null)&&typeof t!="function")throw new TypeError(`${e} must be an object or function`);return t}function o(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function d(t){if(!(t instanceof Error))return{message:String(t),name:"Error"};const e=Reflect.get(t,"code");return{...typeof e=="string"?{code:e}:{},message:t.message,name:t.name}}function u(t){process.stdout.write(`${JSON.stringify(t)}
1
+ import{pathToFileURL as p}from"node:url";import{isUnknownRecord as o}from"../../kernel/unknown-values.js";y();async function y(){try{const e=f(process.argv[2]);l(e.registry.canonicalValue);const t=await import(p(e.family.playwrightTest.entrypoint).href),r=m(t),n=h(r.chromium,"chromium"),s=n.executablePath;if(typeof s!="function")throw new TypeError("Authoritative @playwright/test module must expose chromium.executablePath()");const c=Reflect.apply(s,n,[]);if(typeof c!="string")throw new TypeError("chromium.executablePath() must return a string");u({browserExecutable:c,family:e.family,ok:!0,registry:e.registry})}catch(e){const t=d(e);u({error:{...t.code===void 0?{}:{code:t.code},message:t.message,name:t.name},ok:!1}),process.exitCode=1}}function f(e){if(e===void 0)throw new TypeError("Playwright resolution child requires one input");let t;try{t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"))}catch(r){throw new TypeError("Playwright resolution child input is invalid",{cause:r})}if(!o(t)||!g(t.family)||!o(t.registry)||typeof t.registry.canonicalValue!="string"||typeof t.registry.mode!="string")throw new TypeError("Playwright resolution child input is invalid");return t}function l(e){if(process.env.PLAYWRIGHT_BROWSERS_PATH!==e)throw new Error("Playwright resolution child did not receive the canonical browser registry")}function m(e){const t=a(e,"@playwright/test module namespace"),r=t.default??t["module.exports"]??t;return a(r,"@playwright/test public module")}function g(e){return o(e)&&typeof e.cli=="string"&&i(e.playwrightTest,"@playwright/test")&&i(e.playwright,"playwright")&&i(e.playwrightCore,"playwright-core")}function i(e,t){return o(e)&&e.name===t&&typeof e.version=="string"&&typeof e.root=="string"&&typeof e.entrypoint=="string"}function h(e,t){if(!o(e))throw new TypeError(`${t} must be an object`);return e}function a(e,t){if((typeof e!="object"||e===null)&&typeof e!="function")throw new TypeError(`${t} must be an object or function`);return e}function d(e){if(!(e instanceof Error))return{message:String(e),name:"Error"};const t=Reflect.get(e,"code");return{...typeof t=="string"?{code:t}:{},message:e.message,name:e.name}}function u(e){process.stdout.write(`${JSON.stringify(e)}
2
2
  `)}
@@ -1 +1 @@
1
- import{PLAYWRIGHT_PACKAGE_FAMILY_REQUIREMENTS as R}from"./package-requirements.js";export{PLAYWRIGHT_PACKAGE_FAMILY_REQUIREMENTS}from"./package-requirements.js";import c from"node:fs";import w from"node:os";import f from"node:path";import{fileURLToPath as h}from"node:url";import{runManagedProcess as x}from"../../process/index.js";import{currentLinuxLibc as T,currentPlatformTarget as _,platformTargetKey as d,SUPPORTED_PLATFORM_TARGETS as I}from"../../process/host/platform.js";import{RootPackageResolver as m}from"./package-resolution.js";const A=64*1024,O=6e4,b="PLAYWRIGHT_BROWSERS_PATH",S=new Set(["npm_config_playwright_browsers_path","npm_package_config_playwright_browsers_path"]);export class PlaywrightInstallationError extends Error{code="TESTKIT_PLAYWRIGHT_INSTALLATION_INVALID";constructor(r,t){super(`Playwright installation is invalid: ${r}. Run testkit setup playwright --force.`,t),this.name="PlaywrightInstallationError"}}export class UnsupportedPlaywrightPlatformError extends Error{code="TESTKIT_PLAYWRIGHT_PLATFORM_UNSUPPORTED";constructor(r,t){super(`Playwright does not support ${d(r)}${r.platform==="linux"?` with ${t??"unknown"} libc`:""}`),this.name="UnsupportedPlaywrightPlatformError"}}export function resolvePlaywrightPackageFamily(e=new m){const[r,t,o]=R,i=e.resolveRequireFromRoot(u(r)),n=e.resolveImportFromRoot(u(r));L(e,i,n);const a=e.resolveRequireFromPackage(i,u(t)),s=e.resolveRequireFromPackage(a,u(o)),P=e.resolveRequirePublicEntrypoint(i,r.publicEntrypoints[1]);return Object.freeze({cli:P,playwright:p(a,"playwright"),playwrightCore:p(s,"playwright-core"),playwrightTest:p(n,"@playwright/test")})}function L(e,r,t){if(!(r.name===t.name&&r.version===t.version&&r.root===t.root))throw e.brokenInstallation(r,"the import and require public entrypoints select different physical package roots",void 0)}export function resolvePlaywrightRegistry(e){const r=e.platform==="win32"?f.win32:f.posix;if(!r.isAbsolute(e.productRoot))throw new TypeError("Playwright product root must be absolute");const t=e.configuredValue;if(t==="0")return Object.freeze({canonicalValue:"0",mode:"hermetic"});if(t!==void 0&&t.length>0){const o=r.isAbsolute(t);return Object.freeze({canonicalValue:o?r.normalize(t):r.resolve(e.productRoot,t),mode:o?"configured-absolute":"configured-relative"})}return Object.freeze({canonicalValue:r.resolve(e.productRoot,r.join(C(e.platform,e.ambientEnvironment,e.homeDirectory??w.homedir(),r),"ms-playwright")),mode:"default"})}export function playwrightRegistryEnvironment(e,r){const t={};for(const[o,i]of Object.entries(e))typeof i=="string"&&!S.has(o.toLowerCase())&&o.toUpperCase()!==b&&(t[o]=i);return t[b]=r.canonicalValue,Object.freeze(t)}export async function resolvePlaywrightInstallation(e,r={}){e.signal.throwIfAborted();const t={linuxLibc:T(),target:_()};requireSupportedPlaywrightHost(t);const o=new m,i=r.ambientEnvironment??process.env,n=resolvePlaywrightPackageFamily(o),a=resolvePlaywrightRegistry({ambientEnvironment:i,configuredValue:r.configuredRegistry??i.PLAYWRIGHT_BROWSERS_PATH,homeDirectory:w.homedir(),platform:t.target.platform,productRoot:e.productRoot}),s=await k(e,{family:n,registry:a},i);return Object.freeze({authoringEntrypoints:Object.freeze({authoring:o.resolveRootPublicEntrypoint("@gfdelarue/testkit/playwright"),root:o.resolveRootPublicEntrypoint("@gfdelarue/testkit"),rootPackageJson:o.resolveRootPublicEntrypoint("@gfdelarue/testkit/package.json")}),browserExecutable:requireBrowserExecutable(s.browserExecutable,t.target),engineId:"playwright",family:n,registry:a})}async function k(e,r,t){const o=Buffer.from(JSON.stringify(r),"utf8").toString("base64url"),i=await x({args:[N(),o],cwd:e.productRoot,displayLabel:"Playwright installation resolver",env:playwrightRegistryEnvironment(t,r.registry),executable:process.execPath,signal:e.signal,timeoutMs:O}),n=j(i);throwIfPlaywrightProcessAborted(e.signal,i,n),requireBoundedPlaywrightChildOutput(i.stdout);let a;try{a=parsePlaywrightChildOutput(i.stdout)}catch(s){throw n!==null?new PlaywrightInstallationError(`isolated resolver failed: ${n.message}`,{cause:n}):s}if(n!==null)throw new PlaywrightInstallationError(`isolated resolver failed: ${n.message}`,{cause:n});if(!a.ok){if(i.exitCode!==1||i.exitSignal!==null){const s=E(i);throw new PlaywrightInstallationError(`isolated resolver failed: ${s.message}`,{cause:s})}throw new PlaywrightInstallationError(`isolated resolver failed: ${a.error.message}`,{cause:M(a.error)})}if(i.exitCode!==0||i.exitSignal!==null){const s=E(i);throw new PlaywrightInstallationError(`isolated resolver failed: ${s.message}`,{cause:s})}return requireMatchingPlaywrightChildRequest(a,r),a}export function throwIfPlaywrightProcessAborted(e,r,t){if(e.aborted){if(!v(r)||t===null){e.throwIfAborted();return}throw t===e.reason?t:new AggregateError([e.reason,t],"Playwright process was cancelled and process cleanup also failed",{cause:e.reason})}}function v(e){return e.terminationError!==null||e.error!==null||e.timedOut||e.outputLimitExceeded}export function requireBoundedPlaywrightChildOutput(e){if(Buffer.byteLength(e,"utf8")>A)throw new PlaywrightInstallationError("isolated resolver returned oversized output")}export function parsePlaywrightChildOutput(e){let r;try{r=JSON.parse(e)}catch(t){throw new PlaywrightInstallationError("isolated resolver did not return bounded JSON",{cause:t})}if(!l(r)||typeof r.ok!="boolean")throw new PlaywrightInstallationError("isolated resolver returned an invalid response");if(!r.ok){if(!l(r.error)||typeof r.error.name!="string"||typeof r.error.message!="string"||r.error.code!==void 0&&typeof r.error.code!="string")throw new PlaywrightInstallationError("isolated resolver returned an invalid error");return{error:{...r.error.code===void 0?{}:{code:r.error.code},message:r.error.message,name:r.error.name},ok:!1}}if(typeof r.browserExecutable!="string"||!$(r.family)||!H(r.registry))throw new PlaywrightInstallationError("isolated resolver returned an invalid installation");return{browserExecutable:r.browserExecutable,family:r.family,ok:!0,registry:r.registry}}export function requireMatchingPlaywrightChildRequest(e,r){if(JSON.stringify(e.family)!==JSON.stringify(r.family))throw new PlaywrightInstallationError("isolated resolver selected a different physical package family");if(e.registry.canonicalValue!==r.registry.canonicalValue||e.registry.mode!==r.registry.mode)throw new PlaywrightInstallationError("isolated resolver selected a different browser registry")}export function requireBrowserExecutable(e,r){if(!f.isAbsolute(e))throw new PlaywrightInstallationError(`public chromium.executablePath() returned a non-absolute path ${JSON.stringify(e)}`);let t;try{t=c.statSync(e)}catch(o){throw new PlaywrightInstallationError(`public chromium.executablePath() returned missing path ${JSON.stringify(e)}`,{cause:o})}if(!t.isFile())throw new PlaywrightInstallationError(`public chromium.executablePath() must identify a regular file; received ${JSON.stringify(e)}`);if(r.platform!=="win32")try{c.accessSync(e,c.constants.X_OK)}catch(o){throw new PlaywrightInstallationError(`public chromium.executablePath() is not executable: ${JSON.stringify(e)}`,{cause:o})}return e}export function requireSupportedPlaywrightHost(e){const r=d(e.target);if(!I.some(t=>d(t)===r)||e.target.platform==="linux"&&e.linuxLibc!=="glibc")throw new UnsupportedPlaywrightPlatformError(e.target,e.linuxLibc)}function C(e,r,t,o){return e==="linux"?r.XDG_CACHE_HOME||o.join(g(t),".cache"):e==="darwin"?o.join(g(t),"Library","Caches"):r.LOCALAPPDATA||o.join(g(t),"AppData","Local")}function g(e){if(e.length===0)throw new TypeError("Playwright default registry requires a home directory");return e}function u(e){return{dependencyGroup:"dependencies",packageName:e.packageName,publicEntrypoint:e.publicEntrypoints[0]}}function p(e,r){if(e.name!==r)throw new TypeError(`Playwright package family expected ${r}, received ${e.name}`);return Object.freeze({entrypoint:e.entrypoint,name:r,root:e.root,version:e.version})}function N(){const e=h(new URL("./playwright-resolution-child.js",import.meta.url));return c.existsSync(e)?e:h(new URL("../../../dist/engines/installations/playwright-resolution-child.js",import.meta.url))}function j(e){return e.terminationError!==null?e.terminationError:e.error!==null?e.error:e.timedOut?new Error("isolated resolver timed out"):e.cancelled?new Error("isolated resolver was cancelled"):e.outputLimitExceeded?new Error("isolated resolver output exceeded the bound"):null}function E(e){return new Error(`isolated resolver exited with ${e.exitCode===null?String(e.exitSignal):e.exitCode.toString()}`)}function M(e){const r=new Error(e.message);return r.name=e.name,e.code!==void 0&&Object.defineProperty(r,"code",{enumerable:!0,value:e.code}),r}function $(e){return l(e)&&typeof e.cli=="string"&&y(e.playwrightTest,"@playwright/test")&&y(e.playwright,"playwright")&&y(e.playwrightCore,"playwright-core")}function y(e,r){return l(e)&&e.name===r&&typeof e.version=="string"&&typeof e.root=="string"&&typeof e.entrypoint=="string"}function H(e){return l(e)&&typeof e.canonicalValue=="string"&&(e.mode==="configured-absolute"||e.mode==="configured-relative"||e.mode==="default"||e.mode==="hermetic")}function l(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}
1
+ import{PLAYWRIGHT_PACKAGE_FAMILY_REQUIREMENTS as R}from"./package-requirements.js";export{PLAYWRIGHT_PACKAGE_FAMILY_REQUIREMENTS}from"./package-requirements.js";import c from"node:fs";import y from"node:os";import f from"node:path";import{fileURLToPath as h}from"node:url";import{runManagedProcess as x}from"../../process/index.js";import{currentLinuxLibc as T,currentPlatformTarget as _,platformTargetKey as d,SUPPORTED_PLATFORM_TARGETS as I}from"../../process/host/platform.js";import{RootPackageResolver as m}from"./package-resolution.js";import{isUnknownRecord as l}from"../../kernel/unknown-values.js";const O=64*1024,S=6e4,b="PLAYWRIGHT_BROWSERS_PATH",A=new Set(["npm_config_playwright_browsers_path","npm_package_config_playwright_browsers_path"]);export class PlaywrightInstallationError extends Error{code="TESTKIT_PLAYWRIGHT_INSTALLATION_INVALID";constructor(r,t){super(`Playwright installation is invalid: ${r}. Run testkit setup playwright --force.`,t),this.name="PlaywrightInstallationError"}}export class UnsupportedPlaywrightPlatformError extends Error{code="TESTKIT_PLAYWRIGHT_PLATFORM_UNSUPPORTED";constructor(r,t){super(`Playwright does not support ${d(r)}${r.platform==="linux"?` with ${t??"unknown"} libc`:""}`),this.name="UnsupportedPlaywrightPlatformError"}}export function resolvePlaywrightPackageFamily(e=new m){const[r,t,o]=R,i=e.resolveRequireFromRoot(u(r)),n=e.resolveImportFromRoot(u(r));L(e,i,n);const a=e.resolveRequireFromPackage(i,u(t)),s=e.resolveRequireFromPackage(a,u(o)),P=e.resolveRequirePublicEntrypoint(i,r.publicEntrypoints[1]);return Object.freeze({cli:P,playwright:p(a,"playwright"),playwrightCore:p(s,"playwright-core"),playwrightTest:p(n,"@playwright/test")})}function L(e,r,t){if(!(r.name===t.name&&r.version===t.version&&r.root===t.root))throw e.brokenInstallation(r,"the import and require public entrypoints select different physical package roots",void 0)}export function resolvePlaywrightRegistry(e){const r=e.platform==="win32"?f.win32:f.posix;if(!r.isAbsolute(e.productRoot))throw new TypeError("Playwright product root must be absolute");const t=e.configuredValue;if(t==="0")return Object.freeze({canonicalValue:"0",mode:"hermetic"});if(t!==void 0&&t.length>0){const o=r.isAbsolute(t);return Object.freeze({canonicalValue:o?r.normalize(t):r.resolve(e.productRoot,t),mode:o?"configured-absolute":"configured-relative"})}return Object.freeze({canonicalValue:r.resolve(e.productRoot,r.join(C(e.platform,e.ambientEnvironment,e.homeDirectory??y.homedir(),r),"ms-playwright")),mode:"default"})}export function playwrightRegistryEnvironment(e,r){const t={};for(const[o,i]of Object.entries(e))typeof i=="string"&&!A.has(o.toLowerCase())&&o.toUpperCase()!==b&&(t[o]=i);return t[b]=r.canonicalValue,Object.freeze(t)}export async function resolvePlaywrightInstallation(e,r={}){e.signal.throwIfAborted();const t={linuxLibc:T(),target:_()};requireSupportedPlaywrightHost(t);const o=new m,i=r.ambientEnvironment??process.env,n=resolvePlaywrightPackageFamily(o),a=resolvePlaywrightRegistry({ambientEnvironment:i,configuredValue:r.configuredRegistry??i.PLAYWRIGHT_BROWSERS_PATH,homeDirectory:y.homedir(),platform:t.target.platform,productRoot:e.productRoot}),s=await k(e,{family:n,registry:a},i);return Object.freeze({authoringEntrypoints:Object.freeze({authoring:o.resolveRootPublicEntrypoint("@gfdelarue/testkit/playwright"),root:o.resolveRootPublicEntrypoint("@gfdelarue/testkit"),rootPackageJson:o.resolveRootPublicEntrypoint("@gfdelarue/testkit/package.json")}),browserExecutable:requireBrowserExecutable(s.browserExecutable,t.target),engineId:"playwright",family:n,registry:a})}async function k(e,r,t){const o=Buffer.from(JSON.stringify(r),"utf8").toString("base64url"),i=await x({args:[N(),o],cwd:e.productRoot,displayLabel:"Playwright installation resolver",env:playwrightRegistryEnvironment(t,r.registry),executable:process.execPath,signal:e.signal,timeoutMs:S}),n=j(i);throwIfPlaywrightProcessAborted(e.signal,i,n),requireBoundedPlaywrightChildOutput(i.stdout);let a;try{a=parsePlaywrightChildOutput(i.stdout)}catch(s){throw n!==null?new PlaywrightInstallationError(`isolated resolver failed: ${n.message}`,{cause:n}):s}if(n!==null)throw new PlaywrightInstallationError(`isolated resolver failed: ${n.message}`,{cause:n});if(!a.ok){if(i.exitCode!==1||i.exitSignal!==null){const s=E(i);throw new PlaywrightInstallationError(`isolated resolver failed: ${s.message}`,{cause:s})}throw new PlaywrightInstallationError(`isolated resolver failed: ${a.error.message}`,{cause:M(a.error)})}if(i.exitCode!==0||i.exitSignal!==null){const s=E(i);throw new PlaywrightInstallationError(`isolated resolver failed: ${s.message}`,{cause:s})}return requireMatchingPlaywrightChildRequest(a,r),a}export function throwIfPlaywrightProcessAborted(e,r,t){if(e.aborted){if(!v(r)||t===null){e.throwIfAborted();return}throw t===e.reason?t:new AggregateError([e.reason,t],"Playwright process was cancelled and process cleanup also failed",{cause:e.reason})}}function v(e){return e.terminationError!==null||e.error!==null||e.timedOut||e.outputLimitExceeded}export function requireBoundedPlaywrightChildOutput(e){if(Buffer.byteLength(e,"utf8")>O)throw new PlaywrightInstallationError("isolated resolver returned oversized output")}export function parsePlaywrightChildOutput(e){let r;try{r=JSON.parse(e)}catch(t){throw new PlaywrightInstallationError("isolated resolver did not return bounded JSON",{cause:t})}if(!l(r)||typeof r.ok!="boolean")throw new PlaywrightInstallationError("isolated resolver returned an invalid response");if(!r.ok){if(!l(r.error)||typeof r.error.name!="string"||typeof r.error.message!="string"||r.error.code!==void 0&&typeof r.error.code!="string")throw new PlaywrightInstallationError("isolated resolver returned an invalid error");return{error:{...r.error.code===void 0?{}:{code:r.error.code},message:r.error.message,name:r.error.name},ok:!1}}if(typeof r.browserExecutable!="string"||!$(r.family)||!U(r.registry))throw new PlaywrightInstallationError("isolated resolver returned an invalid installation");return{browserExecutable:r.browserExecutable,family:r.family,ok:!0,registry:r.registry}}export function requireMatchingPlaywrightChildRequest(e,r){if(JSON.stringify(e.family)!==JSON.stringify(r.family))throw new PlaywrightInstallationError("isolated resolver selected a different physical package family");if(e.registry.canonicalValue!==r.registry.canonicalValue||e.registry.mode!==r.registry.mode)throw new PlaywrightInstallationError("isolated resolver selected a different browser registry")}export function requireBrowserExecutable(e,r){if(!f.isAbsolute(e))throw new PlaywrightInstallationError(`public chromium.executablePath() returned a non-absolute path ${JSON.stringify(e)}`);let t;try{t=c.statSync(e)}catch(o){throw new PlaywrightInstallationError(`public chromium.executablePath() returned missing path ${JSON.stringify(e)}`,{cause:o})}if(!t.isFile())throw new PlaywrightInstallationError(`public chromium.executablePath() must identify a regular file; received ${JSON.stringify(e)}`);if(r.platform!=="win32")try{c.accessSync(e,c.constants.X_OK)}catch(o){throw new PlaywrightInstallationError(`public chromium.executablePath() is not executable: ${JSON.stringify(e)}`,{cause:o})}return e}export function requireSupportedPlaywrightHost(e){const r=d(e.target);if(!I.some(t=>d(t)===r)||e.target.platform==="linux"&&e.linuxLibc!=="glibc")throw new UnsupportedPlaywrightPlatformError(e.target,e.linuxLibc)}function C(e,r,t,o){return e==="linux"?r.XDG_CACHE_HOME||o.join(g(t),".cache"):e==="darwin"?o.join(g(t),"Library","Caches"):r.LOCALAPPDATA||o.join(g(t),"AppData","Local")}function g(e){if(e.length===0)throw new TypeError("Playwright default registry requires a home directory");return e}function u(e){return{dependencyGroup:"dependencies",packageName:e.packageName,publicEntrypoint:e.publicEntrypoints[0]}}function p(e,r){if(e.name!==r)throw new TypeError(`Playwright package family expected ${r}, received ${e.name}`);return Object.freeze({entrypoint:e.entrypoint,name:r,root:e.root,version:e.version})}function N(){const e=h(new URL("./playwright-resolution-child.js",import.meta.url));return c.existsSync(e)?e:h(new URL("../../../dist/engines/installations/playwright-resolution-child.js",import.meta.url))}function j(e){return e.terminationError!==null?e.terminationError:e.error!==null?e.error:e.timedOut?new Error("isolated resolver timed out"):e.cancelled?new Error("isolated resolver was cancelled"):e.outputLimitExceeded?new Error("isolated resolver output exceeded the bound"):null}function E(e){return new Error(`isolated resolver exited with ${e.exitCode===null?String(e.exitSignal):e.exitCode.toString()}`)}function M(e){const r=new Error(e.message);return r.name=e.name,e.code!==void 0&&Object.defineProperty(r,"code",{enumerable:!0,value:e.code}),r}function $(e){return l(e)&&typeof e.cli=="string"&&w(e.playwrightTest,"@playwright/test")&&w(e.playwright,"playwright")&&w(e.playwrightCore,"playwright-core")}function w(e,r){return l(e)&&e.name===r&&typeof e.version=="string"&&typeof e.root=="string"&&typeof e.entrypoint=="string"}function U(e){return l(e)&&typeof e.canonicalValue=="string"&&(e.mode==="configured-absolute"||e.mode==="configured-relative"||e.mode==="default"||e.mode==="hermetic")}
@@ -1,4 +1,4 @@
1
- import{decodeEngineRuntimeArtifactPayload as v}from"../../api/runtime-artifact.js";import S from"node:fs/promises";import{ENGINE_RUNTIME_ARTIFACT_MARKER as E,findEncodedEngineRuntimeArtifacts as w}from"../../api/index.js";import{evidenceFileAccess as A,readStableEvidenceFile as _,writeOwnedEvidenceFile as m}from"../../adapters/evidence-files.js";export const K6_SUMMARY_MAX_BYTES=16*1024*1024;const l=64,f=1e5,d=1024*1024,p=1e5;export async function collectK6Evidence({artifactDirectory:e,stderr:t,stdout:i,summaryFile:a},n=A){await S.mkdir(e,{recursive:!0});const r=[],o=[];i.length>0&&(o.push({stream:"stdout",text:i}),r.push(await y(e,"stdout.log","k6-stdout","engine.output",i))),t.length>0&&(o.push({stream:"stderr",text:t}),r.push(await y(e,"stderr.log","k6-stderr","engine.output",t)));const s=await $(e,`${i}
2
- ${t}`);r.push(...s);const u=await O(a,n);if(u.value!==null){const g=await m(e,"k6-summary.json",`${JSON.stringify(u.value,null,2)}
3
- `);r.push({contentType:"application/json",kind:"engine.summary",name:"k6-summary",path:g,summary:"k6 execution summary"})}return{evidence:{artifacts:r,logs:o,metrics:u.value===null?[]:k(u.value),...u.value===null?{}:{native:{k6Summary:u.value}}},summary:u.value,summaryError:u.error}}async function y(e,t,i,a,n){const r=await m(e,t,n);return{contentType:"text/plain; charset=utf-8",kind:a,name:i,path:r,summary:`${i} captured`}}async function $(e,t){const i=[];let a=0;for(const n of w(t)){const r=M(n),o=`${a.toString().padStart(3,"0")}-${R(r.name)}.json`,s=await m(e,o,`${JSON.stringify(r.data,null,2)}
4
- `);i.push({contentType:r.contentType,data:r.data,kind:r.kind,metadata:r.metadata,name:r.name,path:s,...r.summary===null?{}:{summary:r.summary}}),a+=1}return i}function M(e){const t=v(e),i={emittedAt:t.emittedAt,marker:E};return{contentType:t.contentType,data:t.data,kind:t.kind??"testkit.runtime",metadata:i,name:t.name,summary:t.summary}}async function O(e,t){let i;try{({contents:i}=await _(e,K6_SUMMARY_MAX_BYTES,"k6 summary export",t))}catch(a){return{error:h(a),value:null}}try{const a=JSON.parse(i.toString("utf8")),n=T(a,"k6 summary export");return{error:null,value:N(n)}}catch(a){return{error:h(a),value:null}}}function N(e){return Object.fromEntries(Object.entries(e).filter(([t])=>t!=="setup_data"))}function k(e){const t=e.metrics;if(!c(t))return[];const i=[];for(const[a,n]of Object.entries(t)){if(!c(n))continue;const r=c(n.values)?n.values:n;for(const[o,s]of Object.entries(r))typeof s!="number"||!Number.isFinite(s)||i.push({dimensions:{statistic:o},name:a,value:s})}return i}function R(e){const t=e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"").slice(0,80);return t.length>0?t:"artifact"}function T(e,t){if(!c(e))throw new Error(`${t} must contain a JSON object`);const i=[{depth:0,value:e}];let a=0;for(;i.length>0;){const n=i.pop();if(n===void 0)continue;if(a+=1,a>f)throw new Error(`${t} exceeds the ${f.toString()} JSON node limit`);if(n.depth>l)throw new Error(`${t} exceeds the ${l.toString()} level JSON depth limit`);if(typeof n.value=="string"){if(Buffer.byteLength(n.value,"utf8")>d)throw new Error(`${t} contains a string exceeding the ${d.toString()} byte limit`);continue}if(n.value===null||typeof n.value=="boolean")continue;if(typeof n.value=="number"){if(!Number.isFinite(n.value))throw new Error(`${t} contains a non-finite number`);continue}const r=Array.isArray(n.value)?n.value:c(n.value)?Object.values(n.value):null;if(r===null)throw new Error(`${t} contains a non-JSON value`);if(r.length>p)throw new Error(`${t} contains a collection exceeding the ${p.toString()} entry limit`);for(const o of r)i.push({depth:n.depth+1,value:o})}return e}function c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function h(e){return e instanceof Error?e:new Error(String(e))}
1
+ import{decodeEngineRuntimeArtifactPayload as g}from"../../api/runtime-artifact.js";import S from"node:fs/promises";import{ENGINE_RUNTIME_ARTIFACT_MARKER as w,findEncodedEngineRuntimeArtifacts as E}from"../../api/index.js";import{evidenceFileAccess as A,readStableEvidenceFile as _,writeOwnedEvidenceFile as m}from"../../adapters/evidence-files.js";import{isUnknownRecord as c}from"../../../kernel/unknown-values.js";import{toError as l}from"../../../kernel/error-serialization.js";export const K6_SUMMARY_MAX_BYTES=16*1024*1024;const f=64,d=1e5,p=1024*1024,y=1e5;export async function collectK6Evidence({artifactDirectory:n,stderr:t,stdout:i,summaryFile:a},e=A){await S.mkdir(n,{recursive:!0});const r=[],o=[];i.length>0&&(o.push({stream:"stdout",text:i}),r.push(await h(n,"stdout.log","k6-stdout","engine.output",i))),t.length>0&&(o.push({stream:"stderr",text:t}),r.push(await h(n,"stderr.log","k6-stderr","engine.output",t)));const s=await $(n,`${i}
2
+ ${t}`);r.push(...s);const u=await O(a,e);if(u.value!==null){const v=await m(n,"k6-summary.json",`${JSON.stringify(u.value,null,2)}
3
+ `);r.push({contentType:"application/json",kind:"engine.summary",name:"k6-summary",path:v,summary:"k6 execution summary"})}return{evidence:{artifacts:r,logs:o,metrics:u.value===null?[]:N(u.value),...u.value===null?{}:{native:{k6Summary:u.value}}},summary:u.value,summaryError:u.error}}async function h(n,t,i,a,e){const r=await m(n,t,e);return{contentType:"text/plain; charset=utf-8",kind:a,name:i,path:r,summary:`${i} captured`}}async function $(n,t){const i=[];let a=0;for(const e of E(t)){const r=M(e),o=`${a.toString().padStart(3,"0")}-${R(r.name)}.json`,s=await m(n,o,`${JSON.stringify(r.data,null,2)}
4
+ `);i.push({contentType:r.contentType,data:r.data,kind:r.kind,metadata:r.metadata,name:r.name,path:s,...r.summary===null?{}:{summary:r.summary}}),a+=1}return i}function M(n){const t=g(n),i={emittedAt:t.emittedAt,marker:w};return{contentType:t.contentType,data:t.data,kind:t.kind??"testkit.runtime",metadata:i,name:t.name,summary:t.summary}}async function O(n,t){let i;try{({contents:i}=await _(n,K6_SUMMARY_MAX_BYTES,"k6 summary export",t))}catch(a){return{error:l(a),value:null}}try{const a=JSON.parse(i.toString("utf8")),e=T(a,"k6 summary export");return{error:null,value:k(e)}}catch(a){return{error:l(a),value:null}}}function k(n){return Object.fromEntries(Object.entries(n).filter(([t])=>t!=="setup_data"))}function N(n){const t=n.metrics;if(!c(t))return[];const i=[];for(const[a,e]of Object.entries(t)){if(!c(e))continue;const r=c(e.values)?e.values:e;for(const[o,s]of Object.entries(r))typeof s!="number"||!Number.isFinite(s)||i.push({dimensions:{statistic:o},name:a,value:s})}return i}function R(n){const t=n.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"").slice(0,80);return t.length>0?t:"artifact"}function T(n,t){if(!c(n))throw new Error(`${t} must contain a JSON object`);const i=[{depth:0,value:n}];let a=0;for(;i.length>0;){const e=i.pop();if(e===void 0)continue;if(a+=1,a>d)throw new Error(`${t} exceeds the ${d.toString()} JSON node limit`);if(e.depth>f)throw new Error(`${t} exceeds the ${f.toString()} level JSON depth limit`);if(typeof e.value=="string"){if(Buffer.byteLength(e.value,"utf8")>p)throw new Error(`${t} contains a string exceeding the ${p.toString()} byte limit`);continue}if(e.value===null||typeof e.value=="boolean")continue;if(typeof e.value=="number"){if(!Number.isFinite(e.value))throw new Error(`${t} contains a non-finite number`);continue}const r=Array.isArray(e.value)?e.value:c(e.value)?Object.values(e.value):null;if(r===null)throw new Error(`${t} contains a non-JSON value`);if(r.length>y)throw new Error(`${t} contains a collection exceeding the ${y.toString()} entry limit`);for(const o of r)i.push({depth:e.depth+1,value:o})}return n}
@@ -1 +1 @@
1
- import{makeTempDirAsync as S}from"../../../process/files/temp-dir.js";import{classifyManagedProcessResult as O,terminalOutcome as y,emptyEvidence as M,failureFromError as I,processExitDetails as R,processExitFailure as P,toError as w,executeEngineTasks as F,managedProcessFailure as U}from"../../adapters/execution.js";import{requireRootDirectory as L,requireAbsoluteWorkspacePath as K,requireConsumerFile as C,safeSegment as T}from"../../adapters/workspace.js";import m from"node:fs/promises";import v from"node:path";import{isEngineTaskDeadlineExceededReason as V,resolveEngineTaskInputs as j}from"../../api/index.js";import{createInvocationProcessEnvironment as $,runManagedProcess as Y}from"../../../process/index.js";import{bundleK6Suite as B,K6ConsumerCompilationError as H}from"./bundle.js";import{collectK6Evidence as z}from"./evidence.js";import{assertK6SpawnEnvironmentBudget as G,createK6RuntimeInputDocument as J,K6_RUNTIME_INPUT_FILE_ENV as W,K6_RUNTIME_INPUT_SHA256_ENV as X,mergeK6Environment as Q,selectK6CustomEnvironment as N,verifyOwnedK6RuntimeInput as Z,writeOwnedK6RuntimeInput as q}from"./input.js";import{K6_RUNTIME_INVOCATION_ID_ENV as ee,K6_RUNTIME_TASK_ID_ENV as te}from"../../api/k6-runtime-input.js";import{collectK6NativeSummaryArtifacts as re,K6_NATIVE_SUMMARY_DIRECTORY as ne}from"./native-summary.js";import{engineEvidenceIdentity as ie}from"../../adapters/evidence-identity.js";const g={codePrefix:"K6",label:"k6"},oe=/^Uncaught testkit suite error during (setup|exec): /u;class A extends Error{constructor(t){const r=w(t);super(r.message,{cause:r}),this.name="K6ConsumerPreparationError"}}export const k6ExecutorDependencies={removeOwnedDirectory:e=>m.rm(e,{force:!0,recursive:!0}),writeRuntimeInput:q};export async function executeK6Engine(e,t,r,n=k6ExecutorDependencies){const i=await ae(e,t,n,r);return F(e,i.tasks,g,(a,u)=>ce(e,i,a,u),Ie(e,i.installation))}async function ae(e,t,r,n){const i=e.profile,a=t.executable,u=await L(e.workspace.rootDirectory);K(e.workspace.temporaryDirectory,"temporary directory"),K(e.workspace.artifactDirectory,"artifact directory"),await m.mkdir(e.workspace.temporaryDirectory,{recursive:!0}),await m.mkdir(e.workspace.artifactDirectory,{recursive:!0});const o=await S(`k6-${T(e.invocationId)}-`,{parentDir:e.workspace.temporaryDirectory});n.defer(()=>r.removeOwnedDirectory(o));const c=await $(o),s=[];for(const[l,d]of e.tasks.entries()){const f=j(e,d),D=await S(`${l.toString().padStart(3,"0")}-${T(d.id)}-`,{parentDir:e.workspace.artifactDirectory}),E=v.join(o,`${l.toString().padStart(3,"0")}-${T(d.id)}`),k=v.join(E,"suite.js"),_=v.join(E,ne);try{await m.mkdir(E,{mode:448,recursive:!1}),await m.mkdir(_,{mode:448,recursive:!1});const h=await x(()=>C(u,d.file,"k6 task file"));await x(()=>{Ee(f.supportModules),pe(e,i,d.serviceName,f),N(f.environment)});const b=await r.writeRuntimeInput(E,J(e,d,f));await B({configuration:f.configuration,entrypoints:t.authoringEntrypoints,nativeSummaryDirectory:_,outputFile:k,rootDirectory:u,signal:e.signal,sourceFile:h}),s.push({artifactDirectory:D,inputs:f,task:d,preparationFailure:null,prepared:{bundleFile:k,nativeSummaryDirectory:_,runtimeInput:b}})}catch(h){s.push({artifactDirectory:D,inputs:f,task:d,preparationFailure:ge(h),prepared:null})}}return Object.freeze({executable:a,installation:t,invocationEnvironment:c.environment,rootDirectory:u,tasks:Object.freeze(s)})}async function ce(e,t,r,n){const i=Math.max(0,r.task.deadlineMs-n);try{await Z(r.prepared.runtimeInput)}catch(l){return y(r.task.id,"failed",n,M(),{...I(l,"K6_INPUT_INVALID"),classification:"infra"})}const a=`${r.prepared.bundleFile}.summary.json`,u=me(e,t,r),o=await Y({args:["run","--address","127.0.0.1:0","--no-color","--quiet","--summary-export",a,r.prepared.bundleFile],cwd:t.rootDirectory,displayLabel:"k6",env:u,executable:t.executable,signal:e.signal,timeoutMs:i});let c;try{c=await z({artifactDirectory:r.artifactDirectory,stderr:o.stderr,stdout:o.stdout,summaryFile:a});const l=await re(r.prepared.nativeSummaryDirectory,r.artifactDirectory);l.length>0&&(c={...c,evidence:{...c.evidence,artifacts:[...c.evidence.artifacts,...l]}})}catch(l){return y(r.task.id,"failed",n,{artifacts:[],logs:[...o.stdout.length>0?[{stream:"stdout",text:o.stdout}]:[],...o.stderr.length>0?[{stream:"stderr",text:o.stderr}]:[]],metrics:[]},k6EvidenceCollectionFailure(o,l))}const s=classifyK6ProcessResult(o,c.summary,c.summaryError,r.task.timeoutMs,V(e.signal.reason));return y(r.task.id,s.status,n,c.evidence,s.failure)}export function classifyK6ProcessResult(e,t,r,n,i){const a=O(e,n,i,g);if(a!==null)return a;const u=ue(e.stderr),o=se(e.stderr);if(o!==null)return{failure:{code:"K6_SUMMARY_OUTPUT_INVALID",message:o,stack:e.stderr},status:"failed"};if(u!==null){const s=oe.exec(u)?.[1];return{failure:{code:"K6_RUNTIME_EXCEPTION",details:{...s===void 0?{}:{phase:s},...R(e),summaryRead:r===null},message:u,stack:e.stderr},status:"failed"}}const c=de(t);if(c.length>0){const s=fe(t);return{failure:{code:"K6_THRESHOLDS_FAILED",details:{...R(e),...s===null?{}:{failedChecks:s},thresholds:c},message:`k6 thresholds failed: ${c.join(", ")}`},status:"failed"}}return e.exitCode!==0?P(e,g):r!==null?{failure:{...I(r,"K6_SUMMARY_INVALID"),classification:"infra"},status:"failed"}:{failure:null,status:"passed"}}export function k6EvidenceCollectionFailure(e,t){const r=w(t);return U(e,g,r)??{...I(r,"K6_EVIDENCE_FAILED"),classification:"infra"}}function se(e){return e.match(/TESTKIT_K6_SUMMARY_OUTPUT_INVALID:\s*([^\n"]+)/u)?.[1]?.trim()??null}function ue(e){for(const t of e.split(/\r?\n/u)){if(!t.includes("level=error")||!t.includes("source=stacktrace")&&!t.includes('hint="script exception"'))continue;const r=t.match(/\bmsg="((?:\\.|[^"\\])*)"/u)?.[1];if(r===void 0)continue;const n=le(r).split(/\r?\n/u)[0]?.trim();if(!n)continue;return n.match(/^(?:Error|GoError|TypeError|ReferenceError|RangeError):\s*(.+)$/u)?.[1]?.trim()??n}return null}function le(e){try{const t=JSON.parse(`"${e}"`);if(typeof t=="string")return t}catch{}return e}function de(e){if(e===null||!p(e.metrics))return[];const t=[];for(const[r,n]of Object.entries(e.metrics))if(!(!p(n)||!p(n.thresholds)))for(const[i,a]of Object.entries(n.thresholds))a===!0&&t.push(`${r}(${i})`);return t.sort()}function fe(e){if(e===null||!p(e.metrics)||!p(e.metrics.checks))return null;const{fails:t}=e.metrics.checks;return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function me(e,t,r){const n=r.task,i=Q(t.invocationEnvironment,N(r.inputs.environment),{K6_NO_USAGE_REPORT:"true",TESTKIT_ACTIVE:"1",[W]:r.prepared.runtimeInput.file,[X]:r.prepared.runtimeInput.sha256,TESTKIT_INTERNAL_FILE_DEADLINE_MS:String(n.deadlineMs),TESTKIT_INTERNAL_FILE_TIMEOUT_SECONDS:String(Math.max(1,Math.ceil(n.timeoutMs/1e3))),[ee]:e.invocationId,TESTKIT_LEASE_DIR:n.orchestration.lease.directory,TESTKIT_LEASE_ID:n.orchestration.lease.id,TESTKIT_MODE:n.orchestration.mode,...n.orchestration.runtimeId===void 0?{}:{TESTKIT_RUNTIME_ID:n.orchestration.runtimeId},TESTKIT_TEST_FILE:n.file,[te]:n.id});return e.profile.id==="k6-http"&&Object.defineProperty(i,"BASE_URL",{configurable:!0,enumerable:!0,value:e.target.endpoints[n.serviceName],writable:!0}),G(i),Object.freeze(i)}function pe(e,t,r,n){if(t.id==="k6-http"){const a=e.target.endpoints[r];if(typeof a!="string"||a.trim().length===0)throw new Error(`k6-http requires a published endpoint for service ${r}`);return}const i=n.environment.DATABASE_URL;if(typeof i!="string"||i.trim().length===0)throw new Error("k6-dal requires DATABASE_URL in its resolved task inputs")}function Ee(e){const t=Object.keys(e);if(t.length!==0)throw new Error(`k6 does not accept support modules (${t.join(", ")}); repository configuration must cross the engine boundary as validated JSON`)}function Ie(e,t){return{...ie({engineId:"k6",installationKind:"direct-package",profile:e.profile,target:t.target}),packageName:t.targetPackage.name,packageVersion:t.targetPackage.version,runtimeObservedVersion:t.engineVersion}}function ge(e){return{...I(e,"K6_PREPARE_FAILED"),classification:e instanceof A||e instanceof H?"product":"infra"}}async function x(e){try{return await e()}catch(t){throw new A(t)}}function p(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}
1
+ import{makeTempDirAsync as S}from"../../../process/files/temp-dir.js";import{toError as k}from"../../../kernel/error-serialization.js";import{classifyManagedProcessResult as b,terminalOutcome as y,emptyEvidence as M,failureFromError as E,processExitDetails as K,processExitFailure as A,executeEngineTasks as F,managedProcessFailure as P}from"../../adapters/execution.js";import{requireRootDirectory as U,requireAbsoluteWorkspacePath as R,requireConsumerFile as L,safeSegment as h}from"../../adapters/workspace.js";import d from"node:fs/promises";import v from"node:path";import{isEngineTaskDeadlineExceededReason as C,resolveEngineTaskInputs as V}from"../../api/index.js";import{createInvocationProcessEnvironment as j,runManagedProcess as $}from"../../../process/index.js";import{bundleK6Suite as Y,K6ConsumerCompilationError as H}from"./bundle.js";import{collectK6Evidence as z}from"./evidence.js";import{assertK6SpawnEnvironmentBudget as B,createK6RuntimeInputDocument as G,K6_RUNTIME_INPUT_FILE_ENV as J,K6_RUNTIME_INPUT_SHA256_ENV as W,mergeK6Environment as X,selectK6CustomEnvironment as w,verifyOwnedK6RuntimeInput as Q,writeOwnedK6RuntimeInput as Z}from"./input.js";import{K6_RUNTIME_INVOCATION_ID_ENV as q,K6_RUNTIME_TASK_ID_ENV as ee}from"../../api/k6-runtime-input.js";import{collectK6NativeSummaryArtifacts as te,K6_NATIVE_SUMMARY_DIRECTORY as re}from"./native-summary.js";import{engineEvidenceIdentity as ne}from"../../adapters/evidence-identity.js";import{isUnknownRecord as f}from"../../../kernel/unknown-values.js";const I={codePrefix:"K6",label:"k6"},ie=/^Uncaught testkit suite error during (setup|exec): /u;class N extends Error{constructor(t){const r=k(t);super(r.message,{cause:r}),this.name="K6ConsumerPreparationError"}}export const k6ExecutorDependencies={removeOwnedDirectory:e=>d.rm(e,{force:!0,recursive:!0}),writeRuntimeInput:Z};export async function executeK6Engine(e,t,r,n=k6ExecutorDependencies){const i=await oe(e,t,n,r);return F(e,i.tasks,I,(o,u)=>ae(e,i,o,u),pe(e,i.installation))}async function oe(e,t,r,n){const i=t.executable,o=await U(e.workspace.rootDirectory);R(e.workspace.temporaryDirectory,"temporary directory"),R(e.workspace.artifactDirectory,"artifact directory"),await d.mkdir(e.workspace.temporaryDirectory,{recursive:!0}),await d.mkdir(e.workspace.artifactDirectory,{recursive:!0});const u=await S(`k6-${h(e.invocationId)}-`,{parentDir:e.workspace.temporaryDirectory});n.defer(()=>r.removeOwnedDirectory(u));const s=await j(u),a=[];for(const[l,c]of e.tasks.entries()){const m=V(e,c),T=await S(`${l.toString().padStart(3,"0")}-${h(c.id)}-`,{parentDir:e.workspace.artifactDirectory}),p=v.join(u,`${l.toString().padStart(3,"0")}-${h(c.id)}`),D=v.join(p,"suite.js"),_=v.join(p,re);try{await d.mkdir(p,{mode:448,recursive:!1}),await d.mkdir(_,{mode:448,recursive:!1});const g=await x(()=>L(o,c.file,"k6 task file"));await x(()=>{fe(m.supportModules),w(m.environment)});const O=await r.writeRuntimeInput(p,G(e,c,m));await Y({configuration:m.configuration,entrypoints:t.authoringEntrypoints,nativeSummaryDirectory:_,outputFile:D,rootDirectory:o,signal:e.signal,sourceFile:g}),a.push({artifactDirectory:T,inputs:m,task:c,preparationFailure:null,prepared:{bundleFile:D,nativeSummaryDirectory:_,runtimeInput:O}})}catch(g){a.push({artifactDirectory:T,inputs:m,task:c,preparationFailure:Ee(g),prepared:null})}}return Object.freeze({executable:i,installation:t,invocationEnvironment:s.environment,rootDirectory:o,tasks:Object.freeze(a)})}async function ae(e,t,r,n){const i=Math.max(0,r.task.deadlineMs-n);try{await Q(r.prepared.runtimeInput)}catch(c){return y(r.task.id,"failed",n,M(),{...E(c,"K6_INPUT_INVALID"),classification:"infra"})}const o=`${r.prepared.bundleFile}.summary.json`,u=de(e,t,r),s=await $({args:["run","--address","127.0.0.1:0","--no-color","--quiet","--summary-export",o,r.prepared.bundleFile],cwd:t.rootDirectory,displayLabel:"k6",env:u,executable:t.executable,signal:e.signal,timeoutMs:i});let a;try{a=await z({artifactDirectory:r.artifactDirectory,stderr:s.stderr,stdout:s.stdout,summaryFile:o});const c=await te(r.prepared.nativeSummaryDirectory,r.artifactDirectory);c.length>0&&(a={...a,evidence:{...a.evidence,artifacts:[...a.evidence.artifacts,...c]}})}catch(c){return y(r.task.id,"failed",n,{artifacts:[],logs:[...s.stdout.length>0?[{stream:"stdout",text:s.stdout}]:[],...s.stderr.length>0?[{stream:"stderr",text:s.stderr}]:[]],metrics:[]},k6EvidenceCollectionFailure(s,c))}const l=classifyK6ProcessResult(s,a.summary,a.summaryError,r.task.timeoutMs,C(e.signal.reason));return y(r.task.id,l.status,n,a.evidence,l.failure)}export function classifyK6ProcessResult(e,t,r,n,i){const o=b(e,n,i,I);if(o!==null)return o;const u=se(e.stderr),s=ce(e.stderr);if(s!==null)return{failure:{code:"K6_SUMMARY_OUTPUT_INVALID",message:s,stack:e.stderr},status:"failed"};if(u!==null){const l=ie.exec(u)?.[1];return{failure:{code:"K6_RUNTIME_EXCEPTION",details:{...l===void 0?{}:{phase:l},...K(e),summaryRead:r===null},message:u,stack:e.stderr},status:"failed"}}const a=le(t);if(a.length>0){const l=me(t);return{failure:{code:"K6_THRESHOLDS_FAILED",details:{...K(e),...l===null?{}:{failedChecks:l},thresholds:a},message:`k6 thresholds failed: ${a.join(", ")}`},status:"failed"}}return e.exitCode!==0?A(e,I):r!==null?{failure:{...E(r,"K6_SUMMARY_INVALID"),classification:"infra"},status:"failed"}:{failure:null,status:"passed"}}export function k6EvidenceCollectionFailure(e,t){const r=k(t);return P(e,I,r)??{...E(r,"K6_EVIDENCE_FAILED"),classification:"infra"}}function ce(e){return e.match(/TESTKIT_K6_SUMMARY_OUTPUT_INVALID:\s*([^\n"]+)/u)?.[1]?.trim()??null}function se(e){for(const t of e.split(/\r?\n/u)){if(!t.includes("level=error")||!t.includes("source=stacktrace")&&!t.includes('hint="script exception"'))continue;const r=t.match(/\bmsg="((?:\\.|[^"\\])*)"/u)?.[1];if(r===void 0)continue;const n=ue(r).split(/\r?\n/u)[0]?.trim();if(!n)continue;return n.match(/^(?:Error|GoError|TypeError|ReferenceError|RangeError):\s*(.+)$/u)?.[1]?.trim()??n}return null}function ue(e){try{const t=JSON.parse(`"${e}"`);if(typeof t=="string")return t}catch{}return e}function le(e){if(e===null||!f(e.metrics))return[];const t=[];for(const[r,n]of Object.entries(e.metrics))if(!(!f(n)||!f(n.thresholds)))for(const[i,o]of Object.entries(n.thresholds))o===!0&&t.push(`${r}(${i})`);return t.sort()}function me(e){if(e===null||!f(e.metrics)||!f(e.metrics.checks))return null;const{fails:t}=e.metrics.checks;return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function de(e,t,r){const n=r.task,i=X(t.invocationEnvironment,w(r.inputs.environment),{K6_NO_USAGE_REPORT:"true",TESTKIT_ACTIVE:"1",[J]:r.prepared.runtimeInput.file,[W]:r.prepared.runtimeInput.sha256,TESTKIT_INTERNAL_FILE_DEADLINE_MS:String(n.deadlineMs),TESTKIT_INTERNAL_FILE_TIMEOUT_SECONDS:String(Math.max(1,Math.ceil(n.timeoutMs/1e3))),[q]:e.invocationId,TESTKIT_LEASE_DIR:n.orchestration.lease.directory,TESTKIT_LEASE_ID:n.orchestration.lease.id,TESTKIT_MODE:n.orchestration.mode,...n.orchestration.runtimeId===void 0?{}:{TESTKIT_RUNTIME_ID:n.orchestration.runtimeId},TESTKIT_TEST_FILE:n.file,[ee]:n.id}),o=Object.hasOwn(e.target.endpoints,n.serviceName)?e.target.endpoints[n.serviceName]:null;return o!==null&&Object.defineProperty(i,"BASE_URL",{configurable:!0,enumerable:!0,value:o,writable:!0}),B(i),Object.freeze(i)}function fe(e){const t=Object.keys(e);if(t.length!==0)throw new Error(`k6 does not accept support modules (${t.join(", ")}); repository configuration must cross the engine boundary as validated JSON`)}function pe(e,t){return{...ne({engineId:"k6",installationKind:"direct-package",profile:e.profile,target:t.target}),packageName:t.targetPackage.name,packageVersion:t.targetPackage.version,runtimeObservedVersion:t.engineVersion}}function Ee(e){return{...E(e,"K6_PREPARE_FAILED"),classification:e instanceof N||e instanceof H?"product":"infra"}}async function x(e){try{return await e()}catch(t){throw new N(t)}}
@@ -1 +1 @@
1
- import u from"node:fs/promises";import r from"node:path";import{evidenceFileAccess as A,readStableEvidenceFile as g,writeOwnedEvidenceFile as k}from"../../adapters/evidence-files.js";export const K6_NATIVE_SUMMARY_DIRECTORY="native-summary";const _="manifest.json",b=128*1024,$=128,E=8*1024*1024,F=16*1024*1024,O=/^[a-f0-9]{64}$/u,j=/^[a-f0-9]{64}\.output$/u;export const k6NativeSummaryPersistence={createStagingDirectory:async t=>(await u.mkdir(t,{recursive:!0}),u.mkdtemp(r.join(t,`.${K6_NATIVE_SUMMARY_DIRECTORY}-`))),promoteDirectory:async(t,a)=>{await u.rename(t,a)},removeDirectory:async t=>{await u.rm(t,{force:!0,recursive:!0})},writeOutput:async(t,a)=>{await k(r.dirname(t),r.basename(t),a)}};export async function collectK6NativeSummaryArtifacts(t,a,s=A,e=k6NativeSummaryPersistence){const c=r.join(t,_);let p;try{p=await s.lstat(c)}catch(n){if(I(n,"ENOENT"))return[];throw n}const{contents:S}=await g(c,b,"k6 native summary manifest",s,p),T=JSON.parse(S.toString("utf8")),v=M(T),f=[];let d=0;for(const n of v){const o=r.join(t,n.storedName),i=`k6 native summary output ${n.name}`,{contents:m,sha256:N}=await g(o,E,i,s);if(m.byteLength!==n.sizeBytes)throw new Error(`k6 native summary output ${n.name} has an invalid size`);if(d+=m.byteLength,d>F)throw new Error("k6 native summary outputs exceed their aggregate byte limit");if(N!==n.sha256)throw new Error(`k6 native summary output ${n.name} failed integrity validation`);f.push({contents:m,entry:n})}if(f.length===0)return[];const y=r.join(a,"native-summary"),h=await e.createStagingDirectory(a),w=[];try{for(const[n,{contents:o,entry:i}]of f.entries()){const m=`${n.toString().padStart(3,"0")}-${P(r.basename(i.name))}`;await e.writeOutput(r.join(h,m),o),w.push({contentType:z(i.name),kind:"engine.native-summary",metadata:{originalPath:i.name,sha256:i.sha256},name:`k6-handle-summary:${i.name}`,path:r.join(y,m),summary:`k6 handleSummary output ${i.name}`})}await e.promoteDirectory(h,y)}catch(n){const o=await B(()=>e.removeDirectory(h));throw o!==null?new AggregateError([n,o.error],"k6 native summary publication and staging cleanup both failed",{cause:n}):n}return w}async function B(t){try{return await t(),null}catch(a){return{error:a}}}function M(t){if(!l(t)||t.version!==1||!Array.isArray(t.entries))throw new Error("k6 native summary manifest has an invalid schema");if(t.entries.length>$)throw new Error("k6 native summary manifest exceeds its file-count limit");const a=new Set,s=new Set;return t.entries.map((e,c)=>{if(!l(e))throw new Error(`k6 native summary manifest entry ${c.toString()} must be an object`);if(typeof e.name!="string"||e.name.length===0||e.name.length>240||!x(e.name)||typeof e.sha256!="string"||!O.test(e.sha256)||typeof e.storedName!="string"||!j.test(e.storedName)||typeof e.sizeBytes!="number"||!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0||e.sizeBytes>E)throw new Error(`k6 native summary manifest entry ${c.toString()} is invalid`);if(a.has(e.name)||s.has(e.storedName))throw new Error("k6 native summary manifest contains duplicate outputs");return a.add(e.name),s.add(e.storedName),{name:e.name,sha256:e.sha256,sizeBytes:e.sizeBytes,storedName:e.storedName}})}function x(t){return r.isAbsolute(t)||t.includes("\0")||t.startsWith("\\\\")||/^[a-z]:/iu.test(t)?!1:t.split(/[\\/]/u).every(s=>s.length>0&&s!=="."&&s!=="..")}function z(t){switch(r.extname(t).toLowerCase()){case".json":return"application/json";case".html":return"text/html; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".txt":case".log":case".csv":return"text/plain; charset=utf-8";default:return"application/octet-stream"}}function P(t){const a=t.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"").slice(0,120);return a.length>0?a:"summary-output"}function I(t,a){return l(t)&&t.code===a}function l(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}
1
+ import u from"node:fs/promises";import n from"node:path";import{evidenceFileAccess as k,readStableEvidenceFile as y,writeOwnedEvidenceFile as A}from"../../adapters/evidence-files.js";import{isUnknownRecord as g}from"../../../kernel/unknown-values.js";import{hasErrorCode as _}from"../../../kernel/error-serialization.js";export const K6_NATIVE_SUMMARY_DIRECTORY="native-summary";const b="manifest.json",$=128*1024,F=128,E=8*1024*1024,O=16*1024*1024,B=/^[a-f0-9]{64}$/u,M=/^[a-f0-9]{64}\.output$/u;export const k6NativeSummaryPersistence={createStagingDirectory:async t=>(await u.mkdir(t,{recursive:!0}),u.mkdtemp(n.join(t,`.${K6_NATIVE_SUMMARY_DIRECTORY}-`))),promoteDirectory:async(t,r)=>{await u.rename(t,r)},removeDirectory:async t=>{await u.rm(t,{force:!0,recursive:!0})},writeOutput:async(t,r)=>{await A(n.dirname(t),n.basename(t),r)}};export async function collectK6NativeSummaryArtifacts(t,r,s=k,e=k6NativeSummaryPersistence){const c=n.join(t,b);let p;try{p=await s.lstat(c)}catch(a){if(_(a,"ENOENT"))return[];throw a}const{contents:S}=await y(c,$,"k6 native summary manifest",s,p),v=JSON.parse(S.toString("utf8")),T=x(v),f=[];let l=0;for(const a of T){const o=n.join(t,a.storedName),i=`k6 native summary output ${a.name}`,{contents:m,sha256:N}=await y(o,E,i,s);if(m.byteLength!==a.sizeBytes)throw new Error(`k6 native summary output ${a.name} has an invalid size`);if(l+=m.byteLength,l>O)throw new Error("k6 native summary outputs exceed their aggregate byte limit");if(N!==a.sha256)throw new Error(`k6 native summary output ${a.name} failed integrity validation`);f.push({contents:m,entry:a})}if(f.length===0)return[];const d=n.join(r,"native-summary"),h=await e.createStagingDirectory(r),w=[];try{for(const[a,{contents:o,entry:i}]of f.entries()){const m=`${a.toString().padStart(3,"0")}-${I(n.basename(i.name))}`;await e.writeOutput(n.join(h,m),o),w.push({contentType:P(i.name),kind:"engine.native-summary",metadata:{originalPath:i.name,sha256:i.sha256},name:`k6-handle-summary:${i.name}`,path:n.join(d,m),summary:`k6 handleSummary output ${i.name}`})}await e.promoteDirectory(h,d)}catch(a){const o=await j(()=>e.removeDirectory(h));throw o!==null?new AggregateError([a,o.error],"k6 native summary publication and staging cleanup both failed",{cause:a}):a}return w}async function j(t){try{return await t(),null}catch(r){return{error:r}}}function x(t){if(!g(t)||t.version!==1||!Array.isArray(t.entries))throw new Error("k6 native summary manifest has an invalid schema");if(t.entries.length>F)throw new Error("k6 native summary manifest exceeds its file-count limit");const r=new Set,s=new Set;return t.entries.map((e,c)=>{if(!g(e))throw new Error(`k6 native summary manifest entry ${c.toString()} must be an object`);if(typeof e.name!="string"||e.name.length===0||e.name.length>240||!z(e.name)||typeof e.sha256!="string"||!B.test(e.sha256)||typeof e.storedName!="string"||!M.test(e.storedName)||typeof e.sizeBytes!="number"||!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0||e.sizeBytes>E)throw new Error(`k6 native summary manifest entry ${c.toString()} is invalid`);if(r.has(e.name)||s.has(e.storedName))throw new Error("k6 native summary manifest contains duplicate outputs");return r.add(e.name),s.add(e.storedName),{name:e.name,sha256:e.sha256,sizeBytes:e.sizeBytes,storedName:e.storedName}})}function z(t){return n.isAbsolute(t)||t.includes("\0")||t.startsWith("\\\\")||/^[a-z]:/iu.test(t)?!1:t.split(/[\\/]/u).every(s=>s.length>0&&s!=="."&&s!=="..")}function P(t){switch(n.extname(t).toLowerCase()){case".json":return"application/json";case".html":return"text/html; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".txt":case".log":case".csv":return"text/plain; charset=utf-8";default:return"application/octet-stream"}}function I(t){const r=t.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"").slice(0,120);return r.length>0?r:"summary-output"}
@@ -1 +1 @@
1
- import{check as b}from"k6";import S from"k6/execution";import{emitArtifact as z}from"./artifacts.js";import{areRowsSorted as J}from"./shared/ordering.js";const c=O();export const failureDetails={begin:startFailureCollection,flush:emitFailureCollectionArtifact};export function evaluateCheck(e,t,n,i=null){const r=s(t,"unnamed check"),a=b(e,{[r]:n});if(!a){const l=i?i():{kind:"runtime-check",key:r,title:r,checkName:r,phase:c.phase};recordFailureDetail(l)}return a}export function json(e,t){if(typeof e.body!="string")throw new TypeError("response body must be text to parse JSON");const n=JSON.parse(e.body);if(t&&!t(n))throw new TypeError("response JSON did not match the expected shape");return n}export function contains(e,t,n){const i=String(t);return e.some(r=>r[i]===n)}export function allMatch(e,t){return e.length>0&&e.every(t)}export function isSorted(e,t,n="asc"){return J(e,t,n)}export function startFailureCollection(e){c.phase=s(e,"exec"),c.detailsByName=new Map}export function emitFailureCollectionArtifact(){const e=[...c.detailsByName.values()].sort((t,n)=>t.key.localeCompare(n.key)||t.title.localeCompare(n.title)).map(t=>({...t}));e.length>0&&z("failure-details",{phase:c.phase,failures:e},{kind:"testkit.failure-details",summary:`${String(e.length)} failure detail(s)`}),startFailureCollection(c.phase)}export function recordFailureDetail(e){const t=w(e);if(!t)return;const n=S.vu.metrics.tags.group;typeof n=="string"&&n.length>0&&(t.groupPath=n.replace(/^::/,"").split("::"),t.key=C(t.groupPath,t.key));const i=JSON.stringify([t.key,t.labelled??null,t.title]),r=c.detailsByName.get(i);if(!r){c.detailsByName.set(i,t);return}r.count+=t.count}function O(){return{phase:"exec",detailsByName:new Map}}function w(e){if(!f(e))return null;const t=s(o(e,"kind"),null),n=s(o(e,"key"),null),i=s(o(e,"title"),null);if(!t||!n||!i)return null;const r={kind:t,key:n,title:i,count:1},a=o(e,"labelled");typeof a=="boolean"&&(r.labelled=a);const l=s(o(e,"checkName"),null);l&&(r.checkName=l);const p=s(o(e,"phase"),null);p&&(r.phase=p);const m=s(o(e,"message"),null);m&&(r.message=m);const d=o(e,"expected");d!==void 0&&(r.expected=d);const h=o(e,"actual");h!==void 0&&(r.actual=h);const y=s(o(e,"traceId"),null);y&&(r.traceId=y);const k=u(o(e,"request"));k&&(r.request=k);const g=u(o(e,"response"));g&&(r.response=g);const x=u(o(e,"location"));x&&(r.location=x);const N=s(o(e,"stack"),null);return N&&(r.stack=N),r}function C(e,t){return e.length===0?t:[...e,t].join(" > ")}function s(e,t){if(typeof e!="string")return t;const n=e.trim();return n.length>0?n:t}function u(e){if(!f(e))return null;try{const t=F(e);if(t===void 0)return null;const n=JSON.parse(t);return B(n)?n:null}catch{return null}}function o(e,t){return Reflect.get(e,t)}function f(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function B(e){return f(e)}function F(e){return JSON.stringify(e)}
1
+ import{check as S}from"k6";import b from"k6/execution";import{emitArtifact as z}from"./artifacts.js";import{areRowsSorted as w}from"./shared/ordering.js";import{isUnknownRecord as u}from"../../../kernel/unknown-values.js";const c=J();export const failureDetails={begin:startFailureCollection,flush:emitFailureCollectionArtifact};export function evaluateCheck(e,t,n,i=null){const r=s(t,"unnamed check"),a=S(e,{[r]:n});if(!a){const l=i?i():{kind:"runtime-check",key:r,title:r,checkName:r,phase:c.phase};recordFailureDetail(l)}return a}export function json(e,t){if(typeof e.body!="string")throw new TypeError("response body must be text to parse JSON");const n=JSON.parse(e.body);if(t&&!t(n))throw new TypeError("response JSON did not match the expected shape");return n}export function contains(e,t,n){const i=String(t);return e.some(r=>r[i]===n)}export function allMatch(e,t){return e.length>0&&e.every(t)}export function isSorted(e,t,n="asc"){return w(e,t,n)}export function startFailureCollection(e){c.phase=s(e,"exec"),c.detailsByName=new Map}export function emitFailureCollectionArtifact(){const e=[...c.detailsByName.values()].sort((t,n)=>t.key.localeCompare(n.key)||t.title.localeCompare(n.title)).map(t=>({...t}));e.length>0&&z("failure-details",{phase:c.phase,failures:e},{kind:"testkit.failure-details",summary:`${String(e.length)} failure detail(s)`}),startFailureCollection(c.phase)}export function recordFailureDetail(e){const t=O(e);if(!t)return;const n=b.vu.metrics.tags.group;typeof n=="string"&&n.length>0&&(t.groupPath=n.replace(/^::/,"").split("::"),t.key=C(t.groupPath,t.key));const i=JSON.stringify([t.key,t.labelled??null,t.title]),r=c.detailsByName.get(i);if(!r){c.detailsByName.set(i,t);return}r.count+=t.count}function J(){return{phase:"exec",detailsByName:new Map}}function O(e){if(!u(e))return null;const t=s(o(e,"kind"),null),n=s(o(e,"key"),null),i=s(o(e,"title"),null);if(!t||!n||!i)return null;const r={kind:t,key:n,title:i,count:1},a=o(e,"labelled");typeof a=="boolean"&&(r.labelled=a);const l=s(o(e,"checkName"),null);l&&(r.checkName=l);const p=s(o(e,"phase"),null);p&&(r.phase=p);const m=s(o(e,"message"),null);m&&(r.message=m);const d=o(e,"expected");d!==void 0&&(r.expected=d);const h=o(e,"actual");h!==void 0&&(r.actual=h);const y=s(o(e,"traceId"),null);y&&(r.traceId=y);const k=f(o(e,"request"));k&&(r.request=k);const g=f(o(e,"response"));g&&(r.response=g);const x=f(o(e,"location"));x&&(r.location=x);const N=s(o(e,"stack"),null);return N&&(r.stack=N),r}function C(e,t){return e.length===0?t:[...e,t].join(" > ")}function s(e,t){if(typeof e!="string")return t;const n=e.trim();return n.length>0?n:t}function f(e){if(!u(e))return null;try{const t=F(e);if(t===void 0)return null;const n=JSON.parse(t);return B(n)?n:null}catch{return null}}function o(e,t){return Reflect.get(e,t)}function B(e){return u(e)}function F(e){return JSON.stringify(e)}
@@ -1 +1 @@
1
- import{readProperty as d}from"./shared/properties.js";import{readTestkitContext as F}from"../../contracts/test-context.js";import{createFixtureScope as y}from"./shared/fixture-engine.js";import{emitArtifact as D}from"./artifacts.js";export function defineDalFixtures(e){if(typeof e!="function")throw new Error("defineDalFixtures(factory) requires a fixture factory function.");return{create:e}}export function createDalFixtureRuntime({db:e,dal:t,definition:c=null,env:f=__ENV}){const a=F(f),r=y({namespace:`dal-${a.namespace}`}),n=w(c),s=n?A(h(n,{db:e,dal:t,fixtureScope:r,seed:(i,x,m,p)=>r.seed(i,x,m,p),values:r.values})):{};let o=!1;function l(){if(o)return;const i=r.records();i.length!==0&&(D("dal-fixtures",{namespace:r.namespace,fixtures:i},{kind:"testkit.dal-fixtures",summary:`${i.length.toString()} DAL fixture(s)`}),o=!0)}return{fixtures:s,fixtureScope:r,emitArtifactOnce:l}}function w(e){if(!e)return null;if(!u(e))throw new Error("DAL fixture definitions must be created with defineDalFixtures(...).");const t=d(e,"create");if(!E(t))throw new Error("DAL fixture definitions must be created with defineDalFixtures(...).");return{create:t,receiver:e}}function h(e,t){return Reflect.apply(e.create,e.receiver,[t])}function A(e){if(!u(e))throw new Error("DAL fixture factories must return an object.");return e}function E(e){return typeof e=="function"}function u(e){return typeof e=="object"&&e!==null||typeof e=="function"}
1
+ import{readProperty as d}from"./shared/properties.js";import{readTestkitContext as F}from"../../contracts/test-context.js";import{createFixtureScope as D}from"./shared/fixture-engine.js";import{emitArtifact as w}from"./artifacts.js";import{isPropertyContainer as u}from"../../../kernel/unknown-values.js";export function defineDalFixtures(e){if(typeof e!="function")throw new Error("defineDalFixtures(factory) requires a fixture factory function.");return{create:e}}export function createDalFixtureRuntime({db:e,dal:t,definition:c=null,env:f=__ENV}){const a=F(f),r=D({namespace:`dal-${a.namespace}`}),n=y(c),s=n?A(h(n,{db:e,dal:t,fixtureScope:r,seed:(i,l,x,p)=>r.seed(i,l,x,p),values:r.values})):{};let o=!1;function m(){if(o)return;const i=r.records();i.length!==0&&(w("dal-fixtures",{namespace:r.namespace,fixtures:i},{kind:"testkit.dal-fixtures",summary:`${i.length.toString()} DAL fixture(s)`}),o=!0)}return{fixtures:s,fixtureScope:r,emitArtifactOnce:m}}function y(e){if(!e)return null;if(!u(e))throw new Error("DAL fixture definitions must be created with defineDalFixtures(...).");const t=d(e,"create");if(!E(t))throw new Error("DAL fixture definitions must be created with defineDalFixtures(...).");return{create:t,receiver:e}}function h(e,t){return Reflect.apply(e.create,e.receiver,[t])}function A(e){if(!u(e))throw new Error("DAL fixture factories must return an object.");return e}function E(e){return typeof e=="function"}
@@ -1 +1 @@
1
- import{readProperty as r}from"./shared/properties.js";import{fail as l}from"k6";import{emitFailureCollectionArtifact as m,startFailureCollection as x}from"./checks.js";import{createDalContext as D}from"./dal.js";import{createDalFixtureRuntime as w}from"./dal-fixtures.js";import{defaultSuiteOptions as A,formatFatalSuiteError as d}from"./http-suite-runtime.js";export function defineDalSuite(t,e){const{config:n,run:f}=C(t,e),o=D(n.db);if(!E(o))throw new Error("DAL suite database context requires query, exec, and truncate functions.");const c=o,a=c.db,i=w({db:a,dal:c,definition:n.fixtures});return{options:n.options||A,setup(){if(!n.setup)return null;x("setup");let s=!1;try{const u=n.setup({db:a,dal:c,fixtures:i.fixtures,fixtureScope:i.fixtureScope});return s=!0,u}catch(u){l(d("setup",u))}finally{s||i.emitArtifactOnce(),m()}},exec(s){x("exec");try{return f({db:a,dal:c,fixtures:i.fixtures,fixtureScope:i.fixtureScope,setupData:s})}catch(u){l(d("exec",u))}finally{i.emitArtifactOnce(),m()}}}}function C(t,e){if(y(t))return{config:{fixtures:null},run:t};if(!y(e))throw new Error("suite factory requires a run callback");return{config:S(t),run:e}}function S(t){if(!t)return{fixtures:null};if(!p(t))throw new Error("DAL suite config must be an object.");const e=h(r(t,"db")),n=r(t,"fixtures")||null,f=g(r(t,"options")),o=r(t,"setup");return{...e?{db:e}:{},fixtures:n,...f?{options:f}:{},...q(o)?{setup:o}:{}}}function h(t){if(t){if(!b(t))throw new Error("DAL suite config.db requires query and exec functions.");return t}}function g(t){if(t){if(!R(t))throw new Error("DAL suite config.options must be an object.");return t}}function y(t){return typeof t=="function"}function q(t){return typeof t=="function"}function E(t){return p(t)?b(r(t,"db"))&&typeof r(t,"truncate")=="function":!1}function b(t){return p(t)?typeof r(t,"query")=="function"&&typeof r(t,"exec")=="function":!1}function p(t){return typeof t=="object"&&t!==null||typeof t=="function"}function R(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}
1
+ import{readProperty as r}from"./shared/properties.js";import{fail as l}from"k6";import{emitFailureCollectionArtifact as m,startFailureCollection as x}from"./checks.js";import{createDalContext as D}from"./dal.js";import{createDalFixtureRuntime as w}from"./dal-fixtures.js";import{defaultSuiteOptions as C,formatFatalSuiteError as d}from"./http-suite-runtime.js";import{isPropertyContainer as p,isUnknownRecord as S}from"../../../kernel/unknown-values.js";export function defineDalSuite(t,e){const{config:n,run:f}=A(t,e),o=D(n.db);if(!R(o))throw new Error("DAL suite database context requires query, exec, and truncate functions.");const c=o,a=c.db,i=w({db:a,dal:c,definition:n.fixtures});return{options:n.options||C,setup(){if(!n.setup)return null;x("setup");let s=!1;try{const u=n.setup({db:a,dal:c,fixtures:i.fixtures,fixtureScope:i.fixtureScope});return s=!0,u}catch(u){l(d("setup",u))}finally{s||i.emitArtifactOnce(),m()}},exec(s){x("exec");try{return f({db:a,dal:c,fixtures:i.fixtures,fixtureScope:i.fixtureScope,setupData:s})}catch(u){l(d("exec",u))}finally{i.emitArtifactOnce(),m()}}}}function A(t,e){if(b(t))return{config:{fixtures:null},run:t};if(!b(e))throw new Error("suite factory requires a run callback");return{config:h(t),run:e}}function h(t){if(!t)return{fixtures:null};if(!p(t))throw new Error("DAL suite config must be an object.");const e=g(r(t,"db")),n=r(t,"fixtures")||null,f=q(r(t,"options")),o=r(t,"setup");return{...e?{db:e}:{},fixtures:n,...f?{options:f}:{},...E(o)?{setup:o}:{}}}function g(t){if(t){if(!y(t))throw new Error("DAL suite config.db requires query and exec functions.");return t}}function q(t){if(t){if(!S(t))throw new Error("DAL suite config.options must be an object.");return t}}function b(t){return typeof t=="function"}function E(t){return typeof t=="function"}function R(t){return p(t)?y(r(t,"db"))&&typeof r(t,"truncate")=="function":!1}function y(t){return p(t)?typeof r(t,"query")=="function"&&typeof r(t,"exec")=="function":!1}
@@ -1 +1 @@
1
- import{readProperty as y}from"./shared/properties.js";import{resolveHttpProfile as H}from"../../../config/authoring/runtime.js";import{createHttpClient as b,getEnv as E}from"./http.js";export function normalizeSuiteArgs(t,n){if(m(t))return{config:{},run:t};if(!m(n))throw new Error("suite factory requires a run callback");return{config:g(t),run:n}}export function mergeProfileConfig(t){const n=g(t),r=S(n.profile),i=r?H(r):null,e=i?g(i):null,u=n.auth??e?.auth??null,f=n.headers??e?.headers,o=n.rawHeaders??e?.rawHeaders,s=n.env??e?.env,c=A(n.options??e?.options);return{...e??{},...n,auth:u,headers:f,rawHeaders:o,options:c,env:s}}export function resolveRuntimeConfig(t,n=null){const r=mergeProfileConfig(t),i=r.env??E(),e=x(i),u=k(r.auth),f=w(r.headers,"HTTP suite headers"),o=w(r.rawHeaders,"HTTP suite rawHeaders"),s=z(n)?n:null,c=b({baseUrl:e.BASE,defaultActor:s?.primaryActor??null,sessionBundle:s,getHeaders(l){return{...T(u,n,e,l.actorName),...p(f,n,e,l.actorName,"HTTP suite headers")}},getRawHeaders(l){return p(o,n,e,l.actorName,"HTTP suite rawHeaders")}});return{auth:u,client:c,env:e,resolvedConfig:r,runtimeHttp:c.rawHttp,sessionBundle:s}}export function executeSuiteSetup(t,n,r){return t?.setup?Reflect.apply(t.setup.callable,t.setup.receiver,[{env:n,http:r}]):null}export function invokeSuiteRun(t,n){return Reflect.apply(t,void 0,[n])}export function createSuiteActors(t,n){const r=Object.keys(t?.actors??{}),i=r.map(o=>{const s=t?.actors[o],c=n.as(o);return{email:s?.email??null,headers:c.headers(),index:s?.actorIndex??0,key:o,name:s?.name??null,organizationKey:s?.organizationKey??null,organizationName:s?.organizationName??null,rawHeaders:c.rawHeaders(),rawReq:c.rawReq,req:c,session:s?.session??null}}),e=new Map(i.map(o=>[o.key,o])),u=t?.primaryActor??null,f=u?e.get(u)??null:null;return{actor:f,actors:{names:r,primary:f,get(o){const s=e.get(o);if(!s)throw new Error(`Unknown testkit actor "${o}"`);return s},has(o){return e.has(o)},list(){return i.slice()}}}}export const defaultSuiteOptions={iterations:1,thresholds:{checks:["rate==1.0"]}};export function formatFatalSuiteError(t,n){return n instanceof Error?`Uncaught testkit suite error during ${t}: ${n.message}`:`Uncaught testkit suite error during ${t}: ${String(n)}`}export function buildRuntimeExceptionDetail(t,n){const r=n instanceof Error?n.message:String(n),i=n instanceof Error&&typeof n.stack=="string"?n.stack:"",e=$(i);return{kind:"runtime-exception",key:e?`${e.path}:${String(e.line)}:${String(e.column)}`:`runtime-exception:${t}:${r}`,title:"Uncaught runtime exception",message:`Uncaught testkit suite error during ${t}: ${r}`,location:e,stack:i}}function p(t,n,r,i,e){if(!t)return{};const u=Reflect.apply(t.callable,t.receiver,[n,{actor:i,env:r}]);return P(u,e)}function T(t,n,r,i){return p(t?.headers??null,n,r,i,"HTTP suite auth.headers")}function g(t){if(!a(t))throw new Error("HTTP suite config must be an object");return t}function S(t){if(t==null||t==="")return null;if(typeof t!="string")throw new Error("HTTP suite config.profile must be a string");return t}function A(t){if(t!=null){if(!a(t))throw new Error("HTTP suite options must be an object");return t}}function k(t){if(t==null)return null;if(!C(t))throw new Error("HTTP suite auth must be an object");return{headers:h(t,"headers","HTTP suite auth.headers"),setup:h(t,"setup","HTTP suite auth.setup")}}function h(t,n,r){const i=y(t,n);if(i==null)return null;if(!m(i))throw new Error(`${r} must be a function`);return{callable:i,receiver:t}}function w(t,n){if(t==null)return null;if(!m(t))throw new Error(`${n} must be a function`);return{callable:t,receiver:void 0}}function P(t,n){if(t==null)return{};if(!j(t))throw new Error(`${n} must return string-valued headers`);return t}function x(t){if(!a(t))throw new Error("HTTP suite env must be an object");return{...t,BASE:typeof t.BASE=="string"?t.BASE:"",rawEnv:__ENV}}function z(t){return!a(t)||!a(t.actors)||t.primaryActor!==null&&typeof t.primaryActor!="string"?!1:Object.values(t.actors).every(n=>n===void 0||R(n))}function R(t){return a(t)?typeof t.actorIndex=="number"&&typeof t.actorName=="string"&&d(t.email)&&d(t.name)&&d(t.organizationKey)&&d(t.organizationName)&&(t.session===null||a(t.session)):!1}function $(t){if(!t)return null;const r=[...t.matchAll(/(file:\/\/[^\s)]+|\/[^\s):]+):(\d+):(\d+)/g)].at(0),i=r?.[1],e=r?.[2],u=r?.[3];return!i||!e||!u?null:{path:N(i),line:Number(e),column:Number(u)}}function N(t){return t.startsWith("file://")?t.slice(7):t}function m(t){return typeof t=="function"}function C(t){return typeof t=="object"&&t!==null||typeof t=="function"}function a(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function j(t){return a(t)&&Object.values(t).every(n=>typeof n=="string")}function d(t){return t===void 0||typeof t=="string"}
1
+ import{readProperty as H}from"./shared/properties.js";import{resolveHttpProfile as y}from"../../../config/authoring/runtime.js";import{createHttpClient as b,getEnv as E}from"./http.js";import{isPropertyContainer as T,isUnknownRecord as c}from"../../../kernel/unknown-values.js";export function normalizeSuiteArgs(e,t){if(m(e))return{config:{},run:e};if(!m(t))throw new Error("suite factory requires a run callback");return{config:g(e),run:t}}export function mergeProfileConfig(e){const t=g(e),r=k(t.profile),i=r?y(r):null,n=i?g(i):null,u=t.auth??n?.auth??null,l=t.headers??n?.headers,o=t.rawHeaders??n?.rawHeaders,s=t.env??n?.env,a=P(t.options??n?.options);return{...n??{},...t,auth:u,headers:l,rawHeaders:o,options:a,env:s}}export function resolveRuntimeConfig(e,t=null){const r=mergeProfileConfig(e),i=r.env??E(),n=z(i),u=x(r.auth),l=w(r.headers,"HTTP suite headers"),o=w(r.rawHeaders,"HTTP suite rawHeaders"),s=R(t)?t:null,a=b({baseUrl:n.BASE,defaultActor:s?.primaryActor??null,sessionBundle:s,getHeaders(f){return{...S(u,t,n,f.actorName),...p(l,t,n,f.actorName,"HTTP suite headers")}},getRawHeaders(f){return p(o,t,n,f.actorName,"HTTP suite rawHeaders")}});return{auth:u,client:a,env:n,resolvedConfig:r,runtimeHttp:a.rawHttp,sessionBundle:s}}export function executeSuiteSetup(e,t,r){return e?.setup?Reflect.apply(e.setup.callable,e.setup.receiver,[{env:t,http:r}]):null}export function invokeSuiteRun(e,t){return Reflect.apply(e,void 0,[t])}export function createSuiteActors(e,t){const r=Object.keys(e?.actors??{}),i=r.map(o=>{const s=e?.actors[o],a=t.as(o);return{email:s?.email??null,headers:a.headers(),index:s?.actorIndex??0,key:o,name:s?.name??null,organizationKey:s?.organizationKey??null,organizationName:s?.organizationName??null,rawHeaders:a.rawHeaders(),rawReq:a.rawReq,req:a,session:s?.session??null}}),n=new Map(i.map(o=>[o.key,o])),u=e?.primaryActor??null,l=u?n.get(u)??null:null;return{actor:l,actors:{names:r,primary:l,get(o){const s=n.get(o);if(!s)throw new Error(`Unknown testkit actor "${o}"`);return s},has(o){return n.has(o)},list(){return i.slice()}}}}export const defaultSuiteOptions={iterations:1,thresholds:{checks:["rate==1.0"]}};export function formatFatalSuiteError(e,t){return t instanceof Error?`Uncaught testkit suite error during ${e}: ${t.message}`:`Uncaught testkit suite error during ${e}: ${String(t)}`}export function buildRuntimeExceptionDetail(e,t){const r=t instanceof Error?t.message:String(t),i=t instanceof Error&&typeof t.stack=="string"?t.stack:"",n=N(i);return{kind:"runtime-exception",key:n?`${n.path}:${String(n.line)}:${String(n.column)}`:`runtime-exception:${e}:${r}`,title:"Uncaught runtime exception",message:`Uncaught testkit suite error during ${e}: ${r}`,location:n,stack:i}}function p(e,t,r,i,n){if(!e)return{};const u=Reflect.apply(e.callable,e.receiver,[t,{actor:i,env:r}]);return A(u,n)}function S(e,t,r,i){return p(e?.headers??null,t,r,i,"HTTP suite auth.headers")}function g(e){if(!c(e))throw new Error("HTTP suite config must be an object");return e}function k(e){if(e==null||e==="")return null;if(typeof e!="string")throw new Error("HTTP suite config.profile must be a string");return e}function P(e){if(e!=null){if(!c(e))throw new Error("HTTP suite options must be an object");return e}}function x(e){if(e==null)return null;if(!T(e))throw new Error("HTTP suite auth must be an object");return{headers:h(e,"headers","HTTP suite auth.headers"),setup:h(e,"setup","HTTP suite auth.setup")}}function h(e,t,r){const i=H(e,t);if(i==null)return null;if(!m(i))throw new Error(`${r} must be a function`);return{callable:i,receiver:e}}function w(e,t){if(e==null)return null;if(!m(e))throw new Error(`${t} must be a function`);return{callable:e,receiver:void 0}}function A(e,t){if(e==null)return{};if(!j(e))throw new Error(`${t} must return string-valued headers`);return e}function z(e){if(!c(e))throw new Error("HTTP suite env must be an object");return{...e,BASE:typeof e.BASE=="string"?e.BASE:"",rawEnv:__ENV}}function R(e){return!c(e)||!c(e.actors)||e.primaryActor!==null&&typeof e.primaryActor!="string"?!1:Object.values(e.actors).every(t=>t===void 0||$(t))}function $(e){return c(e)?typeof e.actorIndex=="number"&&typeof e.actorName=="string"&&d(e.email)&&d(e.name)&&d(e.organizationKey)&&d(e.organizationName)&&(e.session===null||c(e.session)):!1}function N(e){if(!e)return null;const r=[...e.matchAll(/(file:\/\/[^\s)]+|\/[^\s):]+):(\d+):(\d+)/g)].at(0),i=r?.[1],n=r?.[2],u=r?.[3];return!i||!n||!u?null:{path:C(i),line:Number(n),column:Number(u)}}function C(e){return e.startsWith("file://")?e.slice(7):e}function m(e){return typeof e=="function"}function j(e){return c(e)&&Object.values(e).every(t=>typeof t=="string")}function d(e){return e===void 0||typeof e=="string"}
@@ -1 +1 @@
1
- import{createHttpMethods as P,createBodyMethods as _}from"../../../config/authoring/http-methods.js";import R from"k6/http";import{emitArtifact as F}from"./artifacts.js";import{fixture as L}from"./fixtures.js";const V=new Set(["token","organizationId"]),v=new Set(["authorization","cookie","x-admin-key"]),C=320,z=String,y=X();export function getEnv(){const e=__ENV.BASE_URL;if(!e)throw new Error("BASE_URL env var required");return{BASE:e}}export function createHttpClient(e){const{baseUrl:t,defaultActor:r=null,defaultHeaders:c={"Content-Type":"application/json"},sessionBundle:o=null,getHeaders:d=null,getRawHeaders:p=null}=e;if(!t)throw new Error("baseUrl is required");function m(n,i,s={},u={}){const{includeDefaultHeaders:l=!0,contentTypeJson:a=!0}=u,f={...l?c:{},...re(n,i),...s};return a||(delete f["Content-Type"],delete f["content-type"]),f}function H(n=null){return{actor:n&&o&&o.actors[n]||null,actorName:n,sessionBundle:o}}function h(n){if(!(!n||!o)&&!o.actors[n])throw new Error(`Unknown testkit actor "${n}"`)}function b(n,i={}){h(n);const s=H(n);return m(d,s,i)}function g(n=null,i={}){h(n);const s=H(n);return m(p,s,i)}function q(n,i,s,u,l={},a={}){h(n);const f=`${t}${s}`,E=H(n),S=m(d,E,l,{contentTypeJson:a.contentTypeJson!==!1,includeDefaultHeaders:a.includeDefaultHeaders!==!1});return $(i,s,f,u,S,E.actor,a)}function T(n,i,s,u,l={},a={}){h(n);const f=`${t}${s}`,E=H(n),S=m(p,E,l,{contentTypeJson:a.contentTypeJson!==!1,includeDefaultHeaders:a.includeDefaultHeaders!==!1});return $(i,s,f,u,S,E.actor,a)}function w(n,i,s,u,l={},a={}){const f=J(u);return q(n,i,s,f,l,{...a,contentTypeJson:!1,includeDefaultHeaders:!1,serialize:"raw"})}function U(n,i,s,u,l={},a={}){const f=J(u);return T(n,i,s,f,l,{...a,contentTypeJson:!1,includeDefaultHeaders:!1,serialize:"raw"})}function I(n){const i=D(n),s=(u,l,a,f={})=>q(n,u,l,a,f);return{...P(s,null),headers(u={}){return b(n,u)},rawHeaders(u={}){return g(n,u)},request:s,rawReq:i,raw(u,l,a,f={},E={}){return i(u,l,a,f,E)},rawGet:i.get,rawDelete:i.delete,rawPost:i.post,rawPut:i.put,rawPatch:i.patch,multipart:_((u,l,a,f={})=>w(n,u,l,a,f)),rawMultipart:i.multipart}}function D(n=null){const i=(s,u,l,a={},f={})=>T(n,s,u,l,a,f);return Object.assign(i,{...P(i,null),request:i,headers(s={}){return g(n,s)},as(s){return h(s),D(s)},multipart:_((s,u,l,a={})=>U(n,s,u,l,a))})}const x=I(r),A=D(null);return Object.assign(function(i,s,u=null,l,a={}){const f=arguments.length>=4?l:u;return x.request(i,s,f,a)},{rawHttp:R,headers:x.headers,rawHeaders(n=null,i={}){return g(n,i)},as(n){return h(n),I(n)},request:x.request,get:x.get,delete:x.delete,post:x.post,put:x.put,patch:x.patch,raw:A,rawGet:A.get,rawDelete:A.delete,rawPost:A.post,rawPut:A.put,rawPatch:A.patch,multipart:x.multipart,rawMultipart:A.multipart})}export function makeReq(e,t=null,r=null,c=null){return createHttpClient({baseUrl:e,sessionBundle:t,defaultActor:c,getHeaders:r??void 0})}export function makeRawReq(e,t=null){return createHttpClient({baseUrl:e,getRawHeaders:t??void 0}).raw}function $(e,t,r,c,o,d=null,p={}){const m=te(),H=ee(m),h={...o,"x-request-id":o["x-request-id"]||o["X-Request-Id"]||H},b=G({ordinal:m,requestId:h["x-request-id"],method:e,path:t,url:r,actorRecord:d,requestHeaders:h}),g=N(h,p),q=ie(c,p.serialize||"json"),T=e;let w;if(T==="GET")w=R.get(r,g);else if(T==="PUT")w=R.put(r,q,g);else if(T==="POST")w=R.post(r,q,g);else if(T==="PATCH")w=R.patch(r,q,g);else if(T==="DELETE")w=R.del(r,q,g);else throw new Error(`unsupported method: ${T}`);return Q(b,w),y.traces.push(b),W(),ne(w,b)}function N(e,t={}){const r={...t};return Reflect.deleteProperty(r,"contentTypeJson"),Reflect.deleteProperty(r,"includeDefaultHeaders"),Reflect.deleteProperty(r,"serialize"),{...r,headers:e}}export function startHttpTraceCollection(e){y.phase=B(e,"exec"),y.traces=[],y.counter=0}export function emitHttpTraceCollectionArtifact(){const e=y.traces.map(t=>({...t}));e.length>0&&F("http-traces",{phase:y.phase,traces:e},{kind:"testkit.http-traces",summary:`${String(e.length)} HTTP trace(s)`}),startHttpTraceCollection(y.phase)}export function getHttpTrace(e){return e?.__testkit?.httpTrace||null}export function summarizeHttpTrace(e){const t=getHttpTrace(e);return t?{actorName:t.actorName,id:t.id,organizationKey:t.organizationKey,organizationName:t.organizationName,requestId:t.requestId,method:t.method,path:t.path,url:t.url,requestHeaders:t.requestHeaders,response:t.response,startedAt:t.startedAt,finishedAt:t.finishedAt,durationMs:t.durationMs}:null}export function safeJson(e,t){try{const r=e?.body;if(typeof r!="string")throw new TypeError("response body is not text");const c=JSON.parse(r);return t&&!t(c)?{ok:!1,error:"response JSON did not match the expected shape"}:{ok:!0,value:c}}catch(r){return{ok:!1,error:r instanceof Error?r.message:z(r)}}}export function toBodyPreview(e){const t=M(e?.headers?.["Content-Type"]||e?.headers?.["content-type"]||null),r=typeof e?.body=="string"?e.body:"";if(!r.trim())return null;if(t?.includes("application/json"))try{return k(JSON.stringify(JSON.parse(r)),C)}catch{return k(r,C)}return k(r,C)}function G({ordinal:e,requestId:t,method:r,path:c,url:o,actorRecord:d,requestHeaders:p}){return{actorName:d?.actorName||null,id:`${y.phase}-${String(e).padStart(3,"0")}`,organizationKey:d?.organizationKey||null,organizationName:d?.organizationName||null,requestId:t,startedAt:new Date().toISOString(),method:r,path:O(c),url:Y(o),requestHeaders:Z(p)}}function Q(e,t){const r=new Date;e.finishedAt=r.toISOString(),e.durationMs=Math.max(0,r.getTime()-Date.parse(e.startedAt)),e.response={status:t.status||null,contentType:M(t.headers["Content-Type"]||t.headers["content-type"]||null),bodyPreview:toBodyPreview(t),bodyTruncated:typeof t.body=="string"&&t.body.length>C}}function W(){y.traces.length<=y.maxEntries||y.traces.splice(0,y.traces.length-y.maxEntries)}function X(){return{phase:"exec",traces:[],counter:0,maxEntries:50}}function O(e){const[t,r]=e.split("?");if(!r)return t;const c=r.split("&").map(o=>{const[d]=o.split("="),p=oe(d);return V.has(p)?`${d||encodeURIComponent(p)}=${encodeURIComponent("[REDACTED]")}`:o});return`${t}?${c.join("&")}`}function Y(e){const t=e.indexOf("://");if(t===-1)return O(e);const r=e.indexOf("/",t+3);return r===-1?e:`${e.slice(0,r)}${O(e.slice(r))}`}function Z(e){const t={};for(const[r,c]of Object.entries(e)){const o=r,d=o.toLowerCase();t[o]=v.has(d)?"[REDACTED]":j(c)}return t}function j(e){return Array.isArray(e)?e.map(t=>z(t)):e==null?null:z(e)}function M(e){const t=j(e);return Array.isArray(t)?t[0]||null:t}function ee(e){return`tk_${B(__ENV.TESTKIT_RUNTIME_ID,"runtime")}_${y.phase}_${String(e).padStart(4,"0")}`}function te(){return y.counter+=1,y.counter}function k(e,t){const r=(e?z(e):"").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,Math.max(0,t-3))}...`}function B(e,t){if(typeof e!="string")return t;const r=e.trim();return r.length>0?r:t}function re(e,t){return e?e(t)||{}:{}}function ne(e,t){const r={body:e.body,cookies:e.cookies,headers:e.headers,json(o){return e.json(o)},status:e.status,timings:e.timings};for(const o of Object.keys(e))Reflect.set(r,o,Reflect.get(e,o));const c=Object.getPrototypeOf(e);if(c&&typeof c=="object")for(const o of Object.getOwnPropertyNames(c)){if(o==="constructor"||o in r)continue;const p=Object.getOwnPropertyDescriptor(c,o)?.value;if(typeof p!="function")continue;const m=p;Reflect.set(r,o,(...H)=>Reflect.apply(m,e,H))}return r.__testkit={httpTrace:t,rawResponse:e},r}function oe(e){const t=e?z(e):"";try{return decodeURIComponent(t)}catch{return t}}function ie(e,t="json"){if(e==null)return e;if(t==="raw"){if(ue(e))return e;throw new TypeError("raw request body is not supported by k6")}return typeof e=="string"?e:JSON.stringify(e)}function J(e={}){const t=e.fields??{},r=e.files??[],c={...t};for(const o of r){const d=o.field.trim();if(!d)throw new Error("multipart file entries require a field name");const p=se(o);if(p.data===void 0)throw new Error(`multipart file entry "${d}" requires data or a fixture`);c[d]=R.file(p.data,p.filename,p.contentType)}return c}function se(e){return typeof e.fixture=="string"?L(e.fixture):e.fixture?e.fixture:e.file?e.file:e}function ue(e){return typeof e=="string"||e instanceof ArrayBuffer?!0:K(e)?Object.values(e).every(t=>typeof t=="string"||ae(t)):!1}function ae(e){if(!K(e))return!1;const t=Reflect.get(e,"data");return typeof t=="string"||t instanceof ArrayBuffer}function K(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}
1
+ import{createHttpMethods as P,createBodyMethods as _}from"../../../config/authoring/http-methods.js";import R from"k6/http";import{emitArtifact as v}from"./artifacts.js";import{fixture as F}from"./fixtures.js";import{isUnknownRecord as $}from"../../../kernel/unknown-values.js";const L=new Set(["token","organizationId"]),V=new Set(["authorization","cookie","x-admin-key"]),D=320,C=String,y=X();export function getEnv(){const e=__ENV.BASE_URL;if(!e)throw new Error("BASE_URL env var required");return{BASE:e}}export function createHttpClient(e){const{baseUrl:t,defaultActor:r=null,defaultHeaders:c={"Content-Type":"application/json"},sessionBundle:o=null,getHeaders:d=null,getRawHeaders:p=null}=e;if(!t)throw new Error("baseUrl is required");function m(n,i,s={},u={}){const{includeDefaultHeaders:l=!0,contentTypeJson:a=!0}=u,f={...l?c:{},...re(n,i),...s};return a||(delete f["Content-Type"],delete f["content-type"]),f}function H(n=null){return{actor:n&&o&&o.actors[n]||null,actorName:n,sessionBundle:o}}function h(n){if(!(!n||!o)&&!o.actors[n])throw new Error(`Unknown testkit actor "${n}"`)}function z(n,i={}){h(n);const s=H(n);return m(d,s,i)}function g(n=null,i={}){h(n);const s=H(n);return m(p,s,i)}function q(n,i,s,u,l={},a={}){h(n);const f=`${t}${s}`,A=H(n),b=m(d,A,l,{contentTypeJson:a.contentTypeJson!==!1,includeDefaultHeaders:a.includeDefaultHeaders!==!1});return M(i,s,f,u,b,A.actor,a)}function T(n,i,s,u,l={},a={}){h(n);const f=`${t}${s}`,A=H(n),b=m(p,A,l,{contentTypeJson:a.contentTypeJson!==!1,includeDefaultHeaders:a.includeDefaultHeaders!==!1});return M(i,s,f,u,b,A.actor,a)}function w(n,i,s,u,l={},a={}){const f=K(u);return q(n,i,s,f,l,{...a,contentTypeJson:!1,includeDefaultHeaders:!1,serialize:"raw"})}function U(n,i,s,u,l={},a={}){const f=K(u);return T(n,i,s,f,l,{...a,contentTypeJson:!1,includeDefaultHeaders:!1,serialize:"raw"})}function I(n){const i=S(n),s=(u,l,a,f={})=>q(n,u,l,a,f);return{...P(s,null),headers(u={}){return z(n,u)},rawHeaders(u={}){return g(n,u)},request:s,rawReq:i,raw(u,l,a,f={},A={}){return i(u,l,a,f,A)},rawGet:i.get,rawDelete:i.delete,rawPost:i.post,rawPut:i.put,rawPatch:i.patch,multipart:_((u,l,a,f={})=>w(n,u,l,a,f)),rawMultipart:i.multipart}}function S(n=null){const i=(s,u,l,a={},f={})=>T(n,s,u,l,a,f);return Object.assign(i,{...P(i,null),request:i,headers(s={}){return g(n,s)},as(s){return h(s),S(s)},multipart:_((s,u,l,a={})=>U(n,s,u,l,a))})}const x=I(r),E=S(null);return Object.assign(function(i,s,u=null,l,a={}){const f=arguments.length>=4?l:u;return x.request(i,s,f,a)},{rawHttp:R,headers:x.headers,rawHeaders(n=null,i={}){return g(n,i)},as(n){return h(n),I(n)},request:x.request,get:x.get,delete:x.delete,post:x.post,put:x.put,patch:x.patch,raw:E,rawGet:E.get,rawDelete:E.delete,rawPost:E.post,rawPut:E.put,rawPatch:E.patch,multipart:x.multipart,rawMultipart:E.multipart})}export function makeReq(e,t=null,r=null,c=null){return createHttpClient({baseUrl:e,sessionBundle:t,defaultActor:c,getHeaders:r??void 0})}export function makeRawReq(e,t=null){return createHttpClient({baseUrl:e,getRawHeaders:t??void 0}).raw}function M(e,t,r,c,o,d=null,p={}){const m=te(),H=ee(m),h={...o,"x-request-id":o["x-request-id"]||o["X-Request-Id"]||H},z=G({ordinal:m,requestId:h["x-request-id"],method:e,path:t,url:r,actorRecord:d,requestHeaders:h}),g=N(h,p),q=ie(c,p.serialize||"json"),T=e;let w;if(T==="GET")w=R.get(r,g);else if(T==="PUT")w=R.put(r,q,g);else if(T==="POST")w=R.post(r,q,g);else if(T==="PATCH")w=R.patch(r,q,g);else if(T==="DELETE")w=R.del(r,q,g);else throw new Error(`unsupported method: ${T}`);return Q(z,w),y.traces.push(z),W(),ne(w,z)}function N(e,t={}){const r={...t};return Reflect.deleteProperty(r,"contentTypeJson"),Reflect.deleteProperty(r,"includeDefaultHeaders"),Reflect.deleteProperty(r,"serialize"),{...r,headers:e}}export function startHttpTraceCollection(e){y.phase=J(e,"exec"),y.traces=[],y.counter=0}export function emitHttpTraceCollectionArtifact(){const e=y.traces.map(t=>({...t}));e.length>0&&v("http-traces",{phase:y.phase,traces:e},{kind:"testkit.http-traces",summary:`${String(e.length)} HTTP trace(s)`}),startHttpTraceCollection(y.phase)}export function getHttpTrace(e){return e?.__testkit?.httpTrace||null}export function summarizeHttpTrace(e){const t=getHttpTrace(e);return t?{actorName:t.actorName,id:t.id,organizationKey:t.organizationKey,organizationName:t.organizationName,requestId:t.requestId,method:t.method,path:t.path,url:t.url,requestHeaders:t.requestHeaders,response:t.response,startedAt:t.startedAt,finishedAt:t.finishedAt,durationMs:t.durationMs}:null}export function safeJson(e,t){try{const r=e?.body;if(typeof r!="string")throw new TypeError("response body is not text");const c=JSON.parse(r);return t&&!t(c)?{ok:!1,error:"response JSON did not match the expected shape"}:{ok:!0,value:c}}catch(r){return{ok:!1,error:r instanceof Error?r.message:C(r)}}}export function toBodyPreview(e){const t=B(e?.headers?.["Content-Type"]||e?.headers?.["content-type"]||null),r=typeof e?.body=="string"?e.body:"";if(!r.trim())return null;if(t?.includes("application/json"))try{return O(JSON.stringify(JSON.parse(r)),D)}catch{return O(r,D)}return O(r,D)}function G({ordinal:e,requestId:t,method:r,path:c,url:o,actorRecord:d,requestHeaders:p}){return{actorName:d?.actorName||null,id:`${y.phase}-${String(e).padStart(3,"0")}`,organizationKey:d?.organizationKey||null,organizationName:d?.organizationName||null,requestId:t,startedAt:new Date().toISOString(),method:r,path:k(c),url:Y(o),requestHeaders:Z(p)}}function Q(e,t){const r=new Date;e.finishedAt=r.toISOString(),e.durationMs=Math.max(0,r.getTime()-Date.parse(e.startedAt)),e.response={status:t.status||null,contentType:B(t.headers["Content-Type"]||t.headers["content-type"]||null),bodyPreview:toBodyPreview(t),bodyTruncated:typeof t.body=="string"&&t.body.length>D}}function W(){y.traces.length<=y.maxEntries||y.traces.splice(0,y.traces.length-y.maxEntries)}function X(){return{phase:"exec",traces:[],counter:0,maxEntries:50}}function k(e){const[t,r]=e.split("?");if(!r)return t;const c=r.split("&").map(o=>{const[d]=o.split("="),p=oe(d);return L.has(p)?`${d||encodeURIComponent(p)}=${encodeURIComponent("[REDACTED]")}`:o});return`${t}?${c.join("&")}`}function Y(e){const t=e.indexOf("://");if(t===-1)return k(e);const r=e.indexOf("/",t+3);return r===-1?e:`${e.slice(0,r)}${k(e.slice(r))}`}function Z(e){const t={};for(const[r,c]of Object.entries(e)){const o=r,d=o.toLowerCase();t[o]=V.has(d)?"[REDACTED]":j(c)}return t}function j(e){return Array.isArray(e)?e.map(t=>C(t)):e==null?null:C(e)}function B(e){const t=j(e);return Array.isArray(t)?t[0]||null:t}function ee(e){return`tk_${J(__ENV.TESTKIT_RUNTIME_ID,"runtime")}_${y.phase}_${String(e).padStart(4,"0")}`}function te(){return y.counter+=1,y.counter}function O(e,t){const r=(e?C(e):"").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,Math.max(0,t-3))}...`}function J(e,t){if(typeof e!="string")return t;const r=e.trim();return r.length>0?r:t}function re(e,t){return e?e(t)||{}:{}}function ne(e,t){const r={body:e.body,cookies:e.cookies,headers:e.headers,json(o){return e.json(o)},status:e.status,timings:e.timings};for(const o of Object.keys(e))Reflect.set(r,o,Reflect.get(e,o));const c=Object.getPrototypeOf(e);if(c&&typeof c=="object")for(const o of Object.getOwnPropertyNames(c)){if(o==="constructor"||o in r)continue;const p=Object.getOwnPropertyDescriptor(c,o)?.value;if(typeof p!="function")continue;const m=p;Reflect.set(r,o,(...H)=>Reflect.apply(m,e,H))}return r.__testkit={httpTrace:t,rawResponse:e},r}function oe(e){const t=e?C(e):"";try{return decodeURIComponent(t)}catch{return t}}function ie(e,t="json"){if(e==null)return e;if(t==="raw"){if(ue(e))return e;throw new TypeError("raw request body is not supported by k6")}return typeof e=="string"?e:JSON.stringify(e)}function K(e={}){const t=e.fields??{},r=e.files??[],c={...t};for(const o of r){const d=o.field.trim();if(!d)throw new Error("multipart file entries require a field name");const p=se(o);if(p.data===void 0)throw new Error(`multipart file entry "${d}" requires data or a fixture`);c[d]=R.file(p.data,p.filename,p.contentType)}return c}function se(e){return typeof e.fixture=="string"?F(e.fixture):e.fixture?e.fixture:e.file?e.file:e}function ue(e){return typeof e=="string"||e instanceof ArrayBuffer?!0:$(e)?Object.values(e).every(t=>typeof t=="string"||ae(t)):!1}function ae(e){if(!$(e))return!1;const t=Reflect.get(e,"data");return typeof t=="string"||t instanceof ArrayBuffer}
@@ -1 +1 @@
1
- import{readProperty as o}from"./properties.js";const f=Symbol.for("testkit.runtimeDb");export function createRuntimeDb(e){if(!h(e))throw new Error("Runtime DB requires query(sql) and exec(sql) functions.");if(o(e,f))return e;const r={exec(t,...n){return e.exec(t,...n)},query(t,...n){return normalizeDbRows(e.query(t,...n))}};return Object.setPrototypeOf(r,e),Object.defineProperty(r,f,{value:!0,enumerable:!1}),r}export function normalizeDbRows(e){return Array.isArray(e)?e.map(r=>p(r)):e}function p(e){if(!S(e))return e;const r={};for(const[t,n]of Object.entries(e))r[t]=normalizeDbValue(n);return r}export function normalizeDbValue(e){if(y(e)){const r=a(e);if(r.parsed)return r.value}return e}function a(e){const r=l(e);if(r===null)return{parsed:!1};const t=r.trim();if(!m(t))return{parsed:!1};try{return{parsed:!0,value:JSON.parse(t)}}catch{return{parsed:!1}}}function y(e){if(!s(e)||!(Array.isArray(e)||typeof ArrayBuffer<"u"&&ArrayBuffer.isView(e)))return!1;const t=o(e,"length");if(typeof t!="number"||!Number.isInteger(t)||t<=0)return!1;for(let n=0;n<t;n+=1)if(!d(o(e,String(n))))return!1;return!0}function d(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0&&e<=255}function l(e){const r=[];for(let n=0;n<e.length;n+=8192){const c=Math.min(n+8192,e.length);let i="";for(let u=n;u<c;u+=1)i+=`%${e[u].toString(16).padStart(2,"0")}`;r.push(i)}try{return decodeURIComponent(r.join(""))}catch{return null}}function m(e){if(e.length===0)return!1;const r=e[0];return r==="{"||r==="["||r==='"'?!0:e==="true"||e==="false"||e==="null"||/^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/iu.test(e)}function h(e){return s(e)&&typeof o(e,"query")=="function"&&typeof o(e,"exec")=="function"}function S(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function s(e){return typeof e=="object"&&e!==null||typeof e=="function"}
1
+ import{readProperty as u}from"./properties.js";import{isPropertyContainer as s}from"../../../../kernel/unknown-values.js";const f=Symbol.for("testkit.runtimeDb");export function createRuntimeDb(e){if(!h(e))throw new Error("Runtime DB requires query(sql) and exec(sql) functions.");if(u(e,f))return e;const r={exec(n,...t){return e.exec(n,...t)},query(n,...t){return normalizeDbRows(e.query(n,...t))}};return Object.setPrototypeOf(r,e),Object.defineProperty(r,f,{value:!0,enumerable:!1}),r}export function normalizeDbRows(e){return Array.isArray(e)?e.map(r=>a(r)):e}function a(e){if(!S(e))return e;const r={};for(const[n,t]of Object.entries(e))r[n]=normalizeDbValue(t);return r}export function normalizeDbValue(e){if(d(e)){const r=p(e);if(r.parsed)return r.value}return e}function p(e){const r=l(e);if(r===null)return{parsed:!1};const n=r.trim();if(!m(n))return{parsed:!1};try{return{parsed:!0,value:JSON.parse(n)}}catch{return{parsed:!1}}}function d(e){if(!s(e)||!(Array.isArray(e)||typeof ArrayBuffer<"u"&&ArrayBuffer.isView(e)))return!1;const n=u(e,"length");if(typeof n!="number"||!Number.isInteger(n)||n<=0)return!1;for(let t=0;t<n;t+=1)if(!y(u(e,String(t))))return!1;return!0}function y(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0&&e<=255}function l(e){const r=[];for(let t=0;t<e.length;t+=8192){const c=Math.min(t+8192,e.length);let i="";for(let o=t;o<c;o+=1)i+=`%${e[o].toString(16).padStart(2,"0")}`;r.push(i)}try{return decodeURIComponent(r.join(""))}catch{return null}}function m(e){if(e.length===0)return!1;const r=e[0];return r==="{"||r==="["||r==='"'?!0:e==="true"||e==="false"||e==="null"||/^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/iu.test(e)}function h(e){return s(e)&&typeof u(e,"query")=="function"&&typeof u(e,"exec")=="function"}function S(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}
@@ -1,2 +1,2 @@
1
- import{readProperty as j}from"./properties.js";const P=63,N=12,D=16,J="example.test",O=/(file:\/\/[^\s)]+|\/[^\s):]+):(\d+):(\d+)/,h=String;export function createFixtureScope({namespace:n,locationSkips:e=[]}={}){const i=A(n),s=new Map,a=[],f=[],u=createFixtureValues(i),o=["/k6/shared/fixture-engine.js","/k6/dal-fixtures.js",...e].filter(Boolean);function r(t,c,g,k){const y=C(t,"fixture kind"),$=C(c,"fixture key");if(typeof k!="function")throw new Error(`Fixture ${b(y,$)} requires a synchronous create callback.`);const p=R(y,$),I=f.at(-1);I&&I.dependencies.add(p);const S=x(g),F=_(S),m=s.get(p);if(m){if(m.state==="creating")throw new Error(M(m,f,y,$));if(m.signatureJson!==F)throw new Error(U(m,S,F));return m.reuseCount+=1,m.result}const E={entryId:p,kind:y,key:$,state:"creating",signature:S,signatureJson:F,location:V(o),dependencies:new Set,reuseCount:0,order:a.length+1,result:void 0};s.set(p,E),a.push(p),f.push(E);try{const L=k();if(B(L))throw new Error(`Fixture ${b(y,$)} returned a Promise. DAL fixtures must be synchronous.`);return E.state="ready",E.result=L,L}catch(L){throw s.delete(p),a.pop(),L}finally{f.pop()}}function d(){return a.map(t=>s.get(t)).filter(t=>t!==void 0).map(t=>({kind:t.kind,key:t.key,signature:q(t.signature),reuseCount:t.reuseCount,order:t.order,dependencies:[...t.dependencies].map(c=>s.get(c)).filter(c=>c!==void 0).map(c=>({kind:c.kind,key:c.key})),...t.location?{location:{...t.location}}:{}}))}return{namespace:i,values:u,id:t=>u.uuid(t),uuid:t=>u.uuid(t),slug:(t,c)=>u.slug(t,c),email:(t,c)=>u.email(t,c),string:(t,c)=>u.string(t,c),token:(t,c)=>u.token(t,c),seed:r,records:d}}export function createFixtureValues(n){const e=A(n);function i(o){const r=T(e,o).slice(0,32).split("");return r[12]="4",r[16]=(Number.parseInt(r[16]||"0",16)&3|8).toString(16),`${r.slice(0,8).join("")}-${r.slice(8,12).join("")}-${r.slice(12,16).join("")}-${r.slice(16,20).join("")}-${r.slice(20,32).join("")}`}function s(o,r={}){const d=l(r.fallback)||"resource",t=l(o)||d,c=w(r.maxLength)||P;return`${t}-${z(e,`slug:${o}`,N)}`.slice(0,c)}function a(o,r={}){const d=l(r.fallback)||"user",t=l(o)||d,c=H(r.domain)||J,g=w(r.suffixLength)||N;return`${t}-${z(e,`email:${o}`,g)}@${c}`}function f(o,r={}){const d=l(r.fallback)||"value",t=l(r.prefix)||l(o)||d,c=w(r.suffixLength)||N,g=w(r.maxLength)||null,k=`${t}-${z(e,`string:${o}:${t}`,c)}`;return g?k.slice(0,g):k}function u(o,r={}){return f(o,{...r,fallback:r.fallback||"token",suffixLength:w(r.suffixLength)||D})}return{uuid:i,slug:s,email:a,string:f,token:u}}function U(n,e,i){const s=n.location?` First declared at ${G(n.location)}.`:"";return[`Fixture ${b(n.kind,n.key)} was seeded twice with conflicting signatures.`,s,` Existing: ${h(n.signatureJson)}`,` New: ${h(i||_(x(e)))}`].join("")}function M(n,e,i,s){const a=e.findIndex(o=>o.entryId===n.entryId);return`Fixture dependency cycle detected: ${[...(a>=0?e.slice(a):e).map(o=>b(o.kind,o.key)),b(i,s)].join(" -> ")}.`}function b(n,e){return`${n}:${e}`}function G(n){return[n.path,n.line.toString(),n.column.toString()].join(":")}function R(n,e){return`${n}::${e}`}function A(n){return l(n)||"standalone"}function C(n,e){const i=h(n||"").trim();if(i.length===0)throw new Error(`Fixture ${e} must be a non-empty string.`);return i}function w(n){return typeof n!="number"||!Number.isInteger(n)||n<=0?null:n}function H(n){const e=h(n||"").trim().toLowerCase();return e.length>0?e:null}function l(n){return h(n||"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function K(n){let e=2166136261;for(let i=0;i<n.length;i+=1)e^=n.charCodeAt(i),e=Math.imul(e,16777619)>>>0;return e.toString(16).padStart(8,"0")}function T(n,e){return[0,1,2,3].map(i=>K(`${n}:${e}:${i.toString()}`)).join("")}function z(n,e,i){return T(n,e).slice(0,i)}function V(n){const e=new Error().stack;if(!e)return null;for(const i of e.split(`
2
- `).slice(1)){const s=i.match(O);if(!s)continue;const[a,f,u]=s.slice(1);if(!a||!f||!u)continue;const o=X(a);if(!n.some(r=>o.endsWith(r)||o.includes(r)))return{path:o,line:Number(f),column:Number(u)}}return null}function X(n){return n.replace(/^file:\/\//,"")}function _(n){return JSON.stringify(x(n))}function q(n){return x(n)}function x(n){return n==null||typeof n=="boolean"||typeof n=="number"||typeof n=="string"?n:typeof n=="bigint"?n.toString():Array.isArray(n)?n.map(e=>x(e)):typeof n=="object"?Object.keys(n).sort().reduce((e,i)=>(e[i]=x(j(n,i)),e),{}):h(n)}function B(n){return W(n)&&typeof j(n,"then")=="function"}function W(n){return typeof n=="object"&&n!==null||typeof n=="function"}
1
+ import{readProperty as A}from"./properties.js";import{isPropertyContainer as P}from"../../../../kernel/unknown-values.js";const D=63,N=12,J=16,O="example.test",U=/(file:\/\/[^\s)]+|\/[^\s):]+):(\d+):(\d+)/,h=String;export function createFixtureScope({namespace:n,locationSkips:e=[]}={}){const i=C(n),s=new Map,a=[],f=[],u=createFixtureValues(i),o=["/k6/shared/fixture-engine.js","/k6/dal-fixtures.js",...e].filter(Boolean);function r(t,c,g,k){const y=T(t,"fixture kind"),$=T(c,"fixture key");if(typeof k!="function")throw new Error(`Fixture ${w(y,$)} requires a synchronous create callback.`);const p=H(y,$),I=f.at(-1);I&&I.dependencies.add(p);const S=x(g),F=_(S),m=s.get(p);if(m){if(m.state==="creating")throw new Error(G(m,f,y,$));if(m.signatureJson!==F)throw new Error(M(m,S,F));return m.reuseCount+=1,m.result}const b={entryId:p,kind:y,key:$,state:"creating",signature:S,signatureJson:F,location:X(o),dependencies:new Set,reuseCount:0,order:a.length+1,result:void 0};s.set(p,b),a.push(p),f.push(b);try{const L=k();if(W(L))throw new Error(`Fixture ${w(y,$)} returned a Promise. DAL fixtures must be synchronous.`);return b.state="ready",b.result=L,L}catch(L){throw s.delete(p),a.pop(),L}finally{f.pop()}}function d(){return a.map(t=>s.get(t)).filter(t=>t!==void 0).map(t=>({kind:t.kind,key:t.key,signature:B(t.signature),reuseCount:t.reuseCount,order:t.order,dependencies:[...t.dependencies].map(c=>s.get(c)).filter(c=>c!==void 0).map(c=>({kind:c.kind,key:c.key})),...t.location?{location:{...t.location}}:{}}))}return{namespace:i,values:u,id:t=>u.uuid(t),uuid:t=>u.uuid(t),slug:(t,c)=>u.slug(t,c),email:(t,c)=>u.email(t,c),string:(t,c)=>u.string(t,c),token:(t,c)=>u.token(t,c),seed:r,records:d}}export function createFixtureValues(n){const e=C(n);function i(o){const r=j(e,o).slice(0,32).split("");return r[12]="4",r[16]=(Number.parseInt(r[16]||"0",16)&3|8).toString(16),`${r.slice(0,8).join("")}-${r.slice(8,12).join("")}-${r.slice(12,16).join("")}-${r.slice(16,20).join("")}-${r.slice(20,32).join("")}`}function s(o,r={}){const d=l(r.fallback)||"resource",t=l(o)||d,c=E(r.maxLength)||D;return`${t}-${z(e,`slug:${o}`,N)}`.slice(0,c)}function a(o,r={}){const d=l(r.fallback)||"user",t=l(o)||d,c=K(r.domain)||O,g=E(r.suffixLength)||N;return`${t}-${z(e,`email:${o}`,g)}@${c}`}function f(o,r={}){const d=l(r.fallback)||"value",t=l(r.prefix)||l(o)||d,c=E(r.suffixLength)||N,g=E(r.maxLength)||null,k=`${t}-${z(e,`string:${o}:${t}`,c)}`;return g?k.slice(0,g):k}function u(o,r={}){return f(o,{...r,fallback:r.fallback||"token",suffixLength:E(r.suffixLength)||J})}return{uuid:i,slug:s,email:a,string:f,token:u}}function M(n,e,i){const s=n.location?` First declared at ${R(n.location)}.`:"";return[`Fixture ${w(n.kind,n.key)} was seeded twice with conflicting signatures.`,s,` Existing: ${h(n.signatureJson)}`,` New: ${h(i||_(x(e)))}`].join("")}function G(n,e,i,s){const a=e.findIndex(o=>o.entryId===n.entryId);return`Fixture dependency cycle detected: ${[...(a>=0?e.slice(a):e).map(o=>w(o.kind,o.key)),w(i,s)].join(" -> ")}.`}function w(n,e){return`${n}:${e}`}function R(n){return[n.path,n.line.toString(),n.column.toString()].join(":")}function H(n,e){return`${n}::${e}`}function C(n){return l(n)||"standalone"}function T(n,e){const i=h(n||"").trim();if(i.length===0)throw new Error(`Fixture ${e} must be a non-empty string.`);return i}function E(n){return typeof n!="number"||!Number.isInteger(n)||n<=0?null:n}function K(n){const e=h(n||"").trim().toLowerCase();return e.length>0?e:null}function l(n){return h(n||"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function V(n){let e=2166136261;for(let i=0;i<n.length;i+=1)e^=n.charCodeAt(i),e=Math.imul(e,16777619)>>>0;return e.toString(16).padStart(8,"0")}function j(n,e){return[0,1,2,3].map(i=>V(`${n}:${e}:${i.toString()}`)).join("")}function z(n,e,i){return j(n,e).slice(0,i)}function X(n){const e=new Error().stack;if(!e)return null;for(const i of e.split(`
2
+ `).slice(1)){const s=i.match(U);if(!s)continue;const[a,f,u]=s.slice(1);if(!a||!f||!u)continue;const o=q(a);if(!n.some(r=>o.endsWith(r)||o.includes(r)))return{path:o,line:Number(f),column:Number(u)}}return null}function q(n){return n.replace(/^file:\/\//,"")}function _(n){return JSON.stringify(x(n))}function B(n){return x(n)}function x(n){return n==null||typeof n=="boolean"||typeof n=="number"||typeof n=="string"?n:typeof n=="bigint"?n.toString():Array.isArray(n)?n.map(e=>x(e)):typeof n=="object"?Object.keys(n).sort().reduce((e,i)=>(e[i]=x(A(n,i)),e),{}):h(n)}function W(n){return P(n)&&typeof A(n,"then")=="function"}
@@ -1,3 +1,3 @@
1
- const s=String;export function parseJsonBody(t){return JSON.parse(s(t.body))}export function extractCookie(t,n){const a=p(t,"headers"),r=l(a).filter(([e])=>e.toLowerCase()==="set-cookie").flatMap(([,e])=>d(e)?e:e?[e]:[]);if(r.length===0)return null;const i=new RegExp(`(?:^|,\\s*)${f(n)}=([^;,]+)`);for(const e of r){const o=i.exec(s(e));if(o?.[1])return o[1]}return null}export function parseSseEvents(t){return s(t||"").split(/\n\n+/).map(n=>n.trim()).filter(Boolean).map(n=>{const a=n.split(`
2
- `);let r=null;const i=[];for(const o of a)o.startsWith("event:")&&(r=o.slice(6).trim()||null),o.startsWith("data:")&&i.push(o.slice(5).trim());const e=i.join(`
3
- `);if(!e)return{event:r,data:null};try{const o=JSON.parse(e);return{event:r,data:o}}catch{return{event:r,data:e}}})}export function getSseEventData(t,n){return parseSseEvents(t).find(r=>r.event===n)?.data??null}function f(t){return s(t||"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function l(t){return u(t)?Object.keys(t).map(n=>[n,c(t,n)]):[]}function p(t,n){if(u(t))return c(t,n)}function c(t,n){return Reflect.get(t,n)}function u(t){return typeof t=="object"&&t!==null||typeof t=="function"}function d(t){return Array.isArray(t)}
1
+ import{isPropertyContainer as c,isUnknownArray as l}from"../../../../kernel/unknown-values.js";const i=String;export function parseJsonBody(t){return JSON.parse(i(t.body))}export function extractCookie(t,e){const a=d(t,"headers"),r=p(a).filter(([n])=>n.toLowerCase()==="set-cookie").flatMap(([,n])=>l(n)?n:n?[n]:[]);if(r.length===0)return null;const s=new RegExp(`(?:^|,\\s*)${f(e)}=([^;,]+)`);for(const n of r){const o=s.exec(i(n));if(o?.[1])return o[1]}return null}export function parseSseEvents(t){return i(t||"").split(/\n\n+/).map(e=>e.trim()).filter(Boolean).map(e=>{const a=e.split(`
2
+ `);let r=null;const s=[];for(const o of a)o.startsWith("event:")&&(r=o.slice(6).trim()||null),o.startsWith("data:")&&s.push(o.slice(5).trim());const n=s.join(`
3
+ `);if(!n)return{event:r,data:null};try{const o=JSON.parse(n);return{event:r,data:o}}catch{return{event:r,data:n}}})}export function getSseEventData(t,e){return parseSseEvents(t).find(r=>r.event===e)?.data??null}function f(t){return i(t||"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function p(t){return c(t)?Object.keys(t).map(e=>[e,u(t,e)]):[]}function d(t,e){if(c(t))return u(t,e)}function u(t,e){return Reflect.get(t,e)}
@@ -6,4 +6,3 @@ export declare function requireDirectTargetsWithinRoots(direct: Readonly<Record<
6
6
  export declare function requireExistingFile(value: string, label: string): string;
7
7
  export declare function readRecord(file: string): Record<string, unknown>;
8
8
  export declare function isErrorCode(error: unknown, code: string): boolean;
9
- export declare function isRecord(value: unknown): value is Record<string, unknown>;
@@ -1 +1 @@
1
- import{isPathWithin as l}from"../process/files/paths.js";import s from"node:fs";import c from"node:path";export function normalizeExistingFileRecord(e,r){const o={};for(const[t,n]of Object.entries(e).sort(([i],[u])=>i.localeCompare(u)))o[t]=requireExistingFile(n,`${r}.${t}`);return Object.freeze(o)}export function normalizeAbsoluteFiles(e,r,o){return normalizeStrings(e.map((t,n)=>{const i=`${r}[${n.toString()}]`;return o?requireExistingFile(t,i):a(t,i)}))}export function normalizeDirectories(e,r){return normalizeStrings(e.map((o,t)=>{const n=a(o,`${r}[${t.toString()}]`),i=s.realpathSync(n);if(!s.statSync(i).isDirectory())throw new Error(`Managed module-resolution policy ${r} must contain directories`);return i}))}export function normalizeStrings(e){return Object.freeze([...new Set(e)].sort())}export function requireDirectTargetsWithinRoots(e,r){for(const[o,t]of Object.entries(e))if(!r.some(n=>l(n,t)||c.basename(t)==="package.json"&&c.dirname(t)===c.dirname(n)))throw new Error(`Managed direct module ${o} is outside every direct bridge root`)}export function requireExistingFile(e,r){const o=a(e,r),t=s.realpathSync(o);if(!s.statSync(t).isFile())throw new Error(`Managed module-resolution policy ${r} must be a file`);return t}function a(e,r){if(!c.isAbsolute(e))throw new Error(`Managed module-resolution policy ${r} must be absolute`);return c.resolve(e)}export function readRecord(e){const r=JSON.parse(s.readFileSync(e,"utf8"));if(!isRecord(r))throw new Error(`Invalid package manifest: ${e}`);return r}export function isErrorCode(e,r){return typeof e=="object"&&e!==null&&"code"in e&&Reflect.get(e,"code")===r}export function isRecord(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}
1
+ import{isPathWithin as l}from"../process/files/paths.js";import s from"node:fs";import c from"node:path";import{isUnknownRecord as f}from"../kernel/unknown-values.js";export function normalizeExistingFileRecord(e,r){const o={};for(const[t,n]of Object.entries(e).sort(([i],[u])=>i.localeCompare(u)))o[t]=requireExistingFile(n,`${r}.${t}`);return Object.freeze(o)}export function normalizeAbsoluteFiles(e,r,o){return normalizeStrings(e.map((t,n)=>{const i=`${r}[${n.toString()}]`;return o?requireExistingFile(t,i):a(t,i)}))}export function normalizeDirectories(e,r){return normalizeStrings(e.map((o,t)=>{const n=a(o,`${r}[${t.toString()}]`),i=s.realpathSync(n);if(!s.statSync(i).isDirectory())throw new Error(`Managed module-resolution policy ${r} must contain directories`);return i}))}export function normalizeStrings(e){return Object.freeze([...new Set(e)].sort())}export function requireDirectTargetsWithinRoots(e,r){for(const[o,t]of Object.entries(e))if(!r.some(n=>l(n,t)||c.basename(t)==="package.json"&&c.dirname(t)===c.dirname(n)))throw new Error(`Managed direct module ${o} is outside every direct bridge root`)}export function requireExistingFile(e,r){const o=a(e,r),t=s.realpathSync(o);if(!s.statSync(t).isFile())throw new Error(`Managed module-resolution policy ${r} must be a file`);return t}function a(e,r){if(!c.isAbsolute(e))throw new Error(`Managed module-resolution policy ${r} must be absolute`);return c.resolve(e)}export function readRecord(e){const r=JSON.parse(s.readFileSync(e,"utf8"));if(!f(r))throw new Error(`Invalid package manifest: ${e}`);return r}export function isErrorCode(e,r){return typeof e=="object"&&e!==null&&"code"in e&&Reflect.get(e,"code")===r}
@@ -1 +1 @@
1
- import{isPathWithin as m}from"../process/files/paths.js";import d from"node:fs";import a from"node:path";import{isErrorCode as j,isRecord as b,normalizeAbsoluteFiles as g,normalizeDirectories as w,normalizeExistingFileRecord as v,normalizeStrings as E,readRecord as k,requireDirectTargetsWithinRoots as y,requireExistingFile as h}from"./managed-module-resolution-policy-input.js";export function inspectManagedNodeModuleResolutionPolicy(t){const{engineLabel:o,stateSymbol:r}=t,e=w(t.consumerRoots,"consumerRoots"),n=v(t.direct,"direct"),s=w(t.directBridgeRoots,"directBridgeRoots");y(n,s);const i=S(t.packageAnchors,"packageAnchors"),c=E(t.reservedPackageNames),f=F(i);return Object.freeze({consumerRoots:e,dependencyRoots:f,managedImporterRoots:Object.freeze([...Object.values(i),...f.flatMap(l=>t.forbiddenConsumerPackagePrefixes.map(u=>a.join(l,u)).filter(u=>d.existsSync(u)).map(u=>d.realpathSync(u)))]),direct:n,directBridgeRoots:s,engineLabel:o,forbiddenConsumerPackagePrefixes:E(t.forbiddenConsumerPackagePrefixes),packageExports:$(i,o),packageRoots:i,reservedPackageNames:c,stateSymbol:r,trustedImporterFiles:g(t.trustedImporterFiles,"trustedImporterFiles",!1),trustedInternalEntrypoints:g(t.trustedInternalEntrypoints,"trustedInternalEntrypoints",!0),trustedInternalRoots:R(t.trustedInternalEntrypoints,c),verifiedParentlessPackageFiles:x(t.verifiedParentlessPackageFiles,i),verifiedProcessEntrypoints:g(t.verifiedProcessEntrypoints,"verifiedProcessEntrypoints",!0)})}function R(t,o){const r=new Set;for(const e of t){let n=a.dirname(h(e,"trustedInternalEntrypoints"));for(;;){const s=a.join(n,"package.json");if(d.existsSync(s)){const c=k(s);if(typeof c.name=="string"&&o.includes(c.name)){const f=a.relative(n,e),[l]=f.split(a.sep);if(l&&l!==".."&&!a.isAbsolute(f)){const u=a.join(n,l);d.statSync(u).isDirectory()&&r.add(d.realpathSync(u))}}break}const i=a.dirname(n);if(i===n)break;n=i}}return Object.freeze([...r].sort())}function x(t,o){const r=new Set;for(const[e,n]of Object.entries(t)){if(!Object.hasOwn(o,e))throw new Error(`Parentless preload package is not managed: ${e}`);const s=o[e];for(const[i,c]of n.entries()){if(a.isAbsolute(c)||c.length===0||c.includes("\0"))throw new Error(`Parentless preload ${e}[${i.toString()}] must be a relative file`);const f=a.resolve(s,c);if(!m(s,f))throw new Error(`Parentless preload escapes managed package ${e}`);const l=h(f,`verifiedParentlessPackageFiles.${e}[${i.toString()}]`);if(!m(s,l))throw new Error(`Parentless preload escapes managed package ${e}`);r.add(l)}}return Object.freeze([...r].sort())}function S(t,o){const r={};for(const[e,n]of Object.entries(t).sort(([s],[i])=>s.localeCompare(i)))r[e]=O(e,h(n,o));return Object.freeze(r)}function O(t,o){let r=a.dirname(o);for(;;){const e=a.join(r,"package.json");if(d.existsSync(e)&&k(e).name===t)return d.realpathSync(r);const n=a.dirname(r);if(n===r)throw new Error(`Managed package anchor has no matching package root: ${t}`);r=n}}function $(t,o){const r={};for(const[e,n]of Object.entries(t)){const s=k(a.join(n,"package.json"));if(s.name!==e||!b(s.exports))throw new Error(`Managed ${o} package manifest is invalid: ${e}`);for(const[i,c]of Object.entries(s.exports)){if(i!=="."&&!i.startsWith("./")||i.includes("*"))continue;const f=i==="."?e:`${e}${i.slice(1)}`;r[f]=Object.freeze({default:P(e,i,n,p(c,new Set(["node","default"]))),import:P(e,i,n,p(c,new Set(["node","import","default"]))),require:P(e,i,n,p(c,new Set(["node","require","default"])))})}}return Object.freeze(r)}function p(t,o){if(typeof t=="string")return t;if(Array.isArray(t)){for(const r of t){const e=p(r,o);if(e!==null)return e}return null}if(!b(t))return null;for(const[r,e]of Object.entries(t)){if(r==="types"||!o.has(r))continue;const n=p(e,o);if(n!==null)return n}return null}function P(t,o,r,e){if(e===null)return null;if(!e.startsWith("./"))throw new Error(`Managed package export must be relative: ${t}${o}`);const n=a.resolve(r,e);if(!m(r,n))throw new Error(`Managed package export escapes its verified root: ${t}${o}`);try{const s=d.realpathSync(n);if(!m(r,s)||!d.statSync(s).isFile())throw new Error(`Managed package export is not a verified file: ${t}${o}`);return s}catch(s){if(j(s,"ENOENT"))return null;throw s}}function F(t){const o=new Set;for(const[r,e]of Object.entries(t))o.add(r.startsWith("@")?a.dirname(a.dirname(e)):a.dirname(e));return Object.freeze([...o].sort())}
1
+ import{isPathWithin as m}from"../process/files/paths.js";import{isUnknownRecord as b}from"../kernel/unknown-values.js";import d from"node:fs";import a from"node:path";import{isErrorCode as j,normalizeAbsoluteFiles as g,normalizeDirectories as w,normalizeExistingFileRecord as v,normalizeStrings as E,readRecord as k,requireDirectTargetsWithinRoots as y,requireExistingFile as h}from"./managed-module-resolution-policy-input.js";export function inspectManagedNodeModuleResolutionPolicy(t){const{engineLabel:o,stateSymbol:r}=t,e=w(t.consumerRoots,"consumerRoots"),n=v(t.direct,"direct"),s=w(t.directBridgeRoots,"directBridgeRoots");y(n,s);const i=S(t.packageAnchors,"packageAnchors"),c=E(t.reservedPackageNames),f=F(i);return Object.freeze({consumerRoots:e,dependencyRoots:f,managedImporterRoots:Object.freeze([...Object.values(i),...f.flatMap(l=>t.forbiddenConsumerPackagePrefixes.map(u=>a.join(l,u)).filter(u=>d.existsSync(u)).map(u=>d.realpathSync(u)))]),direct:n,directBridgeRoots:s,engineLabel:o,forbiddenConsumerPackagePrefixes:E(t.forbiddenConsumerPackagePrefixes),packageExports:$(i,o),packageRoots:i,reservedPackageNames:c,stateSymbol:r,trustedImporterFiles:g(t.trustedImporterFiles,"trustedImporterFiles",!1),trustedInternalEntrypoints:g(t.trustedInternalEntrypoints,"trustedInternalEntrypoints",!0),trustedInternalRoots:R(t.trustedInternalEntrypoints,c),verifiedParentlessPackageFiles:x(t.verifiedParentlessPackageFiles,i),verifiedProcessEntrypoints:g(t.verifiedProcessEntrypoints,"verifiedProcessEntrypoints",!0)})}function R(t,o){const r=new Set;for(const e of t){let n=a.dirname(h(e,"trustedInternalEntrypoints"));for(;;){const s=a.join(n,"package.json");if(d.existsSync(s)){const c=k(s);if(typeof c.name=="string"&&o.includes(c.name)){const f=a.relative(n,e),[l]=f.split(a.sep);if(l&&l!==".."&&!a.isAbsolute(f)){const u=a.join(n,l);d.statSync(u).isDirectory()&&r.add(d.realpathSync(u))}}break}const i=a.dirname(n);if(i===n)break;n=i}}return Object.freeze([...r].sort())}function x(t,o){const r=new Set;for(const[e,n]of Object.entries(t)){if(!Object.hasOwn(o,e))throw new Error(`Parentless preload package is not managed: ${e}`);const s=o[e];for(const[i,c]of n.entries()){if(a.isAbsolute(c)||c.length===0||c.includes("\0"))throw new Error(`Parentless preload ${e}[${i.toString()}] must be a relative file`);const f=a.resolve(s,c);if(!m(s,f))throw new Error(`Parentless preload escapes managed package ${e}`);const l=h(f,`verifiedParentlessPackageFiles.${e}[${i.toString()}]`);if(!m(s,l))throw new Error(`Parentless preload escapes managed package ${e}`);r.add(l)}}return Object.freeze([...r].sort())}function S(t,o){const r={};for(const[e,n]of Object.entries(t).sort(([s],[i])=>s.localeCompare(i)))r[e]=O(e,h(n,o));return Object.freeze(r)}function O(t,o){let r=a.dirname(o);for(;;){const e=a.join(r,"package.json");if(d.existsSync(e)&&k(e).name===t)return d.realpathSync(r);const n=a.dirname(r);if(n===r)throw new Error(`Managed package anchor has no matching package root: ${t}`);r=n}}function $(t,o){const r={};for(const[e,n]of Object.entries(t)){const s=k(a.join(n,"package.json"));if(s.name!==e||!b(s.exports))throw new Error(`Managed ${o} package manifest is invalid: ${e}`);for(const[i,c]of Object.entries(s.exports)){if(i!=="."&&!i.startsWith("./")||i.includes("*"))continue;const f=i==="."?e:`${e}${i.slice(1)}`;r[f]=Object.freeze({default:P(e,i,n,p(c,new Set(["node","default"]))),import:P(e,i,n,p(c,new Set(["node","import","default"]))),require:P(e,i,n,p(c,new Set(["node","require","default"])))})}}return Object.freeze(r)}function p(t,o){if(typeof t=="string")return t;if(Array.isArray(t)){for(const r of t){const e=p(r,o);if(e!==null)return e}return null}if(!b(t))return null;for(const[r,e]of Object.entries(t)){if(r==="types"||!o.has(r))continue;const n=p(e,o);if(n!==null)return n}return null}function P(t,o,r,e){if(e===null)return null;if(!e.startsWith("./"))throw new Error(`Managed package export must be relative: ${t}${o}`);const n=a.resolve(r,e);if(!m(r,n))throw new Error(`Managed package export escapes its verified root: ${t}${o}`);try{const s=d.realpathSync(n);if(!m(r,s)||!d.statSync(s).isFile())throw new Error(`Managed package export is not a verified file: ${t}${o}`);return s}catch(s){if(j(s,"ENOENT"))return null;throw s}}function F(t){const o=new Set;for(const[r,e]of Object.entries(t))o.add(r.startsWith("@")?a.dirname(a.dirname(e)):a.dirname(e));return Object.freeze([...o].sort())}
@@ -1 +1 @@
1
- import{makeTempDirAsync as h}from"../../../process/files/temp-dir.js";import{classifyManagedProcessResult as H,terminalOutcome as E,processOutputEvidence as J,emptyEvidence as R,failureFromError as p,firstOutputLine as x,processExitFailure as Y,toError as M,executeEngineTasks as G,managedProcessFailure as Q,taskTimeoutFailure as X}from"../../adapters/execution.js";import{requireRootDirectory as Z,requireAbsoluteWorkspacePath as P,requireConsumerFile as L,safeSegment as A}from"../../adapters/workspace.js";import f from"node:fs/promises";import c from"node:path";import{pathToFileURL as q}from"node:url";import{isEngineTaskDeadlineExceededReason as tt,resolveEngineTaskInputs as et}from"../../api/index.js";import{createInvocationProcessEnvironment as it,runManagedProcess as rt}from"../../../process/index.js";import{preflightNodeVitestInstallation as nt}from"../../installations/node-vitest.js";import{collectNodeVitestEvidence as ot}from"./evidence.js";import{assertNodeVitestSpawnEnvironmentBudget as C,NODE_VITEST_RUNTIME_INPUT_FILE_ENV as at,NODE_VITEST_RUNTIME_INPUT_SHA256_ENV as st,selectNodeVitestForwardedEnvironment as ct,verifyOwnedNodeVitestRuntimeInput as ut,writeOwnedNodeVitestRuntimeInput as dt}from"../runtime/runtime-input.js";import{writeNodeVitestWorkspace as lt}from"./workspace.js";import{engineEvidenceIdentity as pt}from"../../adapters/evidence-identity.js";import{getNodeStartupCacheEnvironment as ft}from"../../adapters/node-startup-cache.js";const I={codePrefix:"NODE_VITEST",label:"Node/Vitest"};class b extends Error{constructor(e){const i=M(e);super(i.message,{cause:i}),this.name="NodeVitestConsumerPreparationError"}}export const nodeVitestExecutorDependencies={removeOwnedDirectory:t=>f.rm(t,{force:!0,recursive:!0}),writeRuntimeInput:dt,writeWorkspace:lt};export async function executeNodeVitestEngine(t,e,i,r=nodeVitestExecutorDependencies){const n=await mt(t,e,r,i);return G(t,n.tasks,I,(a,o)=>Et(t,n,a,o),yt(t,n.installation))}async function mt(t,e,i,r){const n=t.profile.id,a=e.packages.vitest.cli,o=await Z(t.workspace.rootDirectory);P(t.workspace.temporaryDirectory,"temporary directory"),P(t.workspace.artifactDirectory,"artifact directory"),await f.mkdir(t.workspace.temporaryDirectory,{recursive:!0}),await f.mkdir(t.workspace.artifactDirectory,{recursive:!0});const d=await f.realpath(t.workspace.temporaryDirectory),T=await f.realpath(t.workspace.artifactDirectory),l=Object.freeze({...e.authoringEntrypoints,cli:e.packages.vitest.cli,packages:e.packages}),m=await h(`node-vitest-${A(t.invocationId)}-`,{parentDir:d});r.defer(()=>i.removeOwnedDirectory(m));const U=await it(m),g=[];for(const[B,s]of t.tasks.entries()){const v=et(t,s),S=`${B.toString().padStart(3,"0")}-${A(s.id)}`,u=c.join(m,S),y=await h(`${S}-`,{parentDir:T}),w=c.join(u,"testkit-vitest-report.json"),$=c.join(y,"data","manifest.json"),z=c.join(u,"setup.mjs"),O=c.join(u,"input-bootstrap.mjs"),F=c.join(u,"resolution-bootstrap.cjs"),V=c.join(u,"vitest.config.mjs");try{await f.mkdir(u,{mode:448,recursive:!1});const D=await N(()=>L(o,s.file,"Node/Vitest task file")),k=await N(()=>gt(o,v)),W=await N(()=>vt(t,n,s,v)),_=await i.writeRuntimeInput(u,W);await i.writeWorkspace({report:{identity:{engineId:"node-vitest",invocationId:t.invocationId,taskId:s.id,sourceFile:s.file},reportFile:w,workspaceDirectory:u},configFile:k.testkitConfig,entrypoints:l,inputBootstrapFile:O,resolutionBootstrapFile:F,rootDirectory:o,runtimeInput:{expectedFile:_.file,expectedInvocationId:t.invocationId,expectedProfileId:n,expectedSha256:_.sha256,expectedSizeBytes:_.sizeBytes,expectedTaskId:s.id},setupFile:z,sourceFile:D,timeoutMs:Math.max(1,s.deadlineMs-Date.now()),tsconfigFile:k.tsconfig,vitestConfigFile:V}),g.push({artifactDirectory:y,inputs:v,task:s,preparationFailure:null,prepared:{dataManifestFile:$,inputBootstrapFile:O,reportFile:w,resolutionBootstrapFile:F,runtimeInput:_,vitestConfigFile:V}})}catch(D){g.push({artifactDirectory:y,inputs:v,task:s,preparationFailure:Dt(D),prepared:null})}}return Object.freeze({cliFile:a,installation:e,invocationEnvironment:U.environment,profileId:n,rootDirectory:o,tasks:Object.freeze(g)})}async function Et(t,e,i,r){try{await ut(i.prepared.runtimeInput)}catch(l){return E(i.task.id,"failed",r,R(),{...p(l,"NODE_VITEST_INPUT_INVALID"),classification:"infra"})}const n=await Tt(t,e,i),a=i.task.deadlineMs-Date.now();if(a<=0)return E(i.task.id,"failed",r,R(),X(i.task.timeoutMs,I));const o=await rt({args:[e.cliFile,"run","--config",i.prepared.vitestConfigFile,"--configLoader","runner"],cwd:e.rootDirectory,displayLabel:"Node/Vitest",env:n,executable:process.execPath,signal:t.signal,timeoutMs:a});let d;try{d=await ot({identity:{engineId:"node-vitest",invocationId:t.invocationId,taskId:i.task.id,sourceFile:i.task.file},artifactDirectory:i.artifactDirectory,dataManifestFile:i.prepared.dataManifestFile,profileId:e.profileId,reportFile:i.prepared.reportFile,rootDirectory:e.rootDirectory,stderr:o.stderr,stdout:o.stdout})}catch(l){const m=J(o);return E(i.task.id,"failed",r,m,nodeVitestEvidenceCollectionFailure(o,l))}if(d.reportSummary===null&&o.exitCode!==0&&!t.signal.aborted&&!o.timedOut&&!o.outputLimitExceeded&&o.terminationError===null&&o.error===null)try{await nt(e.installation,{signal:t.signal})}catch(l){if(!t.signal.aborted)return E(i.task.id,"failed",r,d.evidence,{...p(l,"NODE_VITEST_INSTALLATION_BROKEN"),classification:"infra"})}const T=classifyNodeVitestProcessResult(o,d,i.task.timeoutMs,tt(t.signal.reason));return E(i.task.id,T.status,r,d.evidence,T.failure)}export function classifyNodeVitestProcessResult(t,e,i,r){const n=H(t,i,r,I);return n!==null?n:e.reportSummary?.numTotalTests===0?{failure:{code:"NODE_VITEST_NO_TESTS",message:"Vitest did not discover any tests for the task file"},status:"failed"}:It(e.reportSummary)?{failure:null,status:"skipped"}:t.exitCode!==0?Y(t,I,e.reportFailureMessage??x(t.stderr)??x(t.stdout),"Vitest"):e.reportError!==null?{failure:{...p(e.reportError,"NODE_VITEST_REPORT_INVALID"),classification:"infra"},status:"failed"}:e.reportFailureMessage!==null?{failure:{code:"NODE_VITEST_REPORT_FAILED",message:e.reportFailureMessage},status:"failed"}:e.dataEvidenceError!==null?{failure:p(e.dataEvidenceError,"NODE_VITEST_DATA_EVIDENCE_INVALID"),status:"failed"}:e.reportSummary===null||!e.reportSummary.success||e.reportSummary.numFailedTests>0||e.reportSummary.numPassedTests===0?{failure:{code:"NODE_VITEST_REPORT_FAILED",message:"Vitest report did not contain a completed passing test"},status:"failed"}:{failure:null,status:"passed"}}export function nodeVitestEvidenceCollectionFailure(t,e){const i=M(e);return Q(t,I,i)??{...p(i,"NODE_VITEST_EVIDENCE_FAILED"),classification:"infra"}}function It(t){return t!==null&&t.success&&t.numTotalTests>0&&t.numPassedTests===0&&t.numFailedTests===0&&(t.numPendingTests>0||t.numTodoTests>0)}async function Tt(t,e,i){const r=i.task,n=j(t,r.serviceName),a={...e.invocationEnvironment};Object.assign(a,{...n===null?{}:{BASE_URL:n},FORCE_COLOR:"0",NODE_OPTIONS:_t(i.prepared.resolutionBootstrapFile,i.prepared.inputBootstrapFile),NO_COLOR:"1",TESTKIT_ACTIVE:"1",[at]:i.prepared.runtimeInput.file,[st]:i.prepared.runtimeInput.sha256,TESTKIT_INTERNAL_FILE_DEADLINE_MS:String(r.deadlineMs),TESTKIT_INTERNAL_FILE_TIMEOUT_SECONDS:String(Math.max(1,Math.ceil(r.timeoutMs/1e3))),TESTKIT_INVOCATION_ID:t.invocationId,TESTKIT_LEASE_DIR:r.orchestration.lease.directory,TESTKIT_LEASE_ID:r.orchestration.lease.id,TESTKIT_MODE:r.orchestration.mode,...r.orchestration.runtimeId===void 0?{}:{TESTKIT_RUNTIME_ID:r.orchestration.runtimeId},TESTKIT_TEST_FILE:r.file,TESTKIT_TEST_ID:r.id,...e.profileId==="node-vitest-data"?{TESTKIT_DATA_ARTIFACT_DIR:c.dirname(i.prepared.dataManifestFile)}:{}}),C(a),Object.assign(a,await ft(t.workspace.cacheDirectory,i.inputs.environment));try{C(a)}catch{delete a.NODE_COMPILE_CACHE}return a}function vt(t,e,i,r){const n=j(t,i.serviceName),a=ct(r.environment);return{context:{baseUrl:n,engineId:"node-vitest",invocationId:t.invocationId,profileId:e,serviceName:i.serviceName,task:{file:i.file,id:i.id,suiteName:i.suiteName,testType:i.testType}},engineId:"node-vitest",environment:a,fixtures:r.fixtures,invocationId:t.invocationId,profileId:e,...r.setupData===void 0?{}:{setupData:r.setupData},taskId:i.id,version:1}}function _t(t,e){return[`--require=${JSON.stringify(t)}`,`--import=${JSON.stringify(q(e).href)}`].join(" ")}function j(t,e){return Object.hasOwn(t.target.endpoints,e)?t.target.endpoints[e]:null}async function gt(t,e){return{testkitConfig:await K(t,e.supportModules,"testkitConfig"),tsconfig:await K(t,e.supportModules,"tsconfig")}}async function K(t,e,i){if(!Object.hasOwn(e,i))return null;const r=e[i];if(!c.isAbsolute(r))throw new Error(`supportModules.${i} must be an absolute path`);return L(t,r,`supportModules.${i}`)}function yt(t,e){return{...pt({engineId:"node-vitest",installationKind:"root-direct-packages",profile:t.profile}),directPackages:{esbuild:e.packages.esbuild.version,typescript:e.packages.typescript.version,vite:e.packages.vite.version,vitest:e.packages.vitest.version}}}function Dt(t){return{...p(t,"NODE_VITEST_PREPARE_FAILED"),classification:t instanceof b?"product":"infra"}}async function N(t){try{return await t()}catch(e){throw new b(e)}}
1
+ import{makeTempDirAsync as h}from"../../../process/files/temp-dir.js";import{toError as R}from"../../../kernel/error-serialization.js";import{classifyManagedProcessResult as H,terminalOutcome as E,processOutputEvidence as J,emptyEvidence as x,failureFromError as p,firstOutputLine as M,processExitFailure as Y,executeEngineTasks as G,managedProcessFailure as Q,taskTimeoutFailure as X}from"../../adapters/execution.js";import{requireRootDirectory as Z,requireAbsoluteWorkspacePath as P,requireConsumerFile as L,safeSegment as A}from"../../adapters/workspace.js";import f from"node:fs/promises";import c from"node:path";import{pathToFileURL as q}from"node:url";import{isEngineTaskDeadlineExceededReason as tt,resolveEngineTaskInputs as et}from"../../api/index.js";import{createInvocationProcessEnvironment as it,runManagedProcess as rt}from"../../../process/index.js";import{preflightNodeVitestInstallation as ot}from"../../installations/node-vitest.js";import{collectNodeVitestEvidence as nt}from"./evidence.js";import{assertNodeVitestSpawnEnvironmentBudget as C,NODE_VITEST_RUNTIME_INPUT_FILE_ENV as at,NODE_VITEST_RUNTIME_INPUT_SHA256_ENV as st,selectNodeVitestForwardedEnvironment as ct,verifyOwnedNodeVitestRuntimeInput as ut,writeOwnedNodeVitestRuntimeInput as dt}from"../runtime/runtime-input.js";import{writeNodeVitestWorkspace as lt}from"./workspace.js";import{engineEvidenceIdentity as pt}from"../../adapters/evidence-identity.js";import{getNodeStartupCacheEnvironment as ft}from"../../adapters/node-startup-cache.js";const I={codePrefix:"NODE_VITEST",label:"Node/Vitest"};class b extends Error{constructor(e){const i=R(e);super(i.message,{cause:i}),this.name="NodeVitestConsumerPreparationError"}}export const nodeVitestExecutorDependencies={removeOwnedDirectory:t=>f.rm(t,{force:!0,recursive:!0}),writeRuntimeInput:dt,writeWorkspace:lt};export async function executeNodeVitestEngine(t,e,i,r=nodeVitestExecutorDependencies){const o=await mt(t,e,r,i);return G(t,o.tasks,I,(a,n)=>Et(t,o,a,n),yt(t,o.installation))}async function mt(t,e,i,r){const o=t.profile.id,a=e.packages.vitest.cli,n=await Z(t.workspace.rootDirectory);P(t.workspace.temporaryDirectory,"temporary directory"),P(t.workspace.artifactDirectory,"artifact directory"),await f.mkdir(t.workspace.temporaryDirectory,{recursive:!0}),await f.mkdir(t.workspace.artifactDirectory,{recursive:!0});const d=await f.realpath(t.workspace.temporaryDirectory),T=await f.realpath(t.workspace.artifactDirectory),l=Object.freeze({...e.authoringEntrypoints,cli:e.packages.vitest.cli,packages:e.packages}),m=await h(`node-vitest-${A(t.invocationId)}-`,{parentDir:d});r.defer(()=>i.removeOwnedDirectory(m));const U=await it(m),g=[];for(const[B,s]of t.tasks.entries()){const v=et(t,s),S=`${B.toString().padStart(3,"0")}-${A(s.id)}`,u=c.join(m,S),y=await h(`${S}-`,{parentDir:T}),w=c.join(u,"testkit-vitest-report.json"),$=c.join(y,"data","manifest.json"),z=c.join(u,"setup.mjs"),O=c.join(u,"input-bootstrap.mjs"),F=c.join(u,"resolution-bootstrap.cjs"),V=c.join(u,"vitest.config.mjs");try{await f.mkdir(u,{mode:448,recursive:!1});const D=await N(()=>L(n,s.file,"Node/Vitest task file")),k=await N(()=>gt(n,v)),W=await N(()=>vt(t,o,s,v)),_=await i.writeRuntimeInput(u,W);await i.writeWorkspace({report:{identity:{engineId:"node-vitest",invocationId:t.invocationId,taskId:s.id,sourceFile:s.file},reportFile:w,workspaceDirectory:u},configFile:k.testkitConfig,entrypoints:l,inputBootstrapFile:O,resolutionBootstrapFile:F,rootDirectory:n,runtimeInput:{expectedFile:_.file,expectedInvocationId:t.invocationId,expectedProfileId:o,expectedSha256:_.sha256,expectedSizeBytes:_.sizeBytes,expectedTaskId:s.id},setupFile:z,sourceFile:D,timeoutMs:Math.max(1,s.deadlineMs-Date.now()),tsconfigFile:k.tsconfig,vitestConfigFile:V}),g.push({artifactDirectory:y,inputs:v,task:s,preparationFailure:null,prepared:{dataManifestFile:$,inputBootstrapFile:O,reportFile:w,resolutionBootstrapFile:F,runtimeInput:_,vitestConfigFile:V}})}catch(D){g.push({artifactDirectory:y,inputs:v,task:s,preparationFailure:Dt(D),prepared:null})}}return Object.freeze({cliFile:a,installation:e,invocationEnvironment:U.environment,profileId:o,rootDirectory:n,tasks:Object.freeze(g)})}async function Et(t,e,i,r){try{await ut(i.prepared.runtimeInput)}catch(l){return E(i.task.id,"failed",r,x(),{...p(l,"NODE_VITEST_INPUT_INVALID"),classification:"infra"})}const o=await Tt(t,e,i),a=i.task.deadlineMs-Date.now();if(a<=0)return E(i.task.id,"failed",r,x(),X(i.task.timeoutMs,I));const n=await rt({args:[e.cliFile,"run","--config",i.prepared.vitestConfigFile,"--configLoader","runner"],cwd:e.rootDirectory,displayLabel:"Node/Vitest",env:o,executable:process.execPath,signal:t.signal,timeoutMs:a});let d;try{d=await nt({identity:{engineId:"node-vitest",invocationId:t.invocationId,taskId:i.task.id,sourceFile:i.task.file},artifactDirectory:i.artifactDirectory,dataManifestFile:i.prepared.dataManifestFile,profileId:e.profileId,reportFile:i.prepared.reportFile,rootDirectory:e.rootDirectory,stderr:n.stderr,stdout:n.stdout})}catch(l){const m=J(n);return E(i.task.id,"failed",r,m,nodeVitestEvidenceCollectionFailure(n,l))}if(d.reportSummary===null&&n.exitCode!==0&&!t.signal.aborted&&!n.timedOut&&!n.outputLimitExceeded&&n.terminationError===null&&n.error===null)try{await ot(e.installation,{signal:t.signal})}catch(l){if(!t.signal.aborted)return E(i.task.id,"failed",r,d.evidence,{...p(l,"NODE_VITEST_INSTALLATION_BROKEN"),classification:"infra"})}const T=classifyNodeVitestProcessResult(n,d,i.task.timeoutMs,tt(t.signal.reason));return E(i.task.id,T.status,r,d.evidence,T.failure)}export function classifyNodeVitestProcessResult(t,e,i,r){const o=H(t,i,r,I);return o!==null?o:e.reportSummary?.numTotalTests===0?{failure:{code:"NODE_VITEST_NO_TESTS",message:"Vitest did not discover any tests for the task file"},status:"failed"}:It(e.reportSummary)?{failure:null,status:"skipped"}:t.exitCode!==0?Y(t,I,e.reportFailureMessage??M(t.stderr)??M(t.stdout),"Vitest"):e.reportError!==null?{failure:{...p(e.reportError,"NODE_VITEST_REPORT_INVALID"),classification:"infra"},status:"failed"}:e.reportFailureMessage!==null?{failure:{code:"NODE_VITEST_REPORT_FAILED",message:e.reportFailureMessage},status:"failed"}:e.dataEvidenceError!==null?{failure:p(e.dataEvidenceError,"NODE_VITEST_DATA_EVIDENCE_INVALID"),status:"failed"}:e.reportSummary===null||!e.reportSummary.success||e.reportSummary.numFailedTests>0||e.reportSummary.numPassedTests===0?{failure:{code:"NODE_VITEST_REPORT_FAILED",message:"Vitest report did not contain a completed passing test"},status:"failed"}:{failure:null,status:"passed"}}export function nodeVitestEvidenceCollectionFailure(t,e){const i=R(e);return Q(t,I,i)??{...p(i,"NODE_VITEST_EVIDENCE_FAILED"),classification:"infra"}}function It(t){return t!==null&&t.success&&t.numTotalTests>0&&t.numPassedTests===0&&t.numFailedTests===0&&(t.numPendingTests>0||t.numTodoTests>0)}async function Tt(t,e,i){const r=i.task,o=j(t,r.serviceName),a={...e.invocationEnvironment};Object.assign(a,{...o===null?{}:{BASE_URL:o},FORCE_COLOR:"0",NODE_OPTIONS:_t(i.prepared.resolutionBootstrapFile,i.prepared.inputBootstrapFile),NO_COLOR:"1",TESTKIT_ACTIVE:"1",[at]:i.prepared.runtimeInput.file,[st]:i.prepared.runtimeInput.sha256,TESTKIT_INTERNAL_FILE_DEADLINE_MS:String(r.deadlineMs),TESTKIT_INTERNAL_FILE_TIMEOUT_SECONDS:String(Math.max(1,Math.ceil(r.timeoutMs/1e3))),TESTKIT_INVOCATION_ID:t.invocationId,TESTKIT_LEASE_DIR:r.orchestration.lease.directory,TESTKIT_LEASE_ID:r.orchestration.lease.id,TESTKIT_MODE:r.orchestration.mode,...r.orchestration.runtimeId===void 0?{}:{TESTKIT_RUNTIME_ID:r.orchestration.runtimeId},TESTKIT_TEST_FILE:r.file,TESTKIT_TEST_ID:r.id,...e.profileId==="node-vitest-data"?{TESTKIT_DATA_ARTIFACT_DIR:c.dirname(i.prepared.dataManifestFile)}:{}}),C(a),Object.assign(a,await ft(t.workspace.cacheDirectory,i.inputs.environment));try{C(a)}catch{delete a.NODE_COMPILE_CACHE}return a}function vt(t,e,i,r){const o=j(t,i.serviceName),a=ct(r.environment);return{context:{baseUrl:o,engineId:"node-vitest",invocationId:t.invocationId,profileId:e,serviceName:i.serviceName,task:{file:i.file,id:i.id,suiteName:i.suiteName,testType:i.testType}},engineId:"node-vitest",environment:a,fixtures:r.fixtures,invocationId:t.invocationId,profileId:e,...r.setupData===void 0?{}:{setupData:r.setupData},taskId:i.id,version:1}}function _t(t,e){return[`--require=${JSON.stringify(t)}`,`--import=${JSON.stringify(q(e).href)}`].join(" ")}function j(t,e){return Object.hasOwn(t.target.endpoints,e)?t.target.endpoints[e]:null}async function gt(t,e){return{testkitConfig:await K(t,e.supportModules,"testkitConfig"),tsconfig:await K(t,e.supportModules,"tsconfig")}}async function K(t,e,i){if(!Object.hasOwn(e,i))return null;const r=e[i];if(!c.isAbsolute(r))throw new Error(`supportModules.${i} must be an absolute path`);return L(t,r,`supportModules.${i}`)}function yt(t,e){return{...pt({engineId:"node-vitest",installationKind:"root-direct-packages",profile:t.profile}),directPackages:{esbuild:e.packages.esbuild.version,typescript:e.packages.typescript.version,vite:e.packages.vite.version,vitest:e.packages.vitest.version}}}function Dt(t){return{...p(t,"NODE_VITEST_PREPARE_FAILED"),classification:t instanceof b?"product":"infra"}}async function N(t){try{return await t()}catch(e){throw new b(e)}}