@stacksjs/testing 0.75.244 → 0.75.246
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +1 -1
- package/package.json +11 -11
package/dist/browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{closeSync as ee,existsSync as S,mkdirSync as te,mkdtempSync as W,openSync as re,readSync as ne,renameSync as se,rmSync as x}from"fs";import{tmpdir as V}from"os";import{join as v}from"path";import P from"process";async function K(t,e=12000,r={}){let s=Date.now(),n=await t();while(!n&&Date.now()-s<e)await Bun.sleep(r.intervalMs??100),n=await t();if(!n)throw Error(`Timed out after ${e}ms${r.label?` waiting for ${r.label}`:""}`);return n}var oe=new Set(["Fetch.continueRequest","Fetch.fulfillRequest","Fetch.failRequest","Fetch.continueResponse"]);function ie(t,e){let r="";for(let s=0;s<t.length;s++){let n=t[s];if(n==="\\"&&s+1<t.length)r+=_(t[++s]);else if(n==="*")r+="[\\s\\S]*";else if(n==="?")r+="[\\s\\S]";else r+=_(n)}return new RegExp(`^${r}$`).test(e)}function _(t){return t.replace(/[.*+?^${}()|[\]\\/]/g,"\\$&")}function B(t,e){let r=e.responseStatusCode!=null||e.responseErrorReason!=null?"Response":"Request";if((t.requestStage??"Request")!==r)return!1;if(t.resourceType&&t.resourceType!==e.resourceType)return!1;return ie(t.urlPattern??"*",e.request?.url??"")}class J{socket;id=0;pending=new Map;listeners=new Map;commandTimeoutMs;interceptors=[];ownFetch=null;answered=new Map;frameLoaders=new Map;requestLoaders=new Map;errors=[];inFlight=new Map;closed=!1;constructor(t,e={}){this.socket=t;this.commandTimeoutMs=e.commandTimeoutMs??30000,t.addEventListener("close",()=>this.markClosed()),t.addEventListener("message",(r)=>this.receive(String(r.data)))}markClosed(){this.closed=!0,this.frameLoaders.clear(),this.requestLoaders.clear();for(let[t,e]of this.pending)clearTimeout(e.timer),e.reject(Error("Chrome closed the connection")),this.pending.delete(t)}receive(t){let e;try{e=JSON.parse(t)}catch{return}if(e.id){let r=this.pending.get(e.id);if(!r)return;if(this.pending.delete(e.id),clearTimeout(r.timer),e.error)r.reject(Error(e.error.message));else r.resolve(e.result);return}if(this.track(e.method,e.params??{}),e.method==="Fetch.requestPaused"&&!this.routePaused(e.params??{}))return;this.dispatch(e.method,e.params??{})}dispatch(t,e){for(let r of[...this.listeners.get(t)??[]])try{r(e)}catch(s){this.errors.push(`Listener for ${t} threw: ${s?.message??String(s)}`)}}routePaused(t){this.remember(t.requestId,!1);let e=this.interceptors.filter((n)=>n.patterns.some((o)=>B(o,t)));for(let n of e)try{let o=n.handler(t,this);if(o&&typeof o.catch==="function")o.catch((a)=>this.errors.push(`Fetch handler threw: ${a?.message??String(a)}`))}catch(o){this.errors.push(`Fetch handler threw: ${o?.message??String(o)}`)}let r=(this.listeners.get("Fetch.requestPaused")?.size??0)>0,s=this.ownFetch?this.ownFetch.patterns.some((n)=>B(n,t)):!1;if(!e.length&&!s&&!r)this.send("Fetch.continueRequest",{requestId:t.requestId}).catch(()=>{});return r&&(s||!e.length)}remember(t,e){if(this.answered.delete(t),this.answered.set(t,e),this.answered.size>2000){for(let[r]of this.answered)if(this.answered.delete(r),this.answered.size<=1000)break}}async applyFetch(){let t=[...this.interceptors.flatMap((e)=>e.patterns),...this.ownFetch?.patterns??[]];if(!t.length)return await this.command("Fetch.disable");return await this.command("Fetch.enable",{...this.ownFetch?.params,patterns:t})}async intercept(t,e){if(!t.length)throw TypeError("intercept needs at least one pattern");let r={patterns:t.map((n)=>({...n})),handler:e};this.interceptors.push(r);try{await this.applyFetch()}catch(n){throw this.interceptors=this.interceptors.filter((o)=>o!==r),n}let s=!1;return async()=>{if(s)return;if(s=!0,this.interceptors=this.interceptors.filter((n)=>n!==r),!this.closed)await this.applyFetch()}}finishRequest(t){this.inFlight.delete(t),this.requestLoaders.delete(t)}retireFrameRequests(t,e){for(let[r,s]of this.requestLoaders)if(s.frameId===t&&(e===void 0||s.loaderId===e))this.finishRequest(r)}track(t,e){if(t==="Network.requestWillBeSent"){let{requestId:r,frameId:s,loaderId:n}=e;if(this.requestLoaders.delete(r),s&&n)this.requestLoaders.set(r,{frameId:s,loaderId:n});this.inFlight.set(e.requestId,`${e.request?.method} ${e.request?.url}`)}else if(t==="Network.loadingFinished"||t==="Network.loadingFailed")this.finishRequest(e.requestId);else if(t==="Network.responseReceived"&&e.response?.mimeType==="text/event-stream")this.finishRequest(e.requestId);else if(t==="Page.frameNavigated"&&e.frame?.id&&e.frame?.loaderId){let{id:r,loaderId:s}=e.frame,n=this.frameLoaders.get(r);if(n&&n!==s)this.retireFrameRequests(r,n);this.frameLoaders.set(r,s)}else if(t==="Page.frameDetached"&&e.reason==="remove")this.frameLoaders.delete(e.frameId),this.retireFrameRequests(e.frameId);if(t==="Runtime.exceptionThrown")this.errors.push(e.exceptionDetails?.exception?.description||e.exceptionDetails?.text||"Runtime exception");else if(t==="Runtime.consoleAPICalled"&&e.type==="error")this.errors.push((e.args||[]).map((r)=>r.value??r.description??"").join(" "));else if(t==="Log.entryAdded"&&e.entry?.level==="error"&&!String(e.entry.text).includes("favicon"))this.errors.push(e.entry.text);else if(t==="Network.loadingFailed"&&!e.canceled)this.errors.push(`Network: ${e.errorText||"request failed"}`)}on(t,e){let r=this.listeners.get(t);if(!r)this.listeners.set(t,r=new Set);return r.add(e),()=>this.off(t,e)}off(t,e){this.listeners.get(t)?.delete(e)}once(t,e=()=>!0,r=this.commandTimeoutMs){return new Promise((s,n)=>{if(this.closed)return n(Error("Chrome closed the connection"));let o=setTimeout(()=>{i(),clearInterval(a),n(Error(`Timed out after ${r}ms waiting for ${t}`))},r),a=setInterval(()=>{if(!this.closed)return;clearTimeout(o),clearInterval(a),i(),n(Error("Chrome closed the connection"))},100),i=this.on(t,(d)=>{if(!e(d))return;clearTimeout(o),clearInterval(a),i(),s(d)})})}send(t,e={}){if(t==="Fetch.enable"){let{patterns:r,...s}=e;return this.ownFetch={patterns:r?.length?r.map((n)=>({...n})):[{urlPattern:"*"}],params:s},this.closed?this.command(t,e):this.applyFetch()}if(t==="Fetch.disable")return this.ownFetch=null,this.closed?this.command(t,e):this.applyFetch();if(oe.has(t)&&typeof e.requestId==="string"){if(this.answered.get(e.requestId)===!0)return Promise.resolve({});if(this.answered.has(e.requestId))this.remember(e.requestId,!0)}return this.command(t,e)}command(t,e={}){let r=++this.id;return new Promise((s,n)=>{if(this.closed)return n(Error("Chrome closed the connection"));let o=setTimeout(()=>{this.pending.delete(r),n(Error(`Chrome command timed out: ${t}`))},this.commandTimeoutMs);this.pending.set(r,{resolve:s,reject:n,timer:o}),this.socket.send(JSON.stringify({id:r,method:t,params:e}))})}async evaluate(t){let e=await this.send("Runtime.evaluate",{expression:t,awaitPromise:!0,returnByValue:!0});if(e.exceptionDetails)throw Error(e.exceptionDetails.exception?.description||e.exceptionDetails.text);return e.result?.value}disconnect(){this.markClosed();try{this.socket.close()}catch{}}}async function O(t,e={}){let r=new WebSocket(t);return await new Promise((s,n)=>{let o=(u)=>{if(clearTimeout(d),r.removeEventListener("open",a),r.removeEventListener("error",i),r.removeEventListener("close",i),u){try{r.close()}catch{}n(u)}else s()},a=()=>o(),i=()=>o(Error(`Could not connect to Chrome at ${t}`)),d=setTimeout(()=>o(Error(`Timed out connecting to Chrome at ${t}`)),e.connectTimeoutMs??30000);r.addEventListener("open",a,{once:!0}),r.addEventListener("error",i,{once:!0}),r.addEventListener("close",i,{once:!0})}),new J(r,e)}var z=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing","/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"],ae=["google-chrome","google-chrome-stable","chromium","chromium-browser","chrome"],Y=["KSProductID","KSUpdateURL","KSChannelID","KSVersion"],N="dev.stacks.testing.chrome";function ce(){if(P.env.CHROME_PATH)return P.env.CHROME_PATH;if(P.platform==="darwin"){let t=z.find((e)=>S(e));if(t)return t}for(let t of ae){let e=Bun.which(t);if(e)return e}return null}function Q(t){let e=/^(.*?\.app)\/Contents\/MacOS\/[^/]+$/.exec(t);return e?e[1]:null}function T(t,e){let r=Bun.spawnSync(["/usr/libexec/PlistBuddy","-c",e,t],{stdout:"pipe",stderr:"pipe"});return{ok:r.exitCode===0,out:r.stdout.toString().trim()}}function le(t){let e=Q(t);if(!e||P.platform!=="darwin")return!1;let r=v(e,"Contents/Info.plist");return S(r)&&Y.some((s)=>T(r,`Print :${s}`).ok)}function ue(t={}){if(P.platform!=="darwin")throw Error("prepareMacChrome is for macOS; elsewhere launch Chrome as installed");let e=t.source??z[0],r=Q(e);if(!r||!S(r))throw Error(`No Chrome app bundle at ${e}`);let s=v(r,"Contents/Info.plist"),n=T(s,"Print :CFBundleShortVersionString").out||"unknown",o=T(s,"Print :CFBundleExecutable").out||"Google Chrome",a=t.directory??v(V(),`stacks-chrome-${n.replace(/[^\w.-]/g,"_")}`),i=v(a,"Chrome.app"),d=v(i,"Contents/MacOS",o),u=v(i,"Contents/Info.plist");if(S(d)&&T(u,"Print :CFBundleIdentifier").out===N&&T(u,"Print :CFBundleShortVersionString").out===n)return{executable:d,app:i,reused:!0};te(a,{recursive:!0});let h=W(v(a,"staging-")),w=v(h,"Chrome.app"),l=(p,y)=>{let f=Bun.spawnSync(p,{stdout:"pipe",stderr:"pipe"});if(f.exitCode!==0)throw Error(`${y} failed: ${f.stderr.toString().trim()}`)};try{l(["cp","-cR",r,w],"Cloning Chrome");let p=v(w,"Contents/Info.plist");for(let y of Y)T(p,`Delete :${y}`);l(["/usr/libexec/PlistBuddy","-c",`Set :CFBundleIdentifier ${N}`,p],"Renaming the Chrome bundle"),l(["codesign","--force","--deep","--sign","-",w],"Re-signing Chrome"),x(i,{recursive:!0,force:!0}),se(w,i)}finally{x(h,{recursive:!0,force:!0})}return{executable:d,app:i,reused:!1}}class k extends Error{diagnostics;constructor(t,e){super(`${t instanceof Error?t.message:String(t)}
|
|
2
|
+
import{closeSync as ee,existsSync as S,mkdirSync as te,mkdtempSync as W,openSync as re,readSync as ne,renameSync as se,rmSync as x}from"fs";import{tmpdir as V}from"os";import{join as v}from"path";import P from"process";async function K(t,e=12000,r={}){let s=Date.now(),n=await t();while(!n&&Date.now()-s<e)await Bun.sleep(r.intervalMs??100),n=await t();if(!n)throw Error(`Timed out after ${e}ms${r.label?` waiting for ${r.label}`:""}`);return n}var oe=new Set(["Fetch.continueRequest","Fetch.fulfillRequest","Fetch.failRequest","Fetch.continueResponse"]);function ie(t,e){let r="";for(let s=0;s<t.length;s++){let n=t[s];if(n==="\\"&&s+1<t.length)r+=_(t[++s]);else if(n==="*")r+="[\\s\\S]*";else if(n==="?")r+="[\\s\\S]";else r+=_(n)}return new RegExp(`^${r}$`).test(e)}function _(t){return t.replace(/[.*+?^${}()|[\]\\/]/g,"\\$&")}function B(t,e){let r=e.responseStatusCode!=null||e.responseErrorReason!=null?"Response":"Request";if((t.requestStage??"Request")!==r)return!1;if(t.resourceType&&t.resourceType!==e.resourceType)return!1;return ie(t.urlPattern??"*",e.request?.url??"")}class J{socket;id=0;pending=new Map;listeners=new Map;commandTimeoutMs;interceptors=[];ownFetch=null;answered=new Map;frameLoaders=new Map;requestLoaders=new Map;errors=[];inFlight=new Map;closed=!1;constructor(t,e={}){this.socket=t;this.commandTimeoutMs=e.commandTimeoutMs??30000,t.addEventListener("close",()=>this.markClosed()),t.addEventListener("message",(r)=>this.receive(String(r.data)))}markClosed(){this.closed=!0,this.frameLoaders.clear(),this.requestLoaders.clear();for(let[t,e]of this.pending)clearTimeout(e.timer),e.reject(Error("Chrome closed the connection")),this.pending.delete(t)}receive(t){let e;try{e=JSON.parse(t)}catch{return}if(e.id){let r=this.pending.get(e.id);if(!r)return;if(this.pending.delete(e.id),clearTimeout(r.timer),e.error)r.reject(Error(e.error.message));else r.resolve(e.result);return}if(this.track(e.method,e.params??{}),e.method==="Fetch.requestPaused"&&!this.routePaused(e.params??{}))return;this.dispatch(e.method,e.params??{})}dispatch(t,e){for(let r of[...this.listeners.get(t)??[]])try{r(e)}catch(s){this.errors.push(`Listener for ${t} threw: ${s?.message??String(s)}`)}}routePaused(t){this.remember(t.requestId,!1);let e=this.interceptors.filter((n)=>n.patterns.some((o)=>B(o,t)));for(let n of e)try{let o=n.handler(t,this);if(o&&typeof o.catch==="function")o.catch((a)=>this.errors.push(`Fetch handler threw: ${a?.message??String(a)}`))}catch(o){this.errors.push(`Fetch handler threw: ${o?.message??String(o)}`)}let r=(this.listeners.get("Fetch.requestPaused")?.size??0)>0,s=this.ownFetch?this.ownFetch.patterns.some((n)=>B(n,t)):!1;if(!e.length&&!s&&!r)this.send("Fetch.continueRequest",{requestId:t.requestId}).catch(()=>{});return r&&(s||!e.length)}remember(t,e){if(this.answered.delete(t),this.answered.set(t,e),this.answered.size>2000){for(let[r]of this.answered)if(this.answered.delete(r),this.answered.size<=1000)break}}async applyFetch(){let t=[...this.interceptors.flatMap((e)=>e.patterns),...this.ownFetch?.patterns??[]];if(!t.length)return await this.command("Fetch.disable");return await this.command("Fetch.enable",{...this.ownFetch?.params,patterns:t})}async intercept(t,e){if(!t.length)throw TypeError("intercept needs at least one pattern");let r={patterns:t.map((n)=>({...n})),handler:e};this.interceptors.push(r);try{await this.applyFetch()}catch(n){throw this.interceptors=this.interceptors.filter((o)=>o!==r),n}let s=!1;return async()=>{if(s)return;if(s=!0,this.interceptors=this.interceptors.filter((n)=>n!==r),!this.closed)await this.applyFetch()}}finishRequest(t){this.inFlight.delete(t),this.requestLoaders.delete(t)}retireFrameRequests(t,e){for(let[r,s]of this.requestLoaders)if(s.frameId===t&&(e===void 0||s.loaderId===e))this.finishRequest(r)}track(t,e){if(t==="Network.requestWillBeSent"){let{requestId:r,frameId:s,loaderId:n}=e;if(this.requestLoaders.delete(r),s&&n)this.requestLoaders.set(r,{frameId:s,loaderId:n});this.inFlight.set(e.requestId,`${e.request?.method} ${e.request?.url}`)}else if(t==="Network.loadingFinished"||t==="Network.loadingFailed")this.finishRequest(e.requestId);else if(t==="Network.responseReceived"&&e.response?.mimeType==="text/event-stream")this.finishRequest(e.requestId);else if(t==="Page.frameNavigated"&&e.frame?.id&&e.frame?.loaderId){let{id:r,loaderId:s}=e.frame,n=this.frameLoaders.get(r);if(n&&n!==s)this.retireFrameRequests(r,n);this.frameLoaders.set(r,s)}else if(t==="Page.frameDetached"&&e.reason==="remove")this.frameLoaders.delete(e.frameId),this.retireFrameRequests(e.frameId);if(t==="Runtime.exceptionThrown")this.errors.push(e.exceptionDetails?.exception?.description||e.exceptionDetails?.text||"Runtime exception");else if(t==="Runtime.consoleAPICalled"&&e.type==="error")this.errors.push((e.args||[]).map((r)=>r.value??r.description??"").join(" "));else if(t==="Log.entryAdded"&&e.entry?.level==="error"&&!String(e.entry.text).includes("favicon"))this.errors.push(e.entry.text);else if(t==="Network.loadingFailed"&&!e.canceled)this.errors.push(`Network: ${e.errorText||"request failed"}`)}on(t,e){let r=this.listeners.get(t);if(!r)this.listeners.set(t,r=new Set);return r.add(e),()=>this.off(t,e)}off(t,e){this.listeners.get(t)?.delete(e)}once(t,e=()=>!0,r=this.commandTimeoutMs){return new Promise((s,n)=>{if(this.closed)return n(Error("Chrome closed the connection"));let o=setTimeout(()=>{i(),clearInterval(a),n(Error(`Timed out after ${r}ms waiting for ${t}`))},r),a=setInterval(()=>{if(!this.closed)return;clearTimeout(o),clearInterval(a),i(),n(Error("Chrome closed the connection"))},100),i=this.on(t,(d)=>{if(!e(d))return;clearTimeout(o),clearInterval(a),i(),s(d)})})}send(t,e={}){if(t==="Fetch.enable"){let{patterns:r,...s}=e;return this.ownFetch={patterns:r?.length?r.map((n)=>({...n})):[{urlPattern:"*"}],params:s},this.closed?this.command(t,e):this.applyFetch()}if(t==="Fetch.disable")return this.ownFetch=null,this.closed?this.command(t,e):this.applyFetch();if(oe.has(t)&&typeof e.requestId==="string"){if(this.answered.get(e.requestId)===!0)return Promise.resolve({});if(this.answered.has(e.requestId))this.remember(e.requestId,!0)}return this.command(t,e)}command(t,e={}){let r=++this.id;return new Promise((s,n)=>{if(this.closed)return n(Error("Chrome closed the connection"));let o=setTimeout(()=>{this.pending.delete(r),n(Error(`Chrome command timed out: ${t}`))},this.commandTimeoutMs);this.pending.set(r,{resolve:s,reject:n,timer:o}),this.socket.send(JSON.stringify({id:r,method:t,params:e}))})}async evaluate(t){let e=await this.send("Runtime.evaluate",{expression:t,awaitPromise:!0,returnByValue:!0});if(e.exceptionDetails)throw Error(e.exceptionDetails.exception?.description||e.exceptionDetails.text);return e.result?.value}disconnect(){this.markClosed();try{this.socket.close()}catch{}}}async function O(t,e={}){let r=new WebSocket(t);return await new Promise((s,n)=>{let o=(u)=>{if(clearTimeout(d),r.removeEventListener("open",a),r.removeEventListener("error",i),r.removeEventListener("close",i),u){try{r.close()}catch{}n(u)}else s()},a=()=>o(),i=()=>o(Error(`Could not connect to Chrome at ${t}`)),d=setTimeout(()=>o(Error(`Timed out connecting to Chrome at ${t}`)),e.connectTimeoutMs??30000);r.addEventListener("open",a,{once:!0}),r.addEventListener("error",i,{once:!0}),r.addEventListener("close",i,{once:!0})}),new J(r,e)}var z=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing","/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"],ae=["google-chrome","google-chrome-stable","chromium","chromium-browser","chrome"],Y=["KSProductID","KSUpdateURL","KSChannelID","KSVersion"],N="dev.stacks.testing.chrome";function ce(){if(P.env.CHROME_PATH)return P.env.CHROME_PATH;if(P.platform==="darwin"){let t=z.find((e)=>S(e));if(t)return t}for(let t of ae){let e=Bun.which(t);if(e)return e}return null}function Q(t){let e=/^(.*?\.app)\/Contents\/MacOS\/[^/]+$/.exec(t);return e?e[1]:null}function T(t,e){let r=Bun.spawnSync(["/usr/libexec/PlistBuddy","-c",e,t],{stdout:"pipe",stderr:"pipe"});return{ok:r.exitCode===0,out:r.stdout.toString().trim()}}function le(t){let e=Q(t);if(!e||P.platform!=="darwin")return!1;let r=v(e,"Contents/Info.plist");return S(r)&&Y.some((s)=>T(r,`Print :${s}`).ok)}function ue(t={}){if(P.platform!=="darwin")throw Error("prepareMacChrome is for macOS; elsewhere launch Chrome as installed");let e=t.source??z[0],r=Q(e);if(!r||!S(r))throw Error(`No Chrome app bundle at ${e}`);let s=v(r,"Contents/Info.plist"),n=T(s,"Print :CFBundleShortVersionString").out||"unknown",o=T(s,"Print :CFBundleExecutable").out||"Google Chrome",a=t.directory??v(V(),`stacks-chrome-${n.replace(/[^\w.-]/g,"_")}`),i=v(a,"Chrome.app"),d=v(i,"Contents/MacOS",o),u=v(i,"Contents/Info.plist");if(S(d)&&T(u,"Print :CFBundleIdentifier").out===N&&T(u,"Print :CFBundleShortVersionString").out===n)return{executable:d,app:i,reused:!0};te(a,{recursive:!0});let h=W(v(a,"staging-")),w=v(h,"Chrome.app"),l=(p,y)=>{let f=Bun.spawnSync(p,{stdout:"pipe",stderr:"pipe"});if(f.exitCode!==0)throw Error(`${y} failed: ${f.stderr.toString().trim()}`)};try{l(["/bin/cp","-cR",r,w],"Cloning Chrome");let p=v(w,"Contents/Info.plist");for(let y of Y)T(p,`Delete :${y}`);l(["/usr/libexec/PlistBuddy","-c",`Set :CFBundleIdentifier ${N}`,p],"Renaming the Chrome bundle"),l(["codesign","--force","--deep","--sign","-",w],"Re-signing Chrome"),x(i,{recursive:!0,force:!0}),se(w,i)}finally{x(h,{recursive:!0,force:!0})}return{executable:d,app:i,reused:!1}}class k extends Error{diagnostics;constructor(t,e){super(`${t instanceof Error?t.message:String(t)}
|
|
3
3
|
Chrome startup: ${JSON.stringify(e)}`,{cause:t});this.diagnostics=e;this.name="ChromeLaunchError"}}async function q(t,e){let r;try{return await Promise.race([t.then(()=>!0),new Promise((s)=>{r=setTimeout(()=>s(!1),e)})])}finally{clearTimeout(r)}}function D(t){let e;try{e=re(t,"r");let r=Buffer.alloc(1024);return r.subarray(0,ne(e,r,0,r.length,0)).toString("utf8")}catch{return null}finally{if(e!==void 0)try{ee(e)}catch{}}}var de=["*/_stx/hmr*"];async function he(t,e=de){if(!e.length)return async()=>{};return await t.intercept(e.map((r)=>({urlPattern:r})),(r,s)=>{s.send("Fetch.fulfillRequest",{requestId:r.requestId,responseCode:200,responseHeaders:[{name:"Content-Type",value:"text/event-stream"}],body:Buffer.from(`retry: 86400000
|
|
4
4
|
|
|
5
5
|
`).toString("base64")}).catch(()=>{})})}function fe(t){let e=t.chromePath??P.env.CHROME_PATH;if(e)return e;let r=ce();if(!r)throw Error("No Chrome found: install Google Chrome or Chromium, or set CHROME_PATH");if((t.stableMacChrome??!0)&&P.platform==="darwin"&&le(r))return ue({source:r}).executable;return r}async function X(t,e,r,s){if(!S(e))throw Error(`Chrome was not found at ${e}`);let n=t.profile||W(v(V(),"stacks-browser-"));x(v(n,"DevToolsActivePort"),{force:!0});let o=v(n,"DevToolsActivePort"),a=(()=>{try{return Bun.spawn([e,...t.headless===!1?[]:["--headless=new"],"--remote-debugging-port=0",`--user-data-dir=${n}`,"--no-first-run","--no-default-browser-check","--disable-background-networking","--disable-component-update","--disable-extensions","--hide-scrollbars","--use-mock-keychain",...t.args??[],"about:blank"],{stdin:"ignore",stdout:"ignore",stderr:"pipe"})}catch(g){let c=null;try{if(!t.profile)x(n,{recursive:!0,force:!0})}catch(m){c=String(m)}throw new k(g,{pid:null,chromePath:e,profile:n,temporaryProfile:!t.profile,elapsedMs:Date.now()-r,exitCodeBeforeCleanup:null,signalCodeBeforeCleanup:null,exitCode:null,signalCode:null,portFileExisted:!1,portFileContents:null,stderrTail:"",stderrTruncated:!1,cleanupError:c})}})(),i="",d=!1,u,h=Promise.resolve(),w,l=()=>w??=(async()=>{let g=!1,c=[];try{if(a.exitCode===null&&a.signalCode===null)try{a.kill("SIGTERM")}catch{}if(!await q(a.exited,2000)){try{a.kill("SIGKILL")}catch{}if(!await q(a.exited,2000))throw Error(`Chrome process ${a.pid} did not exit after SIGKILL`)}g=!0}catch(m){c.push(String(m)),g=a.exitCode!==null||a.signalCode!==null}finally{try{if(!await q(h,100)&&u){if(!await q(u.cancel(),100))throw Error("Chrome stderr cancellation did not finish")}if(!await q(h,100))throw Error("Chrome stderr reader did not finish")}catch(m){c.push(String(m))}finally{if(g&&!t.profile)try{x(n,{recursive:!0,force:!0})}catch(m){c.push(String(m))}}}if(c.length)throw Error(`Chrome cleanup failed: ${c.join("; ")}`)})(),p=()=>a.exitCode!==null||a.signalCode!==null,y=()=>{let g=s-(Date.now()-r);if(g<=0)throw Error(`Timed out after ${s}ms starting Chrome`);if(p())throw Error("Chrome exited during startup");return g},f=async(g,c)=>{let m=Date.now()-r,{exitCode:b,signalCode:R}=a,M=S(o),F=D(o),E=null;if(c)try{await l()}catch(I){E=I instanceof Error?I.message:String(I)}return new k(g,{pid:a.pid,chromePath:e,profile:n,temporaryProfile:!t.profile,elapsedMs:m,exitCodeBeforeCleanup:b,signalCodeBeforeCleanup:R,exitCode:a.exitCode,signalCode:a.signalCode,portFileExisted:M,portFileContents:F,stderrTail:i,stderrTruncated:d,cleanupError:E})};try{u=a.stderr.getReader();let g=u;h=(async()=>{let R=new TextDecoder;for(;;){let{value:M,done:F}=await g.read(),E=R.decode(M,{stream:!F});if(d||=i.length+E.length>16384,i=(i+E).slice(-16384),F)return}})().catch((R)=>{i=`${i}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/testing",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.75.
|
|
5
|
+
"version": "0.75.246",
|
|
6
6
|
"description": "The Stacks way of testing.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -79,16 +79,16 @@
|
|
|
79
79
|
"prepublishOnly": "bun run build"
|
|
80
80
|
},
|
|
81
81
|
"dependencies": {
|
|
82
|
-
"@stacksjs/auth": "0.75.
|
|
83
|
-
"@stacksjs/cache": "0.75.
|
|
84
|
-
"@stacksjs/config": "0.75.
|
|
85
|
-
"@stacksjs/database": "0.75.
|
|
86
|
-
"@stacksjs/email": "0.75.
|
|
87
|
-
"@stacksjs/events": "0.75.
|
|
88
|
-
"@stacksjs/path": "0.75.
|
|
89
|
-
"@stacksjs/router": "0.75.
|
|
90
|
-
"@stacksjs/storage": "0.75.
|
|
91
|
-
"@stacksjs/strings": "0.75.
|
|
82
|
+
"@stacksjs/auth": "0.75.246",
|
|
83
|
+
"@stacksjs/cache": "0.75.246",
|
|
84
|
+
"@stacksjs/config": "0.75.246",
|
|
85
|
+
"@stacksjs/database": "0.75.246",
|
|
86
|
+
"@stacksjs/email": "0.75.246",
|
|
87
|
+
"@stacksjs/events": "0.75.246",
|
|
88
|
+
"@stacksjs/path": "0.75.246",
|
|
89
|
+
"@stacksjs/router": "0.75.246",
|
|
90
|
+
"@stacksjs/storage": "0.75.246",
|
|
91
|
+
"@stacksjs/strings": "0.75.246",
|
|
92
92
|
"@stacksjs/ts-cloud": "^0.16.58",
|
|
93
93
|
"very-happy-dom": "^0.3.5"
|
|
94
94
|
},
|