@gfdelarue/testkit 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +590 -165
  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/batch.js +1 -0
  5. package/dist/app/bugs/ci-report.js +2 -2
  6. package/dist/app/bugs/ci-summary.js +3 -3
  7. package/dist/app/bugs/draft.js +2 -2
  8. package/dist/app/bugs/file.js +1 -1
  9. package/dist/app/bugs/guide.js +1 -1
  10. package/dist/app/bugs/record.js +2 -2
  11. package/dist/app/bugs/run-reading.js +1 -1
  12. package/dist/app/bugs/store.js +1 -1
  13. package/dist/app/campaigns/index.js +2 -2
  14. package/dist/app/campaigns/summary.js +1 -1
  15. package/dist/app/cleanup/index.js +1 -1
  16. package/dist/app/db-schema/prepare.js +1 -1
  17. package/dist/app/db-schema/refresh.js +1 -1
  18. package/dist/app/db-schema/verify.js +1 -1
  19. package/dist/app/destroy/index.js +1 -1
  20. package/dist/app/discover/index.js +2 -2
  21. package/dist/app/environments/config-driven.js +1 -1
  22. package/dist/app/environments/file-setup.js +1 -1
  23. package/dist/app/environments/routing.js +1 -1
  24. package/dist/app/environments/static-values.js +1 -1
  25. package/dist/app/environments/supplied.js +1 -1
  26. package/dist/app/inspect/index.js +1 -1
  27. package/dist/app/lint/native.js +1 -1
  28. package/dist/app/lint/options.js +1 -1
  29. package/dist/app/lint/shared.js +1 -1
  30. package/dist/app/run/engine-orchestration.js +1 -1
  31. package/dist/app/run/environment.js +1 -1
  32. package/dist/app/run/live-run.js +1 -1
  33. package/dist/app/run/orchestrator.js +1 -1
  34. package/dist/app/run/planning.js +1 -1
  35. package/dist/app/run/request.js +1 -1
  36. package/dist/app/run/results.js +1 -1
  37. package/dist/app/run/run-finalization.js +1 -1
  38. package/dist/app/run/run-finisher.js +1 -0
  39. package/dist/app/run/setup/runtime-node-setup-protocol.js +1 -1
  40. package/dist/app/run/setup/runtime-node-setup-worker.js +1 -1
  41. package/dist/app/run/setup/runtime-node-setup.js +2 -2
  42. package/dist/app/run/task-batches.js +1 -1
  43. package/dist/app/run/worker-loop.js +1 -1
  44. package/dist/app/status/model.js +1 -1
  45. package/dist/app/status/runs.js +1 -1
  46. package/dist/app/stop/index.js +1 -1
  47. package/dist/app/tracker/index.js +1 -1
  48. package/dist/app/tracker/token.js +2 -2
  49. package/dist/app/typecheck/index.js +4 -4
  50. package/dist/cli/command-catalog.js +1 -1
  51. package/dist/cli/command-flags.js +1 -1
  52. package/dist/cli/commands/artifacts.js +2 -2
  53. package/dist/cli/commands/bug/file.js +3 -2
  54. package/dist/cli/commands/discover.js +1 -1
  55. package/dist/cli/commands/guard/unsafe-entrypoint.js +1 -1
  56. package/dist/cli/commands/run.js +2 -2
  57. package/dist/cli/commands/typecheck.js +1 -1
  58. package/dist/cli/commands/workspace.js +1 -1
  59. package/dist/cli/framework/help.js +5 -5
  60. package/dist/cli/framework/parser.js +1 -1
  61. package/dist/cli/json-errors.js +1 -1
  62. package/dist/cli/renderers/bug/text.js +1 -1
  63. package/dist/cli/renderers/run/formatting.js +1 -1
  64. package/dist/config/authoring/database-fixture-discovery.js +1 -0
  65. package/dist/config/authoring/index.js +1 -1
  66. package/dist/config/loader/config-loader.js +1 -1
  67. package/dist/config/loader/decode-discovery.js +1 -1
  68. package/dist/config/loader/discover-tests.js +1 -1
  69. package/dist/config/loader/discovery-result.js +1 -0
  70. package/dist/config/loader/discovery.js +2 -2
  71. package/dist/config/loader/file-metadata.js +1 -1
  72. package/dist/config/loader/groups.js +2 -1
  73. package/dist/config/loader/index.js +1 -1
  74. package/dist/config/loader/load.js +1 -1
  75. package/dist/config/loader/managed-configs.js +1 -1
  76. package/dist/config/loader/owned-discovery.js +1 -1
  77. package/dist/config/loader/runtime-isolation.js +1 -1
  78. package/dist/config/loader/skip-config.js +1 -1
  79. package/dist/config/loader/test-selection.js +1 -1
  80. package/dist/database/admin.js +5 -2
  81. package/dist/database/call-caps.js +1 -0
  82. package/dist/database/cleanup.js +1 -1
  83. package/dist/database/configured-steps.js +1 -1
  84. package/dist/database/constants.js +1 -1
  85. package/dist/database/docker-endpoint.js +1 -0
  86. package/dist/database/docker-metadata.js +2 -2
  87. package/dist/database/docker.js +5 -5
  88. package/dist/database/index.js +2 -1
  89. package/dist/database/lifecycle-cleanup.js +1 -1
  90. package/dist/database/local-postgres.js +4 -1
  91. package/dist/database/naming.js +1 -1
  92. package/dist/database/operation-deadline.js +1 -0
  93. package/dist/database/postgres/connection-check.js +1 -1
  94. package/dist/database/postgres/index.js +2 -2
  95. package/dist/database/postgres/owned-exec.js +27 -0
  96. package/dist/database/postgres/protocol.js +2 -2
  97. package/dist/database/provider.js +1 -0
  98. package/dist/database/roles.js +2 -2
  99. package/dist/database/schema-operations.js +5 -1
  100. package/dist/database/schema-source.js +3 -3
  101. package/dist/database/steps.js +1 -1
  102. package/dist/database/template-steps.js +4 -4
  103. package/dist/domain/identifiers.js +1 -1
  104. package/dist/domain/retired-test-types.js +1 -1
  105. package/dist/domain/suite-selection.js +1 -1
  106. package/dist/domain/test-types.js +1 -1
  107. package/dist/engines/adapters/evidence-files.js +1 -1
  108. package/dist/engines/adapters/execution.js +1 -1
  109. package/dist/engines/catalog.js +1 -1
  110. package/dist/engines/definitions.js +1 -1
  111. package/dist/engines/environment/index.js +1 -1
  112. package/dist/engines/installations/node-vitest.js +1 -1
  113. package/dist/engines/installations/playwright.js +1 -1
  114. package/dist/engines/managed-module-resolution.js +6 -2
  115. package/dist/engines/node-vitest/adapter/adapter.js +1 -1
  116. package/dist/engines/node-vitest/adapter/driver.js +2 -2
  117. package/dist/engines/node-vitest/adapter/evidence.js +2 -2
  118. package/dist/engines/node-vitest/adapter/workspace.js +8 -24
  119. package/dist/engines/node-vitest/inventory/index.js +2 -2
  120. package/dist/engines/node-vitest/inventory/list-files.js +3 -3
  121. package/dist/engines/node-vitest/runtime/data/index.js +1 -1
  122. package/dist/engines/node-vitest/runtime/data/report.js +1 -1
  123. package/dist/engines/node-vitest/runtime/data/scenario.js +2 -2
  124. package/dist/engines/node-vitest/runtime/runtime-input.js +1 -1
  125. package/dist/engines/playwright/adapter/adapter.js +1 -1
  126. package/dist/engines/playwright/adapter/browser-network-evidence.js +4 -0
  127. package/dist/engines/playwright/adapter/config.js +16 -6
  128. package/dist/engines/playwright/adapter/evidence.js +2 -1
  129. package/dist/engines/playwright/adapter/failure-details.js +2 -2
  130. package/dist/engines/playwright/adapter/reporter.js +1 -1
  131. package/dist/engines/playwright/runtime/browser-network.js +1 -0
  132. package/dist/engines/playwright/runtime/browser-traffic.js +1 -0
  133. package/dist/engines/playwright/runtime/chromium-environment.js +1 -0
  134. package/dist/engines/playwright/runtime/emulation.js +1 -0
  135. package/dist/engines/playwright/runtime/index.js +1 -1
  136. package/dist/engines/playwright/runtime/managed-test.js +1 -0
  137. package/dist/engines/playwright/runtime/runtime-input.js +2 -2
  138. package/dist/environment/lifecycle-controller.js +1 -1
  139. package/dist/environment/lifecycle.js +1 -1
  140. package/dist/environment/maintenance.js +1 -1
  141. package/dist/environment/run-environment.js +1 -1
  142. package/dist/environment/run-stopping.js +1 -1
  143. package/dist/environment/runtime-manager.js +1 -1
  144. package/dist/evidence/artifact-config.js +1 -1
  145. package/dist/evidence/artifacts.js +5 -2
  146. package/dist/evidence/bundles.js +2 -1
  147. package/dist/evidence/compressed-artifacts.js +1 -0
  148. package/dist/evidence/environment-record.js +1 -1
  149. package/dist/evidence/index.js +1 -1
  150. package/dist/evidence/live-run-summary.js +1 -0
  151. package/dist/evidence/local-paths.js +1 -0
  152. package/dist/evidence/maintenance.js +1 -0
  153. package/dist/evidence/operation-timings.js +1 -1
  154. package/dist/evidence/read-run.js +1 -1
  155. package/dist/evidence/redaction.js +4 -4
  156. package/dist/evidence/run-evidence.js +1 -0
  157. package/dist/evidence/setup-progress.js +1 -1
  158. package/dist/evidence/storage-inventory.js +1 -1
  159. package/dist/evidence/storage.js +2 -2
  160. package/dist/kernel/known-keys.js +1 -0
  161. package/dist/kernel/redaction-targets.js +1 -1
  162. package/dist/kernel/redaction.js +7 -4
  163. package/dist/process/engine-environment-keys.js +1 -0
  164. package/dist/process/environment-overlay.js +1 -1
  165. package/dist/process/environment.js +1 -1
  166. package/dist/process/execa-bundle.json +3 -3
  167. package/dist/process/files/evidence-writes.js +1 -0
  168. package/dist/process/files/product-dir.js +1 -1
  169. package/dist/process/host-process.js +1 -1
  170. package/dist/process/index.js +1 -1
  171. package/dist/process/lifecycle-fence.js +1 -1
  172. package/dist/process/lock-progress.js +2 -0
  173. package/dist/process/locks.js +4 -4
  174. package/dist/process/process-identity.js +1 -1
  175. package/dist/process/process.js +35 -35
  176. package/dist/process/recovery.js +1 -1
  177. package/dist/process/runs/manifest.js +1 -1
  178. package/dist/process/runs/ownership.js +1 -1
  179. package/dist/process/runs/stop.js +1 -1
  180. package/dist/process/shutdown.js +1 -1
  181. package/dist/process/windows-native.js +1 -1
  182. package/dist/repo/fingerprint-policy.js +1 -1
  183. package/dist/repo/history.js +7 -4
  184. package/dist/repo/managed-git.js +1 -1
  185. package/dist/repo/state.js +4 -4
  186. package/dist/steps/configured-step-testkit-modules.js +1 -1
  187. package/dist/steps/environment.js +1 -1
  188. package/dist/toolchains/index.js +2 -2
  189. package/dist/toolchains/node-provisioning.js +2 -2
  190. package/dist/toolchains/vitest/index.js +1 -1
  191. package/dist/tracker/gitea.js +1 -1
  192. package/dist/tracker/github.js +1 -1
  193. package/dist/tracker/http.js +1 -1
  194. package/dist/tracker/ownership.js +1 -0
  195. package/dist/tracker/redaction.js +1 -1
  196. package/dist/tracker/responses.js +1 -1
  197. package/dist/types/config.d.ts +7 -86
  198. package/dist/types/environment.d.ts +6 -0
  199. package/dist/types/node-vitest-data.d.ts +2 -218
  200. package/dist/types/playwright.d.ts +21 -0
  201. package/dist/types/workspace.d.ts +30 -14
  202. package/docs/bug-records.md +19 -18
  203. package/docs/engines.md +115 -21
  204. package/docs/release-notes.md +2846 -0
  205. package/docs/test-types.md +19 -69
  206. package/package.json +15 -6
  207. package/testkit-config-schema.md +101 -170
  208. package/dist/app/lint/rules/data.js +0 -1
  209. package/dist/config/authoring/runtime.js +0 -1
  210. package/dist/config/loader/task-policy.js +0 -1
  211. package/dist/engines/node-vitest/runtime/contract/index.js +0 -1
  212. package/dist/engines/node-vitest/runtime/data/http.js +0 -1
  213. package/dist/engines/node-vitest/runtime/data/runner.js +0 -1
  214. package/dist/environment/lifecycle-artifacts.js +0 -1
  215. package/dist/types/node-vitest-contract.d.ts +0 -75
@@ -1 +0,0 @@
1
- import{createHttpMethods as x}from"../../../../config/authoring/http-methods.js";import b from"node:fs";import{parseRuntimeFixtureManifestEntries as g,resolveRuntimeFixtureEntry as N}from"../../../contracts/fixture-manifest.js";import{readNodeVitestRuntimeInput as d}from"../runtime-input.js";import{expect as T,test as C}from"vitest";import{isUnknownRecord as s}from"../../../../kernel/unknown-values.js";export{T as expect};const w=Object.freeze({}),E=Object.freeze({env:w});export function contractScenario(t,e,n){const{options:r,run:i}=M(e,n);C(t,async()=>{await i(O())},r.timeoutMs||r.timeout)}export function readContractContext(){const t=d();if(t===null)return E;if(t.profileId!=="node-vitest-contract")throw new Error("Node/Vitest contract API requires node-vitest-contract runtime input");const e={...t.context,env:t.environment,...Object.hasOwn(t,"setupData")?{setupData:t.setupData}:{}};if(!A(e))throw new Error("Node/Vitest contract runtime context is invalid");return Object.freeze(e)}export function createHttpClient(t={}){const e=(t.baseUrl||readContractContext().baseUrl||"").replace(/\/+$/u,"");if(!e)throw new Error("createHttpClient(...) requires baseUrl or the managed Node/Vitest contract context baseUrl");const n=t.defaultHeaders||{"Content-Type":"application/json"};async function r(i,c,y,h={},a={}){const u=i.toUpperCase()||"GET",f=j(y,{contentTypeJson:a.contentTypeJson!==!1}),o=await fetch(`${e}${l(c)}`,{method:u,headers:{...f.body==null?{}:n,...h},body:f.body,signal:a.signal}),p=await o.text();return{body:p,headers:R(o.headers),json(){return JSON.parse(p)},method:u,path:l(c),status:o.status,url:o.url}}return{baseUrl:e,...x(r),request:r}}function O(){const t=readContractContext();return Object.freeze({...t,fixture(e){return S(e)},http(e={}){return createHttpClient(e)}})}function S(t){const e=U(t),n=b.readFileSync(e.absolutePath);return{buffer(){return Buffer.from(n)},contentType:e.contentType,filename:e.filename,json(){return JSON.parse(n.toString("utf8"))},path:e.path,sha256:e.sha256,sizeBytes:e.sizeBytes,text(r="utf8"){return n.toString(r)}}}function U(t){const e=q(t,"fixture name"),n=z();return N(n.entries,e)}function z(){const t=d();return t===null?{entries:[]}:{entries:g(t.fixtures,"Node/Vitest contract fixture manifest")}}function j(t,e){if(t==null)return{body:void 0};if(typeof t=="string")return{body:t};if(t instanceof Uint8Array){const n=new Uint8Array(t.byteLength);return n.set(t),{body:n}}if(e.contentTypeJson)return{body:JSON.stringify(t)};throw new TypeError("Non-JSON contract request bodies must be strings or Uint8Array values")}function l(t){const e=t||"/";return e.startsWith("/")?e:`/${e}`}function R(t){const e={};for(const[n,r]of t.entries())e[n.toLowerCase()]=r;return e}function M(t,e){if(typeof t=="function")return{options:{},run:t};if(typeof e!="function")throw new Error("contractScenario(name, options?, run) requires a callback");return{options:t,run:e}}function q(t,e){const n=typeof t=="string"?t.trim():"";if(!n)throw new Error(`${e} is required`);return n}function A(t){return!s(t)||t.engineId!=="node-vitest"||t.profileId!=="node-vitest-contract"||!k(t.env)||"runner"in t||t.baseUrl!==void 0&&t.baseUrl!==null&&typeof t.baseUrl!="string"||t.serviceName!==void 0&&typeof t.serviceName!="string"?!1:I(t.task)}function I(t){return s(t)?!("type"in t)&&t.testType==="contract"&&m(t.file)&&J(t.id)&&m(t.suiteName):!1}function m(t){return t===void 0||typeof t=="string"}function J(t){return t===void 0||typeof t=="string"||typeof t=="number"}function k(t){return s(t)&&Object.values(t).every(e=>typeof e=="string")}
@@ -1 +0,0 @@
1
- import{stringFromUnknown as _}from"./primitives.js";import{createHttpMethods as b}from"../../../../config/authoring/http-methods.js";import{resolveHttpProfile as F}from"../../../../config/authoring/runtime.js";import{readNodeVitestRuntimeInput as G}from"../runtime-input.js";import{isUnknownRecord as l}from"../../../../kernel/unknown-values.js";export function createHttpClient(t={}){const e=(t.baseUrl??readDataContext().baseUrl??"").replace(/\/+$/u,"");if(!e)throw new Error("createHttpClient(...) requires baseUrl or the managed Node/Vitest data context baseUrl");const n=t.recorder||t.trace||null,o=t.defaultHeaders||{"Content-Type":"application/json"},r=t.sessionBundle||null,i=t.defaultActor||r?.primaryActor||null,c=typeof t.getHeaders=="function"?t.getHeaders:null,s=typeof t.getRawHeaders=="function"?t.getRawHeaders:c;async function u(a,f,w,d,E,k={},g={}){O(r,a);const A=w.trim()===""?"GET":w.toUpperCase(),D=`${e}${x(d)}`,H=v(E,{contentTypeJson:g.contentTypeJson!==!1}),$={actor:a&&r?r.actors[a]??null:null,actorName:a,sessionBundle:r},S={...H.body==null?{}:o,...m(f?s:c,$),...k},L=Date.now(),h=await fetch(D,{method:A,headers:S,body:H.body,signal:g.signal}),T=await h.text(),P=Date.now()-L,M=C(h.headers),J={body:T,cookies:V(h.headers),durationMs:P,headers:M,json(){return JSON.parse(T)},method:A,path:x(d),status:h.status,url:D};return n&&n.recordHttpRequest({bodyBytes:it(H.body),durationMs:P,method:A,path:x(d),requestHeaders:S,responseBytes:Buffer.byteLength(T),status:h.status}),J}const p=y(null,!0),R=b(p),U=Object.assign(p,{as:B,get:R.get,post:R.post}),N=y(i,!1);return{...b(N),baseUrl:e,headers(a={}){return{...m(c,{actorName:i,actor:j(r,i),sessionBundle:r}),...a}},rawHeaders(a={}){return{...m(s,{actorName:i,actor:j(r,i),sessionBundle:r}),...a}},raw:U,rawReq:U,request:N,as:I};function y(a,f){return(w,d,E,k,g)=>u(a,f,w,d,E,k,g)}function I(a){O(r,a);const f=y(a,!1),w=B(a);return{...b(f),headers(d={}){return{...m(c,{actorName:a,actor:r?r.actors[a]??null:null,sessionBundle:r}),...d}},rawHeaders(d={}){return{...m(s,{actorName:a,actor:r?r.actors[a]??null:null,sessionBundle:r}),...d}},raw:w,rawReq:w,request:f}}function B(a){const f=y(a,!0);return Object.assign(f,b(f))}}export function readDataContext(){const t=G();if(t===null)return nt;if(t.profileId!=="node-vitest-data")throw new Error("Node/Vitest data API requires node-vitest-data runtime input");return et({...t.context,env:t.environment,...Object.hasOwn(t,"setupData")?{setupData:t.setupData}:{}})}export async function createDataHttpClient(t={}){if(!t.profile)return createHttpClient(t);const e=F(t.profile);if(!e)throw new Error(`Data HTTP profile "${t.profile}" is unavailable because no repo config is registered`);const n=Y(e,t),o=X(n),r=await W(n.auth,o,t.profile),i=createHttpClient({...t,baseUrl:o.BASE,...r?.primaryActor?{defaultActor:r.primaryActor}:{},getHeaders(s){return{...n.auth?.headers?.(r,{actor:s.actorName,env:o})??{},...q(n.headers,r,o,s.actorName)}},getRawHeaders(s){return q(n.rawHeaders,r,o,s.actorName)},...r?{sessionBundle:r}:{}}),c=Q(r,i);return{...i,actor:c.actor,actors:c.actors,env:o}}function K(t){return t??null}function Y(t,e){return{...t,...e,auth:e.auth??K(t.auth),headers:e.headers??t.headers,rawHeaders:e.rawHeaders??t.rawHeaders,env:e.env??t.env}}async function W(t,e,n){const o={env:e,http:Z(),json:ot};let r=null;if(typeof t?.setupAsync=="function"?r=await t.setupAsync(o):typeof t?.setup=="function"&&(r=t.setup(o)),r==null)return null;if(!ft(r))throw new Error(`Data HTTP profile "${n??""}" auth setup must return a session bundle with actors and primaryActor`);return r}function q(t,e,n,o){return typeof t!="function"?{}:t(e,{actor:o,env:n})??{}}function X(t){const n={BASE:readDataContext().baseUrl||process.env.BASE_URL},o={...t.env||n,rawEnv:process.env};if(!o.BASE)throw new Error("Data HTTP profile requires BASE_URL or the managed Node/Vitest data context baseUrl");return{...o,BASE:o.BASE,rawEnv:process.env}}function Q(t,e){const n=Object.keys(t?.actors??{}),o=n.map(s=>{const u=t?.actors[s]??null,p=e.as(s);return{email:u?.email||null,headers:p.headers(),index:u?.actorIndex??0,key:s,name:u?.name||null,organizationKey:u?.organizationKey||null,organizationName:u?.organizationName||null,rawHeaders:p.rawHeaders(),rawReq:p.rawReq,req:p,session:u?.session||null}}),r=new Map(o.map(s=>[s.key,s])),i=t?.primaryActor||null,c=i&&r.get(i)||null;return{actor:c,actors:{names:n,primary:c,get(s){const u=r.get(s);if(!u)throw new Error(`Unknown testkit actor "${s}"`);return u},has(s){return r.has(s)},list(){return o.slice()}}}}function Z(){async function t(e,n,o,r={}){const i=st(r),c=await fetch(n,{method:e,headers:i,body:e==="GET"?void 0:at(o)});return{body:await c.text(),cookies:V(c.headers),headers:C(c.headers),status:c.status}}return{del(e,n,o){return t("DELETE",e,n,o)},get(e,n){return t("GET",e,null,n)},patch(e,n,o){return t("PATCH",e,n,o)},post(e,n,o){return t("POST",e,n,o)},put(e,n,o){return t("PUT",e,n,o)}}}function m(t,e){return typeof t!="function"?{}:t(e)}function O(t,e){if(!(!e||!t)&&!Object.hasOwn(t.actors,e))throw new Error(`Unknown testkit actor "${e}"`)}function x(t){const e=t||"/";return e.startsWith("/")?e:`/${e}`}function v(t,e={}){return t==null?{body:void 0}:typeof t=="string"?{body:t}:t instanceof Uint8Array?{body:Uint8Array.from(t)}:t instanceof URLSearchParams||t instanceof FormData||t instanceof Blob?{body:t}:e.contentTypeJson===!1?{body:z(t)}:{body:JSON.stringify(t)}}function C(t){const e={};for(const[n,o]of t.entries())e[n]=o;return e}function V(t){const e=typeof t.getSetCookie=="function"?t.getSetCookie():tt(t.get("set-cookie")),n={};for(const o of e){const[r]=o.split(";"),i=r.indexOf("=");if(i<=0)continue;const c=r.slice(0,i).trim(),s=r.slice(i+1).trim();n[c]=[{value:s}]}return n}function tt(t){return t?t.split(/,(?=\s*[^;,]+=)/u).map(e=>e.trim()).filter(Boolean):[]}function et(t){if(!l(t))throw new Error("Node/Vitest data context must be an object");if(t.engineId!=="node-vitest")throw new Error('Node/Vitest data context.engineId must be "node-vitest"');if(t.profileId!=="node-vitest-data")throw new Error('Node/Vitest data context.profileId must be "node-vitest-data"');if(!dt(t.env))throw new Error("Node/Vitest data context.env must be a string environment record");if("runner"in t)throw new Error("Node/Vitest data context.runner is not supported");const e={...t,env:t.env};if(t.baseUrl!==void 0&&t.baseUrl!==null&&typeof t.baseUrl!="string")throw new Error("Node/Vitest data context.baseUrl must be a string");if(t.serviceName!==void 0&&typeof t.serviceName!="string")throw new Error("Node/Vitest data context.serviceName must be a string");if(!l(t.task))throw new Error("Node/Vitest data context.task must be an object");{const n=t.task.id;if(n!==void 0&&typeof n!="string"&&typeof n!="number")throw new Error("Node/Vitest data context.task.id is invalid");for(const o of["file","suiteName"])if(t.task[o]!==void 0&&typeof t.task[o]!="string")throw new Error(`Node/Vitest data context.task.${o} must be a string`);if(t.task.testType!=="data")throw new Error('Node/Vitest data context.task.testType must be "data"');if("type"in t.task)throw new Error("Node/Vitest data context.task.type is not supported");e.task={...typeof t.task.file=="string"?{file:t.task.file}:{},...n===void 0?{}:{id:n},...typeof t.task.suiteName=="string"?{suiteName:t.task.suiteName}:{},testType:t.task.testType}}return e.engineId=t.engineId,e.profileId=t.profileId,Object.freeze(e)}const rt=Object.freeze({}),nt=Object.freeze({env:rt});function ot(t){if(!l(t)||typeof t.body!="string")throw new Error("Data HTTP profile response body must be a string");return JSON.parse(t.body)}function st(t){if(t==null)return{};if(!l(t))throw new Error("Data HTTP profile request options must be an object");return t.headers===void 0?{}:ct(t.headers,"Data HTTP profile request headers")}function at(t){if(t!=null)return z(t)}function it(t){return t===void 0?0:typeof t=="string"?Buffer.byteLength(t):t instanceof Blob?t.size:t instanceof URLSearchParams?Buffer.byteLength(t.toString()):t instanceof ArrayBuffer||ArrayBuffer.isView(t)?t.byteLength:0}function j(t,e){return e&&t?.actors?t.actors[e]??null:null}function z(t){return typeof t=="string"||t instanceof Blob||t instanceof FormData||t instanceof URLSearchParams||t instanceof ArrayBuffer?t:ArrayBuffer.isView(t)?Uint8Array.from(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)):_(t)}function ct(t,e){if(!l(t))throw new Error(`${e} must be an object`);const n={};for(const[o,r]of Object.entries(t))n[o]=ut(r,`${e}.${o}`);return n}function ut(t,e){if(typeof t!="string"||t.length===0)throw new Error(`${e} must be a non-empty string`);return t}function ft(t){return l(t)&&l(t.actors)&&(t.primaryActor===null||typeof t.primaryActor=="string")}function dt(t){return l(t)&&Object.values(t).every(e=>typeof e=="string")}
@@ -1 +0,0 @@
1
- import{TestRunner as a}from"vitest";import{isDataScenarioCase as o}from"./scenario.js";export default class s extends a{onCollected(t){for(const r of t)for(const e of r.tasks)if(!o(e))throw new Error(`Data suites must register every case with dataScenario: ${e.name}`)}}
@@ -1 +0,0 @@
1
- import o from"fs";import a from"path";import{finalizeLiveRunArtifact as e}from"../evidence/index.js";import{isUnknownRecord as u}from"../kernel/unknown-values.js";export function reconcileInactiveRunArtifact(n,t){typeof t.runId=="string"&&e(n,{runId:t.runId,reason:"stale run process not active",status:"interrupted"})}export function reconcileOrphanedLiveRunArtifact(n,{activeRunIds:t=new Set}={}){const r=f(n),i=r?.run.id||null;return!i||r?.run.status!=="running"||t.has(i)?!1:e(n,{runId:i,reason:"stale live artifact has no active run manifest",status:"interrupted"})}function f(n){try{const t=JSON.parse(o.readFileSync(a.join(n,".testkit","results","live.json"),"utf8"));return c(t)}catch{return null}}function c(n){if(!u(n)||!u(n.run))return null;const t=n.run.id,r=n.run.status;return!s(t)||!s(r)?null:{run:{id:t,status:r}}}function s(n){return n===void 0||typeof n=="string"}
@@ -1,75 +0,0 @@
1
- import { expect } from 'vitest';
2
-
3
- export interface HttpMethods<Response, Extra extends unknown[]> {
4
- get: (path: string, ...extra: Extra) => Response;
5
- delete: (path: string, body?: unknown, ...extra: Extra) => Response;
6
- post: (path: string, body?: unknown, ...extra: Extra) => Response;
7
- put: (path: string, body?: unknown, ...extra: Extra) => Response;
8
- patch: (path: string, body?: unknown, ...extra: Extra) => Response;
9
- }
10
- export interface ContractScenarioOptions {
11
- timeout?: number;
12
- timeoutMs?: number;
13
- }
14
- export interface ContractHttpRequestOptions extends Record<string, unknown> {
15
- contentTypeJson?: boolean;
16
- signal?: AbortSignal;
17
- }
18
- export interface ContractHttpResponse {
19
- body: string;
20
- headers: Record<string, string>;
21
- json(): unknown;
22
- method: string;
23
- path: string;
24
- status: number;
25
- url: string;
26
- }
27
- export interface ContractHttpClientOptions {
28
- baseUrl?: string;
29
- defaultHeaders?: Record<string, string>;
30
- }
31
- export interface ContractHttpClient extends HttpMethods<Promise<ContractHttpResponse>, [
32
- headers?: Record<string, string>,
33
- options?: ContractHttpRequestOptions
34
- ]> {
35
- baseUrl: string;
36
- request(method: string, path: string, body?: unknown, headers?: Record<string, string>, options?: ContractHttpRequestOptions): Promise<ContractHttpResponse>;
37
- }
38
- export interface ContractFixture {
39
- buffer(): Buffer;
40
- contentType: string;
41
- filename: string;
42
- json(): unknown;
43
- path: string;
44
- sha256: string;
45
- sizeBytes: number;
46
- text(encoding?: BufferEncoding): string;
47
- }
48
- export interface ContractRuntimeContext extends Record<string, unknown> {
49
- baseUrl?: string | null;
50
- engineId?: "node-vitest";
51
- readonly env: Readonly<Record<string, string>>;
52
- profileId?: "node-vitest-contract";
53
- serviceName?: string;
54
- task?: {
55
- file?: string;
56
- id?: number | string;
57
- suiteName?: string;
58
- testType: "contract";
59
- };
60
- }
61
- export interface ContractScenarioContext extends ContractRuntimeContext {
62
- fixture(name: string): ContractFixture;
63
- http(options?: ContractHttpClientOptions): ContractHttpClient;
64
- }
65
- export type ContractScenarioRun = (context: ContractScenarioContext) => unknown;
66
- export declare function contractScenario(name: string, run: ContractScenarioRun): void;
67
- export declare function contractScenario(name: string, options: ContractScenarioOptions, run: ContractScenarioRun): void;
68
- export declare function readContractContext(): ContractRuntimeContext;
69
- export declare function createHttpClient(options?: Readonly<ContractHttpClientOptions>): ContractHttpClient;
70
-
71
- export {
72
- expect,
73
- };
74
-
75
- export {};