From 2b8ec139e28aba47a50d85bcb63729a226915044 Mon Sep 17 00:00:00 2001 From: QAComet Date: Sat, 27 Apr 2024 10:54:13 -0600 Subject: [PATCH] fix: update homepage twitter:image --- 200.html | 20 ++--- 404.html | 20 ++--- _nuxt/{jJdxSUYP.js => 4r0YjvSz.js} | 2 +- _nuxt/9UJQMWko.js | 1 + _nuxt/{BlpW7-o8.js => B0VAc3Z5.js} | 2 +- _nuxt/{CIBrSKio.js => B60RBlQ9.js} | 2 +- _nuxt/{-iiyWVfK.js => BB7G3joz.js} | 2 +- _nuxt/{B3wvVkPS.js => BBg3Df_v.js} | 2 +- _nuxt/{D3rhYO6_.js => BECgZIvk.js} | 2 +- _nuxt/{BNmay2Ox.js => BK5dMROA.js} | 2 +- _nuxt/{CU2a8ONd.js => BMo7zexA.js} | 2 +- _nuxt/{DcFjWfdR.js => BRsYUypn.js} | 2 +- _nuxt/{BCwT3ku9.js => BhCbx3Wd.js} | 2 +- _nuxt/{Bu7SZk0z.js => BlS8upJP.js} | 8 +- _nuxt/{a3lCQdJr.js => BnI7OW5X.js} | 2 +- _nuxt/{CLiedZiS.js => BneHlRLI.js} | 2 +- _nuxt/BnwjeOpX.js | 1 + _nuxt/{BO7VgWjS.js => BqBwjWqG.js} | 2 +- _nuxt/{Bkm5lGB3.js => Bse8ef0b.js} | 2 +- _nuxt/{DpBmcb3F.js => BsvTfDZ0.js} | 2 +- _nuxt/{pvtjWFi2.js => BxiCSTFT.js} | 2 +- _nuxt/{mjnzBbnN.js => ByDkrM4K.js} | 2 +- _nuxt/{CUQ1nFrM.js => BzoHbl1P.js} | 2 +- _nuxt/{DxMaKacJ.js => C17h_atD.js} | 2 +- _nuxt/{CTsxuQGU.js => CCgfT4mO.js} | 2 +- _nuxt/CD12G3CN.js | 1 - _nuxt/{CiI5X-ZH.js => CFwVd7gV.js} | 2 +- _nuxt/{DBoACagk.js => CFzORWKb.js} | 2 +- _nuxt/{BStWRYj4.js => CGfQlKlL.js} | 2 +- _nuxt/{Bb9rc-i1.js => CRh1_mKz.js} | 2 +- _nuxt/{BQTmeGxM.js => CSXQV5-h.js} | 2 +- _nuxt/{8dPTDCd1.js => CToKNNT4.js} | 2 +- _nuxt/{BvZyYzvi.js => CZNwzoXQ.js} | 2 +- _nuxt/{CZdjxv7A.js => CZcQ1mDI.js} | 2 +- _nuxt/{DUi0I8oe.js => C_1yPr0e.js} | 2 +- _nuxt/{D9PIjOys.js => Cn1tIV_T.js} | 2 +- _nuxt/{BDF7_qnw.js => Cst9DoAH.js} | 2 +- _nuxt/{DHy7JUVR.js => Cz78Sion.js} | 2 +- _nuxt/Czu_W2CL.js | 1 + _nuxt/{tGLQVeD8.js => D2xr6gf6.js} | 2 +- _nuxt/{Du3a2oyP.js => DF1VbFfH.js} | 4 +- _nuxt/DOMMcfGQ.js | 1 - _nuxt/{Dtop_YE0.js => DQA0lbK1.js} | 2 +- _nuxt/{qxZzs3oh.js => DQv0CMQg.js} | 2 +- _nuxt/{DgGP7C2m.js => DS-4onvx.js} | 2 +- _nuxt/{Ctq4P3QF.js => DbrryaCF.js} | 2 +- _nuxt/Df2pBprM.js | 1 - _nuxt/{D33P3ETq.js => DgaJ7ELG.js} | 2 +- _nuxt/{Dxr2xmOe.js => Dhont5qJ.js} | 2 +- _nuxt/{twebAfCg.js => DkuQMAl2.js} | 2 +- _nuxt/{uY7d0eSg.js => DmSip271.js} | 2 +- _nuxt/{Blt55MqG.js => DxghXiKV.js} | 2 +- _nuxt/{IHox2P6B.js => J2jEMbcE.js} | 2 +- _nuxt/{N-K5-nTu.js => N8b39uzv.js} | 2 +- _nuxt/{Dfba2t6l.js => Q0Y17sdK.js} | 2 +- _nuxt/{BHlee23A.js => R-gFWJPL.js} | 2 +- _nuxt/Testimonial.BamnguDL.css | 1 + _nuxt/Testimonial.Cue4Qr-t.css | 1 - _nuxt/Ukwwp72Y.js | 1 - _nuxt/{CIDPYlRW.js => X2wNORNR.js} | 4 +- _nuxt/ZkJgmw7I.js | 1 + _nuxt/{BZVFcOsn.js => _tWtRPYx.js} | 2 +- _nuxt/builds/latest.json | 2 +- .../ca109cee-b19c-4e04-8198-82d8546b7421.json | 1 - .../d8c635a6-4df4-43ae-ac4a-a06023848560.json | 1 + _nuxt/{j7haMJK9.js => dGARKcZ6.js} | 2 +- ...ault.CnGTIgSd.css => default.C6rz2lqQ.css} | 2 +- _nuxt/{DedQPodZ.js => dzMqTbw3.js} | 2 +- ...{entry.Ck87SGOn.css => entry.DiT2Mvoi.css} | 2 +- _nuxt/{DzjWGKN4.js => lFVxmSVb.js} | 2 +- _nuxt/{TPisoLyH.js => mB4jvhnn.js} | 2 +- _nuxt/{B5qANkaG.js => maW11VfC.js} | 2 +- _nuxt/open-graph-banner.Cso2_SHa.jpg | Bin 0 -> 63380 bytes _nuxt/open-graph-banner.DatA27wH.jpg | Bin 128423 -> 0 bytes _nuxt/{nWlMw1xF.js => ti0Z0EYt.js} | 2 +- _payload.json | 2 +- ...69884582.json => cache.1714258600178.json} | 2 +- ...582.json => 9C0VBep6PV.1714258600178.json} | 0 ...582.json => Cr3vX64g4U.1714258600178.json} | 0 ...582.json => Qfdjvn2t5d.1714258600178.json} | 0 ...582.json => VlbRDfyd5U.1714258600178.json} | 0 ...582.json => c1NuIkbLFt.1714258600178.json} | 0 ...582.json => jaZDQs2Nrb.1714258600178.json} | 0 ...582.json => muguO0VHIr.1714258600178.json} | 0 ...582.json => x1MOVa2EhJ.1714258600178.json} | 0 case-studies/_payload.json | 2 +- case-studies/automatisch/_payload.json | 2 +- case-studies/automatisch/index.html | 68 ++++++++--------- case-studies/index.html | 36 ++++----- index.html | 46 ++++++------ playwright/_payload.json | 2 +- playwright/architecture/_payload.json | 2 +- playwright/architecture/index.html | 70 +++++++++--------- .../how-playwright-initializes/_payload.json | 2 +- .../how-playwright-initializes/index.html | 70 +++++++++--------- playwright/index.html | 36 ++++----- privacy-policy/_payload.json | 2 +- privacy-policy/index.html | 68 ++++++++--------- terms-and-conditions/_payload.json | 2 +- terms-and-conditions/index.html | 60 +++++++-------- terms-of-service/_payload.json | 2 +- terms-of-service/index.html | 64 ++++++++-------- 102 files changed, 359 insertions(+), 359 deletions(-) rename _nuxt/{jJdxSUYP.js => 4r0YjvSz.js} (86%) create mode 100644 _nuxt/9UJQMWko.js rename _nuxt/{BlpW7-o8.js => B0VAc3Z5.js} (95%) rename _nuxt/{CIBrSKio.js => B60RBlQ9.js} (65%) rename _nuxt/{-iiyWVfK.js => BB7G3joz.js} (64%) rename _nuxt/{B3wvVkPS.js => BBg3Df_v.js} (64%) rename _nuxt/{D3rhYO6_.js => BECgZIvk.js} (99%) rename _nuxt/{BNmay2Ox.js => BK5dMROA.js} (77%) rename _nuxt/{CU2a8ONd.js => BMo7zexA.js} (85%) rename _nuxt/{DcFjWfdR.js => BRsYUypn.js} (78%) rename _nuxt/{BCwT3ku9.js => BhCbx3Wd.js} (64%) rename _nuxt/{Bu7SZk0z.js => BlS8upJP.js} (97%) rename _nuxt/{a3lCQdJr.js => BnI7OW5X.js} (98%) rename _nuxt/{CLiedZiS.js => BneHlRLI.js} (87%) create mode 100644 _nuxt/BnwjeOpX.js rename _nuxt/{BO7VgWjS.js => BqBwjWqG.js} (81%) rename _nuxt/{Bkm5lGB3.js => Bse8ef0b.js} (94%) rename _nuxt/{DpBmcb3F.js => BsvTfDZ0.js} (58%) rename _nuxt/{pvtjWFi2.js => BxiCSTFT.js} (89%) rename _nuxt/{mjnzBbnN.js => ByDkrM4K.js} (85%) rename _nuxt/{CUQ1nFrM.js => BzoHbl1P.js} (77%) rename _nuxt/{DxMaKacJ.js => C17h_atD.js} (96%) rename _nuxt/{CTsxuQGU.js => CCgfT4mO.js} (86%) delete mode 100644 _nuxt/CD12G3CN.js rename _nuxt/{CiI5X-ZH.js => CFwVd7gV.js} (99%) rename _nuxt/{DBoACagk.js => CFzORWKb.js} (98%) rename _nuxt/{BStWRYj4.js => CGfQlKlL.js} (64%) rename _nuxt/{Bb9rc-i1.js => CRh1_mKz.js} (97%) rename _nuxt/{BQTmeGxM.js => CSXQV5-h.js} (77%) rename _nuxt/{8dPTDCd1.js => CToKNNT4.js} (63%) rename _nuxt/{BvZyYzvi.js => CZNwzoXQ.js} (65%) rename _nuxt/{CZdjxv7A.js => CZcQ1mDI.js} (80%) rename _nuxt/{DUi0I8oe.js => C_1yPr0e.js} (85%) rename _nuxt/{D9PIjOys.js => Cn1tIV_T.js} (86%) rename _nuxt/{BDF7_qnw.js => Cst9DoAH.js} (65%) rename _nuxt/{DHy7JUVR.js => Cz78Sion.js} (87%) create mode 100644 _nuxt/Czu_W2CL.js rename _nuxt/{tGLQVeD8.js => D2xr6gf6.js} (85%) rename _nuxt/{Du3a2oyP.js => DF1VbFfH.js} (93%) delete mode 100644 _nuxt/DOMMcfGQ.js rename _nuxt/{Dtop_YE0.js => DQA0lbK1.js} (85%) rename _nuxt/{qxZzs3oh.js => DQv0CMQg.js} (99%) rename _nuxt/{DgGP7C2m.js => DS-4onvx.js} (96%) rename _nuxt/{Ctq4P3QF.js => DbrryaCF.js} (65%) delete mode 100644 _nuxt/Df2pBprM.js rename _nuxt/{D33P3ETq.js => DgaJ7ELG.js} (65%) rename _nuxt/{Dxr2xmOe.js => Dhont5qJ.js} (92%) rename _nuxt/{twebAfCg.js => DkuQMAl2.js} (65%) rename _nuxt/{uY7d0eSg.js => DmSip271.js} (64%) rename _nuxt/{Blt55MqG.js => DxghXiKV.js} (64%) rename _nuxt/{IHox2P6B.js => J2jEMbcE.js} (82%) rename _nuxt/{N-K5-nTu.js => N8b39uzv.js} (77%) rename _nuxt/{Dfba2t6l.js => Q0Y17sdK.js} (85%) rename _nuxt/{BHlee23A.js => R-gFWJPL.js} (95%) create mode 100644 _nuxt/Testimonial.BamnguDL.css delete mode 100644 _nuxt/Testimonial.Cue4Qr-t.css delete mode 100644 _nuxt/Ukwwp72Y.js rename _nuxt/{CIDPYlRW.js => X2wNORNR.js} (78%) create mode 100644 _nuxt/ZkJgmw7I.js rename _nuxt/{BZVFcOsn.js => _tWtRPYx.js} (53%) delete mode 100644 _nuxt/builds/meta/ca109cee-b19c-4e04-8198-82d8546b7421.json create mode 100644 _nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json rename _nuxt/{j7haMJK9.js => dGARKcZ6.js} (58%) rename _nuxt/{default.CnGTIgSd.css => default.C6rz2lqQ.css} (85%) rename _nuxt/{DedQPodZ.js => dzMqTbw3.js} (89%) rename _nuxt/{entry.Ck87SGOn.css => entry.DiT2Mvoi.css} (87%) rename _nuxt/{DzjWGKN4.js => lFVxmSVb.js} (85%) rename _nuxt/{TPisoLyH.js => mB4jvhnn.js} (64%) rename _nuxt/{B5qANkaG.js => maW11VfC.js} (83%) create mode 100644 _nuxt/open-graph-banner.Cso2_SHa.jpg delete mode 100644 _nuxt/open-graph-banner.DatA27wH.jpg rename _nuxt/{nWlMw1xF.js => ti0Z0EYt.js} (64%) rename api/_content/{cache.1714069884582.json => cache.1714258600178.json} (99%) rename api/_content/query/{9C0VBep6PV.1714069884582.json => 9C0VBep6PV.1714258600178.json} (100%) rename api/_content/query/{Cr3vX64g4U.1714069884582.json => Cr3vX64g4U.1714258600178.json} (100%) rename api/_content/query/{Qfdjvn2t5d.1714069884582.json => Qfdjvn2t5d.1714258600178.json} (100%) rename api/_content/query/{VlbRDfyd5U.1714069884582.json => VlbRDfyd5U.1714258600178.json} (100%) rename api/_content/query/{c1NuIkbLFt.1714069884582.json => c1NuIkbLFt.1714258600178.json} (100%) rename api/_content/query/{jaZDQs2Nrb.1714069884582.json => jaZDQs2Nrb.1714258600178.json} (100%) rename api/_content/query/{muguO0VHIr.1714069884582.json => muguO0VHIr.1714258600178.json} (100%) rename api/_content/query/{x1MOVa2EhJ.1714069884582.json => x1MOVa2EhJ.1714258600178.json} (100%) diff --git a/200.html b/200.html index 011b396..e2e81fe 100644 --- a/200.html +++ b/200.html @@ -2,13 +2,13 @@ - - - - - - - - -
- \ No newline at end of file + + + + + + + + +
+ \ No newline at end of file diff --git a/404.html b/404.html index 011b396..e2e81fe 100644 --- a/404.html +++ b/404.html @@ -2,13 +2,13 @@ - - - - - - - - -
- \ No newline at end of file + + + + + + + + +
+ \ No newline at end of file diff --git a/_nuxt/jJdxSUYP.js b/_nuxt/4r0YjvSz.js similarity index 86% rename from _nuxt/jJdxSUYP.js rename to _nuxt/4r0YjvSz.js index 2b022af..963f0a0 100644 --- a/_nuxt/jJdxSUYP.js +++ b/_nuxt/4r0YjvSz.js @@ -1 +1 @@ -import{f as o,i as s,o as n,c as r,d as e,m as a,a as t}from"./Bu7SZk0z.js";const c={key:0},i=t("code",null,"script",-1),d=t("code",null,"ProseScript",-1),f=o({__name:"ProseScript",props:{src:{type:String,default:""}},setup(l){return(_,m)=>s(!1)?(n(),r("div",c,[e(" Rendering the "),i,e(" element is dangerous and is disabled by default. Consider implementing your own "),d,e(" element to have control over script rendering. ")])):a("",!0)}});export{f as default}; +import{f as o,i as s,o as n,c as r,d as e,m as a,a as t}from"./BlS8upJP.js";const c={key:0},i=t("code",null,"script",-1),d=t("code",null,"ProseScript",-1),f=o({__name:"ProseScript",props:{src:{type:String,default:""}},setup(l){return(_,m)=>s(!1)?(n(),r("div",c,[e(" Rendering the "),i,e(" element is dangerous and is disabled by default. Consider implementing your own "),d,e(" element to have control over script rendering. ")])):a("",!0)}});export{f as default}; diff --git a/_nuxt/9UJQMWko.js b/_nuxt/9UJQMWko.js new file mode 100644 index 0000000..77d8527 --- /dev/null +++ b/_nuxt/9UJQMWko.js @@ -0,0 +1 @@ +import{_ as o}from"./DQv0CMQg.js";import"./BlS8upJP.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";export{o as default}; diff --git a/_nuxt/BlpW7-o8.js b/_nuxt/B0VAc3Z5.js similarity index 95% rename from _nuxt/BlpW7-o8.js rename to _nuxt/B0VAc3Z5.js index 853c22d..85d40c3 100644 --- a/_nuxt/BlpW7-o8.js +++ b/_nuxt/B0VAc3Z5.js @@ -1 +1 @@ -import{u as o}from"./B5qANkaG.js";import{_ as a,o as s,c as i,a as e,t as r,p as u,e as l}from"./Bu7SZk0z.js";const c=t=>(u("data-v-6fdef64d"),t=t(),l(),t),d={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},p=c(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),h={class:"max-w-520px text-center"},f=["textContent"],g=["textContent"],b={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const n=t;return o({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(m,x)=>(s(),i("div",d,[p,e("div",h,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:r(t.statusCode)},null,8,f),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:r(t.description)},null,8,g)])]))}},w=a(b,[["__scopeId","data-v-6fdef64d"]]);export{w as default}; +import{u as o}from"./maW11VfC.js";import{_ as a,o as s,c as i,a as e,t as r,p as u,e as l}from"./BlS8upJP.js";const c=t=>(u("data-v-6fdef64d"),t=t(),l(),t),d={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},p=c(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),h={class:"max-w-520px text-center"},f=["textContent"],g=["textContent"],b={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const n=t;return o({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(m,x)=>(s(),i("div",d,[p,e("div",h,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:r(t.statusCode)},null,8,f),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:r(t.description)},null,8,g)])]))}},w=a(b,[["__scopeId","data-v-6fdef64d"]]);export{w as default}; diff --git a/_nuxt/CIBrSKio.js b/_nuxt/B60RBlQ9.js similarity index 65% rename from _nuxt/CIBrSKio.js rename to _nuxt/B60RBlQ9.js index 0059db4..fb45900 100644 --- a/_nuxt/CIBrSKio.js +++ b/_nuxt/B60RBlQ9.js @@ -1 +1 @@ -import{_ as o,o as t,c,l as r}from"./Bu7SZk0z.js";const s={};function l(e,n){return t(),c("blockquote",null,[r(e.$slots,"default")])}const _=o(s,[["render",l]]);export{_ as default}; +import{_ as o,o as t,c,l as r}from"./BlS8upJP.js";const s={};function l(e,n){return t(),c("blockquote",null,[r(e.$slots,"default")])}const _=o(s,[["render",l]]);export{_ as default}; diff --git a/_nuxt/-iiyWVfK.js b/_nuxt/BB7G3joz.js similarity index 64% rename from _nuxt/-iiyWVfK.js rename to _nuxt/BB7G3joz.js index 17c0606..5d78f52 100644 --- a/_nuxt/-iiyWVfK.js +++ b/_nuxt/BB7G3joz.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./Bu7SZk0z.js";const c={};function n(e,a){return r(),s("p",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function n(e,a){return r(),s("p",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/B3wvVkPS.js b/_nuxt/BBg3Df_v.js similarity index 64% rename from _nuxt/B3wvVkPS.js rename to _nuxt/BBg3Df_v.js index 14e8835..0fcb41e 100644 --- a/_nuxt/B3wvVkPS.js +++ b/_nuxt/BBg3Df_v.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./Bu7SZk0z.js";const c={};function n(e,a){return r(),s("em",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function n(e,a){return r(),s("em",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/D3rhYO6_.js b/_nuxt/BECgZIvk.js similarity index 99% rename from _nuxt/D3rhYO6_.js rename to _nuxt/BECgZIvk.js index 85bb28c..6bf8a39 100644 --- a/_nuxt/D3rhYO6_.js +++ b/_nuxt/BECgZIvk.js @@ -1,3 +1,3 @@ -import{S as P,X as R,W as z,E as N,a1 as H,a0 as K,G as q,q as x}from"./Bu7SZk0z.js";const S=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function V(r,i){if(typeof r!="string")throw new TypeError("argument str must be a string");const n={},t=(i||{}).decode||X;let o=0;for(;o{i+=t};return{toString(){return i},getContext(){return n},dispatch(t){return r.replacer&&(t=r.replacer(t)),this[t===null?"null":typeof t](t)},object(t){if(t&&typeof t.toJSON=="function")return this.object(t.toJSON());const o=Object.prototype.toString.call(t);let s="";const a=o.length;a<10?s="unknown:["+o+"]":s=o.slice(8,a-1),s=s.toLowerCase();let c=null;if((c=n.get(t))===void 0)n.set(t,n.size);else return this.dispatch("[CIRCULAR:"+c+"]");if(typeof Buffer<"u"&&Buffer.isBuffer&&Buffer.isBuffer(t))return e("buffer:"),e(t.toString("utf8"));if(s!=="object"&&s!=="function"&&s!=="asyncfunction")this[s]?this[s](t):r.ignoreUnknown||this.unkown(t,s);else{let u=Object.keys(t);r.unorderedObjects&&(u=u.sort());let f=[];r.respectType!==!1&&!A(t)&&(f=Y),r.excludeKeys&&(u=u.filter(l=>!r.excludeKeys(l)),f=f.filter(l=>!r.excludeKeys(l))),e("object:"+(u.length+f.length)+":");const h=l=>{this.dispatch(l),e(":"),r.excludeValues||this.dispatch(t[l]),e(",")};for(const l of u)h(l);for(const l of f)h(l)}},array(t,o){if(o=o===void 0?r.unorderedArrays!==!1:o,e("array:"+t.length+":"),!o||t.length<=1){for(const c of t)this.dispatch(c);return}const s=new Map,a=t.map(c=>{const u=D(r);u.dispatch(c);for(const[f,h]of u.getContext())s.set(f,h);return u.toString()});return n=s,a.sort(),this.array(a,!1)},date(t){return e("date:"+t.toJSON())},symbol(t){return e("symbol:"+t.toString())},unkown(t,o){if(e(o),!!t&&(e(":"),t&&typeof t.entries=="function"))return this.array(Array.from(t.entries()),!0)},error(t){return e("error:"+t.toString())},boolean(t){return e("bool:"+t)},string(t){e("string:"+t.length+":"),e(t)},function(t){e("fn:"),A(t)?this.dispatch("[native]"):this.dispatch(t.toString()),r.respectFunctionNames!==!1&&this.dispatch("function-name:"+String(t.name)),r.respectFunctionProperties&&this.object(t)},number(t){return e("number:"+t)},xml(t){return e("xml:"+t.toString())},null(){return e("Null")},undefined(){return e("Undefined")},regexp(t){return e("regex:"+t.toString())},uint8array(t){return e("uint8array:"),this.dispatch(Array.prototype.slice.call(t))},uint8clampedarray(t){return e("uint8clampedarray:"),this.dispatch(Array.prototype.slice.call(t))},int8array(t){return e("int8array:"),this.dispatch(Array.prototype.slice.call(t))},uint16array(t){return e("uint16array:"),this.dispatch(Array.prototype.slice.call(t))},int16array(t){return e("int16array:"),this.dispatch(Array.prototype.slice.call(t))},uint32array(t){return e("uint32array:"),this.dispatch(Array.prototype.slice.call(t))},int32array(t){return e("int32array:"),this.dispatch(Array.prototype.slice.call(t))},float32array(t){return e("float32array:"),this.dispatch(Array.prototype.slice.call(t))},float64array(t){return e("float64array:"),this.dispatch(Array.prototype.slice.call(t))},arraybuffer(t){return e("arraybuffer:"),this.dispatch(new Uint8Array(t))},url(t){return e("url:"+t.toString())},map(t){e("map:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},set(t){e("set:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},file(t){return e("file:"),this.dispatch([t.name,t.size,t.type,t.lastModfied])},blob(){if(r.ignoreUnknown)return e("[blob]");throw new Error(`Hashing Blob objects is currently not supported +import{S as P,X as R,W as z,E as N,a1 as H,a0 as K,G as q,q as x}from"./BlS8upJP.js";const S=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function V(r,i){if(typeof r!="string")throw new TypeError("argument str must be a string");const n={},t=(i||{}).decode||X;let o=0;for(;o{i+=t};return{toString(){return i},getContext(){return n},dispatch(t){return r.replacer&&(t=r.replacer(t)),this[t===null?"null":typeof t](t)},object(t){if(t&&typeof t.toJSON=="function")return this.object(t.toJSON());const o=Object.prototype.toString.call(t);let s="";const a=o.length;a<10?s="unknown:["+o+"]":s=o.slice(8,a-1),s=s.toLowerCase();let c=null;if((c=n.get(t))===void 0)n.set(t,n.size);else return this.dispatch("[CIRCULAR:"+c+"]");if(typeof Buffer<"u"&&Buffer.isBuffer&&Buffer.isBuffer(t))return e("buffer:"),e(t.toString("utf8"));if(s!=="object"&&s!=="function"&&s!=="asyncfunction")this[s]?this[s](t):r.ignoreUnknown||this.unkown(t,s);else{let u=Object.keys(t);r.unorderedObjects&&(u=u.sort());let f=[];r.respectType!==!1&&!A(t)&&(f=Y),r.excludeKeys&&(u=u.filter(l=>!r.excludeKeys(l)),f=f.filter(l=>!r.excludeKeys(l))),e("object:"+(u.length+f.length)+":");const h=l=>{this.dispatch(l),e(":"),r.excludeValues||this.dispatch(t[l]),e(",")};for(const l of u)h(l);for(const l of f)h(l)}},array(t,o){if(o=o===void 0?r.unorderedArrays!==!1:o,e("array:"+t.length+":"),!o||t.length<=1){for(const c of t)this.dispatch(c);return}const s=new Map,a=t.map(c=>{const u=D(r);u.dispatch(c);for(const[f,h]of u.getContext())s.set(f,h);return u.toString()});return n=s,a.sort(),this.array(a,!1)},date(t){return e("date:"+t.toJSON())},symbol(t){return e("symbol:"+t.toString())},unkown(t,o){if(e(o),!!t&&(e(":"),t&&typeof t.entries=="function"))return this.array(Array.from(t.entries()),!0)},error(t){return e("error:"+t.toString())},boolean(t){return e("bool:"+t)},string(t){e("string:"+t.length+":"),e(t)},function(t){e("fn:"),A(t)?this.dispatch("[native]"):this.dispatch(t.toString()),r.respectFunctionNames!==!1&&this.dispatch("function-name:"+String(t.name)),r.respectFunctionProperties&&this.object(t)},number(t){return e("number:"+t)},xml(t){return e("xml:"+t.toString())},null(){return e("Null")},undefined(){return e("Undefined")},regexp(t){return e("regex:"+t.toString())},uint8array(t){return e("uint8array:"),this.dispatch(Array.prototype.slice.call(t))},uint8clampedarray(t){return e("uint8clampedarray:"),this.dispatch(Array.prototype.slice.call(t))},int8array(t){return e("int8array:"),this.dispatch(Array.prototype.slice.call(t))},uint16array(t){return e("uint16array:"),this.dispatch(Array.prototype.slice.call(t))},int16array(t){return e("int16array:"),this.dispatch(Array.prototype.slice.call(t))},uint32array(t){return e("uint32array:"),this.dispatch(Array.prototype.slice.call(t))},int32array(t){return e("int32array:"),this.dispatch(Array.prototype.slice.call(t))},float32array(t){return e("float32array:"),this.dispatch(Array.prototype.slice.call(t))},float64array(t){return e("float64array:"),this.dispatch(Array.prototype.slice.call(t))},arraybuffer(t){return e("arraybuffer:"),this.dispatch(new Uint8Array(t))},url(t){return e("url:"+t.toString())},map(t){e("map:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},set(t){e("set:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},file(t){return e("file:"),this.dispatch([t.name,t.size,t.type,t.lastModfied])},blob(){if(r.ignoreUnknown)return e("[blob]");throw new Error(`Hashing Blob objects is currently not supported Use "options.replacer" or "options.ignoreUnknown" `)},domwindow(){return e("domwindow")},bigint(t){return e("bigint:"+t.toString())},process(){return e("process")},timer(){return e("timer")},pipe(){return e("pipe")},tcp(){return e("tcp")},udp(){return e("udp")},tty(){return e("tty")},statwatcher(){return e("statwatcher")},securecontext(){return e("securecontext")},connection(){return e("connection")},zlib(){return e("zlib")},context(){return e("context")},nodescript(){return e("nodescript")},httpparser(){return e("httpparser")},dataview(){return e("dataview")},signal(){return e("signal")},fsevent(){return e("fsevent")},tlswrap(){return e("tlswrap")}}}const I="[native code] }",$=I.length;function A(r){return typeof r!="function"?!1:Function.prototype.toString.call(r).slice(-$)===I}class d{constructor(i,n){i=this.words=i||[],this.sigBytes=n===void 0?i.length*4:n}toString(i){return(i||Q).stringify(this)}concat(i){if(this.clamp(),this.sigBytes%4)for(let n=0;n>>2]>>>24-n%4*8&255;this.words[this.sigBytes+n>>>2]|=e<<24-(this.sigBytes+n)%4*8}else for(let n=0;n>>2]=i.words[n>>>2];return this.sigBytes+=i.sigBytes,this}clamp(){this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4)}clone(){return new d([...this.words])}}const Q={stringify(r){const i=[];for(let n=0;n>>2]>>>24-n%4*8&255;i.push((e>>>4).toString(16),(e&15).toString(16))}return i.join("")}},Z={stringify(r){const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=[];for(let e=0;e>>2]>>>24-e%4*8&255,o=r.words[e+1>>>2]>>>24-(e+1)%4*8&255,s=r.words[e+2>>>2]>>>24-(e+2)%4*8&255,a=t<<16|o<<8|s;for(let c=0;c<4&&e*8+c*6>>6*(3-c)&63))}return n.join("")}},ee={parse(r){const i=r.length,n=[];for(let e=0;e>>2]|=(r.charCodeAt(e)&255)<<24-e%4*8;return new d(n,i)}},te={parse(r){return ee.parse(unescape(encodeURIComponent(r)))}};class re{constructor(){this._data=new d,this._nDataBytes=0,this._minBufferSize=0,this.blockSize=512/32}reset(){this._data=new d,this._nDataBytes=0}_append(i){typeof i=="string"&&(i=te.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes}_doProcessBlock(i,n){}_process(i){let n,e=this._data.sigBytes/(this.blockSize*4);i?e=Math.ceil(e):e=Math.max((e|0)-this._minBufferSize,0);const t=e*this.blockSize,o=Math.min(t*4,this._data.sigBytes);if(t){for(let s=0;s>>7)^(w<<14|w>>>18)^w>>>3,m=y[l-2],F=(m<<15|m>>>17)^(m<<13|m>>>19)^m>>>10;y[l]=L+y[l-7]+F+y[l-16]}const g=c&u^~c&f,v=t&o^t&s^o&s,b=(t<<30|t>>>2)^(t<<19|t>>>13)^(t<<10|t>>>22),M=(c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25),_=h+M+g+ie[l]+y[l],U=b+v;h=f,f=u,u=c,c=a+_|0,a=s,s=o,o=t,t=_+U|0}e[0]=e[0]+t|0,e[1]=e[1]+o|0,e[2]=e[2]+s|0,e[3]=e[3]+a|0,e[4]=e[4]+c|0,e[5]=e[5]+u|0,e[6]=e[6]+f|0,e[7]=e[7]+h|0}finalize(i){super.finalize(i);const n=this._nDataBytes*8,e=this._data.sigBytes*8;return this._data.words[e>>>5]|=128<<24-e%32,this._data.words[(e+64>>>9<<4)+14]=Math.floor(n/4294967296),this._data.words[(e+64>>>9<<4)+15]=n,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}}function oe(r){return new se().finalize(r).toString(Z)}function de(r,i={}){const n=typeof r=="string"?r:B(r,i);return oe(n).slice(0,10)}function ae(r,i,n={}){return r===i||B(r,n)===B(i,n)}function p(r){if(typeof r!="object")return r;var i,n,e=Object.prototype.toString.call(r);if(e==="[object Object]"){if(r.constructor!==Object&&typeof r.constructor=="function"){n=new r.constructor;for(i in r)r.hasOwnProperty(i)&&n[i]!==r[i]&&(n[i]=p(r[i]))}else{n={};for(i in r)i==="__proto__"?Object.defineProperty(n,i,{value:p(r[i]),configurable:!0,enumerable:!0,writable:!0}):n[i]=p(r[i])}return n}if(e==="[object Array]"){for(i=r.length,n=Array(i);i--;)n[i]=p(r[i]);return n}return e==="[object Set]"?(n=new Set,r.forEach(function(t){n.add(p(t))}),n):e==="[object Map]"?(n=new Map,r.forEach(function(t,o){n.set(p(o),p(t))}),n):e==="[object Date]"?new Date(+r):e==="[object RegExp]"?(n=new RegExp(r.source,r.flags),n.lastIndex=r.lastIndex,n):e==="[object DataView]"?new r.constructor(p(r.buffer)):e==="[object ArrayBuffer]"?r.slice(0):e.slice(-6)==="Array]"?new r.constructor(r):r}const ce={path:"/",watch:!0,decode:r=>K(decodeURIComponent(r)),encode:r=>encodeURIComponent(typeof r=="string"?r:JSON.stringify(r))},ue=void 0;function k(r,i){var c;const n={...ce,...i},e=O(n)||{};let t;n.maxAge!==void 0?t=n.maxAge*1e3:n.expires&&(t=n.expires.getTime()-Date.now());const o=t!==void 0&&t<=0,s=p(o?void 0:e[r]??((c=n.default)==null?void 0:c.call(n))),a=t&&!o?he(s,t,n.watch&&n.watch!=="shallow"):P(s);{let u=null;try{!ue&&typeof BroadcastChannel<"u"&&(u=new BroadcastChannel(`nuxt:cookies:${r}`))}catch{}const f=()=>{n.readonly||ae(a.value,e[r])||(fe(r,a.value,n),e[r]=p(a.value),u==null||u.postMessage({value:n.encode(a.value)}))},h=g=>{var b;const v=g.refresh?(b=O(n))==null?void 0:b[r]:n.decode(g.value);l=!0,e[r]=a.value=v,q(()=>{l=!1})};let l=!1;R()&&z(()=>{l=!0,f(),u==null||u.close()}),u&&(u.onmessage=({data:g})=>h(g)),n.watch?N(a,()=>{l||f()},{deep:n.watch!=="shallow"}):f()}return a}function O(r={}){return V(document.cookie,r)}function le(r,i,n={}){return i==null?T(r,i,{...n,maxAge:-1}):T(r,i,n)}function fe(r,i,n={}){document.cookie=le(r,i,n)}const j=2147483647;function he(r,i,n){let e,t,o=0;const s=n?P(r):{value:r};return R()&&z(()=>{t==null||t(),clearTimeout(e)}),H((a,c)=>{n&&(t=N(s,c));function u(){clearTimeout(e);const f=i-o,h=f{if(o+=h,o({isEnabled:()=>{const e=x().query;return Object.prototype.hasOwnProperty.call(e,"preview")&&!e.preview?!1:!!(e.preview||k("previewToken").value||sessionStorage.getItem("previewToken"))},getPreviewToken:()=>k("previewToken").value||sessionStorage.getItem("previewToken")||void 0,setPreviewToken:e=>{k("previewToken").value=e,x().query.preview=e||"",e?sessionStorage.setItem("previewToken",e):sessionStorage.removeItem("previewToken"),window.location.reload()}});export{de as h,ye as u}; diff --git a/_nuxt/BNmay2Ox.js b/_nuxt/BK5dMROA.js similarity index 77% rename from _nuxt/BNmay2Ox.js rename to _nuxt/BK5dMROA.js index f873ed3..2d87c00 100644 --- a/_nuxt/BNmay2Ox.js +++ b/_nuxt/BK5dMROA.js @@ -1 +1 @@ -import i from"./DHy7JUVR.js";import{f as a,c,a as e,b as s,u as m,o as p}from"./Bu7SZk0z.js";import{u as g}from"./B5qANkaG.js";import{_ as l}from"./Ukwwp72Y.js";import"./pvtjWFi2.js";import"./qxZzs3oh.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";import"./Bkm5lGB3.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";const _={class:"page-wrapper"},d={class:"legal-outer"},y=e("h1",{class:"page-header"},"Privacy Policy",-1),I=a({__name:"privacy-policy",setup(u){const o=m(),t=new URL(o.public.baseUrl);t.pathname=l;const n=t.toString();return g({title:"QAComet - Terms & Conditions",meta:[{name:"description",content:"Privacy Policy for QAComet"},{property:"og:image",content:n},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/privacy"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(h,f)=>{const r=i;return p(),c("div",_,[e("div",d,[y,s(r,{path:"/privacy-policy"})])])}}});export{I as default}; +import i from"./Cz78Sion.js";import{f as a,c,a as e,b as s,u as m,o as p}from"./BlS8upJP.js";import{u as g}from"./maW11VfC.js";import{_ as l}from"./Czu_W2CL.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./Bse8ef0b.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const _={class:"page-wrapper"},d={class:"legal-outer"},y=e("h1",{class:"page-header"},"Privacy Policy",-1),I=a({__name:"privacy-policy",setup(u){const o=m(),t=new URL(o.public.baseUrl);t.pathname=l;const n=t.toString();return g({title:"QAComet - Terms & Conditions",meta:[{name:"description",content:"Privacy Policy for QAComet"},{property:"og:image",content:n},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/privacy"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(h,f)=>{const r=i;return p(),c("div",_,[e("div",d,[y,s(r,{path:"/privacy-policy"})])])}}});export{I as default}; diff --git a/_nuxt/CU2a8ONd.js b/_nuxt/BMo7zexA.js similarity index 85% rename from _nuxt/CU2a8ONd.js rename to _nuxt/BMo7zexA.js index af07d4a..5cd2745 100644 --- a/_nuxt/CU2a8ONd.js +++ b/_nuxt/BMo7zexA.js @@ -1 +1 @@ -import{_ as u}from"./DBoACagk.js";import{u as p}from"./Bb9rc-i1.js";import{q as _}from"./Du3a2oyP.js";import{u as h}from"./B5qANkaG.js";import{f as g,h as w,c as n,a as e,F as y,r as f,i as C,o as a,t as o,b as d,w as l,d as r}from"./Bu7SZk0z.js";import"./D3rhYO6_.js";const k={class:"blog-outer"},v={class:"blog-wrapper"},A=e("div",{class:"blog-header"},[e("h1",null,"Case Studies"),e("h2",{class:"subheader"},"A showcase of some recent work we've done")],-1),b={class:"content-wrapper"},x={class:"blog-post-wrapper"},Q={class:"date-wrapper"},q={class:"month"},D={class:"day"},N={class:"year"},S={class:"description-wrapper"},R=g({__name:"index",async setup(B){let s,i;const{data:m}=([s,i]=w(()=>p("case-studies",()=>_("/case-studies").only(["title","link","created","shortDescription"]).find())),s=await s,i(),s);return h({title:"QAComet | Case Studies",meta:[{name:"description",content:"Interested in how QAComet could work for you? Check out our case studies guiding you through some of the work we do with our clients."},{property:"og:image",content:"https://qacomet.com/img/case-studies/case_studies_linkedin.jpg"},{property:"og:image:width",content:"1200"},{property:"og:image:height",content:"630"},{property:"og:title",content:"QAComet | Case Studies"},{property:"og:url",content:"https://qacomet.com/case-studies"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Curious what working with QAComet would be like? Check out our case studies showing some recent work we've done."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(V,F)=>{const c=u;return a(),n("div",k,[e("div",v,[A,e("div",b,[(a(!0),n(y,null,f(C(m),t=>(a(),n("div",x,[e("div",Q,[e("div",q,o(t.created.month),1),e("div",D,o(t.created.day),1),e("div",N,o(t.created.year),1)]),e("div",S,[e("h3",null,[d(c,{to:t.link},{default:l(()=>[r(o(t.title),1)]),_:2},1032,["to"])]),e("p",null,[r(o(t.shortDescription)+" ",1),d(c,{class:"read",to:t.link},{default:l(()=>[r("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{R as default}; +import{_ as u}from"./CFzORWKb.js";import{u as p}from"./CRh1_mKz.js";import{q as _}from"./DF1VbFfH.js";import{u as h}from"./maW11VfC.js";import{f as g,h as w,c as n,a as e,F as y,r as f,i as C,o as a,t as o,b as d,w as l,d as r}from"./BlS8upJP.js";import"./BECgZIvk.js";const k={class:"blog-outer"},v={class:"blog-wrapper"},A=e("div",{class:"blog-header"},[e("h1",null,"Case Studies"),e("h2",{class:"subheader"},"A showcase of some recent work we've done")],-1),b={class:"content-wrapper"},x={class:"blog-post-wrapper"},Q={class:"date-wrapper"},q={class:"month"},D={class:"day"},N={class:"year"},S={class:"description-wrapper"},R=g({__name:"index",async setup(B){let s,i;const{data:m}=([s,i]=w(()=>p("case-studies",()=>_("/case-studies").only(["title","link","created","shortDescription"]).find())),s=await s,i(),s);return h({title:"QAComet | Case Studies",meta:[{name:"description",content:"Interested in how QAComet could work for you? Check out our case studies guiding you through some of the work we do with our clients."},{property:"og:image",content:"https://qacomet.com/img/case-studies/case_studies_linkedin.jpg"},{property:"og:image:width",content:"1200"},{property:"og:image:height",content:"630"},{property:"og:title",content:"QAComet | Case Studies"},{property:"og:url",content:"https://qacomet.com/case-studies"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Curious what working with QAComet would be like? Check out our case studies showing some recent work we've done."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(V,F)=>{const c=u;return a(),n("div",k,[e("div",v,[A,e("div",b,[(a(!0),n(y,null,f(C(m),t=>(a(),n("div",x,[e("div",Q,[e("div",q,o(t.created.month),1),e("div",D,o(t.created.day),1),e("div",N,o(t.created.year),1)]),e("div",S,[e("h3",null,[d(c,{to:t.link},{default:l(()=>[r(o(t.title),1)]),_:2},1032,["to"])]),e("p",null,[r(o(t.shortDescription)+" ",1),d(c,{class:"read",to:t.link},{default:l(()=>[r("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{R as default}; diff --git a/_nuxt/DcFjWfdR.js b/_nuxt/BRsYUypn.js similarity index 78% rename from _nuxt/DcFjWfdR.js rename to _nuxt/BRsYUypn.js index 2e1b6cd..ab2b930 100644 --- a/_nuxt/DcFjWfdR.js +++ b/_nuxt/BRsYUypn.js @@ -1 +1 @@ -import d from"./Bkm5lGB3.js";import{f as c,H as l,J as f}from"./Bu7SZk0z.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";import"./D3rhYO6_.js";const u=(r,t)=>f("pre",null,JSON.stringify({message:"You should use slots with ",slot:r,data:t},null,2)),h=c({name:"ContentList",props:{path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0}},render(r){const t=l(),{path:p,query:a}=r,m={...a||{},path:p||(a==null?void 0:a.path)||"/"};return f(d,m,{default:t!=null&&t.default?({data:e,refresh:o,isPartial:n})=>t.default({list:e,refresh:o,isPartial:n,...this.$attrs}):e=>u("default",e.data),empty:e=>t!=null&&t.empty?t.empty(e):u("default",e==null?void 0:e.data),"not-found":e=>{var o;return t!=null&&t["not-found"]?(o=t==null?void 0:t["not-found"])==null?void 0:o.call(t,e):u("not-found",e==null?void 0:e.data)}})}}),S=h;export{S as default}; +import d from"./Bse8ef0b.js";import{f as c,H as l,J as f}from"./BlS8upJP.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";import"./BECgZIvk.js";const u=(r,t)=>f("pre",null,JSON.stringify({message:"You should use slots with ",slot:r,data:t},null,2)),h=c({name:"ContentList",props:{path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0}},render(r){const t=l(),{path:p,query:a}=r,m={...a||{},path:p||(a==null?void 0:a.path)||"/"};return f(d,m,{default:t!=null&&t.default?({data:e,refresh:o,isPartial:n})=>t.default({list:e,refresh:o,isPartial:n,...this.$attrs}):e=>u("default",e.data),empty:e=>t!=null&&t.empty?t.empty(e):u("default",e==null?void 0:e.data),"not-found":e=>{var o;return t!=null&&t["not-found"]?(o=t==null?void 0:t["not-found"])==null?void 0:o.call(t,e):u("not-found",e==null?void 0:e.data)}})}}),S=h;export{S as default}; diff --git a/_nuxt/BCwT3ku9.js b/_nuxt/BhCbx3Wd.js similarity index 64% rename from _nuxt/BCwT3ku9.js rename to _nuxt/BhCbx3Wd.js index 6baf922..e0353da 100644 --- a/_nuxt/BCwT3ku9.js +++ b/_nuxt/BhCbx3Wd.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./Bu7SZk0z.js";const c={};function l(e,n){return r(),s("ul",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function l(e,n){return r(),s("ul",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; diff --git a/_nuxt/Bu7SZk0z.js b/_nuxt/BlS8upJP.js similarity index 97% rename from _nuxt/Bu7SZk0z.js rename to _nuxt/BlS8upJP.js index 8e1b6b9..2f58f9a 100644 --- a/_nuxt/Bu7SZk0z.js +++ b/_nuxt/BlS8upJP.js @@ -1,6 +1,6 @@ function __vite__mapDeps(indexes) { if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["./CTsxuQGU.js","./CZdjxv7A.js","./DBoACagk.js","./Testimonial.Cue4Qr-t.css","./CLiedZiS.js","./pvtjWFi2.js","./qxZzs3oh.js","./BsYmvPZw.js","./D3rhYO6_.js","./Bb9rc-i1.js","./Du3a2oyP.js","./B5qANkaG.js","./CU2a8ONd.js","./DgGP7C2m.js","./Ukwwp72Y.js","./index.yI_g7lt1.css","./DOMMcfGQ.js","./BO7VgWjS.js","./D9PIjOys.js","./BNmay2Ox.js","./DHy7JUVR.js","./Bkm5lGB3.js","./CUQ1nFrM.js","./BQTmeGxM.js","./CD12G3CN.js","./a3lCQdJr.js","./ProseCode.DPIjDHas.css","./DcFjWfdR.js","./CIDPYlRW.js","./Df2pBprM.js","./j7haMJK9.js","./DxMaKacJ.js","./IHox2P6B.js","./ProsePre.CchFRBtv.css","./twebAfCg.js","./Dxr2xmOe.js","./default.CnGTIgSd.css","./BHlee23A.js","./error-404.CyhgO96i.css","./BlpW7-o8.js","./error-500.Cph627d6.css"] + __vite__mapDeps.viteFileDeps = ["./CCgfT4mO.js","./CZcQ1mDI.js","./CFzORWKb.js","./Testimonial.BamnguDL.css","./BneHlRLI.js","./BxiCSTFT.js","./DQv0CMQg.js","./BsYmvPZw.js","./BECgZIvk.js","./CRh1_mKz.js","./DF1VbFfH.js","./maW11VfC.js","./BMo7zexA.js","./DS-4onvx.js","./Czu_W2CL.js","./index.yI_g7lt1.css","./ZkJgmw7I.js","./BqBwjWqG.js","./Cn1tIV_T.js","./BK5dMROA.js","./Cz78Sion.js","./Bse8ef0b.js","./BzoHbl1P.js","./CSXQV5-h.js","./BnwjeOpX.js","./BnI7OW5X.js","./ProseCode.DPIjDHas.css","./BRsYUypn.js","./X2wNORNR.js","./9UJQMWko.js","./dGARKcZ6.js","./C17h_atD.js","./J2jEMbcE.js","./ProsePre.CchFRBtv.css","./DkuQMAl2.js","./Dhont5qJ.js","./default.C6rz2lqQ.css","./R-gFWJPL.js","./error-404.CyhgO96i.css","./B0VAc3Z5.js","./error-500.Cph627d6.css"] } return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) } @@ -20,10 +20,10 @@ function __vite__mapDeps(indexes) { * @vue/runtime-dom v3.4.21 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const zu="http://www.w3.org/2000/svg",Gu="http://www.w3.org/1998/Math/MathML",gt=typeof document<"u"?document:null,Gs=gt&>.createElement("template"),Ju={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?gt.createElementNS(zu,e):t==="mathml"?gt.createElementNS(Gu,e):gt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>gt.createTextNode(e),createComment:e=>gt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>gt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Gs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Gs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ct="transition",cn="animation",An=Symbol("_vtc"),Tr=(e,{slots:t})=>Oe(iu,Qu(e),t);Tr.displayName="Transition";const sa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Tr.props=_e({},Sl,sa);const Tt=(e,t=[])=>{z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Js=e=>e?z(e)?e.some(t=>t.length>1):e.length>1:!1;function Qu(e){const t={};for(const H in e)H in sa||(t[H]=e[H]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:u=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,v=Xu(o),P=v&&v[0],k=v&&v[1],{onBeforeEnter:A,onEnter:y,onEnterCancelled:m,onLeave:_,onLeaveCancelled:w,onBeforeAppear:E=A,onAppear:L=y,onAppearCancelled:S=m}=t,$=(H,G,le)=>{Ct(H,G?c:l),Ct(H,G?u:i),le&&le()},N=(H,G)=>{H._isLeaving=!1,Ct(H,f),Ct(H,g),Ct(H,d),G&&G()},Q=H=>(G,le)=>{const ae=H?L:y,V=()=>$(G,H,le);Tt(ae,[G,V]),Qs(()=>{Ct(G,H?a:s),ut(G,H?c:l),Js(ae)||Xs(G,r,P,V)})};return _e(t,{onBeforeEnter(H){Tt(A,[H]),ut(H,s),ut(H,i)},onBeforeAppear(H){Tt(E,[H]),ut(H,a),ut(H,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(H,G){H._isLeaving=!0;const le=()=>N(H,G);ut(H,f),ef(),ut(H,d),Qs(()=>{H._isLeaving&&(Ct(H,f),ut(H,g),Js(_)||Xs(H,r,k,le))}),Tt(_,[H,le])},onEnterCancelled(H){$(H,!1),Tt(m,[H])},onAppearCancelled(H){$(H,!0),Tt(S,[H])},onLeaveCancelled(H){N(H),Tt(w,[H])}})}function Xu(e){if(e==null)return null;if(ce(e))return[Fr(e.enter),Fr(e.leave)];{const t=Fr(e);return[t,t]}}function Fr(e){return Ji(e)}function ut(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[An]||(e[An]=new Set)).add(t)}function Ct(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[An];n&&(n.delete(t),n.size||(e[An]=void 0))}function Qs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Yu=0;function Xs(e,t,n,r){const o=e._endId=++Yu,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Zu(e,t);if(!i)return r();const u=i+"end";let c=0;const f=()=>{e.removeEventListener(u,d),s()},d=g=>{g.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[v]||"").split(", "),o=r(`${ct}Delay`),s=r(`${ct}Duration`),i=Ys(o,s),l=r(`${cn}Delay`),a=r(`${cn}Duration`),u=Ys(l,a);let c=null,f=0,d=0;t===ct?i>0&&(c=ct,f=i,d=s.length):t===cn?u>0&&(c=cn,f=u,d=a.length):(f=Math.max(i,u),c=f>0?i>u?ct:cn:null,d=c?c===ct?s.length:a.length:0);const g=c===ct&&/\b(transform|all)(,|$)/.test(r(`${ct}Property`).toString());return{type:c,timeout:f,propCount:d,hasTransform:g}}function Ys(e,t){for(;e.lengthZs(n)+Zs(e[r])))}function Zs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ef(){return document.body.offsetHeight}function tf(e,t,n){const r=e[An];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ei=Symbol("_vod"),nf=Symbol("_vsh"),rf=Symbol(""),of=/(^|;)\s*display\s*:/;function sf(e,t,n){const r=e.style,o=me(n);let s=!1;if(n&&!o){if(t)if(me(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Xn(r,l,"")}else for(const i in t)n[i]==null&&Xn(r,i,"");for(const i in n)i==="display"&&(s=!0),Xn(r,i,n[i])}else if(o){if(t!==n){const i=r[rf];i&&(n+=";"+i),r.cssText=n,s=of.test(n)}}else t&&e.removeAttribute("style");ei in e&&(e[ei]=s?r.display:"",e[nf]&&(r.display="none"))}const ti=/\s*!important$/;function Xn(e,t,n){if(z(n))n.forEach(r=>Xn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=lf(e,t);ti.test(n)?e.setProperty(on(r),n.replace(ti,""),"important"):e[r]=n}}const ni=["Webkit","Moz","ms"],Br={};function lf(e,t){const n=Br[t];if(n)return n;let r=Ze(t);if(r!=="filter"&&r in e)return Br[t]=r;r=mr(r);for(let o=0;oVr||(pf.then(()=>Vr=0),Vr=Date.now());function mf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Be(yf(r,n.value),t,5,[r])};return n.value=e,n.attached=gf(),n}function yf(e,t){if(z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const ii=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,_f=(e,t,n,r,o,s,i,l,a)=>{const u=o==="svg";t==="class"?tf(e,r,u):t==="style"?sf(e,n,r):Ln(t)?jo(t)||df(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):vf(e,t,r,u))?cf(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),af(e,t,r,u))};function vf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ii(t)&&X(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ii(t)&&me(n)?!1:t in e}const ia=_e({patchProp:_f},Ju);let _n,li=!1;function bf(){return _n||(_n=Hu(ia))}function Ef(){return _n=li?_n:Mu(ia),li=!0,_n}const wf=(...e)=>{const t=bf().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=aa(r);if(!o)return;const s=t._component;!X(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,la(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},Rf=(...e)=>{const t=Ef().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=aa(r);if(o)return n(o,!0,la(o))},t};function la(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function aa(e){return me(e)?document.querySelector(e):e}const Pf=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,Tf=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Cf=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Af(e,t){if(e==="__proto__"||e==="constructor"&&t&&typeof t=="object"&&"prototype"in t){Sf(e);return}return t}function Sf(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function ur(e,t={}){if(typeof e!="string")return e;const n=e.trim();if(e[0]==='"'&&e.endsWith('"')&&!e.includes("\\"))return n.slice(1,-1);if(n.length<=9){const r=n.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="undefined")return;if(r==="null")return null;if(r==="nan")return Number.NaN;if(r==="infinity")return Number.POSITIVE_INFINITY;if(r==="-infinity")return Number.NEGATIVE_INFINITY}if(!Cf.test(e)){if(t.strict)throw new SyntaxError("[destr] Invalid JSON");return e}try{if(Pf.test(e)||Tf.test(e)){if(t.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(e,Af)}return JSON.parse(e)}catch(r){if(t.strict)throw r;return e}}const xf=/#/g,kf=/&/g,Lf=/\//g,Of=/=/g,cs=/\+/g,If=/%5e/gi,Hf=/%60/gi,Mf=/%7c/gi,Nf=/%20/gi;function $f(e){return encodeURI(""+e).replace(Mf,"|")}function bo(e){return $f(typeof e=="string"?e:JSON.stringify(e)).replace(cs,"%2B").replace(Nf,"+").replace(xf,"%23").replace(kf,"%26").replace(Hf,"`").replace(If,"^").replace(Lf,"%2F")}function Ur(e){return bo(e).replace(Of,"%3D")}function fr(e=""){try{return decodeURIComponent(""+e)}catch{return""+e}}function jf(e){return fr(e.replace(cs," "))}function Df(e){return fr(e.replace(cs," "))}function Ff(e=""){const t={};e[0]==="?"&&(e=e.slice(1));for(const n of e.split("&")){const r=n.match(/([^=]+)=?(.*)/)||[];if(r.length<2)continue;const o=jf(r[1]);if(o==="__proto__"||o==="constructor")continue;const s=Df(r[2]||"");t[o]===void 0?t[o]=s:Array.isArray(t[o])?t[o].push(s):t[o]=[t[o],s]}return t}function Bf(e,t){return(typeof t=="number"||typeof t=="boolean")&&(t=String(t)),t?Array.isArray(t)?t.map(n=>`${Ur(e)}=${bo(n)}`).join("&"):`${Ur(e)}=${bo(t)}`:Ur(e)}function Vf(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>Bf(t,e[t])).filter(Boolean).join("&")}const Uf=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,Wf=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,Kf=/^([/\\]\s*){2,}[^/\\]/,qf=/^[\s\0]*(blob|data|javascript|vbscript):$/i,zf=/\/$|\/\?|\/#/,Gf=/^\.?\//;function $t(e,t={}){return typeof t=="boolean"&&(t={acceptRelative:t}),t.strict?Uf.test(e):Wf.test(e)||(t.acceptRelative?Kf.test(e):!1)}function Jf(e){return!!e&&qf.test(e)}function Eo(e="",t){return t?zf.test(e):e.endsWith("/")}function us(e="",t){if(!t)return(Eo(e)?e.slice(0,-1):e)||"/";if(!Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");o>=0&&(n=e.slice(0,o),r=e.slice(o));const[s,...i]=n.split("?");return((s.endsWith("/")?s.slice(0,-1):s)||"/")+(i.length>0?`?${i.join("?")}`:"")+r}function wo(e="",t){if(!t)return e.endsWith("/")?e:e+"/";if(Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");if(o>=0&&(n=e.slice(0,o),r=e.slice(o),!n))return r;const[s,...i]=n.split("?");return s+"/"+(i.length>0?`?${i.join("?")}`:"")+r}function Qf(e=""){return e.startsWith("/")}function ai(e=""){return Qf(e)?e:"/"+e}function Xf(e,t){if(ua(t)||$t(e))return e;const n=us(t);return e.startsWith(n)?e:fs(n,e)}function ci(e,t){if(ua(t))return e;const n=us(t);if(!e.startsWith(n))return e;const r=e.slice(n.length);return r[0]==="/"?r:"/"+r}function ca(e,t){const n=Cr(e),r={...Ff(n.search),...t};return n.search=Vf(r),ed(n)}function ua(e){return!e||e==="/"}function Yf(e){return e&&e!=="/"}function fs(e,...t){let n=e||"";for(const r of t.filter(o=>Yf(o)))if(n){const o=r.replace(Gf,"");n=wo(n)+o}else n=r;return n}function fa(...e){var i,l,a,u;const t=/\/(?!\/)/,n=e.filter(Boolean),r=[];let o=0;for(const c of n)if(!(!c||c==="/")){for(const[f,d]of c.split(t).entries())if(!(!d||d===".")){if(d===".."){if(r.length===1&&$t(r[0]))continue;r.pop(),o--;continue}if(f===1&&((i=r[r.length-1])!=null&&i.endsWith(":/"))){r[r.length-1]+="/"+d;continue}r.push(d),o++}}let s=r.join("/");return o>=0?(l=n[0])!=null&&l.startsWith("/")&&!s.startsWith("/")?s="/"+s:(a=n[0])!=null&&a.startsWith("./")&&!s.startsWith("./")&&(s="./"+s):s="../".repeat(-1*o)+s,(u=n[n.length-1])!=null&&u.endsWith("/")&&!s.endsWith("/")&&(s+="/"),s}function Zf(e,t,n={}){return n.trailingSlash||(e=wo(e),t=wo(t)),n.leadingSlash||(e=ai(e),t=ai(t)),n.encoding||(e=fr(e),t=fr(t)),e===t}const da=Symbol.for("ufo:protocolRelative");function Cr(e="",t){const n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){const[,f,d=""]=n;return{protocol:f.toLowerCase(),pathname:d,href:f+d,auth:"",host:"",search:"",hash:""}}if(!$t(e,{acceptRelative:!0}))return t?Cr(t+e):ui(e);const[,r="",o,s=""]=e.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,i="",l=""]=s.match(/([^#/?]*)(.*)?/)||[],{pathname:a,search:u,hash:c}=ui(l.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:r.toLowerCase(),auth:o?o.slice(0,Math.max(0,o.length-1)):"",host:i,pathname:a,search:u,hash:c,[da]:!r}}function ui(e=""){const[t="",n="",r=""]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:r}}function ed(e){const t=e.pathname||"",n=e.search?(e.search.startsWith("?")?"":"?")+e.search:"",r=e.hash||"",o=e.auth?e.auth+"@":"",s=e.host||"";return(e.protocol||e[da]?(e.protocol||"")+"//":"")+o+s+t+n+r}class td extends Error{constructor(t,n){super(t,n),this.name="FetchError",n!=null&&n.cause&&!this.cause&&(this.cause=n.cause)}}function nd(e){var a,u,c,f,d;const t=((a=e.error)==null?void 0:a.message)||((u=e.error)==null?void 0:u.toString())||"",n=((c=e.request)==null?void 0:c.method)||((f=e.options)==null?void 0:f.method)||"GET",r=((d=e.request)==null?void 0:d.url)||String(e.request)||"/",o=`[${n}] ${JSON.stringify(r)}`,s=e.response?`${e.response.status} ${e.response.statusText}`:"",i=`${o}: ${s}${t?` ${t}`:""}`,l=new td(i,e.error?{cause:e.error}:void 0);for(const g of["request","options","response"])Object.defineProperty(l,g,{get(){return e[g]}});for(const[g,v]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(l,g,{get(){return e.response&&e.response[v]}});return l}const rd=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function fi(e="GET"){return rd.has(e.toUpperCase())}function od(e){if(e===void 0)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"||t===null?!0:t!=="object"?!1:Array.isArray(e)?!0:e.buffer?!1:e.constructor&&e.constructor.name==="Object"||typeof e.toJSON=="function"}const sd=new Set(["image/svg","application/xml","application/xhtml","application/html"]),id=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function ld(e=""){if(!e)return"json";const t=e.split(";").shift()||"";return id.test(t)?"json":sd.has(t)||t.startsWith("text/")?"text":"blob"}function ad(e,t,n=globalThis.Headers){const r={...t,...e};if(t!=null&&t.params&&(e!=null&&e.params)&&(r.params={...t==null?void 0:t.params,...e==null?void 0:e.params}),t!=null&&t.query&&(e!=null&&e.query)&&(r.query={...t==null?void 0:t.query,...e==null?void 0:e.query}),t!=null&&t.headers&&(e!=null&&e.headers)){r.headers=new n((t==null?void 0:t.headers)||{});for(const[o,s]of new n((e==null?void 0:e.headers)||{}))r.headers.set(o,s)}return r}const cd=new Set([408,409,425,429,500,502,503,504]),ud=new Set([101,204,205,304]);function ha(e={}){const{fetch:t=globalThis.fetch,Headers:n=globalThis.Headers,AbortController:r=globalThis.AbortController}=e;async function o(l){const a=l.error&&l.error.name==="AbortError"&&!l.options.timeout||!1;if(l.options.retry!==!1&&!a){let c;typeof l.options.retry=="number"?c=l.options.retry:c=fi(l.options.method)?0:1;const f=l.response&&l.response.status||500;if(c>0&&(Array.isArray(l.options.retryStatusCodes)?l.options.retryStatusCodes.includes(f):cd.has(f))){const d=l.options.retryDelay||0;return d>0&&await new Promise(g=>setTimeout(g,d)),s(l.request,{...l.options,retry:c-1})}}const u=nd(l);throw Error.captureStackTrace&&Error.captureStackTrace(u,s),u}const s=async function(a,u={}){var g;const c={request:a,options:ad(u,e.defaults,n),response:void 0,error:void 0};c.options.method=(g=c.options.method)==null?void 0:g.toUpperCase(),c.options.onRequest&&await c.options.onRequest(c),typeof c.request=="string"&&(c.options.baseURL&&(c.request=Xf(c.request,c.options.baseURL)),(c.options.query||c.options.params)&&(c.request=ca(c.request,{...c.options.params,...c.options.query}))),c.options.body&&fi(c.options.method)&&(od(c.options.body)?(c.options.body=typeof c.options.body=="string"?c.options.body:JSON.stringify(c.options.body),c.options.headers=new n(c.options.headers||{}),c.options.headers.has("content-type")||c.options.headers.set("content-type","application/json"),c.options.headers.has("accept")||c.options.headers.set("accept","application/json")):("pipeTo"in c.options.body&&typeof c.options.body.pipeTo=="function"||typeof c.options.body.pipe=="function")&&("duplex"in c.options||(c.options.duplex="half")));let f;if(!c.options.signal&&c.options.timeout){const v=new r;f=setTimeout(()=>v.abort(),c.options.timeout),c.options.signal=v.signal}try{c.response=await t(c.request,c.options)}catch(v){return c.error=v,c.options.onRequestError&&await c.options.onRequestError(c),await o(c)}finally{f&&clearTimeout(f)}if(c.response.body&&!ud.has(c.response.status)&&c.options.method!=="HEAD"){const v=(c.options.parseResponse?"json":c.options.responseType)||ld(c.response.headers.get("content-type")||"");switch(v){case"json":{const P=await c.response.text(),k=c.options.parseResponse||ur;c.response._data=k(P);break}case"stream":{c.response._data=c.response.body;break}default:c.response._data=await c.response[v]()}}return c.options.onResponse&&await c.options.onResponse(c),!c.options.ignoreResponseError&&c.response.status>=400&&c.response.status<600?(c.options.onResponseError&&await c.options.onResponseError(c),await o(c)):c.response},i=async function(a,u){return(await s(a,u))._data};return i.raw=s,i.native=(...l)=>t(...l),i.create=(l={})=>ha({...e,defaults:{...e.defaults,...l}}),i}const ds=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")}(),fd=ds.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),dd=ds.Headers,hd=ds.AbortController,pd=ha({fetch:fd,Headers:dd,AbortController:hd}),gd=pd,md=()=>{var e;return((e=window==null?void 0:window.__NUXT__)==null?void 0:e.config)||{}},dr=md().app,yd=()=>dr.baseURL,_d=()=>dr.buildAssetsDir,hs=(...e)=>fa(pa(),_d(),...e),pa=(...e)=>{const t=dr.cdnURL||dr.baseURL;return e.length?fa(t,...e):t};globalThis.__buildAssetsURL=hs,globalThis.__publicAssetsURL=pa;globalThis.$fetch||(globalThis.$fetch=gd.create({baseURL:yd()}));function Ro(e,t={},n){for(const r in e){const o=e[r],s=n?`${n}:${r}`:r;typeof o=="object"&&o!==null?Ro(o,t,s):typeof o=="function"&&(t[s]=o)}return t}const vd={run:e=>e()},bd=()=>vd,ga=typeof console.createTask<"u"?console.createTask:bd;function Ed(e,t){const n=t.shift(),r=ga(n);return e.reduce((o,s)=>o.then(()=>r.run(()=>s(...t))),Promise.resolve())}function wd(e,t){const n=t.shift(),r=ga(n);return Promise.all(e.map(o=>r.run(()=>o(...t))))}function Wr(e,t){for(const n of[...e])n(t)}class Rd{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(t,n,r={}){if(!t||typeof n!="function")return()=>{};const o=t;let s;for(;this._deprecatedHooks[t];)s=this._deprecatedHooks[t],t=s.to;if(s&&!r.allowDeprecated){let i=s.message;i||(i=`${o} hook has been deprecated`+(s.to?`, please use ${s.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(i)||(console.warn(i),this._deprecatedMessages.add(i))}if(!n.name)try{Object.defineProperty(n,"name",{get:()=>"_"+t.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[t]=this._hooks[t]||[],this._hooks[t].push(n),()=>{n&&(this.removeHook(t,n),n=void 0)}}hookOnce(t,n){let r,o=(...s)=>(typeof r=="function"&&r(),r=void 0,o=void 0,n(...s));return r=this.hook(t,o),r}removeHook(t,n){if(this._hooks[t]){const r=this._hooks[t].indexOf(n);r!==-1&&this._hooks[t].splice(r,1),this._hooks[t].length===0&&delete this._hooks[t]}}deprecateHook(t,n){this._deprecatedHooks[t]=typeof n=="string"?{to:n}:n;const r=this._hooks[t]||[];delete this._hooks[t];for(const o of r)this.hook(t,o)}deprecateHooks(t){Object.assign(this._deprecatedHooks,t);for(const n in t)this.deprecateHook(n,t[n])}addHooks(t){const n=Ro(t),r=Object.keys(n).map(o=>this.hook(o,n[o]));return()=>{for(const o of r.splice(0,r.length))o()}}removeHooks(t){const n=Ro(t);for(const r in n)this.removeHook(r,n[r])}removeAllHooks(){for(const t in this._hooks)delete this._hooks[t]}callHook(t,...n){return n.unshift(t),this.callHookWith(Ed,t,...n)}callHookParallel(t,...n){return n.unshift(t),this.callHookWith(wd,t,...n)}callHookWith(t,n,...r){const o=this._before||this._after?{name:n,args:r,context:{}}:void 0;this._before&&Wr(this._before,o);const s=t(n in this._hooks?[...this._hooks[n]]:[],r);return s instanceof Promise?s.finally(()=>{this._after&&o&&Wr(this._after,o)}):(this._after&&o&&Wr(this._after,o),s)}beforeEach(t){return this._before=this._before||[],this._before.push(t),()=>{if(this._before!==void 0){const n=this._before.indexOf(t);n!==-1&&this._before.splice(n,1)}}}afterEach(t){return this._after=this._after||[],this._after.push(t),()=>{if(this._after!==void 0){const n=this._after.indexOf(t);n!==-1&&this._after.splice(n,1)}}}}function ma(){return new Rd}function Pd(e={}){let t,n=!1;const r=i=>{if(t&&t!==i)throw new Error("Context conflict")};let o;if(e.asyncContext){const i=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;i?o=new i:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const s=()=>{if(o&&t===void 0){const i=o.getStore();if(i!==void 0)return i}return t};return{use:()=>{const i=s();if(i===void 0)throw new Error("Context is not available");return i},tryUse:()=>s(),set:(i,l)=>{l||r(i),t=i,n=!0},unset:()=>{t=void 0,n=!1},call:(i,l)=>{r(i),t=i;try{return o?o.run(i,l):l()}finally{n||(t=void 0)}},async callAsync(i,l){t=i;const a=()=>{t=i},u=()=>t===i?a:void 0;Po.add(u);try{const c=o?o.run(i,l):l();return n||(t=void 0),await c}finally{Po.delete(u)}}}}function Td(e={}){const t={};return{get(n,r={}){return t[n]||(t[n]=Pd({...e,...r})),t[n],t[n]}}}const hr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},di="__unctx__",Cd=hr[di]||(hr[di]=Td()),Ad=(e,t={})=>Cd.get(e,t),hi="__unctx_async_handlers__",Po=hr[hi]||(hr[hi]=new Set);function Sn(e){const t=[];for(const o of Po){const s=o();s&&t.push(s)}const n=()=>{for(const o of t)o()};let r=e();return r&&typeof r=="object"&&"catch"in r&&(r=r.catch(o=>{throw n(),o})),[r,n]}const ya=Ad("nuxt-app",{asyncContext:!1}),Sd="__nuxt_plugin";function xd(e){let t=0;const n={_scope:cc(),provide:void 0,globalName:"nuxt",versions:{get nuxt(){return"3.11.2"},get vue(){return n.vueApp.version}},payload:wt({data:{},state:{},once:new Set,_errors:{},...window.__NUXT__??{}}),static:{data:{}},runWithContext:o=>n._scope.run(()=>Od(n,o)),isHydrating:!0,deferHydration(){if(!n.isHydrating)return()=>{};t++;let o=!1;return()=>{if(!o&&(o=!0,t--,t===0))return n.isHydrating=!1,n.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:{},_payloadRevivers:{},...e};n.hooks=ma(),n.hook=n.hooks.hook,n.callHook=n.hooks.callHook,n.provide=(o,s)=>{const i="$"+o;Gn(n,i,s),Gn(n.vueApp.config.globalProperties,i,s)},Gn(n.vueApp,"$nuxt",n),Gn(n.vueApp.config.globalProperties,"$nuxt",n);{window.addEventListener("nuxt.preloadError",s=>{n.callHook("app:chunkError",{error:s.payload})}),window.useNuxtApp=window.useNuxtApp||ge;const o=n.hook("app:error",(...s)=>{console.error("[nuxt] error caught during app initialization",...s)});n.hook("app:mounted",o)}const r=n.payload.config;return n.provide("config",r),n}async function kd(e,t){if(t.hooks&&e.hooks.addHooks(t.hooks),typeof t=="function"){const{provide:n}=await e.runWithContext(()=>t(e))||{};if(n&&typeof n=="object")for(const r in n)e.provide(r,n[r])}}async function Ld(e,t){const n=[],r=[],o=[],s=[];let i=0;async function l(a){var c;const u=((c=a.dependsOn)==null?void 0:c.filter(f=>t.some(d=>d._name===f)&&!n.includes(f)))??[];if(u.length>0)r.push([new Set(u),a]);else{const f=kd(e,a).then(async()=>{a._name&&(n.push(a._name),await Promise.all(r.map(async([d,g])=>{d.has(a._name)&&(d.delete(a._name),d.size===0&&(i++,await l(g)))})))});a.parallel?o.push(f.catch(d=>s.push(d))):await f}}for(const a of t)await l(a);if(await Promise.all(o),i)for(let a=0;a{}),e,{[Sd]:!0,_name:t})}function Od(e,t,n){const r=()=>n?t(...n):t();return ya.set(e),e.vueApp.runWithContext(r)}function Id(){var t;let e;return jl()&&(e=(t=Mn())==null?void 0:t.appContext.app.$nuxt),e=e||ya.tryUse(),e||null}function ge(){const e=Id();if(!e)throw new Error("[nuxt] instance unavailable");return e}function ps(e){return ge().$config}function Gn(e,t,n){Object.defineProperty(e,t,{get:()=>n})}function Hd(e,t){return{ctx:{table:e},matchAll:n=>va(n,e,t)}}function _a(e){const t={};for(const n in e)t[n]=n==="dynamic"?new Map(Object.entries(e[n]).map(([r,o])=>[r,_a(o)])):new Map(Object.entries(e[n]));return t}function Md(e){return Hd(_a(e))}function va(e,t,n){n!==!0&&e.endsWith("/")&&(e=e.slice(0,-1)||"/");const r=[];for(const[s,i]of pi(t.wildcard))(e===s||e.startsWith(s+"/"))&&r.push(i);for(const[s,i]of pi(t.dynamic))if(e.startsWith(s+"/")){const l="/"+e.slice(s.length).split("/").splice(2).join("/");r.push(...va(l,i))}const o=t.static.get(e);return o&&r.push(o),r.filter(Boolean)}function pi(e){return[...e.entries()].sort((t,n)=>t[0].length-n[0].length)}function Kr(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function To(e,t,n=".",r){if(!Kr(t))return To(e,{},n,r);const o=Object.assign({},t);for(const s in e){if(s==="__proto__"||s==="constructor")continue;const i=e[s];i!=null&&(r&&r(o,s,i,n)||(Array.isArray(i)&&Array.isArray(o[s])?o[s]=[...i,...o[s]]:Kr(i)&&Kr(o[s])?o[s]=To(i,o[s],(n?`${n}.`:"")+s.toString(),r):o[s]=i))}return o}function ba(e){return(...t)=>t.reduce((n,r)=>To(n,r,"",e),{})}const Ea=ba(),Nd=ba((e,t,n)=>{if(e[t]!==void 0&&typeof n=="function")return e[t]=n(e[t]),!0});function $d(e,t){try{return t in e}catch{return!1}}var jd=Object.defineProperty,Dd=(e,t,n)=>t in e?jd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,At=(e,t,n)=>(Dd(e,typeof t!="symbol"?t+"":t,n),n);class Co extends Error{constructor(t,n={}){super(t,n),At(this,"statusCode",500),At(this,"fatal",!1),At(this,"unhandled",!1),At(this,"statusMessage"),At(this,"data"),At(this,"cause"),n.cause&&!this.cause&&(this.cause=n.cause)}toJSON(){const t={message:this.message,statusCode:So(this.statusCode,500)};return this.statusMessage&&(t.statusMessage=wa(this.statusMessage)),this.data!==void 0&&(t.data=this.data),t}}At(Co,"__h3_error__",!0);function Ao(e){if(typeof e=="string")return new Co(e);if(Fd(e))return e;const t=new Co(e.message??e.statusMessage??"",{cause:e.cause||e});if($d(e,"stack"))try{Object.defineProperty(t,"stack",{get(){return e.stack}})}catch{try{t.stack=e.stack}catch{}}if(e.data&&(t.data=e.data),e.statusCode?t.statusCode=So(e.statusCode,t.statusCode):e.status&&(t.statusCode=So(e.status,t.statusCode)),e.statusMessage?t.statusMessage=e.statusMessage:e.statusText&&(t.statusMessage=e.statusText),t.statusMessage){const n=t.statusMessage;wa(t.statusMessage)!==n&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return e.fatal!==void 0&&(t.fatal=e.fatal),e.unhandled!==void 0&&(t.unhandled=e.unhandled),t}function Fd(e){var t;return((t=e==null?void 0:e.constructor)==null?void 0:t.__h3_error__)===!0}const Bd=/[^\u0009\u0020-\u007E]/g;function wa(e=""){return e.replace(Bd,"")}function So(e,t=200){return!e||(typeof e=="string"&&(e=Number.parseInt(e,10)),e<100||e>999)?t:e}const Ra=Symbol("layout-meta"),$n=Symbol("route"),et=()=>{var e;return(e=ge())==null?void 0:e.$router},gs=()=>jl()?Ae($n,ge()._route):ge()._route;const Vd=()=>{try{if(ge()._processingMiddleware)return!0}catch{return!1}return!1},km=(e,t)=>{e||(e="/");const n=typeof e=="string"?e:ca(e.path||"/",e.query||{})+(e.hash||"");if(t!=null&&t.open){const{target:l="_blank",windowFeatures:a={}}=t.open,u=Object.entries(a).filter(([c,f])=>f!==void 0).map(([c,f])=>`${c.toLowerCase()}=${f}`).join(", ");return open(n,l,u),Promise.resolve()}const r=(t==null?void 0:t.external)||$t(n,{acceptRelative:!0});if(r){if(!(t!=null&&t.external))throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const l=Cr(n).protocol;if(l&&Jf(l))throw new Error(`Cannot navigate to a URL with '${l}' protocol.`)}const o=Vd();if(!r&&o)return e;const s=et(),i=ge();return r?(i._scope.stop(),t!=null&&t.replace?location.replace(n):location.href=n,o?i.isHydrating?new Promise(()=>{}):!1:Promise.resolve()):t!=null&&t.replace?s.replace(e):s.push(e)},Pa="__nuxt_error",Ar=()=>jc(ge().payload,"error"),Ut=e=>{const t=Sr(e);try{const n=ge(),r=Ar();n.hooks.callHook("app:error",t),r.value=r.value||t}catch{throw t}return t},Ud=async(e={})=>{const t=ge(),n=Ar();t.callHook("app:error:cleared",e),e.redirect&&await et().replace(e.redirect),n.value=null},Wd=e=>!!e&&typeof e=="object"&&Pa in e,Sr=e=>{const t=Ao(e);return Object.defineProperty(t,Pa,{value:!0,configurable:!1,writable:!1}),t},Kd="modulepreload",qd=function(e,t){return e[0]==="."?new URL(e,t).href:e},gi={},zd=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const s=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=Promise.all(n.map(a=>{if(a=qd(a,r),a in gi)return;gi[a]=!0;const u=a.endsWith(".css"),c=u?'[rel="stylesheet"]':"";if(!!r)for(let g=s.length-1;g>=0;g--){const v=s[g];if(v.href===a&&(!u||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${c}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":Kd,u||(d.as="script",d.crossOrigin=""),d.href=a,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((g,v)=>{d.addEventListener("load",g),d.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${a}`)))})}))}return o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},J=(...e)=>zd(...e).catch(t=>{const n=new Event("nuxt.preloadError");throw n.payload=t,window.dispatchEvent(n),t}),Gd=-1,Jd=-2,Qd=-3,Xd=-4,Yd=-5,Zd=-6;function eh(e,t){return th(JSON.parse(e),t)}function th(e,t){if(typeof e=="number")return o(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);function o(s,i=!1){if(s===Gd)return;if(s===Qd)return NaN;if(s===Xd)return 1/0;if(s===Yd)return-1/0;if(s===Zd)return-0;if(i)throw new Error("Invalid input");if(s in r)return r[s];const l=n[s];if(!l||typeof l!="object")r[s]=l;else if(Array.isArray(l))if(typeof l[0]=="string"){const a=l[0],u=t==null?void 0:t[a];if(u)return r[s]=u(o(l[1]));switch(a){case"Date":r[s]=new Date(l[1]);break;case"Set":const c=new Set;r[s]=c;for(let g=1;g>>9)+65536).toString(16).substring(1,8).toLowerCase()}function mi(e){return e._h||ms(e._d?e._d:`${e.tag}:${e.textContent||e.innerHTML||""}:${Object.entries(e.props).map(([t,n])=>`${t}:${String(n)}`).join(",")}`)}function Ca(e,t){const{props:n,tag:r}=e;if(sh.includes(r))return r;if(r==="link"&&n.rel==="canonical")return"canonical";if(n.charset)return"charset";const o=["id"];r==="meta"&&o.push("name","property","http-equiv");for(const s of o)if(typeof n[s]<"u"){const i=String(n[s]);return t&&!t(i)?!1:`${r}:${s}:${i}`}return!1}function yi(e,t){return e==null?t||null:typeof e=="function"?e(t):e}async function lh(e,t,n){const r={tag:e,props:await Aa(typeof t=="object"&&typeof t!="function"&&!(t instanceof Promise)?{...t}:{[["script","noscript","style"].includes(e)?"innerHTML":"textContent"]:t},["templateParams","titleTemplate"].includes(e))};return Ta.forEach(o=>{const s=typeof r.props[o]<"u"?r.props[o]:n[o];typeof s<"u"&&((!["innerHTML","textContent","children"].includes(o)||rh.includes(r.tag))&&(r[o==="children"?"innerHTML":o]=s),delete r.props[o])}),r.props.body&&(r.tagPosition="bodyClose",delete r.props.body),r.tag==="script"&&typeof r.innerHTML=="object"&&(r.innerHTML=JSON.stringify(r.innerHTML),r.props.type=r.props.type||"application/json"),Array.isArray(r.props.content)?r.props.content.map(o=>({...r,props:{...r.props,content:o}})):r}function ah(e,t){var r;const n=e==="class"?" ":";";return typeof t=="object"&&!Array.isArray(t)&&(t=Object.entries(t).filter(([,o])=>o).map(([o,s])=>e==="style"?`${o}:${s}`:o)),(r=Array.isArray(t)?t.join(n):t)==null?void 0:r.split(n).filter(o=>o.trim()).filter(Boolean).join(n)}async function Aa(e,t){for(const n of Object.keys(e)){if(["class","style"].includes(n)){e[n]=ah(n,e[n]);continue}if(e[n]instanceof Promise&&(e[n]=await e[n]),!t&&!Ta.includes(n)){const r=String(e[n]),o=n.startsWith("data-");r==="true"||r===""?e[n]=o?"true":!0:e[n]||(o&&r==="false"?e[n]="false":delete e[n])}}return e}const ch=10;async function uh(e){const t=[];return Object.entries(e.resolvedInput).filter(([n,r])=>typeof r<"u"&&oh.includes(n)).forEach(([n,r])=>{const o=nh(r);t.push(...o.map(s=>lh(n,s,e)).flat())}),(await Promise.all(t)).flat().filter(Boolean).map((n,r)=>(n._e=e._i,e.mode&&(n._m=e.mode),n._p=(e._i<a&&a[u]||void 0,t):l=t[i],typeof l<"u"?(l||"").replace(/"/g,'\\"'):!1}let o=e;try{o=decodeURI(e)}catch{}return(o.match(/%(\w+\.+\w+)|%(\w+)/g)||[]).sort().reverse().forEach(i=>{const l=r(i.slice(1));typeof l=="string"&&(e=e.replace(new RegExp(`\\${i}(\\W|$)`,"g"),(a,u)=>`${l}${u}`).trim())}),e.includes(ft)&&(e.endsWith(ft)&&(e=e.slice(0,-ft.length).trim()),e.startsWith(ft)&&(e=e.slice(ft.length).trim()),e=e.replace(new RegExp(`\\${ft}\\s*\\${ft}`,"g"),ft),e=Zn(e,{separator:n},n)),e}async function Sa(e,t={}){var c;const n=t.document||e.resolvedOptions.document;if(!n||!e.dirty)return;const r={shouldRender:!0,tags:[]};if(await e.hooks.callHook("dom:beforeRender",r),!r.shouldRender)return;const o=(await e.resolveTags()).map(f=>({tag:f,id:Yn.includes(f.tag)?mi(f):f.tag,shouldRender:!0}));let s=e._dom;if(!s){s={elMap:{htmlAttrs:n.documentElement,bodyAttrs:n.body}};for(const f of["body","head"]){const d=(c=n[f])==null?void 0:c.children,g=[];for(const v of[...d].filter(P=>Yn.includes(P.tagName.toLowerCase()))){const P={tag:v.tagName.toLowerCase(),props:await Aa(v.getAttributeNames().reduce((y,m)=>({...y,[m]:v.getAttribute(m)}),{})),innerHTML:v.innerHTML};let k=1,A=Ca(P);for(;A&&g.find(y=>y._d===A);)A=`${A}:${k++}`;P._d=A||void 0,g.push(P),s.elMap[v.getAttribute("data-hid")||mi(P)]=v}}}s.pendingSideEffects={...s.sideEffects||{}},s.sideEffects={};function i(f,d,g){const v=`${f}:${d}`;s.sideEffects[v]=g,delete s.pendingSideEffects[v]}function l({id:f,$el:d,tag:g}){const v=g.tag.endsWith("Attrs");s.elMap[f]=d,v||(["textContent","innerHTML"].forEach(P=>{g[P]&&g[P]!==d[P]&&(d[P]=g[P])}),i(f,"el",()=>{var P;(P=s.elMap[f])==null||P.remove(),delete s.elMap[f]}));for(const[P,k]of Object.entries(g._eventHandlers||{}))d.getAttribute(`data-${P}`)!==""&&((g.tag==="bodyAttrs"?n.defaultView:d).addEventListener(P.replace("on",""),k.bind(d)),d.setAttribute(`data-${P}`,""));Object.entries(g.props).forEach(([P,k])=>{const A=`attr:${P}`;if(P==="class")for(const y of(k||"").split(" ").filter(Boolean))v&&i(f,`${A}:${y}`,()=>d.classList.remove(y)),!d.classList.contains(y)&&d.classList.add(y);else if(P==="style")for(const y of(k||"").split(";").filter(Boolean)){const[m,..._]=y.split(":").map(w=>w.trim());i(f,`${A}:${y}:${m}`,()=>{d.style.removeProperty(m)}),d.style.setProperty(m,_.join(":"))}else d.getAttribute(P)!==k&&d.setAttribute(P,k===!0?"":String(k)),v&&i(f,A,()=>d.removeAttribute(P))})}const a=[],u={bodyClose:void 0,bodyOpen:void 0,head:void 0};for(const f of o){const{tag:d,shouldRender:g,id:v}=f;if(g){if(d.tag==="title"){n.title=d.textContent;continue}f.$el=f.$el||s.elMap[v],f.$el?l(f):Yn.includes(d.tag)&&a.push(f)}}for(const f of a){const d=f.tag.tagPosition||"head";f.$el=n.createElement(f.tag.tag),l(f),u[d]=u[d]||n.createDocumentFragment(),u[d].appendChild(f.$el)}for(const f of o)await e.hooks.callHook("dom:renderTag",f,n,i);u.head&&n.head.appendChild(u.head),u.bodyOpen&&n.body.insertBefore(u.bodyOpen,n.body.firstChild),u.bodyClose&&n.body.appendChild(u.bodyClose),Object.values(s.pendingSideEffects).forEach(f=>f()),e._dom=s,e.dirty=!1,await e.hooks.callHook("dom:rendered",{renders:o})}async function dh(e,t={}){const n=t.delayFn||(r=>setTimeout(r,10));return e._domUpdatePromise=e._domUpdatePromise||new Promise(r=>n(async()=>{await Sa(e,t),delete e._domUpdatePromise,r()}))}function hh(e){return t=>{var r,o;const n=((o=(r=t.resolvedOptions.document)==null?void 0:r.head.querySelector('script[id="unhead:payload"]'))==null?void 0:o.innerHTML)||!1;return n&&t.push(JSON.parse(n)),{mode:"client",hooks:{"entries:updated":function(s){dh(s,e)}}}}}const ph=["templateParams","htmlAttrs","bodyAttrs"],gh={hooks:{"tag:normalise":function({tag:e}){["hid","vmid","key"].forEach(r=>{e.props[r]&&(e.key=e.props[r],delete e.props[r])});const n=Ca(e)||(e.key?`${e.tag}:${e.key}`:!1);n&&(e._d=n)},"tags:resolve":function(e){const t={};e.tags.forEach(r=>{const o=(r.key?`${r.tag}:${r.key}`:r._d)||r._p,s=t[o];if(s){let l=r==null?void 0:r.tagDuplicateStrategy;if(!l&&ph.includes(r.tag)&&(l="merge"),l==="merge"){const a=s.props;["class","style"].forEach(u=>{a[u]&&(r.props[u]?(u==="style"&&!a[u].endsWith(";")&&(a[u]+=";"),r.props[u]=`${a[u]} ${r.props[u]}`):r.props[u]=a[u])}),t[o].props={...a,...r.props};return}else if(r._e===s._e){s._duped=s._duped||[],r._d=`${s._d}:${s._duped.length+1}`,s._duped.push(r);return}else if(pr(r)>pr(s))return}const i=Object.keys(r.props).length+(r.innerHTML?1:0)+(r.textContent?1:0);if(Yn.includes(r.tag)&&i===0){delete t[o];return}t[o]=r});const n=[];Object.values(t).forEach(r=>{const o=r._duped;delete r._duped,n.push(r),o&&n.push(...o)}),e.tags=n,e.tags=e.tags.filter(r=>!(r.tag==="meta"&&(r.props.name||r.props.property)&&!r.props.content))}}},mh={mode:"server",hooks:{"tags:resolve":function(e){const t={};e.tags.filter(n=>["titleTemplate","templateParams","title"].includes(n.tag)&&n._m==="server").forEach(n=>{t[n.tag]=n.tag.startsWith("title")?n.textContent:n.props}),Object.keys(t).length&&e.tags.push({tag:"script",innerHTML:JSON.stringify(t),props:{id:"unhead:payload",type:"application/json"}})}}},yh=["script","link","bodyAttrs"],_h=e=>({hooks:{"tags:resolve":function(t){for(const n of t.tags.filter(r=>yh.includes(r.tag)))Object.entries(n.props).forEach(([r,o])=>{r.startsWith("on")&&typeof o=="function"&&(e.ssr&&bi.includes(r)?n.props[r]=`this.dataset.${r}fired = true`:delete n.props[r],n._eventHandlers=n._eventHandlers||{},n._eventHandlers[r]=o)}),e.ssr&&n._eventHandlers&&(n.props.src||n.props.href)&&(n.key=n.key||ms(n.props.src||n.props.href))},"dom:renderTag":function({$el:t,tag:n}){var r,o;for(const s of Object.keys((t==null?void 0:t.dataset)||{}).filter(i=>bi.some(l=>`${l}fired`===i))){const i=s.replace("fired","");(o=(r=n._eventHandlers)==null?void 0:r[i])==null||o.call(t,new Event(i.replace("on","")))}}}}),vh=["link","style","script","noscript"],bh={hooks:{"tag:normalise":({tag:e})=>{e.key&&vh.includes(e.tag)&&(e.props["data-hid"]=e._h=ms(e.key))}}},Eh={hooks:{"tags:resolve":e=>{const t=n=>{var r;return(r=e.tags.find(o=>o._d===n))==null?void 0:r._p};for(const{prefix:n,offset:r}of fh)for(const o of e.tags.filter(s=>typeof s.tagPriority=="string"&&s.tagPriority.startsWith(n))){const s=t(o.tagPriority.replace(n,""));typeof s<"u"&&(o._p=s+r)}e.tags.sort((n,r)=>n._p-r._p).sort((n,r)=>pr(n)-pr(r))}}},wh={meta:"content",link:"href",htmlAttrs:"lang"},Rh=e=>({hooks:{"tags:resolve":t=>{var l;const{tags:n}=t,r=(l=n.find(a=>a.tag==="title"))==null?void 0:l.textContent,o=n.findIndex(a=>a.tag==="templateParams"),s=o!==-1?n[o].props:{},i=s.separator||"|";delete s.separator,s.pageTitle=Zn(s.pageTitle||r||"",s,i);for(const a of n.filter(u=>u.processTemplateParams!==!1)){const u=wh[a.tag];u&&typeof a.props[u]=="string"?a.props[u]=Zn(a.props[u],s,i):(a.processTemplateParams===!0||["titleTemplate","title"].includes(a.tag))&&["innerHTML","textContent"].forEach(c=>{typeof a[c]=="string"&&(a[c]=Zn(a[c],s,i))})}e._templateParams=s,e._separator=i,t.tags=n.filter(a=>a.tag!=="templateParams")}}}),Ph={hooks:{"tags:resolve":e=>{const{tags:t}=e;let n=t.findIndex(o=>o.tag==="titleTemplate");const r=t.findIndex(o=>o.tag==="title");if(r!==-1&&n!==-1){const o=yi(t[n].textContent,t[r].textContent);o!==null?t[r].textContent=o||t[r].textContent:delete t[r]}else if(n!==-1){const o=yi(t[n].textContent);o!==null&&(t[n].textContent=o,t[n].tag="title",n=-1)}n!==-1&&delete t[n],e.tags=t.filter(Boolean)}}},Th={hooks:{"tags:afterResolve":function(e){for(const t of e.tags)typeof t.innerHTML=="string"&&(t.innerHTML&&["application/ld+json","application/json"].includes(t.props.type)?t.innerHTML=t.innerHTML.replace(/{l.dirty=!0,t.callHook("entries:updated",l)};let o=0,s=[];const i=[],l={plugins:i,dirty:!1,resolvedOptions:e,hooks:t,headEntries(){return s},use(a){const u=typeof a=="function"?a(l):a;(!u.key||!i.some(c=>c.key===u.key))&&(i.push(u),Ei(u.mode,n)&&t.addHooks(u.hooks||{}))},push(a,u){u==null||delete u.head;const c={_i:o++,input:a,...u};return Ei(c.mode,n)&&(s.push(c),r()),{dispose(){s=s.filter(f=>f._i!==c._i),t.callHook("entries:updated",l),r()},patch(f){s=s.map(d=>(d._i===c._i&&(d.input=c.input=f),d)),r()}}},async resolveTags(){const a={tags:[],entries:[...s]};await t.callHook("entries:resolve",a);for(const u of a.entries){const c=u.resolvedInput||u.input;if(u.resolvedInput=await(u.transform?u.transform(c):c),u.resolvedInput)for(const f of await uh(u)){const d={tag:f,entry:u,resolvedOptions:l.resolvedOptions};await t.callHook("tag:normalise",d),a.tags.push(d.tag)}}return await t.callHook("tags:beforeResolve",a),await t.callHook("tags:resolve",a),await t.callHook("tags:afterResolve",a),a.tags},ssr:n};return[gh,mh,_h,bh,Eh,Rh,Ph,Th,...(e==null?void 0:e.plugins)||[]].forEach(a=>l.use(a)),l.hooks.callHook("init",l),l}function Sh(){return xa}const xh=oa.startsWith("3");function kh(e){return typeof e=="function"?e():ue(e)}function xo(e,t=""){if(e instanceof Promise)return e;const n=kh(e);return!e||!n?n:Array.isArray(n)?n.map(r=>xo(r,t)):typeof n=="object"?Object.fromEntries(Object.entries(n).map(([r,o])=>r==="titleTemplate"||r.startsWith("on")?[r,ue(o)]:[r,xo(o,r)])):n}const Lh={hooks:{"entries:resolve":function(e){for(const t of e.entries)t.resolvedInput=xo(t.input)}}},ka="usehead";function Oh(e){return{install(n){xh&&(n.config.globalProperties.$unhead=e,n.config.globalProperties.$head=e,n.provide(ka,e))}}.install}function Ih(e={}){e.domDelayFn=e.domDelayFn||(n=>ln(()=>setTimeout(()=>n(),0)));const t=Ch(e);return t.use(Lh),t.install=Oh(t),t}const ko=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Lo="__unhead_injection_handler__";function Hh(e){ko[Lo]=e}function Lm(){if(Lo in ko)return ko[Lo]();const e=Ae(ka);return e||Sh()}const Mh={nuxt:{buildId:"ca109cee-b19c-4e04-8198-82d8546b7421"}},Nh=Nd(Mh);function La(){const e=ge();return e._appConfig||(e._appConfig=wt(Nh)),e._appConfig}const $h=!1,Oo=!1,jh=!1,Om={trailingSlash:"append",componentName:"NuxtLink"},Im={deep:!0},Dh="#__nuxt";let er,Oa;function Fh(){var t;const e=(t=La().nuxt)==null?void 0:t.buildId;return er=$fetch(hs(`builds/meta/${e}.json`)),er.then(n=>{Oa=Md(n.matcher)}),er}function xr(){return er||Fh()}async function ys(e){return await xr(),Ea({},...Oa.matchAll(e).reverse())}function wi(e,t={}){const n=Vh(e,t),r=ge(),o=r._payloadCache=r._payloadCache||{};return n in o||(o[n]=Uh(e).then(s=>s?Ia(n).then(i=>i||(delete o[n],null)):(o[n]=null,null))),o[n]}const Bh="_payload.json";function Vh(e,t={}){var o;const n=new URL(e,"http://localhost");if(n.host!=="localhost"||$t(n.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+e);const r=t.hash||(t.fresh?Date.now():(o=La().nuxt)==null?void 0:o.buildId);return fs(ps().app.baseURL,n.pathname,Bh+(r?`?${r}`:""))}async function Ia(e){const t=fetch(e).then(n=>n.text().then(Ha));try{return await t}catch(n){console.warn("[nuxt] Cannot load payload ",e,n)}return null}async function Uh(e=gs().path){if(e=us(e),(await xr()).prerendered.includes(e))return!0;const n=await ys(e);return!!n.prerender&&!n.redirect}let Jn=null;async function Wh(){if(Jn)return Jn;const e=document.getElementById("__NUXT_DATA__");if(!e)return{};const t=await Ha(e.textContent||""),n=e.dataset.src?await Ia(e.dataset.src):void 0;return Jn={...t,...n,...window.__NUXT__},Jn}async function Ha(e){return await eh(e,ge()._payloadRevivers)}function Kh(e,t){ge()._payloadRevivers[e]=t}const Ri={NuxtError:e=>Sr(e),EmptyShallowRef:e=>Rn(e==="_"?void 0:e==="0n"?BigInt(0):ur(e)),EmptyRef:e=>qe(e==="_"?void 0:e==="0n"?BigInt(0):ur(e)),ShallowRef:e=>Rn(e),ShallowReactive:e=>In(e),Ref:e=>qe(e),Reactive:e=>wt(e)},qh=Rt({name:"nuxt:revive-payload:client",order:-30,async setup(e){let t,n;for(const r in Ri)Kh(r,Ri[r]);Object.assign(e.payload,([t,n]=Sn(()=>e.runWithContext(Wh)),t=await t,n(),t)),window.__NUXT__=e.payload}}),zh=[],Gh=Rt({name:"nuxt:head",enforce:"pre",setup(e){const t=Ih({plugins:zh});Hh(()=>ge().vueApp._context.provides.usehead),e.vueApp.use(t);{let n=!0;const r=async()=>{n=!1,await Sa(t)};t.hooks.hook("dom:beforeRender",o=>{o.shouldRender=!n}),e.hooks.hook("page:start",()=>{n=!0}),e.hooks.hook("page:finish",()=>{e.isHydrating||r()}),e.hooks.hook("app:error",r),e.hooks.hook("app:suspense:resolve",r)}}});/*! +**/const zu="http://www.w3.org/2000/svg",Gu="http://www.w3.org/1998/Math/MathML",gt=typeof document<"u"?document:null,Gs=gt&>.createElement("template"),Ju={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?gt.createElementNS(zu,e):t==="mathml"?gt.createElementNS(Gu,e):gt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>gt.createTextNode(e),createComment:e=>gt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>gt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Gs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Gs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ct="transition",cn="animation",An=Symbol("_vtc"),Tr=(e,{slots:t})=>Oe(iu,Qu(e),t);Tr.displayName="Transition";const sa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Tr.props=_e({},Sl,sa);const Tt=(e,t=[])=>{z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Js=e=>e?z(e)?e.some(t=>t.length>1):e.length>1:!1;function Qu(e){const t={};for(const H in e)H in sa||(t[H]=e[H]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:u=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,v=Xu(o),P=v&&v[0],k=v&&v[1],{onBeforeEnter:A,onEnter:y,onEnterCancelled:m,onLeave:_,onLeaveCancelled:w,onBeforeAppear:E=A,onAppear:L=y,onAppearCancelled:S=m}=t,$=(H,G,le)=>{Ct(H,G?c:l),Ct(H,G?u:i),le&&le()},N=(H,G)=>{H._isLeaving=!1,Ct(H,f),Ct(H,g),Ct(H,d),G&&G()},Q=H=>(G,le)=>{const ae=H?L:y,V=()=>$(G,H,le);Tt(ae,[G,V]),Qs(()=>{Ct(G,H?a:s),ut(G,H?c:l),Js(ae)||Xs(G,r,P,V)})};return _e(t,{onBeforeEnter(H){Tt(A,[H]),ut(H,s),ut(H,i)},onBeforeAppear(H){Tt(E,[H]),ut(H,a),ut(H,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(H,G){H._isLeaving=!0;const le=()=>N(H,G);ut(H,f),ef(),ut(H,d),Qs(()=>{H._isLeaving&&(Ct(H,f),ut(H,g),Js(_)||Xs(H,r,k,le))}),Tt(_,[H,le])},onEnterCancelled(H){$(H,!1),Tt(m,[H])},onAppearCancelled(H){$(H,!0),Tt(S,[H])},onLeaveCancelled(H){N(H),Tt(w,[H])}})}function Xu(e){if(e==null)return null;if(ce(e))return[Fr(e.enter),Fr(e.leave)];{const t=Fr(e);return[t,t]}}function Fr(e){return Ji(e)}function ut(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[An]||(e[An]=new Set)).add(t)}function Ct(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[An];n&&(n.delete(t),n.size||(e[An]=void 0))}function Qs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Yu=0;function Xs(e,t,n,r){const o=e._endId=++Yu,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Zu(e,t);if(!i)return r();const u=i+"end";let c=0;const f=()=>{e.removeEventListener(u,d),s()},d=g=>{g.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[v]||"").split(", "),o=r(`${ct}Delay`),s=r(`${ct}Duration`),i=Ys(o,s),l=r(`${cn}Delay`),a=r(`${cn}Duration`),u=Ys(l,a);let c=null,f=0,d=0;t===ct?i>0&&(c=ct,f=i,d=s.length):t===cn?u>0&&(c=cn,f=u,d=a.length):(f=Math.max(i,u),c=f>0?i>u?ct:cn:null,d=c?c===ct?s.length:a.length:0);const g=c===ct&&/\b(transform|all)(,|$)/.test(r(`${ct}Property`).toString());return{type:c,timeout:f,propCount:d,hasTransform:g}}function Ys(e,t){for(;e.lengthZs(n)+Zs(e[r])))}function Zs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ef(){return document.body.offsetHeight}function tf(e,t,n){const r=e[An];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ei=Symbol("_vod"),nf=Symbol("_vsh"),rf=Symbol(""),of=/(^|;)\s*display\s*:/;function sf(e,t,n){const r=e.style,o=me(n);let s=!1;if(n&&!o){if(t)if(me(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Xn(r,l,"")}else for(const i in t)n[i]==null&&Xn(r,i,"");for(const i in n)i==="display"&&(s=!0),Xn(r,i,n[i])}else if(o){if(t!==n){const i=r[rf];i&&(n+=";"+i),r.cssText=n,s=of.test(n)}}else t&&e.removeAttribute("style");ei in e&&(e[ei]=s?r.display:"",e[nf]&&(r.display="none"))}const ti=/\s*!important$/;function Xn(e,t,n){if(z(n))n.forEach(r=>Xn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=lf(e,t);ti.test(n)?e.setProperty(on(r),n.replace(ti,""),"important"):e[r]=n}}const ni=["Webkit","Moz","ms"],Br={};function lf(e,t){const n=Br[t];if(n)return n;let r=Ze(t);if(r!=="filter"&&r in e)return Br[t]=r;r=mr(r);for(let o=0;oVr||(pf.then(()=>Vr=0),Vr=Date.now());function mf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Be(yf(r,n.value),t,5,[r])};return n.value=e,n.attached=gf(),n}function yf(e,t){if(z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const ii=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,_f=(e,t,n,r,o,s,i,l,a)=>{const u=o==="svg";t==="class"?tf(e,r,u):t==="style"?sf(e,n,r):Ln(t)?jo(t)||df(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):vf(e,t,r,u))?cf(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),af(e,t,r,u))};function vf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ii(t)&&X(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ii(t)&&me(n)?!1:t in e}const ia=_e({patchProp:_f},Ju);let _n,li=!1;function bf(){return _n||(_n=Hu(ia))}function Ef(){return _n=li?_n:Mu(ia),li=!0,_n}const wf=(...e)=>{const t=bf().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=aa(r);if(!o)return;const s=t._component;!X(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,la(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},Rf=(...e)=>{const t=Ef().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=aa(r);if(o)return n(o,!0,la(o))},t};function la(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function aa(e){return me(e)?document.querySelector(e):e}const Pf=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,Tf=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Cf=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Af(e,t){if(e==="__proto__"||e==="constructor"&&t&&typeof t=="object"&&"prototype"in t){Sf(e);return}return t}function Sf(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function ur(e,t={}){if(typeof e!="string")return e;const n=e.trim();if(e[0]==='"'&&e.endsWith('"')&&!e.includes("\\"))return n.slice(1,-1);if(n.length<=9){const r=n.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="undefined")return;if(r==="null")return null;if(r==="nan")return Number.NaN;if(r==="infinity")return Number.POSITIVE_INFINITY;if(r==="-infinity")return Number.NEGATIVE_INFINITY}if(!Cf.test(e)){if(t.strict)throw new SyntaxError("[destr] Invalid JSON");return e}try{if(Pf.test(e)||Tf.test(e)){if(t.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(e,Af)}return JSON.parse(e)}catch(r){if(t.strict)throw r;return e}}const xf=/#/g,kf=/&/g,Lf=/\//g,Of=/=/g,cs=/\+/g,If=/%5e/gi,Hf=/%60/gi,Mf=/%7c/gi,Nf=/%20/gi;function $f(e){return encodeURI(""+e).replace(Mf,"|")}function bo(e){return $f(typeof e=="string"?e:JSON.stringify(e)).replace(cs,"%2B").replace(Nf,"+").replace(xf,"%23").replace(kf,"%26").replace(Hf,"`").replace(If,"^").replace(Lf,"%2F")}function Ur(e){return bo(e).replace(Of,"%3D")}function fr(e=""){try{return decodeURIComponent(""+e)}catch{return""+e}}function jf(e){return fr(e.replace(cs," "))}function Df(e){return fr(e.replace(cs," "))}function Ff(e=""){const t={};e[0]==="?"&&(e=e.slice(1));for(const n of e.split("&")){const r=n.match(/([^=]+)=?(.*)/)||[];if(r.length<2)continue;const o=jf(r[1]);if(o==="__proto__"||o==="constructor")continue;const s=Df(r[2]||"");t[o]===void 0?t[o]=s:Array.isArray(t[o])?t[o].push(s):t[o]=[t[o],s]}return t}function Bf(e,t){return(typeof t=="number"||typeof t=="boolean")&&(t=String(t)),t?Array.isArray(t)?t.map(n=>`${Ur(e)}=${bo(n)}`).join("&"):`${Ur(e)}=${bo(t)}`:Ur(e)}function Vf(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>Bf(t,e[t])).filter(Boolean).join("&")}const Uf=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,Wf=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,Kf=/^([/\\]\s*){2,}[^/\\]/,qf=/^[\s\0]*(blob|data|javascript|vbscript):$/i,zf=/\/$|\/\?|\/#/,Gf=/^\.?\//;function $t(e,t={}){return typeof t=="boolean"&&(t={acceptRelative:t}),t.strict?Uf.test(e):Wf.test(e)||(t.acceptRelative?Kf.test(e):!1)}function Jf(e){return!!e&&qf.test(e)}function Eo(e="",t){return t?zf.test(e):e.endsWith("/")}function us(e="",t){if(!t)return(Eo(e)?e.slice(0,-1):e)||"/";if(!Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");o>=0&&(n=e.slice(0,o),r=e.slice(o));const[s,...i]=n.split("?");return((s.endsWith("/")?s.slice(0,-1):s)||"/")+(i.length>0?`?${i.join("?")}`:"")+r}function wo(e="",t){if(!t)return e.endsWith("/")?e:e+"/";if(Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");if(o>=0&&(n=e.slice(0,o),r=e.slice(o),!n))return r;const[s,...i]=n.split("?");return s+"/"+(i.length>0?`?${i.join("?")}`:"")+r}function Qf(e=""){return e.startsWith("/")}function ai(e=""){return Qf(e)?e:"/"+e}function Xf(e,t){if(ua(t)||$t(e))return e;const n=us(t);return e.startsWith(n)?e:fs(n,e)}function ci(e,t){if(ua(t))return e;const n=us(t);if(!e.startsWith(n))return e;const r=e.slice(n.length);return r[0]==="/"?r:"/"+r}function ca(e,t){const n=Cr(e),r={...Ff(n.search),...t};return n.search=Vf(r),ed(n)}function ua(e){return!e||e==="/"}function Yf(e){return e&&e!=="/"}function fs(e,...t){let n=e||"";for(const r of t.filter(o=>Yf(o)))if(n){const o=r.replace(Gf,"");n=wo(n)+o}else n=r;return n}function fa(...e){var i,l,a,u;const t=/\/(?!\/)/,n=e.filter(Boolean),r=[];let o=0;for(const c of n)if(!(!c||c==="/")){for(const[f,d]of c.split(t).entries())if(!(!d||d===".")){if(d===".."){if(r.length===1&&$t(r[0]))continue;r.pop(),o--;continue}if(f===1&&((i=r[r.length-1])!=null&&i.endsWith(":/"))){r[r.length-1]+="/"+d;continue}r.push(d),o++}}let s=r.join("/");return o>=0?(l=n[0])!=null&&l.startsWith("/")&&!s.startsWith("/")?s="/"+s:(a=n[0])!=null&&a.startsWith("./")&&!s.startsWith("./")&&(s="./"+s):s="../".repeat(-1*o)+s,(u=n[n.length-1])!=null&&u.endsWith("/")&&!s.endsWith("/")&&(s+="/"),s}function Zf(e,t,n={}){return n.trailingSlash||(e=wo(e),t=wo(t)),n.leadingSlash||(e=ai(e),t=ai(t)),n.encoding||(e=fr(e),t=fr(t)),e===t}const da=Symbol.for("ufo:protocolRelative");function Cr(e="",t){const n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){const[,f,d=""]=n;return{protocol:f.toLowerCase(),pathname:d,href:f+d,auth:"",host:"",search:"",hash:""}}if(!$t(e,{acceptRelative:!0}))return t?Cr(t+e):ui(e);const[,r="",o,s=""]=e.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,i="",l=""]=s.match(/([^#/?]*)(.*)?/)||[],{pathname:a,search:u,hash:c}=ui(l.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:r.toLowerCase(),auth:o?o.slice(0,Math.max(0,o.length-1)):"",host:i,pathname:a,search:u,hash:c,[da]:!r}}function ui(e=""){const[t="",n="",r=""]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:r}}function ed(e){const t=e.pathname||"",n=e.search?(e.search.startsWith("?")?"":"?")+e.search:"",r=e.hash||"",o=e.auth?e.auth+"@":"",s=e.host||"";return(e.protocol||e[da]?(e.protocol||"")+"//":"")+o+s+t+n+r}class td extends Error{constructor(t,n){super(t,n),this.name="FetchError",n!=null&&n.cause&&!this.cause&&(this.cause=n.cause)}}function nd(e){var a,u,c,f,d;const t=((a=e.error)==null?void 0:a.message)||((u=e.error)==null?void 0:u.toString())||"",n=((c=e.request)==null?void 0:c.method)||((f=e.options)==null?void 0:f.method)||"GET",r=((d=e.request)==null?void 0:d.url)||String(e.request)||"/",o=`[${n}] ${JSON.stringify(r)}`,s=e.response?`${e.response.status} ${e.response.statusText}`:"",i=`${o}: ${s}${t?` ${t}`:""}`,l=new td(i,e.error?{cause:e.error}:void 0);for(const g of["request","options","response"])Object.defineProperty(l,g,{get(){return e[g]}});for(const[g,v]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(l,g,{get(){return e.response&&e.response[v]}});return l}const rd=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function fi(e="GET"){return rd.has(e.toUpperCase())}function od(e){if(e===void 0)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"||t===null?!0:t!=="object"?!1:Array.isArray(e)?!0:e.buffer?!1:e.constructor&&e.constructor.name==="Object"||typeof e.toJSON=="function"}const sd=new Set(["image/svg","application/xml","application/xhtml","application/html"]),id=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function ld(e=""){if(!e)return"json";const t=e.split(";").shift()||"";return id.test(t)?"json":sd.has(t)||t.startsWith("text/")?"text":"blob"}function ad(e,t,n=globalThis.Headers){const r={...t,...e};if(t!=null&&t.params&&(e!=null&&e.params)&&(r.params={...t==null?void 0:t.params,...e==null?void 0:e.params}),t!=null&&t.query&&(e!=null&&e.query)&&(r.query={...t==null?void 0:t.query,...e==null?void 0:e.query}),t!=null&&t.headers&&(e!=null&&e.headers)){r.headers=new n((t==null?void 0:t.headers)||{});for(const[o,s]of new n((e==null?void 0:e.headers)||{}))r.headers.set(o,s)}return r}const cd=new Set([408,409,425,429,500,502,503,504]),ud=new Set([101,204,205,304]);function ha(e={}){const{fetch:t=globalThis.fetch,Headers:n=globalThis.Headers,AbortController:r=globalThis.AbortController}=e;async function o(l){const a=l.error&&l.error.name==="AbortError"&&!l.options.timeout||!1;if(l.options.retry!==!1&&!a){let c;typeof l.options.retry=="number"?c=l.options.retry:c=fi(l.options.method)?0:1;const f=l.response&&l.response.status||500;if(c>0&&(Array.isArray(l.options.retryStatusCodes)?l.options.retryStatusCodes.includes(f):cd.has(f))){const d=l.options.retryDelay||0;return d>0&&await new Promise(g=>setTimeout(g,d)),s(l.request,{...l.options,retry:c-1})}}const u=nd(l);throw Error.captureStackTrace&&Error.captureStackTrace(u,s),u}const s=async function(a,u={}){var g;const c={request:a,options:ad(u,e.defaults,n),response:void 0,error:void 0};c.options.method=(g=c.options.method)==null?void 0:g.toUpperCase(),c.options.onRequest&&await c.options.onRequest(c),typeof c.request=="string"&&(c.options.baseURL&&(c.request=Xf(c.request,c.options.baseURL)),(c.options.query||c.options.params)&&(c.request=ca(c.request,{...c.options.params,...c.options.query}))),c.options.body&&fi(c.options.method)&&(od(c.options.body)?(c.options.body=typeof c.options.body=="string"?c.options.body:JSON.stringify(c.options.body),c.options.headers=new n(c.options.headers||{}),c.options.headers.has("content-type")||c.options.headers.set("content-type","application/json"),c.options.headers.has("accept")||c.options.headers.set("accept","application/json")):("pipeTo"in c.options.body&&typeof c.options.body.pipeTo=="function"||typeof c.options.body.pipe=="function")&&("duplex"in c.options||(c.options.duplex="half")));let f;if(!c.options.signal&&c.options.timeout){const v=new r;f=setTimeout(()=>v.abort(),c.options.timeout),c.options.signal=v.signal}try{c.response=await t(c.request,c.options)}catch(v){return c.error=v,c.options.onRequestError&&await c.options.onRequestError(c),await o(c)}finally{f&&clearTimeout(f)}if(c.response.body&&!ud.has(c.response.status)&&c.options.method!=="HEAD"){const v=(c.options.parseResponse?"json":c.options.responseType)||ld(c.response.headers.get("content-type")||"");switch(v){case"json":{const P=await c.response.text(),k=c.options.parseResponse||ur;c.response._data=k(P);break}case"stream":{c.response._data=c.response.body;break}default:c.response._data=await c.response[v]()}}return c.options.onResponse&&await c.options.onResponse(c),!c.options.ignoreResponseError&&c.response.status>=400&&c.response.status<600?(c.options.onResponseError&&await c.options.onResponseError(c),await o(c)):c.response},i=async function(a,u){return(await s(a,u))._data};return i.raw=s,i.native=(...l)=>t(...l),i.create=(l={})=>ha({...e,defaults:{...e.defaults,...l}}),i}const ds=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")}(),fd=ds.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),dd=ds.Headers,hd=ds.AbortController,pd=ha({fetch:fd,Headers:dd,AbortController:hd}),gd=pd,md=()=>{var e;return((e=window==null?void 0:window.__NUXT__)==null?void 0:e.config)||{}},dr=md().app,yd=()=>dr.baseURL,_d=()=>dr.buildAssetsDir,hs=(...e)=>fa(pa(),_d(),...e),pa=(...e)=>{const t=dr.cdnURL||dr.baseURL;return e.length?fa(t,...e):t};globalThis.__buildAssetsURL=hs,globalThis.__publicAssetsURL=pa;globalThis.$fetch||(globalThis.$fetch=gd.create({baseURL:yd()}));function Ro(e,t={},n){for(const r in e){const o=e[r],s=n?`${n}:${r}`:r;typeof o=="object"&&o!==null?Ro(o,t,s):typeof o=="function"&&(t[s]=o)}return t}const vd={run:e=>e()},bd=()=>vd,ga=typeof console.createTask<"u"?console.createTask:bd;function Ed(e,t){const n=t.shift(),r=ga(n);return e.reduce((o,s)=>o.then(()=>r.run(()=>s(...t))),Promise.resolve())}function wd(e,t){const n=t.shift(),r=ga(n);return Promise.all(e.map(o=>r.run(()=>o(...t))))}function Wr(e,t){for(const n of[...e])n(t)}class Rd{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(t,n,r={}){if(!t||typeof n!="function")return()=>{};const o=t;let s;for(;this._deprecatedHooks[t];)s=this._deprecatedHooks[t],t=s.to;if(s&&!r.allowDeprecated){let i=s.message;i||(i=`${o} hook has been deprecated`+(s.to?`, please use ${s.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(i)||(console.warn(i),this._deprecatedMessages.add(i))}if(!n.name)try{Object.defineProperty(n,"name",{get:()=>"_"+t.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[t]=this._hooks[t]||[],this._hooks[t].push(n),()=>{n&&(this.removeHook(t,n),n=void 0)}}hookOnce(t,n){let r,o=(...s)=>(typeof r=="function"&&r(),r=void 0,o=void 0,n(...s));return r=this.hook(t,o),r}removeHook(t,n){if(this._hooks[t]){const r=this._hooks[t].indexOf(n);r!==-1&&this._hooks[t].splice(r,1),this._hooks[t].length===0&&delete this._hooks[t]}}deprecateHook(t,n){this._deprecatedHooks[t]=typeof n=="string"?{to:n}:n;const r=this._hooks[t]||[];delete this._hooks[t];for(const o of r)this.hook(t,o)}deprecateHooks(t){Object.assign(this._deprecatedHooks,t);for(const n in t)this.deprecateHook(n,t[n])}addHooks(t){const n=Ro(t),r=Object.keys(n).map(o=>this.hook(o,n[o]));return()=>{for(const o of r.splice(0,r.length))o()}}removeHooks(t){const n=Ro(t);for(const r in n)this.removeHook(r,n[r])}removeAllHooks(){for(const t in this._hooks)delete this._hooks[t]}callHook(t,...n){return n.unshift(t),this.callHookWith(Ed,t,...n)}callHookParallel(t,...n){return n.unshift(t),this.callHookWith(wd,t,...n)}callHookWith(t,n,...r){const o=this._before||this._after?{name:n,args:r,context:{}}:void 0;this._before&&Wr(this._before,o);const s=t(n in this._hooks?[...this._hooks[n]]:[],r);return s instanceof Promise?s.finally(()=>{this._after&&o&&Wr(this._after,o)}):(this._after&&o&&Wr(this._after,o),s)}beforeEach(t){return this._before=this._before||[],this._before.push(t),()=>{if(this._before!==void 0){const n=this._before.indexOf(t);n!==-1&&this._before.splice(n,1)}}}afterEach(t){return this._after=this._after||[],this._after.push(t),()=>{if(this._after!==void 0){const n=this._after.indexOf(t);n!==-1&&this._after.splice(n,1)}}}}function ma(){return new Rd}function Pd(e={}){let t,n=!1;const r=i=>{if(t&&t!==i)throw new Error("Context conflict")};let o;if(e.asyncContext){const i=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;i?o=new i:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const s=()=>{if(o&&t===void 0){const i=o.getStore();if(i!==void 0)return i}return t};return{use:()=>{const i=s();if(i===void 0)throw new Error("Context is not available");return i},tryUse:()=>s(),set:(i,l)=>{l||r(i),t=i,n=!0},unset:()=>{t=void 0,n=!1},call:(i,l)=>{r(i),t=i;try{return o?o.run(i,l):l()}finally{n||(t=void 0)}},async callAsync(i,l){t=i;const a=()=>{t=i},u=()=>t===i?a:void 0;Po.add(u);try{const c=o?o.run(i,l):l();return n||(t=void 0),await c}finally{Po.delete(u)}}}}function Td(e={}){const t={};return{get(n,r={}){return t[n]||(t[n]=Pd({...e,...r})),t[n],t[n]}}}const hr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},di="__unctx__",Cd=hr[di]||(hr[di]=Td()),Ad=(e,t={})=>Cd.get(e,t),hi="__unctx_async_handlers__",Po=hr[hi]||(hr[hi]=new Set);function Sn(e){const t=[];for(const o of Po){const s=o();s&&t.push(s)}const n=()=>{for(const o of t)o()};let r=e();return r&&typeof r=="object"&&"catch"in r&&(r=r.catch(o=>{throw n(),o})),[r,n]}const ya=Ad("nuxt-app",{asyncContext:!1}),Sd="__nuxt_plugin";function xd(e){let t=0;const n={_scope:cc(),provide:void 0,globalName:"nuxt",versions:{get nuxt(){return"3.11.2"},get vue(){return n.vueApp.version}},payload:wt({data:{},state:{},once:new Set,_errors:{},...window.__NUXT__??{}}),static:{data:{}},runWithContext:o=>n._scope.run(()=>Od(n,o)),isHydrating:!0,deferHydration(){if(!n.isHydrating)return()=>{};t++;let o=!1;return()=>{if(!o&&(o=!0,t--,t===0))return n.isHydrating=!1,n.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:{},_payloadRevivers:{},...e};n.hooks=ma(),n.hook=n.hooks.hook,n.callHook=n.hooks.callHook,n.provide=(o,s)=>{const i="$"+o;Gn(n,i,s),Gn(n.vueApp.config.globalProperties,i,s)},Gn(n.vueApp,"$nuxt",n),Gn(n.vueApp.config.globalProperties,"$nuxt",n);{window.addEventListener("nuxt.preloadError",s=>{n.callHook("app:chunkError",{error:s.payload})}),window.useNuxtApp=window.useNuxtApp||ge;const o=n.hook("app:error",(...s)=>{console.error("[nuxt] error caught during app initialization",...s)});n.hook("app:mounted",o)}const r=n.payload.config;return n.provide("config",r),n}async function kd(e,t){if(t.hooks&&e.hooks.addHooks(t.hooks),typeof t=="function"){const{provide:n}=await e.runWithContext(()=>t(e))||{};if(n&&typeof n=="object")for(const r in n)e.provide(r,n[r])}}async function Ld(e,t){const n=[],r=[],o=[],s=[];let i=0;async function l(a){var c;const u=((c=a.dependsOn)==null?void 0:c.filter(f=>t.some(d=>d._name===f)&&!n.includes(f)))??[];if(u.length>0)r.push([new Set(u),a]);else{const f=kd(e,a).then(async()=>{a._name&&(n.push(a._name),await Promise.all(r.map(async([d,g])=>{d.has(a._name)&&(d.delete(a._name),d.size===0&&(i++,await l(g)))})))});a.parallel?o.push(f.catch(d=>s.push(d))):await f}}for(const a of t)await l(a);if(await Promise.all(o),i)for(let a=0;a{}),e,{[Sd]:!0,_name:t})}function Od(e,t,n){const r=()=>n?t(...n):t();return ya.set(e),e.vueApp.runWithContext(r)}function Id(){var t;let e;return jl()&&(e=(t=Mn())==null?void 0:t.appContext.app.$nuxt),e=e||ya.tryUse(),e||null}function ge(){const e=Id();if(!e)throw new Error("[nuxt] instance unavailable");return e}function ps(e){return ge().$config}function Gn(e,t,n){Object.defineProperty(e,t,{get:()=>n})}function Hd(e,t){return{ctx:{table:e},matchAll:n=>va(n,e,t)}}function _a(e){const t={};for(const n in e)t[n]=n==="dynamic"?new Map(Object.entries(e[n]).map(([r,o])=>[r,_a(o)])):new Map(Object.entries(e[n]));return t}function Md(e){return Hd(_a(e))}function va(e,t,n){n!==!0&&e.endsWith("/")&&(e=e.slice(0,-1)||"/");const r=[];for(const[s,i]of pi(t.wildcard))(e===s||e.startsWith(s+"/"))&&r.push(i);for(const[s,i]of pi(t.dynamic))if(e.startsWith(s+"/")){const l="/"+e.slice(s.length).split("/").splice(2).join("/");r.push(...va(l,i))}const o=t.static.get(e);return o&&r.push(o),r.filter(Boolean)}function pi(e){return[...e.entries()].sort((t,n)=>t[0].length-n[0].length)}function Kr(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function To(e,t,n=".",r){if(!Kr(t))return To(e,{},n,r);const o=Object.assign({},t);for(const s in e){if(s==="__proto__"||s==="constructor")continue;const i=e[s];i!=null&&(r&&r(o,s,i,n)||(Array.isArray(i)&&Array.isArray(o[s])?o[s]=[...i,...o[s]]:Kr(i)&&Kr(o[s])?o[s]=To(i,o[s],(n?`${n}.`:"")+s.toString(),r):o[s]=i))}return o}function ba(e){return(...t)=>t.reduce((n,r)=>To(n,r,"",e),{})}const Ea=ba(),Nd=ba((e,t,n)=>{if(e[t]!==void 0&&typeof n=="function")return e[t]=n(e[t]),!0});function $d(e,t){try{return t in e}catch{return!1}}var jd=Object.defineProperty,Dd=(e,t,n)=>t in e?jd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,At=(e,t,n)=>(Dd(e,typeof t!="symbol"?t+"":t,n),n);class Co extends Error{constructor(t,n={}){super(t,n),At(this,"statusCode",500),At(this,"fatal",!1),At(this,"unhandled",!1),At(this,"statusMessage"),At(this,"data"),At(this,"cause"),n.cause&&!this.cause&&(this.cause=n.cause)}toJSON(){const t={message:this.message,statusCode:So(this.statusCode,500)};return this.statusMessage&&(t.statusMessage=wa(this.statusMessage)),this.data!==void 0&&(t.data=this.data),t}}At(Co,"__h3_error__",!0);function Ao(e){if(typeof e=="string")return new Co(e);if(Fd(e))return e;const t=new Co(e.message??e.statusMessage??"",{cause:e.cause||e});if($d(e,"stack"))try{Object.defineProperty(t,"stack",{get(){return e.stack}})}catch{try{t.stack=e.stack}catch{}}if(e.data&&(t.data=e.data),e.statusCode?t.statusCode=So(e.statusCode,t.statusCode):e.status&&(t.statusCode=So(e.status,t.statusCode)),e.statusMessage?t.statusMessage=e.statusMessage:e.statusText&&(t.statusMessage=e.statusText),t.statusMessage){const n=t.statusMessage;wa(t.statusMessage)!==n&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return e.fatal!==void 0&&(t.fatal=e.fatal),e.unhandled!==void 0&&(t.unhandled=e.unhandled),t}function Fd(e){var t;return((t=e==null?void 0:e.constructor)==null?void 0:t.__h3_error__)===!0}const Bd=/[^\u0009\u0020-\u007E]/g;function wa(e=""){return e.replace(Bd,"")}function So(e,t=200){return!e||(typeof e=="string"&&(e=Number.parseInt(e,10)),e<100||e>999)?t:e}const Ra=Symbol("layout-meta"),$n=Symbol("route"),et=()=>{var e;return(e=ge())==null?void 0:e.$router},gs=()=>jl()?Ae($n,ge()._route):ge()._route;const Vd=()=>{try{if(ge()._processingMiddleware)return!0}catch{return!1}return!1},km=(e,t)=>{e||(e="/");const n=typeof e=="string"?e:ca(e.path||"/",e.query||{})+(e.hash||"");if(t!=null&&t.open){const{target:l="_blank",windowFeatures:a={}}=t.open,u=Object.entries(a).filter(([c,f])=>f!==void 0).map(([c,f])=>`${c.toLowerCase()}=${f}`).join(", ");return open(n,l,u),Promise.resolve()}const r=(t==null?void 0:t.external)||$t(n,{acceptRelative:!0});if(r){if(!(t!=null&&t.external))throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const l=Cr(n).protocol;if(l&&Jf(l))throw new Error(`Cannot navigate to a URL with '${l}' protocol.`)}const o=Vd();if(!r&&o)return e;const s=et(),i=ge();return r?(i._scope.stop(),t!=null&&t.replace?location.replace(n):location.href=n,o?i.isHydrating?new Promise(()=>{}):!1:Promise.resolve()):t!=null&&t.replace?s.replace(e):s.push(e)},Pa="__nuxt_error",Ar=()=>jc(ge().payload,"error"),Ut=e=>{const t=Sr(e);try{const n=ge(),r=Ar();n.hooks.callHook("app:error",t),r.value=r.value||t}catch{throw t}return t},Ud=async(e={})=>{const t=ge(),n=Ar();t.callHook("app:error:cleared",e),e.redirect&&await et().replace(e.redirect),n.value=null},Wd=e=>!!e&&typeof e=="object"&&Pa in e,Sr=e=>{const t=Ao(e);return Object.defineProperty(t,Pa,{value:!0,configurable:!1,writable:!1}),t},Kd="modulepreload",qd=function(e,t){return e[0]==="."?new URL(e,t).href:e},gi={},zd=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const s=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=Promise.all(n.map(a=>{if(a=qd(a,r),a in gi)return;gi[a]=!0;const u=a.endsWith(".css"),c=u?'[rel="stylesheet"]':"";if(!!r)for(let g=s.length-1;g>=0;g--){const v=s[g];if(v.href===a&&(!u||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${c}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":Kd,u||(d.as="script",d.crossOrigin=""),d.href=a,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((g,v)=>{d.addEventListener("load",g),d.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${a}`)))})}))}return o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},J=(...e)=>zd(...e).catch(t=>{const n=new Event("nuxt.preloadError");throw n.payload=t,window.dispatchEvent(n),t}),Gd=-1,Jd=-2,Qd=-3,Xd=-4,Yd=-5,Zd=-6;function eh(e,t){return th(JSON.parse(e),t)}function th(e,t){if(typeof e=="number")return o(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);function o(s,i=!1){if(s===Gd)return;if(s===Qd)return NaN;if(s===Xd)return 1/0;if(s===Yd)return-1/0;if(s===Zd)return-0;if(i)throw new Error("Invalid input");if(s in r)return r[s];const l=n[s];if(!l||typeof l!="object")r[s]=l;else if(Array.isArray(l))if(typeof l[0]=="string"){const a=l[0],u=t==null?void 0:t[a];if(u)return r[s]=u(o(l[1]));switch(a){case"Date":r[s]=new Date(l[1]);break;case"Set":const c=new Set;r[s]=c;for(let g=1;g>>9)+65536).toString(16).substring(1,8).toLowerCase()}function mi(e){return e._h||ms(e._d?e._d:`${e.tag}:${e.textContent||e.innerHTML||""}:${Object.entries(e.props).map(([t,n])=>`${t}:${String(n)}`).join(",")}`)}function Ca(e,t){const{props:n,tag:r}=e;if(sh.includes(r))return r;if(r==="link"&&n.rel==="canonical")return"canonical";if(n.charset)return"charset";const o=["id"];r==="meta"&&o.push("name","property","http-equiv");for(const s of o)if(typeof n[s]<"u"){const i=String(n[s]);return t&&!t(i)?!1:`${r}:${s}:${i}`}return!1}function yi(e,t){return e==null?t||null:typeof e=="function"?e(t):e}async function lh(e,t,n){const r={tag:e,props:await Aa(typeof t=="object"&&typeof t!="function"&&!(t instanceof Promise)?{...t}:{[["script","noscript","style"].includes(e)?"innerHTML":"textContent"]:t},["templateParams","titleTemplate"].includes(e))};return Ta.forEach(o=>{const s=typeof r.props[o]<"u"?r.props[o]:n[o];typeof s<"u"&&((!["innerHTML","textContent","children"].includes(o)||rh.includes(r.tag))&&(r[o==="children"?"innerHTML":o]=s),delete r.props[o])}),r.props.body&&(r.tagPosition="bodyClose",delete r.props.body),r.tag==="script"&&typeof r.innerHTML=="object"&&(r.innerHTML=JSON.stringify(r.innerHTML),r.props.type=r.props.type||"application/json"),Array.isArray(r.props.content)?r.props.content.map(o=>({...r,props:{...r.props,content:o}})):r}function ah(e,t){var r;const n=e==="class"?" ":";";return typeof t=="object"&&!Array.isArray(t)&&(t=Object.entries(t).filter(([,o])=>o).map(([o,s])=>e==="style"?`${o}:${s}`:o)),(r=Array.isArray(t)?t.join(n):t)==null?void 0:r.split(n).filter(o=>o.trim()).filter(Boolean).join(n)}async function Aa(e,t){for(const n of Object.keys(e)){if(["class","style"].includes(n)){e[n]=ah(n,e[n]);continue}if(e[n]instanceof Promise&&(e[n]=await e[n]),!t&&!Ta.includes(n)){const r=String(e[n]),o=n.startsWith("data-");r==="true"||r===""?e[n]=o?"true":!0:e[n]||(o&&r==="false"?e[n]="false":delete e[n])}}return e}const ch=10;async function uh(e){const t=[];return Object.entries(e.resolvedInput).filter(([n,r])=>typeof r<"u"&&oh.includes(n)).forEach(([n,r])=>{const o=nh(r);t.push(...o.map(s=>lh(n,s,e)).flat())}),(await Promise.all(t)).flat().filter(Boolean).map((n,r)=>(n._e=e._i,e.mode&&(n._m=e.mode),n._p=(e._i<a&&a[u]||void 0,t):l=t[i],typeof l<"u"?(l||"").replace(/"/g,'\\"'):!1}let o=e;try{o=decodeURI(e)}catch{}return(o.match(/%(\w+\.+\w+)|%(\w+)/g)||[]).sort().reverse().forEach(i=>{const l=r(i.slice(1));typeof l=="string"&&(e=e.replace(new RegExp(`\\${i}(\\W|$)`,"g"),(a,u)=>`${l}${u}`).trim())}),e.includes(ft)&&(e.endsWith(ft)&&(e=e.slice(0,-ft.length).trim()),e.startsWith(ft)&&(e=e.slice(ft.length).trim()),e=e.replace(new RegExp(`\\${ft}\\s*\\${ft}`,"g"),ft),e=Zn(e,{separator:n},n)),e}async function Sa(e,t={}){var c;const n=t.document||e.resolvedOptions.document;if(!n||!e.dirty)return;const r={shouldRender:!0,tags:[]};if(await e.hooks.callHook("dom:beforeRender",r),!r.shouldRender)return;const o=(await e.resolveTags()).map(f=>({tag:f,id:Yn.includes(f.tag)?mi(f):f.tag,shouldRender:!0}));let s=e._dom;if(!s){s={elMap:{htmlAttrs:n.documentElement,bodyAttrs:n.body}};for(const f of["body","head"]){const d=(c=n[f])==null?void 0:c.children,g=[];for(const v of[...d].filter(P=>Yn.includes(P.tagName.toLowerCase()))){const P={tag:v.tagName.toLowerCase(),props:await Aa(v.getAttributeNames().reduce((y,m)=>({...y,[m]:v.getAttribute(m)}),{})),innerHTML:v.innerHTML};let k=1,A=Ca(P);for(;A&&g.find(y=>y._d===A);)A=`${A}:${k++}`;P._d=A||void 0,g.push(P),s.elMap[v.getAttribute("data-hid")||mi(P)]=v}}}s.pendingSideEffects={...s.sideEffects||{}},s.sideEffects={};function i(f,d,g){const v=`${f}:${d}`;s.sideEffects[v]=g,delete s.pendingSideEffects[v]}function l({id:f,$el:d,tag:g}){const v=g.tag.endsWith("Attrs");s.elMap[f]=d,v||(["textContent","innerHTML"].forEach(P=>{g[P]&&g[P]!==d[P]&&(d[P]=g[P])}),i(f,"el",()=>{var P;(P=s.elMap[f])==null||P.remove(),delete s.elMap[f]}));for(const[P,k]of Object.entries(g._eventHandlers||{}))d.getAttribute(`data-${P}`)!==""&&((g.tag==="bodyAttrs"?n.defaultView:d).addEventListener(P.replace("on",""),k.bind(d)),d.setAttribute(`data-${P}`,""));Object.entries(g.props).forEach(([P,k])=>{const A=`attr:${P}`;if(P==="class")for(const y of(k||"").split(" ").filter(Boolean))v&&i(f,`${A}:${y}`,()=>d.classList.remove(y)),!d.classList.contains(y)&&d.classList.add(y);else if(P==="style")for(const y of(k||"").split(";").filter(Boolean)){const[m,..._]=y.split(":").map(w=>w.trim());i(f,`${A}:${y}:${m}`,()=>{d.style.removeProperty(m)}),d.style.setProperty(m,_.join(":"))}else d.getAttribute(P)!==k&&d.setAttribute(P,k===!0?"":String(k)),v&&i(f,A,()=>d.removeAttribute(P))})}const a=[],u={bodyClose:void 0,bodyOpen:void 0,head:void 0};for(const f of o){const{tag:d,shouldRender:g,id:v}=f;if(g){if(d.tag==="title"){n.title=d.textContent;continue}f.$el=f.$el||s.elMap[v],f.$el?l(f):Yn.includes(d.tag)&&a.push(f)}}for(const f of a){const d=f.tag.tagPosition||"head";f.$el=n.createElement(f.tag.tag),l(f),u[d]=u[d]||n.createDocumentFragment(),u[d].appendChild(f.$el)}for(const f of o)await e.hooks.callHook("dom:renderTag",f,n,i);u.head&&n.head.appendChild(u.head),u.bodyOpen&&n.body.insertBefore(u.bodyOpen,n.body.firstChild),u.bodyClose&&n.body.appendChild(u.bodyClose),Object.values(s.pendingSideEffects).forEach(f=>f()),e._dom=s,e.dirty=!1,await e.hooks.callHook("dom:rendered",{renders:o})}async function dh(e,t={}){const n=t.delayFn||(r=>setTimeout(r,10));return e._domUpdatePromise=e._domUpdatePromise||new Promise(r=>n(async()=>{await Sa(e,t),delete e._domUpdatePromise,r()}))}function hh(e){return t=>{var r,o;const n=((o=(r=t.resolvedOptions.document)==null?void 0:r.head.querySelector('script[id="unhead:payload"]'))==null?void 0:o.innerHTML)||!1;return n&&t.push(JSON.parse(n)),{mode:"client",hooks:{"entries:updated":function(s){dh(s,e)}}}}}const ph=["templateParams","htmlAttrs","bodyAttrs"],gh={hooks:{"tag:normalise":function({tag:e}){["hid","vmid","key"].forEach(r=>{e.props[r]&&(e.key=e.props[r],delete e.props[r])});const n=Ca(e)||(e.key?`${e.tag}:${e.key}`:!1);n&&(e._d=n)},"tags:resolve":function(e){const t={};e.tags.forEach(r=>{const o=(r.key?`${r.tag}:${r.key}`:r._d)||r._p,s=t[o];if(s){let l=r==null?void 0:r.tagDuplicateStrategy;if(!l&&ph.includes(r.tag)&&(l="merge"),l==="merge"){const a=s.props;["class","style"].forEach(u=>{a[u]&&(r.props[u]?(u==="style"&&!a[u].endsWith(";")&&(a[u]+=";"),r.props[u]=`${a[u]} ${r.props[u]}`):r.props[u]=a[u])}),t[o].props={...a,...r.props};return}else if(r._e===s._e){s._duped=s._duped||[],r._d=`${s._d}:${s._duped.length+1}`,s._duped.push(r);return}else if(pr(r)>pr(s))return}const i=Object.keys(r.props).length+(r.innerHTML?1:0)+(r.textContent?1:0);if(Yn.includes(r.tag)&&i===0){delete t[o];return}t[o]=r});const n=[];Object.values(t).forEach(r=>{const o=r._duped;delete r._duped,n.push(r),o&&n.push(...o)}),e.tags=n,e.tags=e.tags.filter(r=>!(r.tag==="meta"&&(r.props.name||r.props.property)&&!r.props.content))}}},mh={mode:"server",hooks:{"tags:resolve":function(e){const t={};e.tags.filter(n=>["titleTemplate","templateParams","title"].includes(n.tag)&&n._m==="server").forEach(n=>{t[n.tag]=n.tag.startsWith("title")?n.textContent:n.props}),Object.keys(t).length&&e.tags.push({tag:"script",innerHTML:JSON.stringify(t),props:{id:"unhead:payload",type:"application/json"}})}}},yh=["script","link","bodyAttrs"],_h=e=>({hooks:{"tags:resolve":function(t){for(const n of t.tags.filter(r=>yh.includes(r.tag)))Object.entries(n.props).forEach(([r,o])=>{r.startsWith("on")&&typeof o=="function"&&(e.ssr&&bi.includes(r)?n.props[r]=`this.dataset.${r}fired = true`:delete n.props[r],n._eventHandlers=n._eventHandlers||{},n._eventHandlers[r]=o)}),e.ssr&&n._eventHandlers&&(n.props.src||n.props.href)&&(n.key=n.key||ms(n.props.src||n.props.href))},"dom:renderTag":function({$el:t,tag:n}){var r,o;for(const s of Object.keys((t==null?void 0:t.dataset)||{}).filter(i=>bi.some(l=>`${l}fired`===i))){const i=s.replace("fired","");(o=(r=n._eventHandlers)==null?void 0:r[i])==null||o.call(t,new Event(i.replace("on","")))}}}}),vh=["link","style","script","noscript"],bh={hooks:{"tag:normalise":({tag:e})=>{e.key&&vh.includes(e.tag)&&(e.props["data-hid"]=e._h=ms(e.key))}}},Eh={hooks:{"tags:resolve":e=>{const t=n=>{var r;return(r=e.tags.find(o=>o._d===n))==null?void 0:r._p};for(const{prefix:n,offset:r}of fh)for(const o of e.tags.filter(s=>typeof s.tagPriority=="string"&&s.tagPriority.startsWith(n))){const s=t(o.tagPriority.replace(n,""));typeof s<"u"&&(o._p=s+r)}e.tags.sort((n,r)=>n._p-r._p).sort((n,r)=>pr(n)-pr(r))}}},wh={meta:"content",link:"href",htmlAttrs:"lang"},Rh=e=>({hooks:{"tags:resolve":t=>{var l;const{tags:n}=t,r=(l=n.find(a=>a.tag==="title"))==null?void 0:l.textContent,o=n.findIndex(a=>a.tag==="templateParams"),s=o!==-1?n[o].props:{},i=s.separator||"|";delete s.separator,s.pageTitle=Zn(s.pageTitle||r||"",s,i);for(const a of n.filter(u=>u.processTemplateParams!==!1)){const u=wh[a.tag];u&&typeof a.props[u]=="string"?a.props[u]=Zn(a.props[u],s,i):(a.processTemplateParams===!0||["titleTemplate","title"].includes(a.tag))&&["innerHTML","textContent"].forEach(c=>{typeof a[c]=="string"&&(a[c]=Zn(a[c],s,i))})}e._templateParams=s,e._separator=i,t.tags=n.filter(a=>a.tag!=="templateParams")}}}),Ph={hooks:{"tags:resolve":e=>{const{tags:t}=e;let n=t.findIndex(o=>o.tag==="titleTemplate");const r=t.findIndex(o=>o.tag==="title");if(r!==-1&&n!==-1){const o=yi(t[n].textContent,t[r].textContent);o!==null?t[r].textContent=o||t[r].textContent:delete t[r]}else if(n!==-1){const o=yi(t[n].textContent);o!==null&&(t[n].textContent=o,t[n].tag="title",n=-1)}n!==-1&&delete t[n],e.tags=t.filter(Boolean)}}},Th={hooks:{"tags:afterResolve":function(e){for(const t of e.tags)typeof t.innerHTML=="string"&&(t.innerHTML&&["application/ld+json","application/json"].includes(t.props.type)?t.innerHTML=t.innerHTML.replace(/{l.dirty=!0,t.callHook("entries:updated",l)};let o=0,s=[];const i=[],l={plugins:i,dirty:!1,resolvedOptions:e,hooks:t,headEntries(){return s},use(a){const u=typeof a=="function"?a(l):a;(!u.key||!i.some(c=>c.key===u.key))&&(i.push(u),Ei(u.mode,n)&&t.addHooks(u.hooks||{}))},push(a,u){u==null||delete u.head;const c={_i:o++,input:a,...u};return Ei(c.mode,n)&&(s.push(c),r()),{dispose(){s=s.filter(f=>f._i!==c._i),t.callHook("entries:updated",l),r()},patch(f){s=s.map(d=>(d._i===c._i&&(d.input=c.input=f),d)),r()}}},async resolveTags(){const a={tags:[],entries:[...s]};await t.callHook("entries:resolve",a);for(const u of a.entries){const c=u.resolvedInput||u.input;if(u.resolvedInput=await(u.transform?u.transform(c):c),u.resolvedInput)for(const f of await uh(u)){const d={tag:f,entry:u,resolvedOptions:l.resolvedOptions};await t.callHook("tag:normalise",d),a.tags.push(d.tag)}}return await t.callHook("tags:beforeResolve",a),await t.callHook("tags:resolve",a),await t.callHook("tags:afterResolve",a),a.tags},ssr:n};return[gh,mh,_h,bh,Eh,Rh,Ph,Th,...(e==null?void 0:e.plugins)||[]].forEach(a=>l.use(a)),l.hooks.callHook("init",l),l}function Sh(){return xa}const xh=oa.startsWith("3");function kh(e){return typeof e=="function"?e():ue(e)}function xo(e,t=""){if(e instanceof Promise)return e;const n=kh(e);return!e||!n?n:Array.isArray(n)?n.map(r=>xo(r,t)):typeof n=="object"?Object.fromEntries(Object.entries(n).map(([r,o])=>r==="titleTemplate"||r.startsWith("on")?[r,ue(o)]:[r,xo(o,r)])):n}const Lh={hooks:{"entries:resolve":function(e){for(const t of e.entries)t.resolvedInput=xo(t.input)}}},ka="usehead";function Oh(e){return{install(n){xh&&(n.config.globalProperties.$unhead=e,n.config.globalProperties.$head=e,n.provide(ka,e))}}.install}function Ih(e={}){e.domDelayFn=e.domDelayFn||(n=>ln(()=>setTimeout(()=>n(),0)));const t=Ch(e);return t.use(Lh),t.install=Oh(t),t}const ko=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Lo="__unhead_injection_handler__";function Hh(e){ko[Lo]=e}function Lm(){if(Lo in ko)return ko[Lo]();const e=Ae(ka);return e||Sh()}const Mh={nuxt:{buildId:"d8c635a6-4df4-43ae-ac4a-a06023848560"}},Nh=Nd(Mh);function La(){const e=ge();return e._appConfig||(e._appConfig=wt(Nh)),e._appConfig}const $h=!1,Oo=!1,jh=!1,Om={trailingSlash:"append",componentName:"NuxtLink"},Im={deep:!0},Dh="#__nuxt";let er,Oa;function Fh(){var t;const e=(t=La().nuxt)==null?void 0:t.buildId;return er=$fetch(hs(`builds/meta/${e}.json`)),er.then(n=>{Oa=Md(n.matcher)}),er}function xr(){return er||Fh()}async function ys(e){return await xr(),Ea({},...Oa.matchAll(e).reverse())}function wi(e,t={}){const n=Vh(e,t),r=ge(),o=r._payloadCache=r._payloadCache||{};return n in o||(o[n]=Uh(e).then(s=>s?Ia(n).then(i=>i||(delete o[n],null)):(o[n]=null,null))),o[n]}const Bh="_payload.json";function Vh(e,t={}){var o;const n=new URL(e,"http://localhost");if(n.host!=="localhost"||$t(n.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+e);const r=t.hash||(t.fresh?Date.now():(o=La().nuxt)==null?void 0:o.buildId);return fs(ps().app.baseURL,n.pathname,Bh+(r?`?${r}`:""))}async function Ia(e){const t=fetch(e).then(n=>n.text().then(Ha));try{return await t}catch(n){console.warn("[nuxt] Cannot load payload ",e,n)}return null}async function Uh(e=gs().path){if(e=us(e),(await xr()).prerendered.includes(e))return!0;const n=await ys(e);return!!n.prerender&&!n.redirect}let Jn=null;async function Wh(){if(Jn)return Jn;const e=document.getElementById("__NUXT_DATA__");if(!e)return{};const t=await Ha(e.textContent||""),n=e.dataset.src?await Ia(e.dataset.src):void 0;return Jn={...t,...n,...window.__NUXT__},Jn}async function Ha(e){return await eh(e,ge()._payloadRevivers)}function Kh(e,t){ge()._payloadRevivers[e]=t}const Ri={NuxtError:e=>Sr(e),EmptyShallowRef:e=>Rn(e==="_"?void 0:e==="0n"?BigInt(0):ur(e)),EmptyRef:e=>qe(e==="_"?void 0:e==="0n"?BigInt(0):ur(e)),ShallowRef:e=>Rn(e),ShallowReactive:e=>In(e),Ref:e=>qe(e),Reactive:e=>wt(e)},qh=Rt({name:"nuxt:revive-payload:client",order:-30,async setup(e){let t,n;for(const r in Ri)Kh(r,Ri[r]);Object.assign(e.payload,([t,n]=Sn(()=>e.runWithContext(Wh)),t=await t,n(),t)),window.__NUXT__=e.payload}}),zh=[],Gh=Rt({name:"nuxt:head",enforce:"pre",setup(e){const t=Ih({plugins:zh});Hh(()=>ge().vueApp._context.provides.usehead),e.vueApp.use(t);{let n=!0;const r=async()=>{n=!1,await Sa(t)};t.hooks.hook("dom:beforeRender",o=>{o.shouldRender=!n}),e.hooks.hook("page:start",()=>{n=!0}),e.hooks.hook("page:finish",()=>{e.isHydrating||r()}),e.hooks.hook("app:error",r),e.hooks.hook("app:suspense:resolve",r)}}});/*! * vue-router v4.3.0 * (c) 2024 Eduardo San Martin Morote * @license MIT - */const Bt=typeof document<"u";function Jh(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const se=Object.assign;function qr(e,t){const n={};for(const r in t){const o=t[r];n[r]=ze(o)?o.map(e):e(o)}return n}const vn=()=>{},ze=Array.isArray,Ma=/#/g,Qh=/&/g,Xh=/\//g,Yh=/=/g,Zh=/\?/g,Na=/\+/g,ep=/%5B/g,tp=/%5D/g,$a=/%5E/g,np=/%60/g,ja=/%7B/g,rp=/%7C/g,Da=/%7D/g,op=/%20/g;function _s(e){return encodeURI(""+e).replace(rp,"|").replace(ep,"[").replace(tp,"]")}function sp(e){return _s(e).replace(ja,"{").replace(Da,"}").replace($a,"^")}function Io(e){return _s(e).replace(Na,"%2B").replace(op,"+").replace(Ma,"%23").replace(Qh,"%26").replace(np,"`").replace(ja,"{").replace(Da,"}").replace($a,"^")}function ip(e){return Io(e).replace(Yh,"%3D")}function lp(e){return _s(e).replace(Ma,"%23").replace(Zh,"%3F")}function ap(e){return e==null?"":lp(e).replace(Xh,"%2F")}function xn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const cp=/\/$/,up=e=>e.replace(cp,"");function zr(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=pp(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:xn(i)}}function fp(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Pi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function dp(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&tn(t.matched[r],n.matched[o])&&Fa(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function tn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Fa(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!hp(e[n],t[n]))return!1;return!0}function hp(e,t){return ze(e)?Ti(e,t):ze(t)?Ti(t,e):e===t}function Ti(e,t){return ze(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function pp(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}var kn;(function(e){e.pop="pop",e.push="push"})(kn||(kn={}));var bn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(bn||(bn={}));function gp(e){if(!e)if(Bt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),up(e)}const mp=/^[^#]+#/;function yp(e,t){return e.replace(mp,"#")+t}function _p(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const kr=()=>({left:window.scrollX,top:window.scrollY});function vp(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=_p(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ci(e,t){return(history.state?history.state.position-t:-1)+e}const Ho=new Map;function bp(e,t){Ho.set(e,t)}function Ep(e){const t=Ho.get(e);return Ho.delete(e),t}let wp=()=>location.protocol+"//"+location.host;function Ba(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),Pi(a,"")}return Pi(n,e)+r+o}function Rp(e,t,n,r){let o=[],s=[],i=null;const l=({state:d})=>{const g=Ba(e,location),v=n.value,P=t.value;let k=0;if(d){if(n.value=g,t.value=d,i&&i===v){i=null;return}k=P?d.position-P.position:0}else r(g);o.forEach(A=>{A(n.value,v,{delta:k,type:kn.pop,direction:k?k>0?bn.forward:bn.back:bn.unknown})})};function a(){i=n.value}function u(d){o.push(d);const g=()=>{const v=o.indexOf(d);v>-1&&o.splice(v,1)};return s.push(g),g}function c(){const{history:d}=window;d.state&&d.replaceState(se({},d.state,{scroll:kr()}),"")}function f(){for(const d of s)d();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:a,listen:u,destroy:f}}function Ai(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?kr():null}}function Pp(e){const{history:t,location:n}=window,r={value:Ba(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,u,c){const f=e.indexOf("#"),d=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:wp()+e+a;try{t[c?"replaceState":"pushState"](u,"",d),o.value=u}catch(g){console.error(g),n[c?"replace":"assign"](d)}}function i(a,u){const c=se({},t.state,Ai(o.value.back,a,o.value.forward,!0),u,{position:o.value.position});s(a,c,!0),r.value=a}function l(a,u){const c=se({},o.value,t.state,{forward:a,scroll:kr()});s(c.current,c,!0);const f=se({},Ai(r.value,a,null),{position:c.position+1},u);s(a,f,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function Va(e){e=gp(e);const t=Pp(e),n=Rp(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=se({location:"",base:e,go:r,createHref:yp.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Tp(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Va(e)}function Cp(e){return typeof e=="string"||e&&typeof e=="object"}function Ua(e){return typeof e=="string"||typeof e=="symbol"}const We={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Wa=Symbol("");var Si;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Si||(Si={}));function nn(e,t){return se(new Error,{type:e,[Wa]:!0},t)}function tt(e,t){return e instanceof Error&&Wa in e&&(t==null||!!(e.type&t))}const xi="[^/]+?",Ap={sensitive:!1,strict:!1,start:!0,end:!0},Sp=/[.+*?^${}()[\]/\\]/g;function xp(e,t){const n=se({},Ap,t),r=[];let o=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+="/");for(let f=0;ft.length?t.length===1&&t[0]===80?1:-1:0}function Lp(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Op={type:0,value:""},Ip=/[a-zA-Z0-9_]/;function Hp(e){if(!e)return[[]];if(e==="/")return[[Op]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${u}": ${g}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,u="",c="";function f(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),u="")}function d(){u+=a}for(;l{i(y)}:vn}function i(c){if(Ua(c)){const f=r.get(c);f&&(r.delete(c),n.splice(n.indexOf(f),1),f.children.forEach(i),f.alias.forEach(i))}else{const f=n.indexOf(c);f>-1&&(n.splice(f,1),c.record.name&&r.delete(c.record.name),c.children.forEach(i),c.alias.forEach(i))}}function l(){return n}function a(c){let f=0;for(;f=0&&(c.record.path!==n[f].record.path||!Ka(c,n[f]));)f++;n.splice(f,0,c),c.record.name&&!Oi(c)&&r.set(c.record.name,c)}function u(c,f){let d,g={},v,P;if("name"in c&&c.name){if(d=r.get(c.name),!d)throw nn(1,{location:c});P=d.record.name,g=se(Li(f.params,d.keys.filter(y=>!y.optional).concat(d.parent?d.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),c.params&&Li(c.params,d.keys.map(y=>y.name))),v=d.stringify(g)}else if(c.path!=null)v=c.path,d=n.find(y=>y.re.test(v)),d&&(g=d.parse(v),P=d.record.name);else{if(d=f.name?r.get(f.name):n.find(y=>y.re.test(f.path)),!d)throw nn(1,{location:c,currentLocation:f});P=d.record.name,g=se({},f.params,c.params),v=d.stringify(g)}const k=[];let A=d;for(;A;)k.unshift(A.record),A=A.parent;return{name:P,path:v,params:g,matched:k,meta:Dp(k)}}return e.forEach(c=>s(c)),{addRoute:s,resolve:u,removeRoute:i,getRoutes:l,getRecordMatcher:o}}function Li(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function $p(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:jp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function jp(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Oi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Dp(e){return e.reduce((t,n)=>se(t,n.meta),{})}function Ii(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Ka(e,t){return t.children.some(n=>n===e||Ka(e,n))}function Fp(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Io(s)):[r&&Io(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Bp(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ze(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const Vp=Symbol(""),Mi=Symbol(""),vs=Symbol(""),bs=Symbol(""),Mo=Symbol("");function un(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function mt(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const u=d=>{d===!1?a(nn(4,{from:n,to:t})):d instanceof Error?a(d):Cp(d)?a(nn(2,{from:t,to:d})):(i&&r.enterCallbacks[o]===i&&typeof d=="function"&&i.push(d),l())},c=s(()=>e.call(r&&r.instances[o],t,n,u));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch(d=>a(d))})}function Gr(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(Up(a)){const c=(a.__vccOpts||a)[t];c&&s.push(mt(c,n,r,i,l,o))}else{let u=a();s.push(()=>u.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${l}" at "${i.path}"`));const f=Jh(c)?c.default:c;i.components[l]=f;const g=(f.__vccOpts||f)[t];return g&&mt(g,n,r,i,l,o)()}))}}return s}function Up(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Ni(e){const t=Ae(vs),n=Ae(bs),r=Le(()=>t.resolve(ue(e.to))),o=Le(()=>{const{matched:a}=r.value,{length:u}=a,c=a[u-1],f=n.matched;if(!c||!f.length)return-1;const d=f.findIndex(tn.bind(null,c));if(d>-1)return d;const g=$i(a[u-2]);return u>1&&$i(c)===g&&f[f.length-1].path!==g?f.findIndex(tn.bind(null,a[u-2])):d}),s=Le(()=>o.value>-1&&zp(n.params,r.value.params)),i=Le(()=>o.value>-1&&o.value===n.matched.length-1&&Fa(n.params,r.value.params));function l(a={}){return qp(a)?t[ue(e.replace)?"replace":"push"](ue(e.to)).catch(vn):Promise.resolve()}return{route:r,href:Le(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}const Wp=ot({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Ni,setup(e,{slots:t}){const n=wt(Ni(e)),{options:r}=Ae(vs),o=Le(()=>({[ji(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[ji(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:Oe("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Kp=Wp;function qp(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function zp(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!ze(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function $i(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ji=(e,t,n)=>e??t??n,Gp=ot({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Ae(Mo),o=Le(()=>e.route||r.value),s=Ae(Mi,0),i=Le(()=>{let u=ue(s);const{matched:c}=o.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),l=Le(()=>o.value.matched[i.value]);Ot(Mi,Le(()=>i.value+1)),Ot(Vp,l),Ot(Mo,o);const a=qe();return Qt(()=>[a.value,l.value,e.name],([u,c,f],[d,g,v])=>{c&&(c.instances[f]=u,g&&g!==c&&u&&u===d&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),u&&c&&(!g||!tn(c,g)||!d)&&(c.enterCallbacks[f]||[]).forEach(P=>P(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,f=l.value,d=f&&f.components[c];if(!d)return Di(n.default,{Component:d,route:u});const g=f.props[c],v=g?g===!0?u.params:typeof g=="function"?g(u):g:null,k=Oe(d,se({},v,t,{onVnodeUnmounted:A=>{A.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return Di(n.default,{Component:k,route:u})||k}}});function Di(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const qa=Gp;function Jp(e){const t=Np(e.routes,e),n=e.parseQuery||Fp,r=e.stringifyQuery||Hi,o=e.history,s=un(),i=un(),l=un(),a=Rn(We);let u=We;Bt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=qr.bind(null,T=>""+T),f=qr.bind(null,ap),d=qr.bind(null,xn);function g(T,F){let j,U;return Ua(T)?(j=t.getRecordMatcher(T),U=F):U=T,t.addRoute(U,j)}function v(T){const F=t.getRecordMatcher(T);F&&t.removeRoute(F)}function P(){return t.getRoutes().map(T=>T.record)}function k(T){return!!t.getRecordMatcher(T)}function A(T,F){if(F=se({},F||a.value),typeof T=="string"){const p=zr(n,T,F.path),b=t.resolve({path:p.path},F),C=o.createHref(p.fullPath);return se(p,b,{params:d(b.params),hash:xn(p.hash),redirectedFrom:void 0,href:C})}let j;if(T.path!=null)j=se({},T,{path:zr(n,T.path,F.path).path});else{const p=se({},T.params);for(const b in p)p[b]==null&&delete p[b];j=se({},T,{params:f(p)}),F.params=f(F.params)}const U=t.resolve(j,F),oe=T.hash||"";U.params=c(d(U.params));const de=fp(r,se({},T,{hash:sp(oe),path:U.path})),h=o.createHref(de);return se({fullPath:de,hash:oe,query:r===Hi?Bp(T.query):T.query||{}},U,{redirectedFrom:void 0,href:h})}function y(T){return typeof T=="string"?zr(n,T,a.value.path):se({},T)}function m(T,F){if(u!==T)return nn(8,{from:F,to:T})}function _(T){return L(T)}function w(T){return _(se(y(T),{replace:!0}))}function E(T){const F=T.matched[T.matched.length-1];if(F&&F.redirect){const{redirect:j}=F;let U=typeof j=="function"?j(T):j;return typeof U=="string"&&(U=U.includes("?")||U.includes("#")?U=y(U):{path:U},U.params={}),se({query:T.query,hash:T.hash,params:U.path!=null?{}:T.params},U)}}function L(T,F){const j=u=A(T),U=a.value,oe=T.state,de=T.force,h=T.replace===!0,p=E(j);if(p)return L(se(y(p),{state:typeof p=="object"?se({},oe,p.state):oe,force:de,replace:h}),F||j);const b=j;b.redirectedFrom=F;let C;return!de&&dp(r,U,j)&&(C=nn(16,{to:b,from:U}),Ge(U,U,!0,!1)),(C?Promise.resolve(C):N(b,U)).catch(R=>tt(R)?tt(R,2)?R:it(R):W(R,b,U)).then(R=>{if(R){if(tt(R,2))return L(se({replace:h},y(R.to),{state:typeof R.to=="object"?se({},oe,R.to.state):oe,force:de}),F||b)}else R=H(b,U,!0,h,oe);return Q(b,U,R),R})}function S(T,F){const j=m(T,F);return j?Promise.reject(j):Promise.resolve()}function $(T){const F=Dt.values().next().value;return F&&typeof F.runWithContext=="function"?F.runWithContext(T):T()}function N(T,F){let j;const[U,oe,de]=Qp(T,F);j=Gr(U.reverse(),"beforeRouteLeave",T,F);for(const p of U)p.leaveGuards.forEach(b=>{j.push(mt(b,T,F))});const h=S.bind(null,T,F);return j.push(h),we(j).then(()=>{j=[];for(const p of s.list())j.push(mt(p,T,F));return j.push(h),we(j)}).then(()=>{j=Gr(oe,"beforeRouteUpdate",T,F);for(const p of oe)p.updateGuards.forEach(b=>{j.push(mt(b,T,F))});return j.push(h),we(j)}).then(()=>{j=[];for(const p of de)if(p.beforeEnter)if(ze(p.beforeEnter))for(const b of p.beforeEnter)j.push(mt(b,T,F));else j.push(mt(p.beforeEnter,T,F));return j.push(h),we(j)}).then(()=>(T.matched.forEach(p=>p.enterCallbacks={}),j=Gr(de,"beforeRouteEnter",T,F,$),j.push(h),we(j))).then(()=>{j=[];for(const p of i.list())j.push(mt(p,T,F));return j.push(h),we(j)}).catch(p=>tt(p,8)?p:Promise.reject(p))}function Q(T,F,j){l.list().forEach(U=>$(()=>U(T,F,j)))}function H(T,F,j,U,oe){const de=m(T,F);if(de)return de;const h=F===We,p=Bt?history.state:{};j&&(U||h?o.replace(T.fullPath,se({scroll:h&&p&&p.scroll},oe)):o.push(T.fullPath,oe)),a.value=T,Ge(T,F,j,h),it()}let G;function le(){G||(G=o.listen((T,F,j)=>{if(!jn.listening)return;const U=A(T),oe=E(U);if(oe){L(se(oe,{replace:!0}),U).catch(vn);return}u=U;const de=a.value;Bt&&bp(Ci(de.fullPath,j.delta),kr()),N(U,de).catch(h=>tt(h,12)?h:tt(h,2)?(L(h.to,U).then(p=>{tt(p,20)&&!j.delta&&j.type===kn.pop&&o.go(-1,!1)}).catch(vn),Promise.reject()):(j.delta&&o.go(-j.delta,!1),W(h,U,de))).then(h=>{h=h||H(U,de,!1),h&&(j.delta&&!tt(h,8)?o.go(-j.delta,!1):j.type===kn.pop&&tt(h,20)&&o.go(-1,!1)),Q(U,de,h)}).catch(vn)}))}let ae=un(),V=un(),Z;function W(T,F,j){it(T);const U=V.list();return U.length?U.forEach(oe=>oe(T,F,j)):console.error(T),Promise.reject(T)}function Ve(){return Z&&a.value!==We?Promise.resolve():new Promise((T,F)=>{ae.add([T,F])})}function it(T){return Z||(Z=!T,le(),ae.list().forEach(([F,j])=>T?j(T):F()),ae.reset()),T}function Ge(T,F,j,U){const{scrollBehavior:oe}=e;if(!Bt||!oe)return Promise.resolve();const de=!j&&Ep(Ci(T.fullPath,0))||(U||!j)&&history.state&&history.state.scroll||null;return ln().then(()=>oe(T,F,de)).then(h=>h&&vp(h)).catch(h=>W(h,T,F))}const xe=T=>o.go(T);let jt;const Dt=new Set,jn={currentRoute:a,listening:!0,addRoute:g,removeRoute:v,hasRoute:k,getRoutes:P,resolve:A,options:e,push:_,replace:w,go:xe,back:()=>xe(-1),forward:()=>xe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:V.add,isReady:Ve,install(T){const F=this;T.component("RouterLink",Kp),T.component("RouterView",qa),T.config.globalProperties.$router=F,Object.defineProperty(T.config.globalProperties,"$route",{enumerable:!0,get:()=>ue(a)}),Bt&&!jt&&a.value===We&&(jt=!0,_(o.location).catch(oe=>{}));const j={};for(const oe in We)Object.defineProperty(j,oe,{get:()=>a.value[oe],enumerable:!0});T.provide(vs,F),T.provide(bs,In(j)),T.provide(Mo,a);const U=T.unmount;Dt.add(T),T.unmount=function(){Dt.delete(T),Dt.size<1&&(u=We,G&&G(),G=null,a.value=We,jt=!1,Z=!1),U()}}};function we(T){return T.reduce((F,j)=>F.then(()=>$(j)),Promise.resolve())}return jn}function Qp(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;itn(u,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(u=>tn(u,a))||o.push(a))}return[n,r,o]}function Xp(){return Ae(bs)}const Yp=(e,t)=>t.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""}),No=(e,t)=>{const n=e.route.matched.find(o=>{var s;return((s=o.components)==null?void 0:s.default)===e.Component.type}),r=t??(n==null?void 0:n.meta.key)??(n&&Yp(e.route,n));return typeof r=="function"?r(e.route):r},Zp=(e,t)=>({default:()=>e?Oe(au,e===!0?{}:e,t):t});function Es(e){return Array.isArray(e)?e:[e]}const Jr=null,Qr=null,Xr=null,Yr=null,Zr=null,eo=null,to=null,no=null,ro=null,Fi=[{name:"case-studies-automatisch",path:"/case-studies/automatisch",meta:{},alias:[],redirect:Jr==null?void 0:Jr.redirect,component:()=>J(()=>import("./CTsxuQGU.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"case-studies",path:"/case-studies",meta:{},alias:[],redirect:Qr==null?void 0:Qr.redirect,component:()=>J(()=>import("./CU2a8ONd.js"),__vite__mapDeps([12,2,9,10,8,11]),import.meta.url).then(e=>e.default||e)},{name:"index",path:"/",meta:{},alias:[],redirect:Xr==null?void 0:Xr.redirect,component:()=>J(()=>import("./DgGP7C2m.js"),__vite__mapDeps([13,11,9,1,2,3,14,15]),import.meta.url).then(e=>e.default||e)},{name:"playwright-architecture",path:"/playwright/architecture",meta:{},alias:[],redirect:Yr==null?void 0:Yr.redirect,component:()=>J(()=>import("./DOMMcfGQ.js"),__vite__mapDeps([16,4,2,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"playwright-how-playwright-initializes",path:"/playwright/how-playwright-initializes",meta:{},alias:[],redirect:Zr==null?void 0:Zr.redirect,component:()=>J(()=>import("./BO7VgWjS.js"),__vite__mapDeps([17,4,2,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"playwright",path:"/playwright",meta:{},alias:[],redirect:eo==null?void 0:eo.redirect,component:()=>J(()=>import("./D9PIjOys.js"),__vite__mapDeps([18,2,9,10,8,11]),import.meta.url).then(e=>e.default||e)},{name:"privacy-policy",path:"/privacy-policy",meta:{},alias:[],redirect:to==null?void 0:to.redirect,component:()=>J(()=>import("./BNmay2Ox.js"),__vite__mapDeps([19,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-and-conditions",path:"/terms-and-conditions",meta:{},alias:[],redirect:no==null?void 0:no.redirect,component:()=>J(()=>import("./CUQ1nFrM.js"),__vite__mapDeps([22,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-of-service",path:"/terms-of-service",meta:{},alias:[],redirect:ro==null?void 0:ro.redirect,component:()=>J(()=>import("./BQTmeGxM.js"),__vite__mapDeps([23,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)}],za=(e,t,n)=>(t=t===!0?{}:t,{default:()=>{var r;return t?Oe(e,t,n):(r=n.default)==null?void 0:r.call(n)}});function Bi(e){const t=(e==null?void 0:e.meta.key)??e.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""});return typeof t=="function"?t(e):t}function eg(e,t){return e===t||t===We?!1:Bi(e)!==Bi(t)?!0:!e.matched.every((r,o)=>{var s,i;return r.components&&r.components.default===((i=(s=t.matched[o])==null?void 0:s.components)==null?void 0:i.default)})}const tg={scrollBehavior(e,t,n){var u;const r=ge(),o=((u=et().options)==null?void 0:u.scrollBehaviorType)??"auto";let s=n||void 0;const i=typeof e.meta.scrollToTop=="function"?e.meta.scrollToTop(e,t):e.meta.scrollToTop;if(!s&&t&&e&&i!==!1&&eg(e,t)&&(s={left:0,top:0}),e.path===t.path)return t.hash&&!e.hash?{left:0,top:0}:e.hash?{el:e.hash,top:Vi(e.hash),behavior:o}:!1;const l=c=>!!(c.meta.pageTransition??Oo),a=l(t)&&l(e)?"page:transition:finish":"page:finish";return new Promise(c=>{r.hooks.hookOnce(a,async()=>{await new Promise(f=>setTimeout(f,0)),e.hash&&(s={el:e.hash,top:Vi(e.hash),behavior:o}),c(s)})})}};function Vi(e){try{const t=document.querySelector(e);if(t)return parseFloat(getComputedStyle(t).scrollMarginTop)}catch{}return 0}const ng={hashMode:!1,scrollBehaviorType:"auto"},Me={...ng,...tg},rg=async e=>{var a;let t,n;if(!((a=e.meta)!=null&&a.validate))return;const r=ge(),o=et();if(([t,n]=Sn(()=>Promise.resolve(e.meta.validate(e))),t=await t,n(),t)===!0)return;const i=Sr({statusCode:404,statusMessage:`Page Not Found: ${e.fullPath}`,data:{path:e.fullPath}}),l=o.beforeResolve(u=>{if(l(),u===e){const c=o.afterEach(async()=>{c(),await r.runWithContext(()=>Ut(i)),window.history.pushState({},"",e.fullPath)});return!1}})},og=async e=>{let t,n;const r=([t,n]=Sn(()=>ys(e.path)),t=await t,n(),t);if(r.redirect)return $t(r.redirect,{acceptRelative:!0})?(window.location.href=r.redirect,!1):r.redirect},sg=[rg,og],En={};function ig(e,t,n){const{pathname:r,search:o,hash:s}=t,i=e.indexOf("#");if(i>-1){const u=s.includes(e.slice(i))?e.slice(i).length:1;let c=s.slice(u);return c[0]!=="/"&&(c="/"+c),ci(c,"")}const l=ci(r,e),a=!n||Zf(l,n,{trailingSlash:!0})?l:n;return a+(a.includes("?")?"":o)+s}const lg=Rt({name:"nuxt:router",enforce:"pre",async setup(e){var k,A;let t,n,r=ps().app.baseURL;Me.hashMode&&!r.includes("#")&&(r+="#");const o=((k=Me.history)==null?void 0:k.call(Me,r))??(Me.hashMode?Tp(r):Va(r)),s=((A=Me.routes)==null?void 0:A.call(Me,Fi))??Fi;let i;const l=Jp({...Me,scrollBehavior:(y,m,_)=>{if(m===We){i=_;return}if(Me.scrollBehavior){if(l.options.scrollBehavior=Me.scrollBehavior,"scrollRestoration"in window.history){const w=l.beforeEach(()=>{w(),window.history.scrollRestoration="manual"})}return Me.scrollBehavior(y,We,i||_)}},history:o,routes:s});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),e.vueApp.use(l);const a=Rn(l.currentRoute.value);l.afterEach((y,m)=>{a.value=m}),Object.defineProperty(e.vueApp.config.globalProperties,"previousRoute",{get:()=>a.value});const u=ig(r,window.location,e.payload.path),c=Rn(l.currentRoute.value),f=()=>{c.value=l.currentRoute.value};e.hook("page:finish",f),l.afterEach((y,m)=>{var _,w,E,L;((w=(_=y.matched[0])==null?void 0:_.components)==null?void 0:w.default)===((L=(E=m.matched[0])==null?void 0:E.components)==null?void 0:L.default)&&f()});const d={};for(const y in c.value)Object.defineProperty(d,y,{get:()=>c.value[y]});e._route=In(d),e._middleware=e._middleware||{global:[],named:{}};try{[t,n]=Sn(()=>l.isReady()),await t,n()}catch(y){[t,n]=Sn(()=>e.runWithContext(()=>Ut(y))),await t,n()}const g=u!==l.currentRoute.value.fullPath?l.resolve(u):l.currentRoute.value;f();const v=e.payload.state._layout;l.beforeEach(async(y,m)=>{var _;await e.callHook("page:loading:start"),y.meta=wt(y.meta),e.isHydrating&&v&&!It(y.meta.layout)&&(y.meta.layout=v),e._processingMiddleware=!0;{const w=new Set([...sg,...e._middleware.global]);for(const E of y.matched){const L=E.meta.middleware;if(L)for(const S of Es(L))w.add(S)}{const E=await e.runWithContext(()=>ys(y.path));if(E.appMiddleware)for(const L in E.appMiddleware)E.appMiddleware[L]?w.add(L):w.delete(L)}for(const E of w){const L=typeof E=="string"?e._middleware.named[E]||await((_=En[E])==null?void 0:_.call(En).then($=>$.default||$)):E;if(!L)throw new Error(`Unknown route middleware: '${E}'.`);const S=await e.runWithContext(()=>L(y,m));if(!e.payload.serverRendered&&e.isHydrating&&(S===!1||S instanceof Error)){const $=S||Ao({statusCode:404,statusMessage:`Page Not Found: ${u}`});return await e.runWithContext(()=>Ut($)),!1}if(S!==!0&&(S||S===!1))return S}}}),l.onError(async()=>{delete e._processingMiddleware,await e.callHook("page:loading:end")});const P=Ar();return l.afterEach(async(y,m,_)=>{delete e._processingMiddleware,!e.isHydrating&&P.value&&await e.runWithContext(Ud),_&&await e.callHook("page:loading:end"),y.matched.length===0&&await e.runWithContext(()=>Ut(Ao({statusCode:404,fatal:!1,statusMessage:`Page not found: ${y.fullPath}`,data:{path:y.fullPath}})))}),e.hooks.hookOnce("app:created",async()=>{try{"name"in g&&(g.name=void 0),await l.replace({...g,force:!0}),l.options.scrollBehavior=Me.scrollBehavior}catch(y){await e.runWithContext(()=>Ut(y))}}),{provide:{router:l}}}}),Ui=globalThis.requestIdleCallback||(e=>{const t=Date.now(),n={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))};return setTimeout(()=>{e(n)},1)}),Hm=globalThis.cancelIdleCallback||(e=>{clearTimeout(e)}),Ga=e=>{const t=ge();t.isHydrating?t.hooks.hookOnce("app:suspense:resolve",()=>{Ui(e)}):Ui(e)},ag=Rt({name:"nuxt:payload",setup(e){et().beforeResolve(async(t,n)=>{if(t.path===n.path)return;const r=await wi(t.path);r&&Object.assign(e.static.data,r.data)}),Ga(()=>{var t;e.hooks.hook("link:prefetch",async n=>{Cr(n).protocol||await wi(n)}),((t=navigator.connection)==null?void 0:t.effectiveType)!=="slow-2g"&&setTimeout(xr,1e3)})}}),cg=Rt(e=>{let t;async function n(){const r=await xr();t&&clearTimeout(t),t=setTimeout(n,1e3*60*60);try{const o=await $fetch(hs("builds/latest.json")+`?${Date.now()}`);o.id!==r.id&&e.hooks.callHook("app:manifest:update",o)}catch{}}Ga(()=>{t=setTimeout(n,1e3*60*60)})}),ug=ee(()=>J(()=>import("./CD12G3CN.js"),__vite__mapDeps([24,25,26]),import.meta.url).then(e=>e.default||e.default||e)),fg=ee(()=>J(()=>import("./DHy7JUVR.js"),__vite__mapDeps([20,11,5,6,7,8,21,9,10]),import.meta.url).then(e=>e.default||e.default||e)),dg=ee(()=>J(()=>import("./DcFjWfdR.js"),__vite__mapDeps([27,21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),hg=ee(()=>J(()=>import("./CIDPYlRW.js"),__vite__mapDeps([28,9,8,10,2]),import.meta.url).then(e=>e.default||e.default||e)),pg=ee(()=>J(()=>import("./Bkm5lGB3.js"),__vite__mapDeps([21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),gg=ee(()=>J(()=>import("./pvtjWFi2.js"),__vite__mapDeps([5,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),mg=ee(()=>J(()=>import("./Df2pBprM.js"),__vite__mapDeps([29,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),yg=ee(()=>J(()=>import("./DxMaKacJ.js"),[],import.meta.url).then(e=>e.default||e.default||e)),_g=ee(()=>J(()=>import("./N-K5-nTu.js"),[],import.meta.url).then(e=>e.default||e.default||e)),vg=ee(()=>J(()=>import("./DpBmcb3F.js"),[],import.meta.url).then(e=>e.default||e.default||e)),bg=ee(()=>J(()=>import("./j7haMJK9.js"),__vite__mapDeps([30,31]),import.meta.url).then(e=>e.default||e.default||e)),Eg=ee(()=>J(()=>import("./BStWRYj4.js"),[],import.meta.url).then(e=>e.default||e.default||e)),wg=ee(()=>J(()=>import("./IHox2P6B.js"),__vite__mapDeps([32,25,26,33]),import.meta.url).then(e=>e.default||e.default||e)),Rg=ee(()=>J(()=>import("./twebAfCg.js"),__vite__mapDeps([34,2]),import.meta.url).then(e=>e.default||e.default||e)),Pg=ee(()=>J(()=>import("./CIBrSKio.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Tg=ee(()=>J(()=>import("./B3wvVkPS.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Cg=ee(()=>J(()=>import("./mjnzBbnN.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ag=ee(()=>J(()=>import("./DzjWGKN4.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Sg=ee(()=>J(()=>import("./tGLQVeD8.js"),[],import.meta.url).then(e=>e.default||e.default||e)),xg=ee(()=>J(()=>import("./DUi0I8oe.js"),[],import.meta.url).then(e=>e.default||e.default||e)),kg=ee(()=>J(()=>import("./Dtop_YE0.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Lg=ee(()=>J(()=>import("./Dfba2t6l.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Og=ee(()=>J(()=>import("./BZVFcOsn.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ig=ee(()=>J(()=>import("./DedQPodZ.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Hg=ee(()=>J(()=>import("./nWlMw1xF.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Mg=ee(()=>J(()=>import("./uY7d0eSg.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ng=ee(()=>J(()=>import("./-iiyWVfK.js"),[],import.meta.url).then(e=>e.default||e.default||e)),$g=ee(()=>J(()=>import("./jJdxSUYP.js"),[],import.meta.url).then(e=>e.default||e.default||e)),jg=ee(()=>J(()=>import("./D33P3ETq.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Dg=ee(()=>J(()=>import("./BDF7_qnw.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Fg=ee(()=>J(()=>import("./Ctq4P3QF.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Bg=ee(()=>J(()=>import("./TPisoLyH.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Vg=ee(()=>J(()=>import("./Blt55MqG.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ug=ee(()=>J(()=>import("./BvZyYzvi.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Wg=ee(()=>J(()=>import("./8dPTDCd1.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Kg=ee(()=>J(()=>import("./BCwT3ku9.js"),[],import.meta.url).then(e=>e.default||e.default||e)),qg=[["ProseCode",ug],["ContentDoc",fg],["ContentList",dg],["ContentNavigation",hg],["ContentQuery",pg],["ContentRenderer",gg],["ContentRendererMarkdown",mg],["MDCSlot",yg],["DocumentDrivenEmpty",_g],["DocumentDrivenNotFound",vg],["Markdown",bg],["ProseCodeInline",Eg],["ProsePre",wg],["ProseA",Rg],["ProseBlockquote",Pg],["ProseEm",Tg],["ProseH1",Cg],["ProseH2",Ag],["ProseH3",Sg],["ProseH4",xg],["ProseH5",kg],["ProseH6",Lg],["ProseHr",Og],["ProseImg",Ig],["ProseLi",Hg],["ProseOl",Mg],["ProseP",Ng],["ProseScript",$g],["ProseStrong",jg],["ProseTable",Dg],["ProseTbody",Fg],["ProseTd",Bg],["ProseTh",Vg],["ProseThead",Ug],["ProseTr",Wg],["ProseUl",Kg]],zg=Rt({name:"nuxt:global-components",setup(e){for(const[t,n]of qg)e.vueApp.component(t,n),e.vueApp.component("Lazy"+t,n)}}),_t={default:()=>J(()=>import("./Dxr2xmOe.js"),__vite__mapDeps([35,2,11,36]),import.meta.url).then(e=>e.default||e)},Gg=Rt({name:"nuxt:prefetch",setup(e){const t=et();e.hooks.hook("app:mounted",()=>{t.beforeEach(async n=>{var o;const r=(o=n==null?void 0:n.meta)==null?void 0:o.layout;r&&typeof _t[r]=="function"&&await _t[r]()})}),e.hooks.hook("link:prefetch",n=>{if($t(n))return;const r=t.resolve(n);if(!r)return;const o=r.meta.layout;let s=Es(r.meta.middleware);s=s.filter(i=>typeof i=="string");for(const i of s)typeof En[i]=="function"&&En[i]();o&&typeof _t[o]=="function"&&_t[o]()})}});function Jg(e={}){const t=e.path||window.location.pathname;let n={};try{n=ur(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(e.force||(n==null?void 0:n.path)!==t||(n==null?void 0:n.expires){r.clear()}),e.hook("app:chunkError",({error:s})=>{r.add(s)});function o(s){const l="href"in s&&s.href[0]==="#"?n.app.baseURL+s.href:fs(n.app.baseURL,s.fullPath);Jg({path:l,persistState:!0})}e.hook("app:manifest:update",()=>{t.beforeResolve(o)}),t.onError((s,i)=>{r.has(s)&&o(i)})}}),Xg=[qh,Gh,lg,ag,cg,zg,Gg,Qg];function Yg(e,t){const n=t/e*100;return 2/Math.PI*100*Math.atan(n/50)}function Zg(e={}){const{duration:t=2e3,throttle:n=200,hideDelay:r=500,resetDelay:o=400}=e,s=e.estimatedProgress||Yg,i=ge(),l=qe(0),a=qe(!1);let u=!1,c,f,d,g;const v=()=>P(0);function P(E=0){if(!i.isHydrating){if(E>=100)return A();m(),l.value=E<0?0:E,n?f=setTimeout(()=>{a.value=!0,_()},n):(a.value=!0,_())}}function k(){d=setTimeout(()=>{a.value=!1,g=setTimeout(()=>{l.value=0},o)},r)}function A(E={}){l.value=100,u=!0,m(),y(),E.force?(l.value=0,a.value=!1):k()}function y(){clearTimeout(d),clearTimeout(g)}function m(){clearTimeout(f),cancelAnimationFrame(c)}function _(){u=!1;let E;function L(S){if(u)return;E??(E=S);const $=S-E;l.value=Math.max(0,Math.min(100,s(t,$))),c=requestAnimationFrame(L)}c=requestAnimationFrame(L)}let w=()=>{};{const E=i.hook("page:loading:start",()=>{v()}),L=i.hook("page:loading:end",()=>{A()}),S=i.hook("vue:error",()=>A());w=()=>{S(),E(),L(),m()}}return{_cleanup:w,progress:Le(()=>l.value),isLoading:Le(()=>a.value),start:v,set:P,finish:A,clear:m}}function em(e={}){const t=ge(),n=t._loadingIndicator=t._loadingIndicator||Zg(e);return el()&&(t._loadingIndicatorDeps=t._loadingIndicatorDeps||0,t._loadingIndicatorDeps++,fc(()=>{t._loadingIndicatorDeps--,t._loadingIndicatorDeps===0&&(n._cleanup(),delete t._loadingIndicator)})),n}const tm=ot({name:"NuxtLoadingIndicator",props:{throttle:{type:Number,default:200},duration:{type:Number,default:2e3},height:{type:Number,default:3},color:{type:[String,Boolean],default:"repeating-linear-gradient(to right,#00dc82 0%,#34cdfe 50%,#0047e1 100%)"},estimatedProgress:{type:Function,required:!1}},setup(e,{slots:t,expose:n}){const{progress:r,isLoading:o,start:s,finish:i,clear:l}=em({duration:e.duration,throttle:e.throttle,estimatedProgress:e.estimatedProgress});return n({progress:r,isLoading:o,start:s,finish:i,clear:l}),()=>Oe("div",{class:"nuxt-loading-indicator",style:{position:"fixed",top:0,right:0,left:0,pointerEvents:"none",width:"auto",height:`${e.height}px`,opacity:o.value?1:0,background:e.color||void 0,backgroundSize:`${100/r.value*100}% auto`,transform:`scaleX(${r.value}%)`,transformOrigin:"left",transition:"transform 0.1s, height 0.4s, opacity 0.4s",zIndex:999999}},t)}}),nm=ot({props:{vnode:{type:Object,required:!0},route:{type:Object,required:!0},vnodeRef:Object,renderKey:String,trackRootNodes:Boolean},setup(e){const t=e.renderKey,n=e.route,r={};for(const o in e.route)Object.defineProperty(r,o,{get:()=>t===e.renderKey?e.route[o]:n[o]});return Ot($n,In(r)),()=>Oe(e.vnode,{ref:e.vnodeRef})}}),rm=ot({name:"NuxtPage",inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(e,{attrs:t,expose:n}){const r=ge(),o=qe(),s=Ae($n,null);let i;n({pageRef:o});const l=Ae(Ra,null);let a;const u=r.deferHydration();if(r.isHydrating){const c=r.hooks.hookOnce("app:error",u);et().beforeEach(c)}return e.pageKey&&Qt(()=>e.pageKey,(c,f)=>{c!==f&&r.callHook("page:loading:start")}),()=>Oe(qa,{name:e.name,route:e.route,...t},{default:c=>{const f=sm(s,c.route,c.Component),d=s&&s.matched.length===c.route.matched.length;if(!c.Component){if(a&&!d)return a;u();return}if(a&&l&&!l.isCurrent(c.route))return a;if(f&&s&&(!l||l!=null&&l.isCurrent(s)))return d?a:null;const g=No(c,e.pageKey);!r.isHydrating&&!im(s,c.route,c.Component)&&i===g&&r.callHook("page:loading:end"),i=g;const v=!!(e.transition??c.route.meta.pageTransition??Oo),P=v&&om([e.transition,c.route.meta.pageTransition,Oo,{onAfterLeave:()=>{r.callHook("page:transition:finish",c.Component)}}].filter(Boolean)),k=e.keepalive??c.route.meta.keepalive??jh;return a=za(Tr,v&&P,Zp(k,Oe(es,{suspensible:!0,onPending:()=>r.callHook("page:start",c.Component),onResolve:()=>{ln(()=>r.callHook("page:finish",c.Component).then(()=>r.callHook("page:loading:end")).finally(u))}},{default:()=>{const A=Oe(nm,{key:g||void 0,vnode:c.Component,route:c.route,renderKey:g||void 0,trackRootNodes:v,vnodeRef:o});return k&&(A.type.name=c.Component.type.name||c.Component.type.__name||"RouteProvider"),A}}))).default(),a}})}});function om(e){const t=e.map(n=>({...n,onAfterLeave:n.onAfterLeave?Es(n.onAfterLeave):void 0}));return Ea(...t)}function sm(e,t,n){if(!e)return!1;const r=t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)});return!r||r===-1?!1:t.matched.slice(0,r).some((o,s)=>{var i,l,a;return((i=o.components)==null?void 0:i.default)!==((a=(l=e.matched[s])==null?void 0:l.components)==null?void 0:a.default)})||n&&No({route:t,Component:n})!==No({route:e,Component:n})}function im(e,t,n){return e?t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)})r.default||r);return()=>Oe(n,e.layoutProps,t.slots)}}),am=ot({name:"NuxtLayout",inheritAttrs:!1,props:{name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},setup(e,t){const n=ge(),r=Ae($n),o=r===gs()?Xp():r,s=Le(()=>{let a=ue(e.name)??o.meta.layout??"default";return a&&!(a in _t)&&e.fallback&&(a=ue(e.fallback)),a}),i=qe();t.expose({layoutRef:i});const l=n.deferHydration();if(n.isHydrating){const a=n.hooks.hookOnce("app:error",l);et().beforeEach(a)}return()=>{const a=s.value&&s.value in _t,u=o.meta.layoutTransition??$h;return za(Tr,a&&u,{default:()=>Oe(es,{suspensible:!0,onResolve:()=>{ln(l)}},{default:()=>Oe(cm,{layoutProps:ea(t.attrs,{ref:i}),key:s.value||void 0,name:s.value,shouldProvide:!e.name,hasTransition:!!u},t.slots)})}).default()}}}),cm=ot({name:"NuxtLayoutProvider",inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean}},setup(e,t){const n=e.name;return e.shouldProvide&&Ot(Ra,{isCurrent:r=>n===(r.meta.layout??"default")}),()=>{var r,o;return!n||typeof n=="string"&&!(n in _t)?(o=(r=t.slots).default)==null?void 0:o.call(r):Oe(lm,{key:n,layoutProps:e.layoutProps,name:n},t.slots)}}}),um=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},fm={};function dm(e,t){const n=tm,r=rm,o=am;return Ye(),ju(Ce,null,[fe(n,{color:"#18caf9",height:2}),fe(o,null,{default:Xo(()=>[fe(r)]),_:1})],64)}const hm=um(fm,[["render",dm]]),pm={__name:"nuxt-error-page",props:{error:Object},setup(e){const n=e.error;n.stack&&n.stack.split(` + */const Bt=typeof document<"u";function Jh(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const se=Object.assign;function qr(e,t){const n={};for(const r in t){const o=t[r];n[r]=ze(o)?o.map(e):e(o)}return n}const vn=()=>{},ze=Array.isArray,Ma=/#/g,Qh=/&/g,Xh=/\//g,Yh=/=/g,Zh=/\?/g,Na=/\+/g,ep=/%5B/g,tp=/%5D/g,$a=/%5E/g,np=/%60/g,ja=/%7B/g,rp=/%7C/g,Da=/%7D/g,op=/%20/g;function _s(e){return encodeURI(""+e).replace(rp,"|").replace(ep,"[").replace(tp,"]")}function sp(e){return _s(e).replace(ja,"{").replace(Da,"}").replace($a,"^")}function Io(e){return _s(e).replace(Na,"%2B").replace(op,"+").replace(Ma,"%23").replace(Qh,"%26").replace(np,"`").replace(ja,"{").replace(Da,"}").replace($a,"^")}function ip(e){return Io(e).replace(Yh,"%3D")}function lp(e){return _s(e).replace(Ma,"%23").replace(Zh,"%3F")}function ap(e){return e==null?"":lp(e).replace(Xh,"%2F")}function xn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const cp=/\/$/,up=e=>e.replace(cp,"");function zr(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=pp(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:xn(i)}}function fp(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Pi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function dp(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&tn(t.matched[r],n.matched[o])&&Fa(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function tn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Fa(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!hp(e[n],t[n]))return!1;return!0}function hp(e,t){return ze(e)?Ti(e,t):ze(t)?Ti(t,e):e===t}function Ti(e,t){return ze(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function pp(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}var kn;(function(e){e.pop="pop",e.push="push"})(kn||(kn={}));var bn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(bn||(bn={}));function gp(e){if(!e)if(Bt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),up(e)}const mp=/^[^#]+#/;function yp(e,t){return e.replace(mp,"#")+t}function _p(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const kr=()=>({left:window.scrollX,top:window.scrollY});function vp(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=_p(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ci(e,t){return(history.state?history.state.position-t:-1)+e}const Ho=new Map;function bp(e,t){Ho.set(e,t)}function Ep(e){const t=Ho.get(e);return Ho.delete(e),t}let wp=()=>location.protocol+"//"+location.host;function Ba(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),Pi(a,"")}return Pi(n,e)+r+o}function Rp(e,t,n,r){let o=[],s=[],i=null;const l=({state:d})=>{const g=Ba(e,location),v=n.value,P=t.value;let k=0;if(d){if(n.value=g,t.value=d,i&&i===v){i=null;return}k=P?d.position-P.position:0}else r(g);o.forEach(A=>{A(n.value,v,{delta:k,type:kn.pop,direction:k?k>0?bn.forward:bn.back:bn.unknown})})};function a(){i=n.value}function u(d){o.push(d);const g=()=>{const v=o.indexOf(d);v>-1&&o.splice(v,1)};return s.push(g),g}function c(){const{history:d}=window;d.state&&d.replaceState(se({},d.state,{scroll:kr()}),"")}function f(){for(const d of s)d();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:a,listen:u,destroy:f}}function Ai(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?kr():null}}function Pp(e){const{history:t,location:n}=window,r={value:Ba(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,u,c){const f=e.indexOf("#"),d=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:wp()+e+a;try{t[c?"replaceState":"pushState"](u,"",d),o.value=u}catch(g){console.error(g),n[c?"replace":"assign"](d)}}function i(a,u){const c=se({},t.state,Ai(o.value.back,a,o.value.forward,!0),u,{position:o.value.position});s(a,c,!0),r.value=a}function l(a,u){const c=se({},o.value,t.state,{forward:a,scroll:kr()});s(c.current,c,!0);const f=se({},Ai(r.value,a,null),{position:c.position+1},u);s(a,f,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function Va(e){e=gp(e);const t=Pp(e),n=Rp(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=se({location:"",base:e,go:r,createHref:yp.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Tp(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Va(e)}function Cp(e){return typeof e=="string"||e&&typeof e=="object"}function Ua(e){return typeof e=="string"||typeof e=="symbol"}const We={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Wa=Symbol("");var Si;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Si||(Si={}));function nn(e,t){return se(new Error,{type:e,[Wa]:!0},t)}function tt(e,t){return e instanceof Error&&Wa in e&&(t==null||!!(e.type&t))}const xi="[^/]+?",Ap={sensitive:!1,strict:!1,start:!0,end:!0},Sp=/[.+*?^${}()[\]/\\]/g;function xp(e,t){const n=se({},Ap,t),r=[];let o=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+="/");for(let f=0;ft.length?t.length===1&&t[0]===80?1:-1:0}function Lp(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Op={type:0,value:""},Ip=/[a-zA-Z0-9_]/;function Hp(e){if(!e)return[[]];if(e==="/")return[[Op]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${u}": ${g}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,u="",c="";function f(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),u="")}function d(){u+=a}for(;l{i(y)}:vn}function i(c){if(Ua(c)){const f=r.get(c);f&&(r.delete(c),n.splice(n.indexOf(f),1),f.children.forEach(i),f.alias.forEach(i))}else{const f=n.indexOf(c);f>-1&&(n.splice(f,1),c.record.name&&r.delete(c.record.name),c.children.forEach(i),c.alias.forEach(i))}}function l(){return n}function a(c){let f=0;for(;f=0&&(c.record.path!==n[f].record.path||!Ka(c,n[f]));)f++;n.splice(f,0,c),c.record.name&&!Oi(c)&&r.set(c.record.name,c)}function u(c,f){let d,g={},v,P;if("name"in c&&c.name){if(d=r.get(c.name),!d)throw nn(1,{location:c});P=d.record.name,g=se(Li(f.params,d.keys.filter(y=>!y.optional).concat(d.parent?d.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),c.params&&Li(c.params,d.keys.map(y=>y.name))),v=d.stringify(g)}else if(c.path!=null)v=c.path,d=n.find(y=>y.re.test(v)),d&&(g=d.parse(v),P=d.record.name);else{if(d=f.name?r.get(f.name):n.find(y=>y.re.test(f.path)),!d)throw nn(1,{location:c,currentLocation:f});P=d.record.name,g=se({},f.params,c.params),v=d.stringify(g)}const k=[];let A=d;for(;A;)k.unshift(A.record),A=A.parent;return{name:P,path:v,params:g,matched:k,meta:Dp(k)}}return e.forEach(c=>s(c)),{addRoute:s,resolve:u,removeRoute:i,getRoutes:l,getRecordMatcher:o}}function Li(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function $p(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:jp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function jp(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Oi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Dp(e){return e.reduce((t,n)=>se(t,n.meta),{})}function Ii(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Ka(e,t){return t.children.some(n=>n===e||Ka(e,n))}function Fp(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Io(s)):[r&&Io(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Bp(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ze(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const Vp=Symbol(""),Mi=Symbol(""),vs=Symbol(""),bs=Symbol(""),Mo=Symbol("");function un(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function mt(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const u=d=>{d===!1?a(nn(4,{from:n,to:t})):d instanceof Error?a(d):Cp(d)?a(nn(2,{from:t,to:d})):(i&&r.enterCallbacks[o]===i&&typeof d=="function"&&i.push(d),l())},c=s(()=>e.call(r&&r.instances[o],t,n,u));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch(d=>a(d))})}function Gr(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(Up(a)){const c=(a.__vccOpts||a)[t];c&&s.push(mt(c,n,r,i,l,o))}else{let u=a();s.push(()=>u.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${l}" at "${i.path}"`));const f=Jh(c)?c.default:c;i.components[l]=f;const g=(f.__vccOpts||f)[t];return g&&mt(g,n,r,i,l,o)()}))}}return s}function Up(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Ni(e){const t=Ae(vs),n=Ae(bs),r=Le(()=>t.resolve(ue(e.to))),o=Le(()=>{const{matched:a}=r.value,{length:u}=a,c=a[u-1],f=n.matched;if(!c||!f.length)return-1;const d=f.findIndex(tn.bind(null,c));if(d>-1)return d;const g=$i(a[u-2]);return u>1&&$i(c)===g&&f[f.length-1].path!==g?f.findIndex(tn.bind(null,a[u-2])):d}),s=Le(()=>o.value>-1&&zp(n.params,r.value.params)),i=Le(()=>o.value>-1&&o.value===n.matched.length-1&&Fa(n.params,r.value.params));function l(a={}){return qp(a)?t[ue(e.replace)?"replace":"push"](ue(e.to)).catch(vn):Promise.resolve()}return{route:r,href:Le(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}const Wp=ot({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Ni,setup(e,{slots:t}){const n=wt(Ni(e)),{options:r}=Ae(vs),o=Le(()=>({[ji(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[ji(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:Oe("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Kp=Wp;function qp(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function zp(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!ze(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function $i(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ji=(e,t,n)=>e??t??n,Gp=ot({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Ae(Mo),o=Le(()=>e.route||r.value),s=Ae(Mi,0),i=Le(()=>{let u=ue(s);const{matched:c}=o.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),l=Le(()=>o.value.matched[i.value]);Ot(Mi,Le(()=>i.value+1)),Ot(Vp,l),Ot(Mo,o);const a=qe();return Qt(()=>[a.value,l.value,e.name],([u,c,f],[d,g,v])=>{c&&(c.instances[f]=u,g&&g!==c&&u&&u===d&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),u&&c&&(!g||!tn(c,g)||!d)&&(c.enterCallbacks[f]||[]).forEach(P=>P(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,f=l.value,d=f&&f.components[c];if(!d)return Di(n.default,{Component:d,route:u});const g=f.props[c],v=g?g===!0?u.params:typeof g=="function"?g(u):g:null,k=Oe(d,se({},v,t,{onVnodeUnmounted:A=>{A.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return Di(n.default,{Component:k,route:u})||k}}});function Di(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const qa=Gp;function Jp(e){const t=Np(e.routes,e),n=e.parseQuery||Fp,r=e.stringifyQuery||Hi,o=e.history,s=un(),i=un(),l=un(),a=Rn(We);let u=We;Bt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=qr.bind(null,T=>""+T),f=qr.bind(null,ap),d=qr.bind(null,xn);function g(T,F){let j,U;return Ua(T)?(j=t.getRecordMatcher(T),U=F):U=T,t.addRoute(U,j)}function v(T){const F=t.getRecordMatcher(T);F&&t.removeRoute(F)}function P(){return t.getRoutes().map(T=>T.record)}function k(T){return!!t.getRecordMatcher(T)}function A(T,F){if(F=se({},F||a.value),typeof T=="string"){const p=zr(n,T,F.path),b=t.resolve({path:p.path},F),C=o.createHref(p.fullPath);return se(p,b,{params:d(b.params),hash:xn(p.hash),redirectedFrom:void 0,href:C})}let j;if(T.path!=null)j=se({},T,{path:zr(n,T.path,F.path).path});else{const p=se({},T.params);for(const b in p)p[b]==null&&delete p[b];j=se({},T,{params:f(p)}),F.params=f(F.params)}const U=t.resolve(j,F),oe=T.hash||"";U.params=c(d(U.params));const de=fp(r,se({},T,{hash:sp(oe),path:U.path})),h=o.createHref(de);return se({fullPath:de,hash:oe,query:r===Hi?Bp(T.query):T.query||{}},U,{redirectedFrom:void 0,href:h})}function y(T){return typeof T=="string"?zr(n,T,a.value.path):se({},T)}function m(T,F){if(u!==T)return nn(8,{from:F,to:T})}function _(T){return L(T)}function w(T){return _(se(y(T),{replace:!0}))}function E(T){const F=T.matched[T.matched.length-1];if(F&&F.redirect){const{redirect:j}=F;let U=typeof j=="function"?j(T):j;return typeof U=="string"&&(U=U.includes("?")||U.includes("#")?U=y(U):{path:U},U.params={}),se({query:T.query,hash:T.hash,params:U.path!=null?{}:T.params},U)}}function L(T,F){const j=u=A(T),U=a.value,oe=T.state,de=T.force,h=T.replace===!0,p=E(j);if(p)return L(se(y(p),{state:typeof p=="object"?se({},oe,p.state):oe,force:de,replace:h}),F||j);const b=j;b.redirectedFrom=F;let C;return!de&&dp(r,U,j)&&(C=nn(16,{to:b,from:U}),Ge(U,U,!0,!1)),(C?Promise.resolve(C):N(b,U)).catch(R=>tt(R)?tt(R,2)?R:it(R):W(R,b,U)).then(R=>{if(R){if(tt(R,2))return L(se({replace:h},y(R.to),{state:typeof R.to=="object"?se({},oe,R.to.state):oe,force:de}),F||b)}else R=H(b,U,!0,h,oe);return Q(b,U,R),R})}function S(T,F){const j=m(T,F);return j?Promise.reject(j):Promise.resolve()}function $(T){const F=Dt.values().next().value;return F&&typeof F.runWithContext=="function"?F.runWithContext(T):T()}function N(T,F){let j;const[U,oe,de]=Qp(T,F);j=Gr(U.reverse(),"beforeRouteLeave",T,F);for(const p of U)p.leaveGuards.forEach(b=>{j.push(mt(b,T,F))});const h=S.bind(null,T,F);return j.push(h),we(j).then(()=>{j=[];for(const p of s.list())j.push(mt(p,T,F));return j.push(h),we(j)}).then(()=>{j=Gr(oe,"beforeRouteUpdate",T,F);for(const p of oe)p.updateGuards.forEach(b=>{j.push(mt(b,T,F))});return j.push(h),we(j)}).then(()=>{j=[];for(const p of de)if(p.beforeEnter)if(ze(p.beforeEnter))for(const b of p.beforeEnter)j.push(mt(b,T,F));else j.push(mt(p.beforeEnter,T,F));return j.push(h),we(j)}).then(()=>(T.matched.forEach(p=>p.enterCallbacks={}),j=Gr(de,"beforeRouteEnter",T,F,$),j.push(h),we(j))).then(()=>{j=[];for(const p of i.list())j.push(mt(p,T,F));return j.push(h),we(j)}).catch(p=>tt(p,8)?p:Promise.reject(p))}function Q(T,F,j){l.list().forEach(U=>$(()=>U(T,F,j)))}function H(T,F,j,U,oe){const de=m(T,F);if(de)return de;const h=F===We,p=Bt?history.state:{};j&&(U||h?o.replace(T.fullPath,se({scroll:h&&p&&p.scroll},oe)):o.push(T.fullPath,oe)),a.value=T,Ge(T,F,j,h),it()}let G;function le(){G||(G=o.listen((T,F,j)=>{if(!jn.listening)return;const U=A(T),oe=E(U);if(oe){L(se(oe,{replace:!0}),U).catch(vn);return}u=U;const de=a.value;Bt&&bp(Ci(de.fullPath,j.delta),kr()),N(U,de).catch(h=>tt(h,12)?h:tt(h,2)?(L(h.to,U).then(p=>{tt(p,20)&&!j.delta&&j.type===kn.pop&&o.go(-1,!1)}).catch(vn),Promise.reject()):(j.delta&&o.go(-j.delta,!1),W(h,U,de))).then(h=>{h=h||H(U,de,!1),h&&(j.delta&&!tt(h,8)?o.go(-j.delta,!1):j.type===kn.pop&&tt(h,20)&&o.go(-1,!1)),Q(U,de,h)}).catch(vn)}))}let ae=un(),V=un(),Z;function W(T,F,j){it(T);const U=V.list();return U.length?U.forEach(oe=>oe(T,F,j)):console.error(T),Promise.reject(T)}function Ve(){return Z&&a.value!==We?Promise.resolve():new Promise((T,F)=>{ae.add([T,F])})}function it(T){return Z||(Z=!T,le(),ae.list().forEach(([F,j])=>T?j(T):F()),ae.reset()),T}function Ge(T,F,j,U){const{scrollBehavior:oe}=e;if(!Bt||!oe)return Promise.resolve();const de=!j&&Ep(Ci(T.fullPath,0))||(U||!j)&&history.state&&history.state.scroll||null;return ln().then(()=>oe(T,F,de)).then(h=>h&&vp(h)).catch(h=>W(h,T,F))}const xe=T=>o.go(T);let jt;const Dt=new Set,jn={currentRoute:a,listening:!0,addRoute:g,removeRoute:v,hasRoute:k,getRoutes:P,resolve:A,options:e,push:_,replace:w,go:xe,back:()=>xe(-1),forward:()=>xe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:V.add,isReady:Ve,install(T){const F=this;T.component("RouterLink",Kp),T.component("RouterView",qa),T.config.globalProperties.$router=F,Object.defineProperty(T.config.globalProperties,"$route",{enumerable:!0,get:()=>ue(a)}),Bt&&!jt&&a.value===We&&(jt=!0,_(o.location).catch(oe=>{}));const j={};for(const oe in We)Object.defineProperty(j,oe,{get:()=>a.value[oe],enumerable:!0});T.provide(vs,F),T.provide(bs,In(j)),T.provide(Mo,a);const U=T.unmount;Dt.add(T),T.unmount=function(){Dt.delete(T),Dt.size<1&&(u=We,G&&G(),G=null,a.value=We,jt=!1,Z=!1),U()}}};function we(T){return T.reduce((F,j)=>F.then(()=>$(j)),Promise.resolve())}return jn}function Qp(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;itn(u,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(u=>tn(u,a))||o.push(a))}return[n,r,o]}function Xp(){return Ae(bs)}const Yp=(e,t)=>t.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""}),No=(e,t)=>{const n=e.route.matched.find(o=>{var s;return((s=o.components)==null?void 0:s.default)===e.Component.type}),r=t??(n==null?void 0:n.meta.key)??(n&&Yp(e.route,n));return typeof r=="function"?r(e.route):r},Zp=(e,t)=>({default:()=>e?Oe(au,e===!0?{}:e,t):t});function Es(e){return Array.isArray(e)?e:[e]}const Jr=null,Qr=null,Xr=null,Yr=null,Zr=null,eo=null,to=null,no=null,ro=null,Fi=[{name:"case-studies-automatisch",path:"/case-studies/automatisch",meta:{},alias:[],redirect:Jr==null?void 0:Jr.redirect,component:()=>J(()=>import("./CCgfT4mO.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"case-studies",path:"/case-studies",meta:{},alias:[],redirect:Qr==null?void 0:Qr.redirect,component:()=>J(()=>import("./BMo7zexA.js"),__vite__mapDeps([12,2,9,10,8,11]),import.meta.url).then(e=>e.default||e)},{name:"index",path:"/",meta:{},alias:[],redirect:Xr==null?void 0:Xr.redirect,component:()=>J(()=>import("./DS-4onvx.js"),__vite__mapDeps([13,11,9,1,2,3,14,15]),import.meta.url).then(e=>e.default||e)},{name:"playwright-architecture",path:"/playwright/architecture",meta:{},alias:[],redirect:Yr==null?void 0:Yr.redirect,component:()=>J(()=>import("./ZkJgmw7I.js"),__vite__mapDeps([16,4,2,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"playwright-how-playwright-initializes",path:"/playwright/how-playwright-initializes",meta:{},alias:[],redirect:Zr==null?void 0:Zr.redirect,component:()=>J(()=>import("./BqBwjWqG.js"),__vite__mapDeps([17,4,2,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"playwright",path:"/playwright",meta:{},alias:[],redirect:eo==null?void 0:eo.redirect,component:()=>J(()=>import("./Cn1tIV_T.js"),__vite__mapDeps([18,2,9,10,8,11]),import.meta.url).then(e=>e.default||e)},{name:"privacy-policy",path:"/privacy-policy",meta:{},alias:[],redirect:to==null?void 0:to.redirect,component:()=>J(()=>import("./BK5dMROA.js"),__vite__mapDeps([19,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-and-conditions",path:"/terms-and-conditions",meta:{},alias:[],redirect:no==null?void 0:no.redirect,component:()=>J(()=>import("./BzoHbl1P.js"),__vite__mapDeps([22,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-of-service",path:"/terms-of-service",meta:{},alias:[],redirect:ro==null?void 0:ro.redirect,component:()=>J(()=>import("./CSXQV5-h.js"),__vite__mapDeps([23,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)}],za=(e,t,n)=>(t=t===!0?{}:t,{default:()=>{var r;return t?Oe(e,t,n):(r=n.default)==null?void 0:r.call(n)}});function Bi(e){const t=(e==null?void 0:e.meta.key)??e.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""});return typeof t=="function"?t(e):t}function eg(e,t){return e===t||t===We?!1:Bi(e)!==Bi(t)?!0:!e.matched.every((r,o)=>{var s,i;return r.components&&r.components.default===((i=(s=t.matched[o])==null?void 0:s.components)==null?void 0:i.default)})}const tg={scrollBehavior(e,t,n){var u;const r=ge(),o=((u=et().options)==null?void 0:u.scrollBehaviorType)??"auto";let s=n||void 0;const i=typeof e.meta.scrollToTop=="function"?e.meta.scrollToTop(e,t):e.meta.scrollToTop;if(!s&&t&&e&&i!==!1&&eg(e,t)&&(s={left:0,top:0}),e.path===t.path)return t.hash&&!e.hash?{left:0,top:0}:e.hash?{el:e.hash,top:Vi(e.hash),behavior:o}:!1;const l=c=>!!(c.meta.pageTransition??Oo),a=l(t)&&l(e)?"page:transition:finish":"page:finish";return new Promise(c=>{r.hooks.hookOnce(a,async()=>{await new Promise(f=>setTimeout(f,0)),e.hash&&(s={el:e.hash,top:Vi(e.hash),behavior:o}),c(s)})})}};function Vi(e){try{const t=document.querySelector(e);if(t)return parseFloat(getComputedStyle(t).scrollMarginTop)}catch{}return 0}const ng={hashMode:!1,scrollBehaviorType:"auto"},Me={...ng,...tg},rg=async e=>{var a;let t,n;if(!((a=e.meta)!=null&&a.validate))return;const r=ge(),o=et();if(([t,n]=Sn(()=>Promise.resolve(e.meta.validate(e))),t=await t,n(),t)===!0)return;const i=Sr({statusCode:404,statusMessage:`Page Not Found: ${e.fullPath}`,data:{path:e.fullPath}}),l=o.beforeResolve(u=>{if(l(),u===e){const c=o.afterEach(async()=>{c(),await r.runWithContext(()=>Ut(i)),window.history.pushState({},"",e.fullPath)});return!1}})},og=async e=>{let t,n;const r=([t,n]=Sn(()=>ys(e.path)),t=await t,n(),t);if(r.redirect)return $t(r.redirect,{acceptRelative:!0})?(window.location.href=r.redirect,!1):r.redirect},sg=[rg,og],En={};function ig(e,t,n){const{pathname:r,search:o,hash:s}=t,i=e.indexOf("#");if(i>-1){const u=s.includes(e.slice(i))?e.slice(i).length:1;let c=s.slice(u);return c[0]!=="/"&&(c="/"+c),ci(c,"")}const l=ci(r,e),a=!n||Zf(l,n,{trailingSlash:!0})?l:n;return a+(a.includes("?")?"":o)+s}const lg=Rt({name:"nuxt:router",enforce:"pre",async setup(e){var k,A;let t,n,r=ps().app.baseURL;Me.hashMode&&!r.includes("#")&&(r+="#");const o=((k=Me.history)==null?void 0:k.call(Me,r))??(Me.hashMode?Tp(r):Va(r)),s=((A=Me.routes)==null?void 0:A.call(Me,Fi))??Fi;let i;const l=Jp({...Me,scrollBehavior:(y,m,_)=>{if(m===We){i=_;return}if(Me.scrollBehavior){if(l.options.scrollBehavior=Me.scrollBehavior,"scrollRestoration"in window.history){const w=l.beforeEach(()=>{w(),window.history.scrollRestoration="manual"})}return Me.scrollBehavior(y,We,i||_)}},history:o,routes:s});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),e.vueApp.use(l);const a=Rn(l.currentRoute.value);l.afterEach((y,m)=>{a.value=m}),Object.defineProperty(e.vueApp.config.globalProperties,"previousRoute",{get:()=>a.value});const u=ig(r,window.location,e.payload.path),c=Rn(l.currentRoute.value),f=()=>{c.value=l.currentRoute.value};e.hook("page:finish",f),l.afterEach((y,m)=>{var _,w,E,L;((w=(_=y.matched[0])==null?void 0:_.components)==null?void 0:w.default)===((L=(E=m.matched[0])==null?void 0:E.components)==null?void 0:L.default)&&f()});const d={};for(const y in c.value)Object.defineProperty(d,y,{get:()=>c.value[y]});e._route=In(d),e._middleware=e._middleware||{global:[],named:{}};try{[t,n]=Sn(()=>l.isReady()),await t,n()}catch(y){[t,n]=Sn(()=>e.runWithContext(()=>Ut(y))),await t,n()}const g=u!==l.currentRoute.value.fullPath?l.resolve(u):l.currentRoute.value;f();const v=e.payload.state._layout;l.beforeEach(async(y,m)=>{var _;await e.callHook("page:loading:start"),y.meta=wt(y.meta),e.isHydrating&&v&&!It(y.meta.layout)&&(y.meta.layout=v),e._processingMiddleware=!0;{const w=new Set([...sg,...e._middleware.global]);for(const E of y.matched){const L=E.meta.middleware;if(L)for(const S of Es(L))w.add(S)}{const E=await e.runWithContext(()=>ys(y.path));if(E.appMiddleware)for(const L in E.appMiddleware)E.appMiddleware[L]?w.add(L):w.delete(L)}for(const E of w){const L=typeof E=="string"?e._middleware.named[E]||await((_=En[E])==null?void 0:_.call(En).then($=>$.default||$)):E;if(!L)throw new Error(`Unknown route middleware: '${E}'.`);const S=await e.runWithContext(()=>L(y,m));if(!e.payload.serverRendered&&e.isHydrating&&(S===!1||S instanceof Error)){const $=S||Ao({statusCode:404,statusMessage:`Page Not Found: ${u}`});return await e.runWithContext(()=>Ut($)),!1}if(S!==!0&&(S||S===!1))return S}}}),l.onError(async()=>{delete e._processingMiddleware,await e.callHook("page:loading:end")});const P=Ar();return l.afterEach(async(y,m,_)=>{delete e._processingMiddleware,!e.isHydrating&&P.value&&await e.runWithContext(Ud),_&&await e.callHook("page:loading:end"),y.matched.length===0&&await e.runWithContext(()=>Ut(Ao({statusCode:404,fatal:!1,statusMessage:`Page not found: ${y.fullPath}`,data:{path:y.fullPath}})))}),e.hooks.hookOnce("app:created",async()=>{try{"name"in g&&(g.name=void 0),await l.replace({...g,force:!0}),l.options.scrollBehavior=Me.scrollBehavior}catch(y){await e.runWithContext(()=>Ut(y))}}),{provide:{router:l}}}}),Ui=globalThis.requestIdleCallback||(e=>{const t=Date.now(),n={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))};return setTimeout(()=>{e(n)},1)}),Hm=globalThis.cancelIdleCallback||(e=>{clearTimeout(e)}),Ga=e=>{const t=ge();t.isHydrating?t.hooks.hookOnce("app:suspense:resolve",()=>{Ui(e)}):Ui(e)},ag=Rt({name:"nuxt:payload",setup(e){et().beforeResolve(async(t,n)=>{if(t.path===n.path)return;const r=await wi(t.path);r&&Object.assign(e.static.data,r.data)}),Ga(()=>{var t;e.hooks.hook("link:prefetch",async n=>{Cr(n).protocol||await wi(n)}),((t=navigator.connection)==null?void 0:t.effectiveType)!=="slow-2g"&&setTimeout(xr,1e3)})}}),cg=Rt(e=>{let t;async function n(){const r=await xr();t&&clearTimeout(t),t=setTimeout(n,1e3*60*60);try{const o=await $fetch(hs("builds/latest.json")+`?${Date.now()}`);o.id!==r.id&&e.hooks.callHook("app:manifest:update",o)}catch{}}Ga(()=>{t=setTimeout(n,1e3*60*60)})}),ug=ee(()=>J(()=>import("./BnwjeOpX.js"),__vite__mapDeps([24,25,26]),import.meta.url).then(e=>e.default||e.default||e)),fg=ee(()=>J(()=>import("./Cz78Sion.js"),__vite__mapDeps([20,11,5,6,7,8,21,9,10]),import.meta.url).then(e=>e.default||e.default||e)),dg=ee(()=>J(()=>import("./BRsYUypn.js"),__vite__mapDeps([27,21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),hg=ee(()=>J(()=>import("./X2wNORNR.js"),__vite__mapDeps([28,9,8,10,2]),import.meta.url).then(e=>e.default||e.default||e)),pg=ee(()=>J(()=>import("./Bse8ef0b.js"),__vite__mapDeps([21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),gg=ee(()=>J(()=>import("./BxiCSTFT.js"),__vite__mapDeps([5,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),mg=ee(()=>J(()=>import("./9UJQMWko.js"),__vite__mapDeps([29,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),yg=ee(()=>J(()=>import("./C17h_atD.js"),[],import.meta.url).then(e=>e.default||e.default||e)),_g=ee(()=>J(()=>import("./N8b39uzv.js"),[],import.meta.url).then(e=>e.default||e.default||e)),vg=ee(()=>J(()=>import("./BsvTfDZ0.js"),[],import.meta.url).then(e=>e.default||e.default||e)),bg=ee(()=>J(()=>import("./dGARKcZ6.js"),__vite__mapDeps([30,31]),import.meta.url).then(e=>e.default||e.default||e)),Eg=ee(()=>J(()=>import("./CGfQlKlL.js"),[],import.meta.url).then(e=>e.default||e.default||e)),wg=ee(()=>J(()=>import("./J2jEMbcE.js"),__vite__mapDeps([32,25,26,33]),import.meta.url).then(e=>e.default||e.default||e)),Rg=ee(()=>J(()=>import("./DkuQMAl2.js"),__vite__mapDeps([34,2]),import.meta.url).then(e=>e.default||e.default||e)),Pg=ee(()=>J(()=>import("./B60RBlQ9.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Tg=ee(()=>J(()=>import("./BBg3Df_v.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Cg=ee(()=>J(()=>import("./ByDkrM4K.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ag=ee(()=>J(()=>import("./lFVxmSVb.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Sg=ee(()=>J(()=>import("./D2xr6gf6.js"),[],import.meta.url).then(e=>e.default||e.default||e)),xg=ee(()=>J(()=>import("./C_1yPr0e.js"),[],import.meta.url).then(e=>e.default||e.default||e)),kg=ee(()=>J(()=>import("./DQA0lbK1.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Lg=ee(()=>J(()=>import("./Q0Y17sdK.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Og=ee(()=>J(()=>import("./_tWtRPYx.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ig=ee(()=>J(()=>import("./dzMqTbw3.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Hg=ee(()=>J(()=>import("./ti0Z0EYt.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Mg=ee(()=>J(()=>import("./DmSip271.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ng=ee(()=>J(()=>import("./BB7G3joz.js"),[],import.meta.url).then(e=>e.default||e.default||e)),$g=ee(()=>J(()=>import("./4r0YjvSz.js"),[],import.meta.url).then(e=>e.default||e.default||e)),jg=ee(()=>J(()=>import("./DgaJ7ELG.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Dg=ee(()=>J(()=>import("./Cst9DoAH.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Fg=ee(()=>J(()=>import("./DbrryaCF.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Bg=ee(()=>J(()=>import("./mB4jvhnn.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Vg=ee(()=>J(()=>import("./DxghXiKV.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ug=ee(()=>J(()=>import("./CZNwzoXQ.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Wg=ee(()=>J(()=>import("./CToKNNT4.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Kg=ee(()=>J(()=>import("./BhCbx3Wd.js"),[],import.meta.url).then(e=>e.default||e.default||e)),qg=[["ProseCode",ug],["ContentDoc",fg],["ContentList",dg],["ContentNavigation",hg],["ContentQuery",pg],["ContentRenderer",gg],["ContentRendererMarkdown",mg],["MDCSlot",yg],["DocumentDrivenEmpty",_g],["DocumentDrivenNotFound",vg],["Markdown",bg],["ProseCodeInline",Eg],["ProsePre",wg],["ProseA",Rg],["ProseBlockquote",Pg],["ProseEm",Tg],["ProseH1",Cg],["ProseH2",Ag],["ProseH3",Sg],["ProseH4",xg],["ProseH5",kg],["ProseH6",Lg],["ProseHr",Og],["ProseImg",Ig],["ProseLi",Hg],["ProseOl",Mg],["ProseP",Ng],["ProseScript",$g],["ProseStrong",jg],["ProseTable",Dg],["ProseTbody",Fg],["ProseTd",Bg],["ProseTh",Vg],["ProseThead",Ug],["ProseTr",Wg],["ProseUl",Kg]],zg=Rt({name:"nuxt:global-components",setup(e){for(const[t,n]of qg)e.vueApp.component(t,n),e.vueApp.component("Lazy"+t,n)}}),_t={default:()=>J(()=>import("./Dhont5qJ.js"),__vite__mapDeps([35,2,11,36]),import.meta.url).then(e=>e.default||e)},Gg=Rt({name:"nuxt:prefetch",setup(e){const t=et();e.hooks.hook("app:mounted",()=>{t.beforeEach(async n=>{var o;const r=(o=n==null?void 0:n.meta)==null?void 0:o.layout;r&&typeof _t[r]=="function"&&await _t[r]()})}),e.hooks.hook("link:prefetch",n=>{if($t(n))return;const r=t.resolve(n);if(!r)return;const o=r.meta.layout;let s=Es(r.meta.middleware);s=s.filter(i=>typeof i=="string");for(const i of s)typeof En[i]=="function"&&En[i]();o&&typeof _t[o]=="function"&&_t[o]()})}});function Jg(e={}){const t=e.path||window.location.pathname;let n={};try{n=ur(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(e.force||(n==null?void 0:n.path)!==t||(n==null?void 0:n.expires){r.clear()}),e.hook("app:chunkError",({error:s})=>{r.add(s)});function o(s){const l="href"in s&&s.href[0]==="#"?n.app.baseURL+s.href:fs(n.app.baseURL,s.fullPath);Jg({path:l,persistState:!0})}e.hook("app:manifest:update",()=>{t.beforeResolve(o)}),t.onError((s,i)=>{r.has(s)&&o(i)})}}),Xg=[qh,Gh,lg,ag,cg,zg,Gg,Qg];function Yg(e,t){const n=t/e*100;return 2/Math.PI*100*Math.atan(n/50)}function Zg(e={}){const{duration:t=2e3,throttle:n=200,hideDelay:r=500,resetDelay:o=400}=e,s=e.estimatedProgress||Yg,i=ge(),l=qe(0),a=qe(!1);let u=!1,c,f,d,g;const v=()=>P(0);function P(E=0){if(!i.isHydrating){if(E>=100)return A();m(),l.value=E<0?0:E,n?f=setTimeout(()=>{a.value=!0,_()},n):(a.value=!0,_())}}function k(){d=setTimeout(()=>{a.value=!1,g=setTimeout(()=>{l.value=0},o)},r)}function A(E={}){l.value=100,u=!0,m(),y(),E.force?(l.value=0,a.value=!1):k()}function y(){clearTimeout(d),clearTimeout(g)}function m(){clearTimeout(f),cancelAnimationFrame(c)}function _(){u=!1;let E;function L(S){if(u)return;E??(E=S);const $=S-E;l.value=Math.max(0,Math.min(100,s(t,$))),c=requestAnimationFrame(L)}c=requestAnimationFrame(L)}let w=()=>{};{const E=i.hook("page:loading:start",()=>{v()}),L=i.hook("page:loading:end",()=>{A()}),S=i.hook("vue:error",()=>A());w=()=>{S(),E(),L(),m()}}return{_cleanup:w,progress:Le(()=>l.value),isLoading:Le(()=>a.value),start:v,set:P,finish:A,clear:m}}function em(e={}){const t=ge(),n=t._loadingIndicator=t._loadingIndicator||Zg(e);return el()&&(t._loadingIndicatorDeps=t._loadingIndicatorDeps||0,t._loadingIndicatorDeps++,fc(()=>{t._loadingIndicatorDeps--,t._loadingIndicatorDeps===0&&(n._cleanup(),delete t._loadingIndicator)})),n}const tm=ot({name:"NuxtLoadingIndicator",props:{throttle:{type:Number,default:200},duration:{type:Number,default:2e3},height:{type:Number,default:3},color:{type:[String,Boolean],default:"repeating-linear-gradient(to right,#00dc82 0%,#34cdfe 50%,#0047e1 100%)"},estimatedProgress:{type:Function,required:!1}},setup(e,{slots:t,expose:n}){const{progress:r,isLoading:o,start:s,finish:i,clear:l}=em({duration:e.duration,throttle:e.throttle,estimatedProgress:e.estimatedProgress});return n({progress:r,isLoading:o,start:s,finish:i,clear:l}),()=>Oe("div",{class:"nuxt-loading-indicator",style:{position:"fixed",top:0,right:0,left:0,pointerEvents:"none",width:"auto",height:`${e.height}px`,opacity:o.value?1:0,background:e.color||void 0,backgroundSize:`${100/r.value*100}% auto`,transform:`scaleX(${r.value}%)`,transformOrigin:"left",transition:"transform 0.1s, height 0.4s, opacity 0.4s",zIndex:999999}},t)}}),nm=ot({props:{vnode:{type:Object,required:!0},route:{type:Object,required:!0},vnodeRef:Object,renderKey:String,trackRootNodes:Boolean},setup(e){const t=e.renderKey,n=e.route,r={};for(const o in e.route)Object.defineProperty(r,o,{get:()=>t===e.renderKey?e.route[o]:n[o]});return Ot($n,In(r)),()=>Oe(e.vnode,{ref:e.vnodeRef})}}),rm=ot({name:"NuxtPage",inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(e,{attrs:t,expose:n}){const r=ge(),o=qe(),s=Ae($n,null);let i;n({pageRef:o});const l=Ae(Ra,null);let a;const u=r.deferHydration();if(r.isHydrating){const c=r.hooks.hookOnce("app:error",u);et().beforeEach(c)}return e.pageKey&&Qt(()=>e.pageKey,(c,f)=>{c!==f&&r.callHook("page:loading:start")}),()=>Oe(qa,{name:e.name,route:e.route,...t},{default:c=>{const f=sm(s,c.route,c.Component),d=s&&s.matched.length===c.route.matched.length;if(!c.Component){if(a&&!d)return a;u();return}if(a&&l&&!l.isCurrent(c.route))return a;if(f&&s&&(!l||l!=null&&l.isCurrent(s)))return d?a:null;const g=No(c,e.pageKey);!r.isHydrating&&!im(s,c.route,c.Component)&&i===g&&r.callHook("page:loading:end"),i=g;const v=!!(e.transition??c.route.meta.pageTransition??Oo),P=v&&om([e.transition,c.route.meta.pageTransition,Oo,{onAfterLeave:()=>{r.callHook("page:transition:finish",c.Component)}}].filter(Boolean)),k=e.keepalive??c.route.meta.keepalive??jh;return a=za(Tr,v&&P,Zp(k,Oe(es,{suspensible:!0,onPending:()=>r.callHook("page:start",c.Component),onResolve:()=>{ln(()=>r.callHook("page:finish",c.Component).then(()=>r.callHook("page:loading:end")).finally(u))}},{default:()=>{const A=Oe(nm,{key:g||void 0,vnode:c.Component,route:c.route,renderKey:g||void 0,trackRootNodes:v,vnodeRef:o});return k&&(A.type.name=c.Component.type.name||c.Component.type.__name||"RouteProvider"),A}}))).default(),a}})}});function om(e){const t=e.map(n=>({...n,onAfterLeave:n.onAfterLeave?Es(n.onAfterLeave):void 0}));return Ea(...t)}function sm(e,t,n){if(!e)return!1;const r=t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)});return!r||r===-1?!1:t.matched.slice(0,r).some((o,s)=>{var i,l,a;return((i=o.components)==null?void 0:i.default)!==((a=(l=e.matched[s])==null?void 0:l.components)==null?void 0:a.default)})||n&&No({route:t,Component:n})!==No({route:e,Component:n})}function im(e,t,n){return e?t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)})r.default||r);return()=>Oe(n,e.layoutProps,t.slots)}}),am=ot({name:"NuxtLayout",inheritAttrs:!1,props:{name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},setup(e,t){const n=ge(),r=Ae($n),o=r===gs()?Xp():r,s=Le(()=>{let a=ue(e.name)??o.meta.layout??"default";return a&&!(a in _t)&&e.fallback&&(a=ue(e.fallback)),a}),i=qe();t.expose({layoutRef:i});const l=n.deferHydration();if(n.isHydrating){const a=n.hooks.hookOnce("app:error",l);et().beforeEach(a)}return()=>{const a=s.value&&s.value in _t,u=o.meta.layoutTransition??$h;return za(Tr,a&&u,{default:()=>Oe(es,{suspensible:!0,onResolve:()=>{ln(l)}},{default:()=>Oe(cm,{layoutProps:ea(t.attrs,{ref:i}),key:s.value||void 0,name:s.value,shouldProvide:!e.name,hasTransition:!!u},t.slots)})}).default()}}}),cm=ot({name:"NuxtLayoutProvider",inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean}},setup(e,t){const n=e.name;return e.shouldProvide&&Ot(Ra,{isCurrent:r=>n===(r.meta.layout??"default")}),()=>{var r,o;return!n||typeof n=="string"&&!(n in _t)?(o=(r=t.slots).default)==null?void 0:o.call(r):Oe(lm,{key:n,layoutProps:e.layoutProps,name:n},t.slots)}}}),um=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},fm={};function dm(e,t){const n=tm,r=rm,o=am;return Ye(),ju(Ce,null,[fe(n,{color:"#18caf9",height:2}),fe(o,null,{default:Xo(()=>[fe(r)]),_:1})],64)}const hm=um(fm,[["render",dm]]),pm={__name:"nuxt-error-page",props:{error:Object},setup(e){const n=e.error;n.stack&&n.stack.split(` `).splice(1).map(f=>({text:f.replace("webpack:/","").replace(".vue",".js").trim(),internal:f.includes("node_modules")&&!f.includes(".cache")||f.includes("internal")||f.includes("new Promise")})).map(f=>`${f.text}`).join(` -`);const r=Number(n.statusCode||500),o=r===404,s=n.statusMessage??(o?"Page Not Found":"Internal Server Error"),i=n.message||n.toString(),l=void 0,c=o?ee(()=>J(()=>import("./BHlee23A.js"),__vite__mapDeps([37,2,11,38]),import.meta.url).then(f=>f.default||f)):ee(()=>J(()=>import("./BlpW7-o8.js"),__vite__mapDeps([39,11,40]),import.meta.url).then(f=>f.default||f));return(f,d)=>(Ye(),yt(ue(c),ic(Yl({statusCode:ue(r),statusMessage:ue(s),description:ue(i),stack:ue(l)})),null,16))}},gm=pm,mm={__name:"nuxt-root",setup(e){const t=()=>null,n=ge(),r=n.deferHydration();if(n.isHydrating){const l=n.hooks.hookOnce("app:error",r);et().beforeEach(l)}const o=!1;Ot($n,gs()),n.hooks.callHookWith(l=>l.map(a=>a()),"vue:setup");const s=Ar();Hl((l,a,u)=>{if(n.hooks.callHook("vue:error",l,a,u).catch(c=>console.error("[nuxt] Error in `vue:error` hook",c)),Wd(l)&&(l.fatal||l.unhandled))return n.runWithContext(()=>Ut(l)),!1});const i=!1;return(l,a)=>(Ye(),yt(es,{onResolve:ue(r)},{default:Xo(()=>[ue(s)?(Ye(),yt(ue(gm),{key:0,error:ue(s)},null,8,["error"])):ue(i)?(Ye(),yt(ue(t),{key:1,context:ue(i)},null,8,["context"])):ue(o)?(Ye(),yt(Gc(ue(o)),{key:2})):(Ye(),yt(ue(hm),{key:3}))]),_:1},8,["onResolve"]))}},Wi=mm;let Ki;{let e;Ki=async function(){var i,l;if(e)return e;const r=!!((i=window.__NUXT__)!=null&&i.serverRendered||((l=document.getElementById("__NUXT_DATA__"))==null?void 0:l.dataset.ssr)==="true")?Rf(Wi):wf(Wi),o=xd({vueApp:r});async function s(a){await o.callHook("app:error",a),o.payload.error=o.payload.error||Sr(a)}r.config.errorHandler=s;try{await Ld(o,Xg)}catch(a){s(a)}try{await o.hooks.callHook("app:created",r),await o.hooks.callHook("app:beforeMount",r),r.mount(Dh),await o.hooks.callHook("app:mounted",r),await ln()}catch(a){s(a)}return r.config.errorHandler===s&&(r.config.errorHandler=void 0),r},e=Ki().catch(t=>{throw console.error("Error while mounting app:",t),t})}export{Se as $,wm as A,Sm as B,yr as C,_r as D,Qt as E,Ce as F,ln as G,Cm as H,wo as I,Oe as J,J as K,jc as L,Pe as M,Xf as N,ai as O,fs as P,us as Q,Im as R,qe as S,Rn as T,du as U,Il as V,fc as W,el as X,re as Y,Yt as Z,um as _,Xl as a,ur as a0,_m as a1,et as a2,rs as a3,Ga as a4,Ui as a5,os as a6,Hm as a7,Cr as a8,Ff as a9,Om as aa,km as ab,$t as ac,Lm as ad,Rm as ae,uu as af,cu as ag,xo as ah,fe as b,ju as c,Zl as d,Em as e,ot as f,yt as g,Am as h,ue as i,Ae as j,Le as k,Tm as l,xm as m,ea as n,Ye as o,bm as p,gs as q,Pm as r,Sr as s,ym as t,ps as u,vm as v,Xo as w,wt as x,ge as y,Mn as z}; +`);const r=Number(n.statusCode||500),o=r===404,s=n.statusMessage??(o?"Page Not Found":"Internal Server Error"),i=n.message||n.toString(),l=void 0,c=o?ee(()=>J(()=>import("./R-gFWJPL.js"),__vite__mapDeps([37,2,11,38]),import.meta.url).then(f=>f.default||f)):ee(()=>J(()=>import("./B0VAc3Z5.js"),__vite__mapDeps([39,11,40]),import.meta.url).then(f=>f.default||f));return(f,d)=>(Ye(),yt(ue(c),ic(Yl({statusCode:ue(r),statusMessage:ue(s),description:ue(i),stack:ue(l)})),null,16))}},gm=pm,mm={__name:"nuxt-root",setup(e){const t=()=>null,n=ge(),r=n.deferHydration();if(n.isHydrating){const l=n.hooks.hookOnce("app:error",r);et().beforeEach(l)}const o=!1;Ot($n,gs()),n.hooks.callHookWith(l=>l.map(a=>a()),"vue:setup");const s=Ar();Hl((l,a,u)=>{if(n.hooks.callHook("vue:error",l,a,u).catch(c=>console.error("[nuxt] Error in `vue:error` hook",c)),Wd(l)&&(l.fatal||l.unhandled))return n.runWithContext(()=>Ut(l)),!1});const i=!1;return(l,a)=>(Ye(),yt(es,{onResolve:ue(r)},{default:Xo(()=>[ue(s)?(Ye(),yt(ue(gm),{key:0,error:ue(s)},null,8,["error"])):ue(i)?(Ye(),yt(ue(t),{key:1,context:ue(i)},null,8,["context"])):ue(o)?(Ye(),yt(Gc(ue(o)),{key:2})):(Ye(),yt(ue(hm),{key:3}))]),_:1},8,["onResolve"]))}},Wi=mm;let Ki;{let e;Ki=async function(){var i,l;if(e)return e;const r=!!((i=window.__NUXT__)!=null&&i.serverRendered||((l=document.getElementById("__NUXT_DATA__"))==null?void 0:l.dataset.ssr)==="true")?Rf(Wi):wf(Wi),o=xd({vueApp:r});async function s(a){await o.callHook("app:error",a),o.payload.error=o.payload.error||Sr(a)}r.config.errorHandler=s;try{await Ld(o,Xg)}catch(a){s(a)}try{await o.hooks.callHook("app:created",r),await o.hooks.callHook("app:beforeMount",r),r.mount(Dh),await o.hooks.callHook("app:mounted",r),await ln()}catch(a){s(a)}return r.config.errorHandler===s&&(r.config.errorHandler=void 0),r},e=Ki().catch(t=>{throw console.error("Error while mounting app:",t),t})}export{Se as $,wm as A,Sm as B,yr as C,_r as D,Qt as E,Ce as F,ln as G,Cm as H,wo as I,Oe as J,J as K,jc as L,Pe as M,Xf as N,ai as O,fs as P,us as Q,Im as R,qe as S,Rn as T,du as U,Il as V,fc as W,el as X,re as Y,Yt as Z,um as _,Xl as a,ur as a0,_m as a1,et as a2,rs as a3,Ga as a4,Ui as a5,os as a6,Hm as a7,Cr as a8,Ff as a9,Om as aa,km as ab,$t as ac,Lm as ad,Rm as ae,uu as af,cu as ag,xo as ah,fe as b,ju as c,Zl as d,Em as e,ot as f,yt as g,Am as h,ue as i,Ae as j,Le as k,Tm as l,xm as m,ea as n,Ye as o,bm as p,gs as q,Pm as r,Sr as s,ym as t,ps as u,vm as v,Xo as w,wt as x,ge as y,Mn as z}; diff --git a/_nuxt/a3lCQdJr.js b/_nuxt/BnI7OW5X.js similarity index 98% rename from _nuxt/a3lCQdJr.js rename to _nuxt/BnI7OW5X.js index 538cb36..7d721bb 100644 --- a/_nuxt/a3lCQdJr.js +++ b/_nuxt/BnI7OW5X.js @@ -1 +1 @@ -import{o as a,c as t,a as s,f as i,m as c,g as o,i as l,t as d,l as h}from"./Bu7SZk0z.js";const r={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},u=s("path",{fill:"#f5de19",d:"M18.774 19.7a3.727 3.727 0 0 0 3.376 2.078c1.418 0 2.324-.709 2.324-1.688c0-1.173-.931-1.589-2.491-2.272l-.856-.367c-2.469-1.052-4.11-2.37-4.11-5.156c0-2.567 1.956-4.52 5.012-4.52A5.058 5.058 0 0 1 26.9 10.52l-2.665 1.711a2.327 2.327 0 0 0-2.2-1.467a1.489 1.489 0 0 0-1.638 1.467c0 1.027.636 1.442 2.1 2.078l.856.366c2.908 1.247 4.549 2.518 4.549 5.376c0 3.081-2.42 4.769-5.671 4.769a6.575 6.575 0 0 1-6.236-3.5ZM6.686 20c.538.954 1.027 1.76 2.2 1.76c1.124 0 1.834-.44 1.834-2.15V7.975h3.422v11.683c0 3.543-2.078 5.156-5.11 5.156A5.312 5.312 0 0 1 3.9 21.688Z"},null,-1),_=[u];function m(e,n){return a(),t("svg",r,[..._])}const g={name:"vscode-icons-file-type-js",render:m},f={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},p=s("path",{fill:"#f5de19",d:"M4.014 14.976a2.51 2.51 0 0 0 1.567-.518a2.377 2.377 0 0 0 .805-1.358a15.261 15.261 0 0 0 .214-2.944q.012-2.085.075-2.747a5.236 5.236 0 0 1 .418-1.686a3.025 3.025 0 0 1 .755-1.018A3.046 3.046 0 0 1 9 4.125A6.762 6.762 0 0 1 10.544 4h.7v1.96h-.387a2.338 2.338 0 0 0-1.723.468a3.4 3.4 0 0 0-.425 2.092a36.054 36.054 0 0 1-.137 4.133a4.734 4.734 0 0 1-.768 2.06A4.567 4.567 0 0 1 6.1 16a3.809 3.809 0 0 1 1.992 1.754a8.861 8.861 0 0 1 .618 3.865q0 2.435.05 2.9a1.755 1.755 0 0 0 .504 1.181a2.639 2.639 0 0 0 1.592.337h.387V28h-.7a5.655 5.655 0 0 1-1.773-.2a2.97 2.97 0 0 1-1.324-.93a3.353 3.353 0 0 1-.681-1.63a24.175 24.175 0 0 1-.165-3.234a16.469 16.469 0 0 0-.214-3.106a2.408 2.408 0 0 0-.805-1.361a2.489 2.489 0 0 0-1.567-.524Zm23.972 2.035a2.489 2.489 0 0 0-1.567.524a2.408 2.408 0 0 0-.805 1.361a16.469 16.469 0 0 0-.212 3.109a24.175 24.175 0 0 1-.169 3.234a3.353 3.353 0 0 1-.681 1.63a2.97 2.97 0 0 1-1.324.93a5.655 5.655 0 0 1-1.773.2h-.7V26.04h.387a2.639 2.639 0 0 0 1.592-.337a1.755 1.755 0 0 0 .506-1.186q.05-.462.05-2.9a8.861 8.861 0 0 1 .618-3.865A3.809 3.809 0 0 1 25.9 16a4.567 4.567 0 0 1-1.7-1.286a4.734 4.734 0 0 1-.768-2.06a36.054 36.054 0 0 1-.137-4.133a3.4 3.4 0 0 0-.425-2.092a2.338 2.338 0 0 0-1.723-.468h-.387V4h.7a6.762 6.762 0 0 1 1.54.125a3.046 3.046 0 0 1 1.149.581a3.025 3.025 0 0 1 .755 1.018a5.236 5.236 0 0 1 .418 1.686q.062.662.075 2.747a15.261 15.261 0 0 0 .212 2.947a2.377 2.377 0 0 0 .805 1.355a2.51 2.51 0 0 0 1.567.518Z"},null,-1),v=[p];function y(e,n){return a(),t("svg",f,[...v])}const w={name:"vscode-icons-file-type-json",render:y},$={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},V=s("path",{fill:"#007acc",d:"M23.827 8.243a4.424 4.424 0 0 1 2.223 1.281a5.853 5.853 0 0 1 .852 1.143c.011.045-1.534 1.083-2.471 1.662c-.034.023-.169-.124-.322-.35a2.014 2.014 0 0 0-1.67-1c-1.077-.074-1.771.49-1.766 1.433a1.3 1.3 0 0 0 .153.666c.237.49.677.784 2.059 1.383c2.544 1.095 3.636 1.817 4.31 2.843a5.158 5.158 0 0 1 .416 4.333a4.764 4.764 0 0 1-3.932 2.815a10.9 10.9 0 0 1-2.708-.028a6.531 6.531 0 0 1-3.616-1.884a6.278 6.278 0 0 1-.926-1.371a2.655 2.655 0 0 1 .327-.208c.158-.09.756-.434 1.32-.761l1.024-.6l.214.312a4.771 4.771 0 0 0 1.35 1.292a3.3 3.3 0 0 0 3.458-.175a1.545 1.545 0 0 0 .2-1.974c-.276-.395-.84-.727-2.443-1.422a8.8 8.8 0 0 1-3.349-2.055a4.687 4.687 0 0 1-.976-1.777a7.116 7.116 0 0 1-.062-2.268a4.332 4.332 0 0 1 3.644-3.374a9 9 0 0 1 2.691.084m-8.343 1.483l.011 1.454h-4.63v13.148H7.6V11.183H2.97V9.755a13.986 13.986 0 0 1 .04-1.466c.017-.023 2.832-.034 6.245-.028l6.211.017Z"},null,-1),x=[V];function B(e,n){return a(),t("svg",$,[...x])}const k={name:"vscode-icons-file-type-typescript",render:B},A={class:"code-outer"},Z={key:0,class:"code-title"},S={class:"icon-wrapper"},M={key:0,xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 32 32"},j=s("path",{fill:"#79B8FF",d:"M27.5 5.5h-9.3l-2.1 4.2H4.4v16.8h25.2v-21Zm0 4.2h-8.2l1.1-2.1h7.1Z"},null,-1),q=[j],F={class:"file-name"},I=i({__name:"ProseCode",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null}},setup(e){return(n,C)=>(a(),t("div",A,[e.filename?(a(),t("div",Z,[s("div",S,[e.language==="console"?(a(),t("svg",M,q)):c("",!0),e.language==="json"?(a(),o(l(w),{key:1})):c("",!0),e.language==="js"?(a(),o(l(g),{key:2})):c("",!0),e.language==="ts"?(a(),o(l(k),{key:3})):c("",!0)]),s("span",F,d(e.filename),1)])):c("",!0),h(n.$slots,"default")]))}});export{I as _}; +import{o as a,c as t,a as s,f as i,m as c,g as o,i as l,t as d,l as h}from"./BlS8upJP.js";const r={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},u=s("path",{fill:"#f5de19",d:"M18.774 19.7a3.727 3.727 0 0 0 3.376 2.078c1.418 0 2.324-.709 2.324-1.688c0-1.173-.931-1.589-2.491-2.272l-.856-.367c-2.469-1.052-4.11-2.37-4.11-5.156c0-2.567 1.956-4.52 5.012-4.52A5.058 5.058 0 0 1 26.9 10.52l-2.665 1.711a2.327 2.327 0 0 0-2.2-1.467a1.489 1.489 0 0 0-1.638 1.467c0 1.027.636 1.442 2.1 2.078l.856.366c2.908 1.247 4.549 2.518 4.549 5.376c0 3.081-2.42 4.769-5.671 4.769a6.575 6.575 0 0 1-6.236-3.5ZM6.686 20c.538.954 1.027 1.76 2.2 1.76c1.124 0 1.834-.44 1.834-2.15V7.975h3.422v11.683c0 3.543-2.078 5.156-5.11 5.156A5.312 5.312 0 0 1 3.9 21.688Z"},null,-1),_=[u];function m(e,n){return a(),t("svg",r,[..._])}const g={name:"vscode-icons-file-type-js",render:m},f={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},p=s("path",{fill:"#f5de19",d:"M4.014 14.976a2.51 2.51 0 0 0 1.567-.518a2.377 2.377 0 0 0 .805-1.358a15.261 15.261 0 0 0 .214-2.944q.012-2.085.075-2.747a5.236 5.236 0 0 1 .418-1.686a3.025 3.025 0 0 1 .755-1.018A3.046 3.046 0 0 1 9 4.125A6.762 6.762 0 0 1 10.544 4h.7v1.96h-.387a2.338 2.338 0 0 0-1.723.468a3.4 3.4 0 0 0-.425 2.092a36.054 36.054 0 0 1-.137 4.133a4.734 4.734 0 0 1-.768 2.06A4.567 4.567 0 0 1 6.1 16a3.809 3.809 0 0 1 1.992 1.754a8.861 8.861 0 0 1 .618 3.865q0 2.435.05 2.9a1.755 1.755 0 0 0 .504 1.181a2.639 2.639 0 0 0 1.592.337h.387V28h-.7a5.655 5.655 0 0 1-1.773-.2a2.97 2.97 0 0 1-1.324-.93a3.353 3.353 0 0 1-.681-1.63a24.175 24.175 0 0 1-.165-3.234a16.469 16.469 0 0 0-.214-3.106a2.408 2.408 0 0 0-.805-1.361a2.489 2.489 0 0 0-1.567-.524Zm23.972 2.035a2.489 2.489 0 0 0-1.567.524a2.408 2.408 0 0 0-.805 1.361a16.469 16.469 0 0 0-.212 3.109a24.175 24.175 0 0 1-.169 3.234a3.353 3.353 0 0 1-.681 1.63a2.97 2.97 0 0 1-1.324.93a5.655 5.655 0 0 1-1.773.2h-.7V26.04h.387a2.639 2.639 0 0 0 1.592-.337a1.755 1.755 0 0 0 .506-1.186q.05-.462.05-2.9a8.861 8.861 0 0 1 .618-3.865A3.809 3.809 0 0 1 25.9 16a4.567 4.567 0 0 1-1.7-1.286a4.734 4.734 0 0 1-.768-2.06a36.054 36.054 0 0 1-.137-4.133a3.4 3.4 0 0 0-.425-2.092a2.338 2.338 0 0 0-1.723-.468h-.387V4h.7a6.762 6.762 0 0 1 1.54.125a3.046 3.046 0 0 1 1.149.581a3.025 3.025 0 0 1 .755 1.018a5.236 5.236 0 0 1 .418 1.686q.062.662.075 2.747a15.261 15.261 0 0 0 .212 2.947a2.377 2.377 0 0 0 .805 1.355a2.51 2.51 0 0 0 1.567.518Z"},null,-1),v=[p];function y(e,n){return a(),t("svg",f,[...v])}const w={name:"vscode-icons-file-type-json",render:y},$={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},V=s("path",{fill:"#007acc",d:"M23.827 8.243a4.424 4.424 0 0 1 2.223 1.281a5.853 5.853 0 0 1 .852 1.143c.011.045-1.534 1.083-2.471 1.662c-.034.023-.169-.124-.322-.35a2.014 2.014 0 0 0-1.67-1c-1.077-.074-1.771.49-1.766 1.433a1.3 1.3 0 0 0 .153.666c.237.49.677.784 2.059 1.383c2.544 1.095 3.636 1.817 4.31 2.843a5.158 5.158 0 0 1 .416 4.333a4.764 4.764 0 0 1-3.932 2.815a10.9 10.9 0 0 1-2.708-.028a6.531 6.531 0 0 1-3.616-1.884a6.278 6.278 0 0 1-.926-1.371a2.655 2.655 0 0 1 .327-.208c.158-.09.756-.434 1.32-.761l1.024-.6l.214.312a4.771 4.771 0 0 0 1.35 1.292a3.3 3.3 0 0 0 3.458-.175a1.545 1.545 0 0 0 .2-1.974c-.276-.395-.84-.727-2.443-1.422a8.8 8.8 0 0 1-3.349-2.055a4.687 4.687 0 0 1-.976-1.777a7.116 7.116 0 0 1-.062-2.268a4.332 4.332 0 0 1 3.644-3.374a9 9 0 0 1 2.691.084m-8.343 1.483l.011 1.454h-4.63v13.148H7.6V11.183H2.97V9.755a13.986 13.986 0 0 1 .04-1.466c.017-.023 2.832-.034 6.245-.028l6.211.017Z"},null,-1),x=[V];function B(e,n){return a(),t("svg",$,[...x])}const k={name:"vscode-icons-file-type-typescript",render:B},A={class:"code-outer"},Z={key:0,class:"code-title"},S={class:"icon-wrapper"},M={key:0,xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 32 32"},j=s("path",{fill:"#79B8FF",d:"M27.5 5.5h-9.3l-2.1 4.2H4.4v16.8h25.2v-21Zm0 4.2h-8.2l1.1-2.1h7.1Z"},null,-1),q=[j],F={class:"file-name"},I=i({__name:"ProseCode",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null}},setup(e){return(n,C)=>(a(),t("div",A,[e.filename?(a(),t("div",Z,[s("div",S,[e.language==="console"?(a(),t("svg",M,q)):c("",!0),e.language==="json"?(a(),o(l(w),{key:1})):c("",!0),e.language==="js"?(a(),o(l(g),{key:2})):c("",!0),e.language==="ts"?(a(),o(l(k),{key:3})):c("",!0)]),s("span",F,d(e.filename),1)])):c("",!0),h(n.$slots,"default")]))}});export{I as _}; diff --git a/_nuxt/CLiedZiS.js b/_nuxt/BneHlRLI.js similarity index 87% rename from _nuxt/CLiedZiS.js rename to _nuxt/BneHlRLI.js index 96b1cb3..6ac3a4e 100644 --- a/_nuxt/CLiedZiS.js +++ b/_nuxt/BneHlRLI.js @@ -1 +1 @@ -import{_ as y}from"./DBoACagk.js";import g from"./pvtjWFi2.js";import{u as v}from"./Bb9rc-i1.js";import{q as x}from"./Du3a2oyP.js";import{f as C,h as q,o as s,c as o,i as t,a as c,b as i,w as h,d as p,F as w,r as N,t as n,m as a,l as B}from"./Bu7SZk0z.js";const S={class:"blog-outer"},V={key:0,class:"blog-wrapper"},$={key:0,class:"blog-breadcrumbs"},A={class:"crumb"},D=c("span",{class:"sep"},"›",-1),F={class:"crumb"},H={key:0,class:"sep"},L={key:1,class:"blog-header"},P={key:0},R=["href"],E={key:1},O={key:2},T={key:3,class:"blog-created-date"},j={key:0},U=C({__name:"BlogPage",props:{path:{type:String,required:!0},link:{type:String,required:!1}},async setup(_){let r,l;const{path:d,link:z}=_,{data:e}=([r,l]=q(()=>v("blog-post-"+d,()=>x(d).findOne(),"$fqRr3791H4")),r=await r,l(),r);return(b,G)=>{const u=y,f=g;return s(),o("div",S,[t(e)?(s(),o("div",V,[t(e).breadcrumbs?(s(),o("div",$,[c("div",A,[i(u,{to:"/"},{default:h(()=>[p("Home")]),_:1}),D]),(s(!0),o(w,null,N(t(e).breadcrumbs,(m,k)=>(s(),o("div",F,[i(u,{to:m.path},{default:h(()=>[p(n(m.name),1)]),_:2},1032,["to"]),k!=t(e).breadcrumbs.length-1?(s(),o("span",H,"›")):a("",!0)]))),256))])):a("",!0),t(e)&&(t(e).title||t(e).subtitle)?(s(),o("div",L,[t(e).link?(s(),o("h1",P,[c("a",{href:t(e).link},n(t(e).title),9,R)])):(s(),o("h1",E,n(t(e).title),1)),t(e).subtitle?(s(),o("h3",O,n(t(e).subtitle),1)):a("",!0),t(e).created?(s(),o("div",T,n(t(e).created.string),1)):a("",!0)])):a("",!0),c("section",null,[_.path?(s(),o("div",j,[i(f,{value:t(e)},null,8,["value"])])):a("",!0),B(b.$slots,"default")])])):a("",!0)])}}});export{U as _}; +import{_ as y}from"./CFzORWKb.js";import g from"./BxiCSTFT.js";import{u as v}from"./CRh1_mKz.js";import{q as x}from"./DF1VbFfH.js";import{f as C,h as q,o as s,c as o,i as t,a as c,b as i,w as h,d as p,F as w,r as N,t as n,m as a,l as B}from"./BlS8upJP.js";const S={class:"blog-outer"},V={key:0,class:"blog-wrapper"},$={key:0,class:"blog-breadcrumbs"},A={class:"crumb"},D=c("span",{class:"sep"},"›",-1),F={class:"crumb"},H={key:0,class:"sep"},L={key:1,class:"blog-header"},P={key:0},R=["href"],E={key:1},O={key:2},T={key:3,class:"blog-created-date"},j={key:0},U=C({__name:"BlogPage",props:{path:{type:String,required:!0},link:{type:String,required:!1}},async setup(_){let r,l;const{path:d,link:z}=_,{data:e}=([r,l]=q(()=>v("blog-post-"+d,()=>x(d).findOne(),"$fqRr3791H4")),r=await r,l(),r);return(b,G)=>{const u=y,f=g;return s(),o("div",S,[t(e)?(s(),o("div",V,[t(e).breadcrumbs?(s(),o("div",$,[c("div",A,[i(u,{to:"/"},{default:h(()=>[p("Home")]),_:1}),D]),(s(!0),o(w,null,N(t(e).breadcrumbs,(m,k)=>(s(),o("div",F,[i(u,{to:m.path},{default:h(()=>[p(n(m.name),1)]),_:2},1032,["to"]),k!=t(e).breadcrumbs.length-1?(s(),o("span",H,"›")):a("",!0)]))),256))])):a("",!0),t(e)&&(t(e).title||t(e).subtitle)?(s(),o("div",L,[t(e).link?(s(),o("h1",P,[c("a",{href:t(e).link},n(t(e).title),9,R)])):(s(),o("h1",E,n(t(e).title),1)),t(e).subtitle?(s(),o("h3",O,n(t(e).subtitle),1)):a("",!0),t(e).created?(s(),o("div",T,n(t(e).created.string),1)):a("",!0)])):a("",!0),c("section",null,[_.path?(s(),o("div",j,[i(f,{value:t(e)},null,8,["value"])])):a("",!0),B(b.$slots,"default")])])):a("",!0)])}}});export{U as _}; diff --git a/_nuxt/BnwjeOpX.js b/_nuxt/BnwjeOpX.js new file mode 100644 index 0000000..c6189d0 --- /dev/null +++ b/_nuxt/BnwjeOpX.js @@ -0,0 +1 @@ +import{_ as m}from"./BnI7OW5X.js";import"./BlS8upJP.js";export{m as default}; diff --git a/_nuxt/BO7VgWjS.js b/_nuxt/BqBwjWqG.js similarity index 81% rename from _nuxt/BO7VgWjS.js rename to _nuxt/BqBwjWqG.js index e0d58b5..f6499db 100644 --- a/_nuxt/BO7VgWjS.js +++ b/_nuxt/BqBwjWqG.js @@ -1 +1 @@ -import{_ as o}from"./CLiedZiS.js";import{u as e}from"./B5qANkaG.js";import{f as i,g as r,o as n}from"./Bu7SZk0z.js";import"./DBoACagk.js";import"./pvtjWFi2.js";import"./qxZzs3oh.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";const u=i({__name:"how-playwright-initializes",setup(p){return e({title:"QAComet | How importing from Playwright works",meta:[{name:"description",content:"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured."},{property:"og:image",content:"https://qacomet.com/img/playwright/playwright-core_initialization_diagram.jpg"},{property:"og:image:width",content:"800"},{property:"og:image:height",content:"500"},{property:"og:title",content:"QAComet | How importing from playwright works"},{property:"og:url",content:"https://qacomet.com/playwright/how-playwright-initializes"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"NewsArticle",datePublished:"2024-03-13T08:00:00-06:00",author:[{"@type":"Organization",name:"QAComet",url:"https://qacomet.com"}]})}]}),(a,m)=>{const t=o;return n(),r(t,{title:"How importing from Playwright works",path:"playwright/how-playwright-initializes"})}}});export{u as default}; +import{_ as o}from"./BneHlRLI.js";import{u as e}from"./maW11VfC.js";import{f as i,g as r,o as n}from"./BlS8upJP.js";import"./CFzORWKb.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const u=i({__name:"how-playwright-initializes",setup(p){return e({title:"QAComet | How importing from Playwright works",meta:[{name:"description",content:"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured."},{property:"og:image",content:"https://qacomet.com/img/playwright/playwright-core_initialization_diagram.jpg"},{property:"og:image:width",content:"800"},{property:"og:image:height",content:"500"},{property:"og:title",content:"QAComet | How importing from playwright works"},{property:"og:url",content:"https://qacomet.com/playwright/how-playwright-initializes"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"NewsArticle",datePublished:"2024-03-13T08:00:00-06:00",author:[{"@type":"Organization",name:"QAComet",url:"https://qacomet.com"}]})}]}),(a,m)=>{const t=o;return n(),r(t,{title:"How importing from Playwright works",path:"playwright/how-playwright-initializes"})}}});export{u as default}; diff --git a/_nuxt/Bkm5lGB3.js b/_nuxt/Bse8ef0b.js similarity index 94% rename from _nuxt/Bkm5lGB3.js rename to _nuxt/Bse8ef0b.js index ab26cb8..06d63b1 100644 --- a/_nuxt/Bkm5lGB3.js +++ b/_nuxt/Bse8ef0b.js @@ -1 +1 @@ -import{u as g}from"./Bb9rc-i1.js";import{q as m}from"./Du3a2oyP.js";import{f as C,v as S,k as b,u as k,E as _,H as A,J as N}from"./Bu7SZk0z.js";import{h as O}from"./D3rhYO6_.js";const Q=C({name:"ContentQuery",props:{path:{type:String,required:!1,default:void 0},only:{type:Array,required:!1,default:void 0},without:{type:Array,required:!1,default:void 0},where:{type:Object,required:!1,default:void 0},sort:{type:Object,required:!1,default:void 0},limit:{type:Number,required:!1,default:void 0},skip:{type:Number,required:!1,default:void 0},locale:{type:String,required:!1,default:void 0},find:{type:String,required:!1,default:void 0}},async setup(u){const{path:t,only:r,without:o,where:a,sort:f,limit:l,skip:d,locale:s,find:p}=S(u),y=b(()=>{var e;return(e=t.value)==null?void 0:e.includes("/_")}),h=!k().public.content.experimental.advanceQuery;_(()=>u,()=>n(),{deep:!0});const i=e=>h?e!=null&&e.surround?e.surround:e!=null&&e._id||Array.isArray(e)?e:e==null?void 0:e.result:e.result,{data:v,refresh:n}=await g(`content-query-${O(u)}`,()=>{let e;return t.value?e=m(t.value):e=m(),r.value&&(e=e.only(r.value)),o.value&&(e=e.without(o.value)),a.value&&(e=e.where(a.value)),f.value&&(e=e.sort(f.value)),l.value&&(e=e.limit(l.value)),d.value&&(e=e.skip(d.value)),s.value&&(e=e.where({_locale:s.value})),p.value==="one"?e.findOne().then(i):p.value==="surround"?t.value?h?e.findSurround(t.value):e.withSurround(t.value).findOne().then(i):(console.warn("[Content] Surround queries requires `path` prop to be set."),console.warn("[Content] Query without `path` will return regular `find()` results."),e.find().then(i)):e.find().then(i)});return{isPartial:y,data:v,refresh:n}},render(u){var c;const t=A(),{data:r,refresh:o,isPartial:a,path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v}=u,n={path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v};if(n.find==="one"){if(!r&&(t!=null&&t["not-found"]))return t["not-found"]({props:n,...this.$attrs});if(t!=null&&t.empty&&(r==null?void 0:r._type)==="markdown"&&!((c=r==null?void 0:r.body)!=null&&c.children.length))return t.empty({props:n,...this.$attrs})}else if((!r||!r.length)&&t!=null&&t["not-found"])return t["not-found"]({props:n,...this.$attrs});return t!=null&&t.default?t.default({data:r,refresh:o,isPartial:a,props:n,...this.$attrs}):((w,q)=>N("pre",null,JSON.stringify({message:"You should use slots with !",slot:w,data:q},null,2)))("default",{data:r,props:n,isPartial:a})}}),J=Q;export{J as default}; +import{u as g}from"./CRh1_mKz.js";import{q as m}from"./DF1VbFfH.js";import{f as C,v as S,k as b,u as k,E as _,H as A,J as N}from"./BlS8upJP.js";import{h as O}from"./BECgZIvk.js";const Q=C({name:"ContentQuery",props:{path:{type:String,required:!1,default:void 0},only:{type:Array,required:!1,default:void 0},without:{type:Array,required:!1,default:void 0},where:{type:Object,required:!1,default:void 0},sort:{type:Object,required:!1,default:void 0},limit:{type:Number,required:!1,default:void 0},skip:{type:Number,required:!1,default:void 0},locale:{type:String,required:!1,default:void 0},find:{type:String,required:!1,default:void 0}},async setup(u){const{path:t,only:r,without:o,where:a,sort:f,limit:l,skip:d,locale:s,find:p}=S(u),y=b(()=>{var e;return(e=t.value)==null?void 0:e.includes("/_")}),h=!k().public.content.experimental.advanceQuery;_(()=>u,()=>n(),{deep:!0});const i=e=>h?e!=null&&e.surround?e.surround:e!=null&&e._id||Array.isArray(e)?e:e==null?void 0:e.result:e.result,{data:v,refresh:n}=await g(`content-query-${O(u)}`,()=>{let e;return t.value?e=m(t.value):e=m(),r.value&&(e=e.only(r.value)),o.value&&(e=e.without(o.value)),a.value&&(e=e.where(a.value)),f.value&&(e=e.sort(f.value)),l.value&&(e=e.limit(l.value)),d.value&&(e=e.skip(d.value)),s.value&&(e=e.where({_locale:s.value})),p.value==="one"?e.findOne().then(i):p.value==="surround"?t.value?h?e.findSurround(t.value):e.withSurround(t.value).findOne().then(i):(console.warn("[Content] Surround queries requires `path` prop to be set."),console.warn("[Content] Query without `path` will return regular `find()` results."),e.find().then(i)):e.find().then(i)});return{isPartial:y,data:v,refresh:n}},render(u){var c;const t=A(),{data:r,refresh:o,isPartial:a,path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v}=u,n={path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v};if(n.find==="one"){if(!r&&(t!=null&&t["not-found"]))return t["not-found"]({props:n,...this.$attrs});if(t!=null&&t.empty&&(r==null?void 0:r._type)==="markdown"&&!((c=r==null?void 0:r.body)!=null&&c.children.length))return t.empty({props:n,...this.$attrs})}else if((!r||!r.length)&&t!=null&&t["not-found"])return t["not-found"]({props:n,...this.$attrs});return t!=null&&t.default?t.default({data:r,refresh:o,isPartial:a,props:n,...this.$attrs}):((w,q)=>N("pre",null,JSON.stringify({message:"You should use slots with !",slot:w,data:q},null,2)))("default",{data:r,props:n,isPartial:a})}}),J=Q;export{J as default}; diff --git a/_nuxt/DpBmcb3F.js b/_nuxt/BsvTfDZ0.js similarity index 58% rename from _nuxt/DpBmcb3F.js rename to _nuxt/BsvTfDZ0.js index 82a7e7e..f904cb1 100644 --- a/_nuxt/DpBmcb3F.js +++ b/_nuxt/BsvTfDZ0.js @@ -1 +1 @@ -import{f as n,J as e}from"./Bu7SZk0z.js";const t=n({name:"DocumentDrivenNotFound",render(){return e("div","Document not found")}});export{t as default}; +import{f as n,J as e}from"./BlS8upJP.js";const t=n({name:"DocumentDrivenNotFound",render(){return e("div","Document not found")}});export{t as default}; diff --git a/_nuxt/pvtjWFi2.js b/_nuxt/BxiCSTFT.js similarity index 89% rename from _nuxt/pvtjWFi2.js rename to _nuxt/BxiCSTFT.js index 28619d3..76ca784 100644 --- a/_nuxt/pvtjWFi2.js +++ b/_nuxt/BxiCSTFT.js @@ -1 +1 @@ -import{_ as o}from"./qxZzs3oh.js";import{f as l,E as s,H as d,J as c}from"./Bu7SZk0z.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";const g=l({name:"ContentRenderer",props:{value:{type:Object,required:!1,default:()=>({})},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"}},setup(t){s(()=>t.excerpt,n=>{var e,a,u;n&&!((e=t.value)!=null&&e.excerpt)&&(console.warn(`No excerpt found for document content/${(a=t==null?void 0:t.value)==null?void 0:a._path}.${(u=t==null?void 0:t.value)==null?void 0:u._extension}!`),console.warn("Make sure to use in your content if you want to use excerpt feature."))},{immediate:!0})},render(t){var i,f;const n=d(),{value:e,excerpt:a,tag:u}=t,r=a?e==null?void 0:e.excerpt:e==null?void 0:e.body;return!((i=r==null?void 0:r.children)!=null&&i.length)&&(n!=null&&n.empty)?n.empty({value:e,excerpt:a,tag:u,...this.$attrs}):n!=null&&n.default?n.default({value:e,excerpt:a,tag:u,...this.$attrs}):(r==null?void 0:r.type)==="root"&&((f=r==null?void 0:r.children)!=null&&f.length)?c(o,{value:e,excerpt:a,tag:u,...this.$attrs}):c("pre",null,JSON.stringify({message:"You should use slots with ",value:e,excerpt:a,tag:u},null,2))}});export{g as default}; +import{_ as o}from"./DQv0CMQg.js";import{f as l,E as s,H as d,J as c}from"./BlS8upJP.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";const g=l({name:"ContentRenderer",props:{value:{type:Object,required:!1,default:()=>({})},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"}},setup(t){s(()=>t.excerpt,n=>{var e,a,u;n&&!((e=t.value)!=null&&e.excerpt)&&(console.warn(`No excerpt found for document content/${(a=t==null?void 0:t.value)==null?void 0:a._path}.${(u=t==null?void 0:t.value)==null?void 0:u._extension}!`),console.warn("Make sure to use in your content if you want to use excerpt feature."))},{immediate:!0})},render(t){var i,f;const n=d(),{value:e,excerpt:a,tag:u}=t,r=a?e==null?void 0:e.excerpt:e==null?void 0:e.body;return!((i=r==null?void 0:r.children)!=null&&i.length)&&(n!=null&&n.empty)?n.empty({value:e,excerpt:a,tag:u,...this.$attrs}):n!=null&&n.default?n.default({value:e,excerpt:a,tag:u,...this.$attrs}):(r==null?void 0:r.type)==="root"&&((f=r==null?void 0:r.children)!=null&&f.length)?c(o,{value:e,excerpt:a,tag:u,...this.$attrs}):c("pre",null,JSON.stringify({message:"You should use slots with ",value:e,excerpt:a,tag:u},null,2))}});export{g as default}; diff --git a/_nuxt/mjnzBbnN.js b/_nuxt/ByDkrM4K.js similarity index 85% rename from _nuxt/mjnzBbnN.js rename to _nuxt/ByDkrM4K.js index fe3786d..8b614c5 100644 --- a/_nuxt/mjnzBbnN.js +++ b/_nuxt/ByDkrM4K.js @@ -1 +1 @@ -import{f as c,u as d,k as u,o as s,c as t,i as f,l as n}from"./Bu7SZk0z.js";const l=["id"],p=["href"],k=c({__name:"ProseH1",props:{id:{}},setup(r){const a=r,{headings:o}=d().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h1)});return(e,m)=>(s(),t("h1",{id:e.id},[f(i)?(s(),t("a",{key:0,href:`#${e.id}`},[n(e.$slots,"default")],8,p)):n(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as c,u as d,k as u,o as s,c as t,i as f,l as n}from"./BlS8upJP.js";const l=["id"],p=["href"],k=c({__name:"ProseH1",props:{id:{}},setup(r){const a=r,{headings:o}=d().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h1)});return(e,m)=>(s(),t("h1",{id:e.id},[f(i)?(s(),t("a",{key:0,href:`#${e.id}`},[n(e.$slots,"default")],8,p)):n(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/CUQ1nFrM.js b/_nuxt/BzoHbl1P.js similarity index 77% rename from _nuxt/CUQ1nFrM.js rename to _nuxt/BzoHbl1P.js index e669fe8..0a3765b 100644 --- a/_nuxt/CUQ1nFrM.js +++ b/_nuxt/BzoHbl1P.js @@ -1 +1 @@ -import i from"./DHy7JUVR.js";import{f as a,c as s,a as e,b as m,u as c,o as p}from"./Bu7SZk0z.js";import{u as d}from"./B5qANkaG.js";import{_ as g}from"./Ukwwp72Y.js";import"./pvtjWFi2.js";import"./qxZzs3oh.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";import"./Bkm5lGB3.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";const _={class:"page-wrapper"},l={class:"legal-outer"},u=e("h1",{class:"page-header"},"Terms & Conditions",-1),T=a({__name:"terms-and-conditions",setup(h){const o=c(),t=new URL(o.public.baseUrl);t.pathname=g;const n=t.toString();return d({title:"QAComet - Terms & Conditions",meta:[{name:"description",content:"Terms and Conditions for QAComet"},{property:"og:image",content:n},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/terms"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(f,y)=>{const r=i;return p(),s("div",_,[e("div",l,[u,m(r,{path:"/terms-and-conditions"})])])}}});export{T as default}; +import i from"./Cz78Sion.js";import{f as a,c as s,a as e,b as m,u as c,o as p}from"./BlS8upJP.js";import{u as d}from"./maW11VfC.js";import{_ as g}from"./Czu_W2CL.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./Bse8ef0b.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const _={class:"page-wrapper"},l={class:"legal-outer"},u=e("h1",{class:"page-header"},"Terms & Conditions",-1),T=a({__name:"terms-and-conditions",setup(h){const o=c(),t=new URL(o.public.baseUrl);t.pathname=g;const n=t.toString();return d({title:"QAComet - Terms & Conditions",meta:[{name:"description",content:"Terms and Conditions for QAComet"},{property:"og:image",content:n},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/terms"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(f,y)=>{const r=i;return p(),s("div",_,[e("div",l,[u,m(r,{path:"/terms-and-conditions"})])])}}});export{T as default}; diff --git a/_nuxt/DxMaKacJ.js b/_nuxt/C17h_atD.js similarity index 96% rename from _nuxt/DxMaKacJ.js rename to _nuxt/C17h_atD.js index daa4def..e05d13e 100644 --- a/_nuxt/DxMaKacJ.js +++ b/_nuxt/C17h_atD.js @@ -1 +1 @@ -import{f as p,H as m,k as A,J as l,z as w}from"./Bu7SZk0z.js";const S=["p","h1","h2","h3","h4","h5","h6","li"];function f(r,t){return r.type===t||typeof r.type=="object"&&r.type.tag===t||r.tag===t}function s(r){return f(r,"text")||f(r,Symbol.for("v-txt"))}function y(r){var t;return Array.isArray(r.children)||typeof r.children=="string"?r.children:typeof((t=r.children)==null?void 0:t.default)=="function"?r.children.default():[]}function a(r){if(!r)return"";if(Array.isArray(r))return r.map(a).join("");if(s(r))return r.children||r.value||"";const t=y(r);return Array.isArray(t)?t.map(a).filter(Boolean).join(""):""}function c(r,t=[]){if(Array.isArray(r))return r.flatMap(n=>c(n,t));let e=r;return t.some(n=>n==="*"||f(r,n))&&(e=y(r)||r,!Array.isArray(e)&&S.some(n=>f(r,n))&&(e=[e])),e}function h(r,t=[]){return r=Array.isArray(r)?r:[r],t.length?r.flatMap(e=>h(c(e,[t[0]]),t.slice(1))).filter(e=>!(s(e)&&a(e).trim()==="")):r}function g(r,t=[]){return typeof t=="string"&&(t=t.split(",").map(e=>e.trim()).filter(Boolean)),t.length?h(r,t).reduce((e,n)=>(s(n)?typeof e[e.length-1]=="string"?e[e.length-1]+=n.children:e.push(n.children):e.push(n),e),[]):r}const C=p({name:"MDCSlot",functional:!0,props:{name:{type:String,default:"default"},unwrap:{type:[Boolean,String],default:!1},use:{type:Function,default:void 0}},setup(r){const{parent:t}=w(),{default:e}=m(),n=A(()=>typeof r.unwrap=="string"?r.unwrap.split(" "):["*"]);return{fallbackSlot:e,tags:n,parent:t}},render({use:r,unwrap:t,fallbackSlot:e,tags:n,parent:i}){var o;try{let u=r;return typeof r=="string"&&(u=(i==null?void 0:i.slots[r])||((o=i==null?void 0:i.parent)==null?void 0:o.slots[r]),console.warn(`Please set :use="$slots.${r}" in component to enable reactivity`)),u?t?g(u(),n):[u()]:e?e():l("div")}catch{return l("div")}}}),_=p({props:{use:{type:Function,default:void 0},unwrap:{type:[Boolean,String],default:!1}},render(r){return l(C,r)}});export{_ as default}; +import{f as p,H as m,k as A,J as l,z as w}from"./BlS8upJP.js";const S=["p","h1","h2","h3","h4","h5","h6","li"];function f(r,t){return r.type===t||typeof r.type=="object"&&r.type.tag===t||r.tag===t}function s(r){return f(r,"text")||f(r,Symbol.for("v-txt"))}function y(r){var t;return Array.isArray(r.children)||typeof r.children=="string"?r.children:typeof((t=r.children)==null?void 0:t.default)=="function"?r.children.default():[]}function a(r){if(!r)return"";if(Array.isArray(r))return r.map(a).join("");if(s(r))return r.children||r.value||"";const t=y(r);return Array.isArray(t)?t.map(a).filter(Boolean).join(""):""}function c(r,t=[]){if(Array.isArray(r))return r.flatMap(n=>c(n,t));let e=r;return t.some(n=>n==="*"||f(r,n))&&(e=y(r)||r,!Array.isArray(e)&&S.some(n=>f(r,n))&&(e=[e])),e}function h(r,t=[]){return r=Array.isArray(r)?r:[r],t.length?r.flatMap(e=>h(c(e,[t[0]]),t.slice(1))).filter(e=>!(s(e)&&a(e).trim()==="")):r}function g(r,t=[]){return typeof t=="string"&&(t=t.split(",").map(e=>e.trim()).filter(Boolean)),t.length?h(r,t).reduce((e,n)=>(s(n)?typeof e[e.length-1]=="string"?e[e.length-1]+=n.children:e.push(n.children):e.push(n),e),[]):r}const C=p({name:"MDCSlot",functional:!0,props:{name:{type:String,default:"default"},unwrap:{type:[Boolean,String],default:!1},use:{type:Function,default:void 0}},setup(r){const{parent:t}=w(),{default:e}=m(),n=A(()=>typeof r.unwrap=="string"?r.unwrap.split(" "):["*"]);return{fallbackSlot:e,tags:n,parent:t}},render({use:r,unwrap:t,fallbackSlot:e,tags:n,parent:i}){var o;try{let u=r;return typeof r=="string"&&(u=(i==null?void 0:i.slots[r])||((o=i==null?void 0:i.parent)==null?void 0:o.slots[r]),console.warn(`Please set :use="$slots.${r}" in component to enable reactivity`)),u?t?g(u(),n):[u()]:e?e():l("div")}catch{return l("div")}}}),_=p({props:{use:{type:Function,default:void 0},unwrap:{type:[Boolean,String],default:!1}},render(r){return l(C,r)}});export{_ as default}; diff --git a/_nuxt/CTsxuQGU.js b/_nuxt/CCgfT4mO.js similarity index 86% rename from _nuxt/CTsxuQGU.js rename to _nuxt/CCgfT4mO.js index 2a342ea..1f66d41 100644 --- a/_nuxt/CTsxuQGU.js +++ b/_nuxt/CCgfT4mO.js @@ -1 +1 @@ -import{_ as n}from"./CZdjxv7A.js";import{_ as s}from"./CLiedZiS.js";import{f as r,g as m,w as c,u as p,o as u,a as g,b as h}from"./Bu7SZk0z.js";import{u as l}from"./B5qANkaG.js";import"./DBoACagk.js";import"./pvtjWFi2.js";import"./qxZzs3oh.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";const d=""+new URL("open-graph-banner-automatisch.CS0Jtz2i.jpg",import.meta.url).href,f={class:"testimonial-outer"},N=r({__name:"automatisch",setup(_){const o=p(),t=new URL(o.public.baseUrl);t.pathname=d;const e=t.toString();return l({title:"Automatisch - A QAComet Case Study",meta:[{name:"description",content:"We've worked extensively with Automatisch providing a wide range of services, such as writing end to end tests, bug finding, and more. See our case study for details about our work."},{property:"og:image",content:e},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"Automatisch - QAComet Case Study"},{property:"og:url",content:"https://qacomet.com/case-studies/automatisch"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"NewsArticle",headline:"Automatisch - A QAComet Case Study",image:[e],datePublished:"2024-02-26T08:00:00-06:00",author:[{"@type":"Organization",name:"QAComet",url:"https://qacomet.com"}]})}]}),(y,w)=>{const a=n,i=s;return u(),m(i,{link:"https://automatisch.io",path:"/case-studies/automatisch"},{default:c(()=>[g("div",f,[h(a,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",testimonial:"I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product."})])]),_:1})}}});export{N as default}; +import{_ as n}from"./CZcQ1mDI.js";import{_ as s}from"./BneHlRLI.js";import{f as r,g as m,w as c,u as p,o as u,a as g,b as h}from"./BlS8upJP.js";import{u as l}from"./maW11VfC.js";import"./CFzORWKb.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const d=""+new URL("open-graph-banner-automatisch.CS0Jtz2i.jpg",import.meta.url).href,f={class:"testimonial-outer"},N=r({__name:"automatisch",setup(_){const o=p(),t=new URL(o.public.baseUrl);t.pathname=d;const e=t.toString();return l({title:"Automatisch - A QAComet Case Study",meta:[{name:"description",content:"We've worked extensively with Automatisch providing a wide range of services, such as writing end to end tests, bug finding, and more. See our case study for details about our work."},{property:"og:image",content:e},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"Automatisch - QAComet Case Study"},{property:"og:url",content:"https://qacomet.com/case-studies/automatisch"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"NewsArticle",headline:"Automatisch - A QAComet Case Study",image:[e],datePublished:"2024-02-26T08:00:00-06:00",author:[{"@type":"Organization",name:"QAComet",url:"https://qacomet.com"}]})}]}),(y,w)=>{const a=n,i=s;return u(),m(i,{link:"https://automatisch.io",path:"/case-studies/automatisch"},{default:c(()=>[g("div",f,[h(a,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",testimonial:"I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product."})])]),_:1})}}});export{N as default}; diff --git a/_nuxt/CD12G3CN.js b/_nuxt/CD12G3CN.js deleted file mode 100644 index eb3b19c..0000000 --- a/_nuxt/CD12G3CN.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as m}from"./a3lCQdJr.js";import"./Bu7SZk0z.js";export{m as default}; diff --git a/_nuxt/CiI5X-ZH.js b/_nuxt/CFwVd7gV.js similarity index 99% rename from _nuxt/CiI5X-ZH.js rename to _nuxt/CFwVd7gV.js index cc586fb..dea8d5d 100644 --- a/_nuxt/CiI5X-ZH.js +++ b/_nuxt/CFwVd7gV.js @@ -1 +1 @@ -import{a0 as _,P as T,u as M,N as W,y as B}from"./Bu7SZk0z.js";import{g as b,a as P,b as E,o as J,c as k,d as $,f as j,h as D,i as H}from"./Du3a2oyP.js";import{p as G}from"./BsYmvPZw.js";import{u as U}from"./D3rhYO6_.js";const Z="memory",q=()=>{const t=new Map;return{name:Z,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function F(t){return!t||typeof t.then!="function"?Promise.resolve(t):t}function p(t,...r){try{return F(t(...r))}catch(n){return Promise.reject(n)}}function V(t){const r=typeof t;return t===null||r!=="object"&&r!=="function"}function Q(t){const r=Object.getPrototypeOf(t);return!r||r.isPrototypeOf(Object)}function K(t){if(V(t))return String(t);if(Q(t)||Array.isArray(t))return JSON.stringify(t);if(typeof t.toJSON=="function")return K(t.toJSON());throw new Error("[unstorage] Cannot stringify value!")}function z(){if(typeof Buffer===void 0)throw new TypeError("[unstorage] Buffer is not supported!")}const R="base64:";function X(t){if(typeof t=="string")return t;z();const r=Buffer.from(t).toString("base64");return R+r}function ee(t){return typeof t!="string"||!t.startsWith(R)?t:(z(),Buffer.from(t.slice(R.length),"base64"))}const te=["hasItem","getItem","getItemRaw","setItem","setItemRaw","removeItem","getMeta","setMeta","removeMeta","getKeys","clear","mount","unmount"];function re(t,r){if(r=A(r),!r)return t;const n={...t};for(const a of te)n[a]=(l="",...c)=>t[a](r+l,...c);return n.getKeys=(a="",...l)=>t.getKeys(r+a,...l).then(c=>c.map(o=>o.slice(r.length))),n}function d(t){return t?t.split("?")[0].replace(/[/\\]/g,":").replace(/:+/g,":").replace(/^:|:$/g,""):""}function ne(...t){return d(t.join(":"))}function A(t){return t=d(t),t?t+":":""}const ie="memory",ae=()=>{const t=new Map;return{name:ie,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function se(t={}){const r={mounts:{"":t.driver||ae()},mountpoints:[""],watching:!1,watchListeners:[],unwatch:{}},n=e=>{for(const i of r.mountpoints)if(e.startsWith(i))return{base:i,relativeKey:e.slice(i.length),driver:r.mounts[i]};return{base:"",relativeKey:e,driver:r.mounts[""]}},a=(e,i)=>r.mountpoints.filter(s=>s.startsWith(e)||i&&e.startsWith(s)).map(s=>({relativeBase:e.length>s.length?e.slice(s.length):void 0,mountpoint:s,driver:r.mounts[s]})),l=(e,i)=>{if(r.watching){i=d(i);for(const s of r.watchListeners)s(e,i)}},c=async()=>{if(!r.watching){r.watching=!0;for(const e in r.mounts)r.unwatch[e]=await x(r.mounts[e],l,e)}},o=async()=>{if(r.watching){for(const e in r.unwatch)await r.unwatch[e]();r.unwatch={},r.watching=!1}},h=(e,i,s)=>{const u=new Map,f=m=>{let y=u.get(m.base);return y||(y={driver:m.driver,base:m.base,items:[]},u.set(m.base,y)),y};for(const m of e){const y=typeof m=="string",v=d(y?m:m.key),w=y?void 0:m.value,I=y||!m.options?i:{...i,...m.options},O=n(v);f(O).items.push({key:v,value:w,relativeKey:O.relativeKey,options:I})}return Promise.all([...u.values()].map(m=>s(m))).then(m=>m.flat())},g={hasItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.hasItem,s,i)},getItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.getItem,s,i).then(f=>_(f))},getItems(e,i){return h(e,i,s=>s.driver.getItems?p(s.driver.getItems,s.items.map(u=>({key:u.relativeKey,options:u.options})),i).then(u=>u.map(f=>({key:ne(s.base,f.key),value:_(f.value)}))):Promise.all(s.items.map(u=>p(s.driver.getItem,u.relativeKey,u.options).then(f=>({key:u.key,value:_(f)})))))},getItemRaw(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return u.getItemRaw?p(u.getItemRaw,s,i):p(u.getItem,s,i).then(f=>ee(f))},async setItem(e,i,s={}){if(i===void 0)return g.removeItem(e);e=d(e);const{relativeKey:u,driver:f}=n(e);f.setItem&&(await p(f.setItem,u,K(i),s),f.watch||l("update",e))},async setItems(e,i){await h(e,i,async s=>{if(s.driver.setItems)return p(s.driver.setItems,s.items.map(u=>({key:u.relativeKey,value:K(u.value),options:u.options})),i);s.driver.setItem&&await Promise.all(s.items.map(u=>p(s.driver.setItem,u.relativeKey,K(u.value),u.options)))})},async setItemRaw(e,i,s={}){if(i===void 0)return g.removeItem(e,s);e=d(e);const{relativeKey:u,driver:f}=n(e);if(f.setItemRaw)await p(f.setItemRaw,u,i,s);else if(f.setItem)await p(f.setItem,u,X(i),s);else return;f.watch||l("update",e)},async removeItem(e,i={}){typeof i=="boolean"&&(i={removeMeta:i}),e=d(e);const{relativeKey:s,driver:u}=n(e);u.removeItem&&(await p(u.removeItem,s,i),(i.removeMeta||i.removeMata)&&await p(u.removeItem,s+"$",i),u.watch||l("remove",e))},async getMeta(e,i={}){typeof i=="boolean"&&(i={nativeOnly:i}),e=d(e);const{relativeKey:s,driver:u}=n(e),f=Object.create(null);if(u.getMeta&&Object.assign(f,await p(u.getMeta,s,i)),!i.nativeOnly){const m=await p(u.getItem,s+"$",i).then(y=>_(y));m&&typeof m=="object"&&(typeof m.atime=="string"&&(m.atime=new Date(m.atime)),typeof m.mtime=="string"&&(m.mtime=new Date(m.mtime)),Object.assign(f,m))}return f},setMeta(e,i,s={}){return this.setItem(e+"$",i,s)},removeMeta(e,i={}){return this.removeItem(e+"$",i)},async getKeys(e,i={}){e=A(e);const s=a(e,!0);let u=[];const f=[];for(const m of s){const v=(await p(m.driver.getKeys,m.relativeBase,i)).map(w=>m.mountpoint+d(w)).filter(w=>!u.some(I=>w.startsWith(I)));f.push(...v),u=[m.mountpoint,...u.filter(w=>!w.startsWith(m.mountpoint))]}return e?f.filter(m=>m.startsWith(e)&&!m.endsWith("$")):f.filter(m=>!m.endsWith("$"))},async clear(e,i={}){e=A(e),await Promise.all(a(e,!1).map(async s=>{if(s.driver.clear)return p(s.driver.clear,s.relativeBase,i);if(s.driver.removeItem){const u=await s.driver.getKeys(s.relativeBase||"",i);return Promise.all(u.map(f=>s.driver.removeItem(f,i)))}}))},async dispose(){await Promise.all(Object.values(r.mounts).map(e=>L(e)))},async watch(e){return await c(),r.watchListeners.push(e),async()=>{r.watchListeners=r.watchListeners.filter(i=>i!==e),r.watchListeners.length===0&&await o()}},async unwatch(){r.watchListeners=[],await o()},mount(e,i){if(e=A(e),e&&r.mounts[e])throw new Error(`already mounted at ${e}`);return e&&(r.mountpoints.push(e),r.mountpoints.sort((s,u)=>u.length-s.length)),r.mounts[e]=i,r.watching&&Promise.resolve(x(i,l,e)).then(s=>{r.unwatch[e]=s}).catch(console.error),g},async unmount(e,i=!0){e=A(e),!(!e||!r.mounts[e])&&(r.watching&&e in r.unwatch&&(r.unwatch[e](),delete r.unwatch[e]),i&&await L(r.mounts[e]),r.mountpoints=r.mountpoints.filter(s=>s!==e),delete r.mounts[e])},getMount(e=""){e=d(e)+":";const i=n(e);return{driver:i.driver,base:i.base}},getMounts(e="",i={}){return e=d(e),a(e,i.parents).map(u=>({driver:u.driver,base:u.mountpoint}))}};return g}function x(t,r,n){return t.watch?t.watch((a,l)=>r(a,n+l)):()=>{}}async function L(t){typeof t.dispose=="function"&&await p(t.dispose)}function oe(t={}){const r=ue(n,t.operators);function n(a,l){return typeof l!="object"||l instanceof RegExp?r.$eq(a,l):Object.keys(l||{}).every(c=>{const o=l[c];if(c.startsWith("$")&&r[c]){const h=r[c];return typeof h=="function"?h(a,o):!1}return n(b(a,c),o)})}return n}function ue(t,r={}){return{$match:(n,a)=>t(n,a),$eq:(n,a)=>a instanceof RegExp?a.test(n):n===a,$ne:(n,a)=>a instanceof RegExp?!a.test(n):n!==a,$not:(n,a)=>!t(n,a),$and:(n,a)=>(P(a,"$and requires an array as condition"),a.every(l=>t(n,l))),$or:(n,a)=>(P(a,"$or requires an array as condition"),a.some(l=>t(n,l))),$in:(n,a)=>E(a).some(l=>Array.isArray(n)?t(n,{$contains:l}):t(n,l)),$contains:(n,a)=>(n=Array.isArray(n)?n:String(n),E(a).every(l=>n.includes(l))),$icontains:(n,a)=>{if(typeof a!="string")throw new TypeError("$icontains requires a string, use $contains instead");return n=String(n).toLocaleLowerCase(),E(a).every(l=>n.includes(l.toLocaleLowerCase()))},$containsAny:(n,a)=>(P(a,"$containsAny requires an array as condition"),n=Array.isArray(n)?n:String(n),a.some(l=>n.includes(l))),$exists:(n,a)=>a?typeof n<"u":typeof n>"u",$type:(n,a)=>typeof n===String(a),$regex:(n,a)=>{if(!(a instanceof RegExp)){const l=String(a).match(/\/(.*)\/([dgimsuy]*)$/);a=l?new RegExp(l[1],l[2]||""):new RegExp(a)}return a.test(String(n||""))},$lt:(n,a)=>nn<=a,$gt:(n,a)=>n>a,$gte:(n,a)=>n>=a,...r||{}}}function ce(t){const r=oe(),n=(c,{query:o,before:h,after:g})=>{const e=typeof o=="string"?{_path:o}:o,i=c.findIndex(u=>r(u,e));h=h??1,g=g??1;const s=new Array(h+g).fill(null,0);return i===-1?s:s.map((u,f)=>c[i-h+f+ +(f>=h)]||null)},a=[(c,o)=>{const h=c.result.filter(g=>E(o.where).every(e=>r(g,e)));return{...c,result:h,total:h.length}},(c,o)=>E(o.sort).forEach(h=>k(c.result,h)),function(o,h,g){var e;if(h.surround){let i=n(((e=o.result)==null?void 0:e.length)===1?g:o.result,h.surround);i=$(j(h.without))(i),i=$(D(h.only))(i),o.surround=i}return o}],l=[(c,o)=>{if(o.skip)return{...c,result:c.result.slice(o.skip),skip:o.skip}},(c,o)=>{if(o.limit)return{...c,result:c.result.slice(0,o.limit),limit:o.limit}},function(o,h,g){var e,i,s;if(h.dirConfig){const u=((e=o.result[0])==null?void 0:e._path)||((s=(i=h.where)==null?void 0:i.find(f=>f._path))==null?void 0:s._path);if(typeof u=="string"){const f=g.find(m=>m._path===T(u,"_dir"));f&&(o.dirConfig={_path:f._path,...j(["_"])(f)})}}return o},(c,o)=>({...c,result:$(j(o.without))(c.result)}),(c,o)=>({...c,result:$(D(o.only))(c.result)})];return async c=>{const o=await t(),h=c.params(),g={result:o,limit:0,skip:0,total:o.length},e=a.reduce((s,u)=>u(s,h,o)||s,g);if(h.count)return{result:e.result.length};const i=l.reduce((s,u)=>u(s,h,o)||s,e);return h.first?{...J(["skip","limit","total"])(i),result:i.result[0]}:i}}function N(t){const r=ce(t);return async n=>{var c;n.params().first&&n.withDirConfig();const a=n.params(),l=await r(n);return a.surround?l==null?void 0:l.surround:(l!=null&&l.dirConfig&&(l.result={_path:(c=l.dirConfig)==null?void 0:c._path,...l.result,_dir:l.dirConfig}),l==null?void 0:l.result)}}var le=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},fe={exports:{}};(function(t,r){(function(n,a,l){t.exports=l(),t.exports.default=l()})("slugify",le,function(){var n=JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E'","Ը":"Y'","Թ":"T'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C'","Կ":"K","Հ":"H","Ձ":"D'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P'","Ք":"Q'","Օ":"O''","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"'","’":"'","“":"\\"","”":"\\"","„":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₸":"kazakhstani tenge","₹":"indian rupee","₺":"turkish lira","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial","ﻵ":"laa","ﻷ":"laa","ﻹ":"lai","ﻻ":"la"}`),a=JSON.parse('{"bg":{"Й":"Y","Ц":"Ts","Щ":"Sht","Ъ":"A","Ь":"Y","й":"y","ц":"ts","щ":"sht","ъ":"a","ь":"y"},"de":{"Ä":"AE","ä":"ae","Ö":"OE","ö":"oe","Ü":"UE","ü":"ue","ß":"ss","%":"prozent","&":"und","|":"oder","∑":"summe","∞":"unendlich","♥":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","¢":"centavos","£":"libras","¤":"moneda","₣":"francos","∑":"suma","∞":"infinito","♥":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","¢":"centime","£":"livre","¤":"devise","₣":"franc","∑":"somme","∞":"infini","♥":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","¢":"centavo","∑":"soma","£":"libra","∞":"infinito","♥":"amor"},"uk":{"И":"Y","и":"y","Й":"Y","й":"y","Ц":"Ts","ц":"ts","Х":"Kh","х":"kh","Щ":"Shch","щ":"shch","Г":"H","г":"h"},"vi":{"Đ":"D","đ":"d"},"da":{"Ø":"OE","ø":"oe","Å":"AA","å":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"større end"},"nb":{"&":"og","Å":"AA","Æ":"AE","Ø":"OE","å":"aa","æ":"ae","ø":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","Å":"AA","Ä":"AE","Ö":"OE","å":"aa","ä":"ae","ö":"oe"}}');function l(c,o){if(typeof c!="string")throw new Error("slugify: string argument expected");o=typeof o=="string"?{replacement:o}:o||{};var h=a[o.locale]||{},g=o.replacement===void 0?"-":o.replacement,e=o.trim===void 0?!0:o.trim,i=c.normalize().split("").reduce(function(s,u){var f=h[u];return f===void 0&&(f=n[u]),f===void 0&&(f=u),f===g&&(f=" "),s+f.replace(o.remove||/[^\w\s$*_+~.()'"!\-:@]+/g,"")},"");return o.strict&&(i=i.replace(/[^A-Za-z0-9\s]/g,"")),e&&(i=i.trim()),i=i.replace(/\s+/g,g),o.lower&&(i=i.toLowerCase()),i}return l.extend=function(c){Object.assign(n,c)},l})})(fe);const me=t=>t.split(/[\s-]/g).map(G).join(" ");function he(t,r){const{navigation:n}=M().public.content;if(n===!1)return[];const a=c=>({...pe(["title",...n.fields])(c),...de(c==null?void 0:c.navigation)?c.navigation:{}}),l=t.sort((c,o)=>c._path.localeCompare(o._path)).reduce((c,o)=>{const h=o._path.substring(1).split("/"),g=o._id.split(":").slice(1),e=!!g[g.length-1].match(/([1-9][0-9]*\.)?index.md/g),i=f=>({title:f.title,_path:f._path,_file:f._file,children:[],...a(f),...f._draft?{_draft:!0}:{}}),s=i(o);if(e){const f=r[s._path];if(typeof(f==null?void 0:f.navigation)<"u"&&!(f!=null&&f.navigation))return c;if(o._path!=="/"){const m=i(o);s.children.push(m)}Object.assign(s,a(f))}return h.length===1?(c.push(s),c):(h.slice(0,-1).reduce((f,m,y)=>{const v="/"+h.slice(0,y+1).join("/"),w=r[v];if(typeof(w==null?void 0:w.navigation)<"u"&&!w.navigation)return[];let I=f.find(O=>O._path===v);return I||(I={title:me(m),_path:v,_file:o._file,children:[],...a(w)},f.push(I)),I.children},c).push(s),c)},[]);return Y(l)}const ge=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Y(t){var n;t.forEach(a=>{a._file=a._file.split(".").slice(0,-1).join(".")});const r=t.sort((a,l)=>ge.compare(a._file,l._file));for(const a of r)(n=a.children)!=null&&n.length?Y(a.children):delete a.children,delete a._file;return t}function pe(t){return r=>(r=r||{},t&&t.length?t.filter(n=>typeof r[n]<"u").reduce((n,a)=>Object.assign(n,{[a]:r[a]}),{}):r)}function de(t){return Object.prototype.toString.call(t)==="[object Object]"}const ye=t=>W(t,M().public.content.api.baseURL),we=re(se({driver:q()}),"@content");function ve(t){async function r(){const n=new Set(await t.getKeys("cache:")),a=U().getPreviewToken();if(a){const c=await t.getItem(`${a}$`).then(g=>g||{});if(Array.isArray(c.ignoreSources)){const g=c.ignoreSources.map(e=>`cache:${e.trim()}:`);for(const e of n)g.some(i=>e.startsWith(i))&&n.delete(e)}const o=await t.getKeys(`${a}:`),h=await Promise.all(o.map(g=>t.getItem(g)));for(const g of h)n.delete(`cache:${g._id}`),g.__deleted||n.add(`${a}:${g._id}`)}return await Promise.all(Array.from(n).map(c=>t.getItem(c)))}return{storage:t,fetch:N(r),query:n=>H(N(r),{initialParams:n,legacy:!0})}}let C=null,S=null;async function Ie(){return S?await S:C||(S=Ae(),C=await S),C}async function Ae(){const t=B(),{content:r}=M().public,n=ve(we),a=await n.storage.getItem("integrity");if(r.integrity!==+(a||0)){const{contents:l,navigation:c}=await $fetch(ye(r.integrity?`cache.${r.integrity}.json`:"cache.json"));await Promise.all(l.map(o=>n.storage.setItem(`cache:${o._id}`,o))),await n.storage.setItem("navigation",c),await n.storage.setItem("integrity",r.integrity)}return await t.callHook("content:storage",n.storage),n}async function Se(t){const r=await Ie();if(!U().getPreviewToken()&&Object.keys(t||{}).length===0)return r.storage.getItem("navigation");const n=await r.query(t).where({_partial:!1,navigation:{$ne:!1}}).find(),l=(await r.query().where({_path:/\/_dir$/i,_partial:!0}).find()).reduce((c,o)=>{var g;((g=o.title)==null?void 0:g.toLowerCase())==="dir"&&(o.title=void 0);const h=o._path.split("/").slice(0,-1).join("/")||"/";return c[h]={...o,...o.body},c},{});return he(n,l)}export{we as contentStorage,ve as createDB,Se as generateNavigation,Ie as useContentDatabase}; +import{a0 as _,P as T,u as M,N as W,y as B}from"./BlS8upJP.js";import{g as b,a as P,b as E,o as J,c as k,d as $,f as j,h as D,i as H}from"./DF1VbFfH.js";import{p as G}from"./BsYmvPZw.js";import{u as U}from"./BECgZIvk.js";const Z="memory",q=()=>{const t=new Map;return{name:Z,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function F(t){return!t||typeof t.then!="function"?Promise.resolve(t):t}function p(t,...r){try{return F(t(...r))}catch(n){return Promise.reject(n)}}function V(t){const r=typeof t;return t===null||r!=="object"&&r!=="function"}function Q(t){const r=Object.getPrototypeOf(t);return!r||r.isPrototypeOf(Object)}function K(t){if(V(t))return String(t);if(Q(t)||Array.isArray(t))return JSON.stringify(t);if(typeof t.toJSON=="function")return K(t.toJSON());throw new Error("[unstorage] Cannot stringify value!")}function z(){if(typeof Buffer===void 0)throw new TypeError("[unstorage] Buffer is not supported!")}const R="base64:";function X(t){if(typeof t=="string")return t;z();const r=Buffer.from(t).toString("base64");return R+r}function ee(t){return typeof t!="string"||!t.startsWith(R)?t:(z(),Buffer.from(t.slice(R.length),"base64"))}const te=["hasItem","getItem","getItemRaw","setItem","setItemRaw","removeItem","getMeta","setMeta","removeMeta","getKeys","clear","mount","unmount"];function re(t,r){if(r=A(r),!r)return t;const n={...t};for(const a of te)n[a]=(l="",...c)=>t[a](r+l,...c);return n.getKeys=(a="",...l)=>t.getKeys(r+a,...l).then(c=>c.map(o=>o.slice(r.length))),n}function d(t){return t?t.split("?")[0].replace(/[/\\]/g,":").replace(/:+/g,":").replace(/^:|:$/g,""):""}function ne(...t){return d(t.join(":"))}function A(t){return t=d(t),t?t+":":""}const ie="memory",ae=()=>{const t=new Map;return{name:ie,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function se(t={}){const r={mounts:{"":t.driver||ae()},mountpoints:[""],watching:!1,watchListeners:[],unwatch:{}},n=e=>{for(const i of r.mountpoints)if(e.startsWith(i))return{base:i,relativeKey:e.slice(i.length),driver:r.mounts[i]};return{base:"",relativeKey:e,driver:r.mounts[""]}},a=(e,i)=>r.mountpoints.filter(s=>s.startsWith(e)||i&&e.startsWith(s)).map(s=>({relativeBase:e.length>s.length?e.slice(s.length):void 0,mountpoint:s,driver:r.mounts[s]})),l=(e,i)=>{if(r.watching){i=d(i);for(const s of r.watchListeners)s(e,i)}},c=async()=>{if(!r.watching){r.watching=!0;for(const e in r.mounts)r.unwatch[e]=await x(r.mounts[e],l,e)}},o=async()=>{if(r.watching){for(const e in r.unwatch)await r.unwatch[e]();r.unwatch={},r.watching=!1}},h=(e,i,s)=>{const u=new Map,f=m=>{let y=u.get(m.base);return y||(y={driver:m.driver,base:m.base,items:[]},u.set(m.base,y)),y};for(const m of e){const y=typeof m=="string",v=d(y?m:m.key),w=y?void 0:m.value,I=y||!m.options?i:{...i,...m.options},O=n(v);f(O).items.push({key:v,value:w,relativeKey:O.relativeKey,options:I})}return Promise.all([...u.values()].map(m=>s(m))).then(m=>m.flat())},g={hasItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.hasItem,s,i)},getItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.getItem,s,i).then(f=>_(f))},getItems(e,i){return h(e,i,s=>s.driver.getItems?p(s.driver.getItems,s.items.map(u=>({key:u.relativeKey,options:u.options})),i).then(u=>u.map(f=>({key:ne(s.base,f.key),value:_(f.value)}))):Promise.all(s.items.map(u=>p(s.driver.getItem,u.relativeKey,u.options).then(f=>({key:u.key,value:_(f)})))))},getItemRaw(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return u.getItemRaw?p(u.getItemRaw,s,i):p(u.getItem,s,i).then(f=>ee(f))},async setItem(e,i,s={}){if(i===void 0)return g.removeItem(e);e=d(e);const{relativeKey:u,driver:f}=n(e);f.setItem&&(await p(f.setItem,u,K(i),s),f.watch||l("update",e))},async setItems(e,i){await h(e,i,async s=>{if(s.driver.setItems)return p(s.driver.setItems,s.items.map(u=>({key:u.relativeKey,value:K(u.value),options:u.options})),i);s.driver.setItem&&await Promise.all(s.items.map(u=>p(s.driver.setItem,u.relativeKey,K(u.value),u.options)))})},async setItemRaw(e,i,s={}){if(i===void 0)return g.removeItem(e,s);e=d(e);const{relativeKey:u,driver:f}=n(e);if(f.setItemRaw)await p(f.setItemRaw,u,i,s);else if(f.setItem)await p(f.setItem,u,X(i),s);else return;f.watch||l("update",e)},async removeItem(e,i={}){typeof i=="boolean"&&(i={removeMeta:i}),e=d(e);const{relativeKey:s,driver:u}=n(e);u.removeItem&&(await p(u.removeItem,s,i),(i.removeMeta||i.removeMata)&&await p(u.removeItem,s+"$",i),u.watch||l("remove",e))},async getMeta(e,i={}){typeof i=="boolean"&&(i={nativeOnly:i}),e=d(e);const{relativeKey:s,driver:u}=n(e),f=Object.create(null);if(u.getMeta&&Object.assign(f,await p(u.getMeta,s,i)),!i.nativeOnly){const m=await p(u.getItem,s+"$",i).then(y=>_(y));m&&typeof m=="object"&&(typeof m.atime=="string"&&(m.atime=new Date(m.atime)),typeof m.mtime=="string"&&(m.mtime=new Date(m.mtime)),Object.assign(f,m))}return f},setMeta(e,i,s={}){return this.setItem(e+"$",i,s)},removeMeta(e,i={}){return this.removeItem(e+"$",i)},async getKeys(e,i={}){e=A(e);const s=a(e,!0);let u=[];const f=[];for(const m of s){const v=(await p(m.driver.getKeys,m.relativeBase,i)).map(w=>m.mountpoint+d(w)).filter(w=>!u.some(I=>w.startsWith(I)));f.push(...v),u=[m.mountpoint,...u.filter(w=>!w.startsWith(m.mountpoint))]}return e?f.filter(m=>m.startsWith(e)&&!m.endsWith("$")):f.filter(m=>!m.endsWith("$"))},async clear(e,i={}){e=A(e),await Promise.all(a(e,!1).map(async s=>{if(s.driver.clear)return p(s.driver.clear,s.relativeBase,i);if(s.driver.removeItem){const u=await s.driver.getKeys(s.relativeBase||"",i);return Promise.all(u.map(f=>s.driver.removeItem(f,i)))}}))},async dispose(){await Promise.all(Object.values(r.mounts).map(e=>L(e)))},async watch(e){return await c(),r.watchListeners.push(e),async()=>{r.watchListeners=r.watchListeners.filter(i=>i!==e),r.watchListeners.length===0&&await o()}},async unwatch(){r.watchListeners=[],await o()},mount(e,i){if(e=A(e),e&&r.mounts[e])throw new Error(`already mounted at ${e}`);return e&&(r.mountpoints.push(e),r.mountpoints.sort((s,u)=>u.length-s.length)),r.mounts[e]=i,r.watching&&Promise.resolve(x(i,l,e)).then(s=>{r.unwatch[e]=s}).catch(console.error),g},async unmount(e,i=!0){e=A(e),!(!e||!r.mounts[e])&&(r.watching&&e in r.unwatch&&(r.unwatch[e](),delete r.unwatch[e]),i&&await L(r.mounts[e]),r.mountpoints=r.mountpoints.filter(s=>s!==e),delete r.mounts[e])},getMount(e=""){e=d(e)+":";const i=n(e);return{driver:i.driver,base:i.base}},getMounts(e="",i={}){return e=d(e),a(e,i.parents).map(u=>({driver:u.driver,base:u.mountpoint}))}};return g}function x(t,r,n){return t.watch?t.watch((a,l)=>r(a,n+l)):()=>{}}async function L(t){typeof t.dispose=="function"&&await p(t.dispose)}function oe(t={}){const r=ue(n,t.operators);function n(a,l){return typeof l!="object"||l instanceof RegExp?r.$eq(a,l):Object.keys(l||{}).every(c=>{const o=l[c];if(c.startsWith("$")&&r[c]){const h=r[c];return typeof h=="function"?h(a,o):!1}return n(b(a,c),o)})}return n}function ue(t,r={}){return{$match:(n,a)=>t(n,a),$eq:(n,a)=>a instanceof RegExp?a.test(n):n===a,$ne:(n,a)=>a instanceof RegExp?!a.test(n):n!==a,$not:(n,a)=>!t(n,a),$and:(n,a)=>(P(a,"$and requires an array as condition"),a.every(l=>t(n,l))),$or:(n,a)=>(P(a,"$or requires an array as condition"),a.some(l=>t(n,l))),$in:(n,a)=>E(a).some(l=>Array.isArray(n)?t(n,{$contains:l}):t(n,l)),$contains:(n,a)=>(n=Array.isArray(n)?n:String(n),E(a).every(l=>n.includes(l))),$icontains:(n,a)=>{if(typeof a!="string")throw new TypeError("$icontains requires a string, use $contains instead");return n=String(n).toLocaleLowerCase(),E(a).every(l=>n.includes(l.toLocaleLowerCase()))},$containsAny:(n,a)=>(P(a,"$containsAny requires an array as condition"),n=Array.isArray(n)?n:String(n),a.some(l=>n.includes(l))),$exists:(n,a)=>a?typeof n<"u":typeof n>"u",$type:(n,a)=>typeof n===String(a),$regex:(n,a)=>{if(!(a instanceof RegExp)){const l=String(a).match(/\/(.*)\/([dgimsuy]*)$/);a=l?new RegExp(l[1],l[2]||""):new RegExp(a)}return a.test(String(n||""))},$lt:(n,a)=>nn<=a,$gt:(n,a)=>n>a,$gte:(n,a)=>n>=a,...r||{}}}function ce(t){const r=oe(),n=(c,{query:o,before:h,after:g})=>{const e=typeof o=="string"?{_path:o}:o,i=c.findIndex(u=>r(u,e));h=h??1,g=g??1;const s=new Array(h+g).fill(null,0);return i===-1?s:s.map((u,f)=>c[i-h+f+ +(f>=h)]||null)},a=[(c,o)=>{const h=c.result.filter(g=>E(o.where).every(e=>r(g,e)));return{...c,result:h,total:h.length}},(c,o)=>E(o.sort).forEach(h=>k(c.result,h)),function(o,h,g){var e;if(h.surround){let i=n(((e=o.result)==null?void 0:e.length)===1?g:o.result,h.surround);i=$(j(h.without))(i),i=$(D(h.only))(i),o.surround=i}return o}],l=[(c,o)=>{if(o.skip)return{...c,result:c.result.slice(o.skip),skip:o.skip}},(c,o)=>{if(o.limit)return{...c,result:c.result.slice(0,o.limit),limit:o.limit}},function(o,h,g){var e,i,s;if(h.dirConfig){const u=((e=o.result[0])==null?void 0:e._path)||((s=(i=h.where)==null?void 0:i.find(f=>f._path))==null?void 0:s._path);if(typeof u=="string"){const f=g.find(m=>m._path===T(u,"_dir"));f&&(o.dirConfig={_path:f._path,...j(["_"])(f)})}}return o},(c,o)=>({...c,result:$(j(o.without))(c.result)}),(c,o)=>({...c,result:$(D(o.only))(c.result)})];return async c=>{const o=await t(),h=c.params(),g={result:o,limit:0,skip:0,total:o.length},e=a.reduce((s,u)=>u(s,h,o)||s,g);if(h.count)return{result:e.result.length};const i=l.reduce((s,u)=>u(s,h,o)||s,e);return h.first?{...J(["skip","limit","total"])(i),result:i.result[0]}:i}}function N(t){const r=ce(t);return async n=>{var c;n.params().first&&n.withDirConfig();const a=n.params(),l=await r(n);return a.surround?l==null?void 0:l.surround:(l!=null&&l.dirConfig&&(l.result={_path:(c=l.dirConfig)==null?void 0:c._path,...l.result,_dir:l.dirConfig}),l==null?void 0:l.result)}}var le=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},fe={exports:{}};(function(t,r){(function(n,a,l){t.exports=l(),t.exports.default=l()})("slugify",le,function(){var n=JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E'","Ը":"Y'","Թ":"T'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C'","Կ":"K","Հ":"H","Ձ":"D'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P'","Ք":"Q'","Օ":"O''","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"'","’":"'","“":"\\"","”":"\\"","„":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₸":"kazakhstani tenge","₹":"indian rupee","₺":"turkish lira","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial","ﻵ":"laa","ﻷ":"laa","ﻹ":"lai","ﻻ":"la"}`),a=JSON.parse('{"bg":{"Й":"Y","Ц":"Ts","Щ":"Sht","Ъ":"A","Ь":"Y","й":"y","ц":"ts","щ":"sht","ъ":"a","ь":"y"},"de":{"Ä":"AE","ä":"ae","Ö":"OE","ö":"oe","Ü":"UE","ü":"ue","ß":"ss","%":"prozent","&":"und","|":"oder","∑":"summe","∞":"unendlich","♥":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","¢":"centavos","£":"libras","¤":"moneda","₣":"francos","∑":"suma","∞":"infinito","♥":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","¢":"centime","£":"livre","¤":"devise","₣":"franc","∑":"somme","∞":"infini","♥":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","¢":"centavo","∑":"soma","£":"libra","∞":"infinito","♥":"amor"},"uk":{"И":"Y","и":"y","Й":"Y","й":"y","Ц":"Ts","ц":"ts","Х":"Kh","х":"kh","Щ":"Shch","щ":"shch","Г":"H","г":"h"},"vi":{"Đ":"D","đ":"d"},"da":{"Ø":"OE","ø":"oe","Å":"AA","å":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"større end"},"nb":{"&":"og","Å":"AA","Æ":"AE","Ø":"OE","å":"aa","æ":"ae","ø":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","Å":"AA","Ä":"AE","Ö":"OE","å":"aa","ä":"ae","ö":"oe"}}');function l(c,o){if(typeof c!="string")throw new Error("slugify: string argument expected");o=typeof o=="string"?{replacement:o}:o||{};var h=a[o.locale]||{},g=o.replacement===void 0?"-":o.replacement,e=o.trim===void 0?!0:o.trim,i=c.normalize().split("").reduce(function(s,u){var f=h[u];return f===void 0&&(f=n[u]),f===void 0&&(f=u),f===g&&(f=" "),s+f.replace(o.remove||/[^\w\s$*_+~.()'"!\-:@]+/g,"")},"");return o.strict&&(i=i.replace(/[^A-Za-z0-9\s]/g,"")),e&&(i=i.trim()),i=i.replace(/\s+/g,g),o.lower&&(i=i.toLowerCase()),i}return l.extend=function(c){Object.assign(n,c)},l})})(fe);const me=t=>t.split(/[\s-]/g).map(G).join(" ");function he(t,r){const{navigation:n}=M().public.content;if(n===!1)return[];const a=c=>({...pe(["title",...n.fields])(c),...de(c==null?void 0:c.navigation)?c.navigation:{}}),l=t.sort((c,o)=>c._path.localeCompare(o._path)).reduce((c,o)=>{const h=o._path.substring(1).split("/"),g=o._id.split(":").slice(1),e=!!g[g.length-1].match(/([1-9][0-9]*\.)?index.md/g),i=f=>({title:f.title,_path:f._path,_file:f._file,children:[],...a(f),...f._draft?{_draft:!0}:{}}),s=i(o);if(e){const f=r[s._path];if(typeof(f==null?void 0:f.navigation)<"u"&&!(f!=null&&f.navigation))return c;if(o._path!=="/"){const m=i(o);s.children.push(m)}Object.assign(s,a(f))}return h.length===1?(c.push(s),c):(h.slice(0,-1).reduce((f,m,y)=>{const v="/"+h.slice(0,y+1).join("/"),w=r[v];if(typeof(w==null?void 0:w.navigation)<"u"&&!w.navigation)return[];let I=f.find(O=>O._path===v);return I||(I={title:me(m),_path:v,_file:o._file,children:[],...a(w)},f.push(I)),I.children},c).push(s),c)},[]);return Y(l)}const ge=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Y(t){var n;t.forEach(a=>{a._file=a._file.split(".").slice(0,-1).join(".")});const r=t.sort((a,l)=>ge.compare(a._file,l._file));for(const a of r)(n=a.children)!=null&&n.length?Y(a.children):delete a.children,delete a._file;return t}function pe(t){return r=>(r=r||{},t&&t.length?t.filter(n=>typeof r[n]<"u").reduce((n,a)=>Object.assign(n,{[a]:r[a]}),{}):r)}function de(t){return Object.prototype.toString.call(t)==="[object Object]"}const ye=t=>W(t,M().public.content.api.baseURL),we=re(se({driver:q()}),"@content");function ve(t){async function r(){const n=new Set(await t.getKeys("cache:")),a=U().getPreviewToken();if(a){const c=await t.getItem(`${a}$`).then(g=>g||{});if(Array.isArray(c.ignoreSources)){const g=c.ignoreSources.map(e=>`cache:${e.trim()}:`);for(const e of n)g.some(i=>e.startsWith(i))&&n.delete(e)}const o=await t.getKeys(`${a}:`),h=await Promise.all(o.map(g=>t.getItem(g)));for(const g of h)n.delete(`cache:${g._id}`),g.__deleted||n.add(`${a}:${g._id}`)}return await Promise.all(Array.from(n).map(c=>t.getItem(c)))}return{storage:t,fetch:N(r),query:n=>H(N(r),{initialParams:n,legacy:!0})}}let C=null,S=null;async function Ie(){return S?await S:C||(S=Ae(),C=await S),C}async function Ae(){const t=B(),{content:r}=M().public,n=ve(we),a=await n.storage.getItem("integrity");if(r.integrity!==+(a||0)){const{contents:l,navigation:c}=await $fetch(ye(r.integrity?`cache.${r.integrity}.json`:"cache.json"));await Promise.all(l.map(o=>n.storage.setItem(`cache:${o._id}`,o))),await n.storage.setItem("navigation",c),await n.storage.setItem("integrity",r.integrity)}return await t.callHook("content:storage",n.storage),n}async function Se(t){const r=await Ie();if(!U().getPreviewToken()&&Object.keys(t||{}).length===0)return r.storage.getItem("navigation");const n=await r.query(t).where({_partial:!1,navigation:{$ne:!1}}).find(),l=(await r.query().where({_path:/\/_dir$/i,_partial:!0}).find()).reduce((c,o)=>{var g;((g=o.title)==null?void 0:g.toLowerCase())==="dir"&&(o.title=void 0);const h=o._path.split("/").slice(0,-1).join("/")||"/";return c[h]={...o,...o.body},c},{});return he(n,l)}export{we as contentStorage,ve as createDB,Se as generateNavigation,Ie as useContentDatabase}; diff --git a/_nuxt/DBoACagk.js b/_nuxt/CFzORWKb.js similarity index 98% rename from _nuxt/DBoACagk.js rename to _nuxt/CFzORWKb.js index 81574d2..d60860a 100644 --- a/_nuxt/DBoACagk.js +++ b/_nuxt/CFzORWKb.js @@ -1 +1 @@ -import{a2 as _,f as B,k as b,S as P,a3 as w,a4 as L,a5 as N,a6 as T,a7 as I,J as C,A as U,P as j,a8 as O,a9 as V,aa as D,u as E,y as q,ab as F,ac as k,I as H,Q as z}from"./Bu7SZk0z.js";async function R(t,r=_()){const{path:s,matched:e}=r.resolve(t);if(!e.length||(r._routePreloaded||(r._routePreloaded=new Set),r._routePreloaded.has(s)))return;const n=r._preloadPromises=r._preloadPromises||[];if(n.length>4)return Promise.all(n).then(()=>R(t,r));r._routePreloaded.add(s);const i=e.map(u=>{var a;return(a=u.components)==null?void 0:a.default}).filter(u=>typeof u=="function");for(const u of i){const a=Promise.resolve(u()).catch(()=>{}).finally(()=>n.splice(n.indexOf(a)));n.push(a)}await Promise.all(n)}const M=(...t)=>t.find(r=>r!==void 0);function Q(t){const r=t.componentName||"NuxtLink";function s(e,n){if(!e||t.trailingSlash!=="append"&&t.trailingSlash!=="remove")return e;if(typeof e=="string")return S(e,t.trailingSlash);const i="path"in e&&e.path!==void 0?e.path:n(e).path;return{...e,name:void 0,path:S(i,t.trailingSlash)}}return B({name:r,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1}},setup(e,{slots:n}){const i=_(),u=E(),a=b(()=>{const l=e.to||e.href||"";return s(l,i.resolve)}),f=b(()=>typeof a.value=="string"&&k(a.value,{acceptRelative:!0})),g=b(()=>e.target&&e.target!=="_self"),p=b(()=>e.external||g.value?!0:typeof a.value=="object"?!1:a.value===""||f.value),x=P(!1),v=P(null),A=l=>{var d;v.value=e.custom?(d=l==null?void 0:l.$el)==null?void 0:d.nextElementSibling:l==null?void 0:l.$el};if(e.prefetch!==!1&&e.noPrefetch!==!0&&e.target!=="_blank"&&!J()){const d=q();let h,o=null;w(()=>{const y=$();L(()=>{h=N(()=>{var c;(c=v==null?void 0:v.value)!=null&&c.tagName&&(o=y.observe(v.value,async()=>{o==null||o(),o=null;const m=typeof a.value=="string"?a.value:i.resolve(a.value).fullPath;await Promise.all([d.hooks.callHook("link:prefetch",m).catch(()=>{}),!p.value&&R(a.value,i).catch(()=>{})]),x.value=!0}))})})}),T(()=>{h&&I(h),o==null||o(),o=null})}return()=>{var o,y;if(!p.value){const c={ref:A,to:a.value,activeClass:e.activeClass||t.activeClass,exactActiveClass:e.exactActiveClass||t.exactActiveClass,replace:e.replace,ariaCurrentValue:e.ariaCurrentValue,custom:e.custom};return e.custom||(x.value&&(c.class=e.prefetchedClass||t.prefetchedClass),c.rel=e.rel||void 0),C(U("RouterLink"),c,n.default)}const l=typeof a.value=="object"?((o=i.resolve(a.value))==null?void 0:o.href)??null:a.value&&!e.external&&!f.value?s(j(u.app.baseURL,a.value),i.resolve):a.value||null,d=e.target||null,h=M(e.noRel?"":e.rel,t.externalRelAttribute,f.value||g.value?"noopener noreferrer":"")||null;if(e.custom){if(!n.default)return null;const c=()=>F(l,{replace:e.replace,external:e.external});return n.default({href:l,navigate:c,get route(){if(!l)return;const m=O(l);return{path:m.pathname,fullPath:m.pathname,get query(){return V(m.search)},hash:m.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:l}},rel:h,target:d,isExternal:p.value,isActive:!1,isExactActive:!1})}return C("a",{ref:v,href:l,rel:h,target:d},(y=n.default)==null?void 0:y.call(n))}}})}const G=Q(D);function S(t,r){const s=r==="append"?H:z;return k(t)&&!t.startsWith("http")?t:s(t,!0)}function $(){const t=q();if(t._observer)return t._observer;let r=null;const s=new Map,e=(i,u)=>(r||(r=new IntersectionObserver(a=>{for(const f of a){const g=s.get(f.target);(f.isIntersecting||f.intersectionRatio>0)&&g&&g()}})),s.set(i,u),r.observe(i),()=>{s.delete(i),r.unobserve(i),s.size===0&&(r.disconnect(),r=null)});return t._observer={observe:e}}function J(){const t=navigator.connection;return!!(t&&(t.saveData||/2g/.test(t.effectiveType)))}export{G as _}; +import{a2 as _,f as B,k as b,S as P,a3 as w,a4 as L,a5 as N,a6 as T,a7 as I,J as C,A as U,P as j,a8 as O,a9 as V,aa as D,u as E,y as q,ab as F,ac as k,I as H,Q as z}from"./BlS8upJP.js";async function R(t,r=_()){const{path:s,matched:e}=r.resolve(t);if(!e.length||(r._routePreloaded||(r._routePreloaded=new Set),r._routePreloaded.has(s)))return;const n=r._preloadPromises=r._preloadPromises||[];if(n.length>4)return Promise.all(n).then(()=>R(t,r));r._routePreloaded.add(s);const i=e.map(u=>{var a;return(a=u.components)==null?void 0:a.default}).filter(u=>typeof u=="function");for(const u of i){const a=Promise.resolve(u()).catch(()=>{}).finally(()=>n.splice(n.indexOf(a)));n.push(a)}await Promise.all(n)}const M=(...t)=>t.find(r=>r!==void 0);function Q(t){const r=t.componentName||"NuxtLink";function s(e,n){if(!e||t.trailingSlash!=="append"&&t.trailingSlash!=="remove")return e;if(typeof e=="string")return S(e,t.trailingSlash);const i="path"in e&&e.path!==void 0?e.path:n(e).path;return{...e,name:void 0,path:S(i,t.trailingSlash)}}return B({name:r,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1}},setup(e,{slots:n}){const i=_(),u=E(),a=b(()=>{const l=e.to||e.href||"";return s(l,i.resolve)}),f=b(()=>typeof a.value=="string"&&k(a.value,{acceptRelative:!0})),g=b(()=>e.target&&e.target!=="_self"),p=b(()=>e.external||g.value?!0:typeof a.value=="object"?!1:a.value===""||f.value),x=P(!1),v=P(null),A=l=>{var d;v.value=e.custom?(d=l==null?void 0:l.$el)==null?void 0:d.nextElementSibling:l==null?void 0:l.$el};if(e.prefetch!==!1&&e.noPrefetch!==!0&&e.target!=="_blank"&&!J()){const d=q();let h,o=null;w(()=>{const y=$();L(()=>{h=N(()=>{var c;(c=v==null?void 0:v.value)!=null&&c.tagName&&(o=y.observe(v.value,async()=>{o==null||o(),o=null;const m=typeof a.value=="string"?a.value:i.resolve(a.value).fullPath;await Promise.all([d.hooks.callHook("link:prefetch",m).catch(()=>{}),!p.value&&R(a.value,i).catch(()=>{})]),x.value=!0}))})})}),T(()=>{h&&I(h),o==null||o(),o=null})}return()=>{var o,y;if(!p.value){const c={ref:A,to:a.value,activeClass:e.activeClass||t.activeClass,exactActiveClass:e.exactActiveClass||t.exactActiveClass,replace:e.replace,ariaCurrentValue:e.ariaCurrentValue,custom:e.custom};return e.custom||(x.value&&(c.class=e.prefetchedClass||t.prefetchedClass),c.rel=e.rel||void 0),C(U("RouterLink"),c,n.default)}const l=typeof a.value=="object"?((o=i.resolve(a.value))==null?void 0:o.href)??null:a.value&&!e.external&&!f.value?s(j(u.app.baseURL,a.value),i.resolve):a.value||null,d=e.target||null,h=M(e.noRel?"":e.rel,t.externalRelAttribute,f.value||g.value?"noopener noreferrer":"")||null;if(e.custom){if(!n.default)return null;const c=()=>F(l,{replace:e.replace,external:e.external});return n.default({href:l,navigate:c,get route(){if(!l)return;const m=O(l);return{path:m.pathname,fullPath:m.pathname,get query(){return V(m.search)},hash:m.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:l}},rel:h,target:d,isExternal:p.value,isActive:!1,isExactActive:!1})}return C("a",{ref:v,href:l,rel:h,target:d},(y=n.default)==null?void 0:y.call(n))}}})}const G=Q(D);function S(t,r){const s=r==="append"?H:z;return k(t)&&!t.startsWith("http")?t:s(t,!0)}function $(){const t=q();if(t._observer)return t._observer;let r=null;const s=new Map,e=(i,u)=>(r||(r=new IntersectionObserver(a=>{for(const f of a){const g=s.get(f.target);(f.isIntersecting||f.intersectionRatio>0)&&g&&g()}})),s.set(i,u),r.observe(i),()=>{s.delete(i),r.unobserve(i),s.size===0&&(r.disconnect(),r=null)});return t._observer={observe:e}}function J(){const t=navigator.connection;return!!(t&&(t.saveData||/2g/.test(t.effectiveType)))}export{G as _}; diff --git a/_nuxt/BStWRYj4.js b/_nuxt/CGfQlKlL.js similarity index 64% rename from _nuxt/BStWRYj4.js rename to _nuxt/CGfQlKlL.js index be1169e..ca626b7 100644 --- a/_nuxt/BStWRYj4.js +++ b/_nuxt/CGfQlKlL.js @@ -1 +1 @@ -import{_ as o,o as n,c as r,l as c}from"./Bu7SZk0z.js";const s={};function t(e,l){return n(),r("code",null,[c(e.$slots,"default")])}const _=o(s,[["render",t]]);export{_ as default}; +import{_ as o,o as n,c as r,l as c}from"./BlS8upJP.js";const s={};function t(e,l){return n(),r("code",null,[c(e.$slots,"default")])}const _=o(s,[["render",t]]);export{_ as default}; diff --git a/_nuxt/Bb9rc-i1.js b/_nuxt/CRh1_mKz.js similarity index 97% rename from _nuxt/Bb9rc-i1.js rename to _nuxt/CRh1_mKz.js index eadf33f..a6a9b50 100644 --- a/_nuxt/Bb9rc-i1.js +++ b/_nuxt/CRh1_mKz.js @@ -1 +1 @@ -import{R as C,S as y,T as w,L as b,U as O,V as B,E,W as _,y as M,s as R,i as S,z,X as H}from"./Bu7SZk0z.js";const T=s=>s==="defer"||s===!1;function U(...s){var m;const i=typeof s[s.length-1]=="string"?s.pop():void 0;typeof s[0]!="string"&&s.unshift(i);let[t,u,a={}]=s;if(typeof t!="string")throw new TypeError("[nuxt] [asyncData] key must be a string.");if(typeof u!="function")throw new TypeError("[nuxt] [asyncData] handler must be a function.");const e=M(),v=u,p=()=>null,g=()=>e.isHydrating?e.payload.data[t]:e.static.data[t];a.server=a.server??!0,a.default=a.default??p,a.getCachedData=a.getCachedData??g,a.lazy=a.lazy??!1,a.immediate=a.immediate??!0,a.deep=a.deep??C.deep,a.dedupe=a.dedupe??"cancel";const d=()=>a.getCachedData(t,e)!=null;if(!e._asyncData[t]||!a.immediate){(m=e.payload._errors)[t]??(m[t]=null);const o=a.deep?y:w;e._asyncData[t]={data:o(a.getCachedData(t,e)??a.default()),pending:y(!d()),error:b(e.payload._errors,t),status:y("idle")}}const r={...e._asyncData[t]};r.refresh=r.execute=(o={})=>{if(e._asyncDataPromises[t]){if(T(o.dedupe??a.dedupe))return e._asyncDataPromises[t];e._asyncDataPromises[t].cancelled=!0}if((o._initial||e.isHydrating&&o._initial!==!1)&&d())return Promise.resolve(a.getCachedData(t,e));r.pending.value=!0,r.status.value="pending";const l=new Promise((c,n)=>{try{c(v(e))}catch(f){n(f)}}).then(async c=>{if(l.cancelled)return e._asyncDataPromises[t];let n=c;a.transform&&(n=await a.transform(c)),a.pick&&(n=K(n,a.pick)),e.payload.data[t]=n,r.data.value=n,r.error.value=null,r.status.value="success"}).catch(c=>{if(l.cancelled)return e._asyncDataPromises[t];r.error.value=R(c),r.data.value=S(a.default()),r.status.value="error"}).finally(()=>{l.cancelled||(r.pending.value=!1,delete e._asyncDataPromises[t])});return e._asyncDataPromises[t]=l,e._asyncDataPromises[t]},r.clear=()=>j(e,t);const D=()=>r.refresh({_initial:!0}),P=a.server!==!1&&e.payload.serverRendered;{const o=z();if(o&&!o._nuxtOnBeforeMountCbs){o._nuxtOnBeforeMountCbs=[];const n=o._nuxtOnBeforeMountCbs;O(()=>{n.forEach(f=>{f()}),n.splice(0,n.length)}),B(()=>n.splice(0,n.length))}P&&e.isHydrating&&(r.error.value||d())?(r.pending.value=!1,r.status.value=r.error.value?"error":"success"):o&&(e.payload.serverRendered&&e.isHydrating||a.lazy)&&a.immediate?o._nuxtOnBeforeMountCbs.push(D):a.immediate&&D();const l=H();if(a.watch){const n=E(a.watch,()=>r.refresh());l&&_(n)}const c=e.hook("app:data:refresh",async n=>{(!n||n.includes(t))&&await r.refresh()});l&&_(c)}const h=Promise.resolve(e._asyncDataPromises[t]).then(()=>r);return Object.assign(h,r),h}function j(s,i){i in s.payload.data&&(s.payload.data[i]=void 0),i in s.payload._errors&&(s.payload._errors[i]=null),s._asyncData[i]&&(s._asyncData[i].data.value=void 0,s._asyncData[i].error.value=null,s._asyncData[i].pending.value=!1,s._asyncData[i].status.value="idle"),i in s._asyncDataPromises&&(s._asyncDataPromises[i].cancelled=!0,s._asyncDataPromises[i]=void 0)}function K(s,i){const t={};for(const u of i)t[u]=s[u];return t}export{U as u}; +import{R as C,S as y,T as w,L as b,U as O,V as B,E,W as _,y as M,s as R,i as S,z,X as H}from"./BlS8upJP.js";const T=s=>s==="defer"||s===!1;function U(...s){var m;const i=typeof s[s.length-1]=="string"?s.pop():void 0;typeof s[0]!="string"&&s.unshift(i);let[t,u,a={}]=s;if(typeof t!="string")throw new TypeError("[nuxt] [asyncData] key must be a string.");if(typeof u!="function")throw new TypeError("[nuxt] [asyncData] handler must be a function.");const e=M(),v=u,p=()=>null,g=()=>e.isHydrating?e.payload.data[t]:e.static.data[t];a.server=a.server??!0,a.default=a.default??p,a.getCachedData=a.getCachedData??g,a.lazy=a.lazy??!1,a.immediate=a.immediate??!0,a.deep=a.deep??C.deep,a.dedupe=a.dedupe??"cancel";const d=()=>a.getCachedData(t,e)!=null;if(!e._asyncData[t]||!a.immediate){(m=e.payload._errors)[t]??(m[t]=null);const o=a.deep?y:w;e._asyncData[t]={data:o(a.getCachedData(t,e)??a.default()),pending:y(!d()),error:b(e.payload._errors,t),status:y("idle")}}const r={...e._asyncData[t]};r.refresh=r.execute=(o={})=>{if(e._asyncDataPromises[t]){if(T(o.dedupe??a.dedupe))return e._asyncDataPromises[t];e._asyncDataPromises[t].cancelled=!0}if((o._initial||e.isHydrating&&o._initial!==!1)&&d())return Promise.resolve(a.getCachedData(t,e));r.pending.value=!0,r.status.value="pending";const l=new Promise((c,n)=>{try{c(v(e))}catch(f){n(f)}}).then(async c=>{if(l.cancelled)return e._asyncDataPromises[t];let n=c;a.transform&&(n=await a.transform(c)),a.pick&&(n=K(n,a.pick)),e.payload.data[t]=n,r.data.value=n,r.error.value=null,r.status.value="success"}).catch(c=>{if(l.cancelled)return e._asyncDataPromises[t];r.error.value=R(c),r.data.value=S(a.default()),r.status.value="error"}).finally(()=>{l.cancelled||(r.pending.value=!1,delete e._asyncDataPromises[t])});return e._asyncDataPromises[t]=l,e._asyncDataPromises[t]},r.clear=()=>j(e,t);const D=()=>r.refresh({_initial:!0}),P=a.server!==!1&&e.payload.serverRendered;{const o=z();if(o&&!o._nuxtOnBeforeMountCbs){o._nuxtOnBeforeMountCbs=[];const n=o._nuxtOnBeforeMountCbs;O(()=>{n.forEach(f=>{f()}),n.splice(0,n.length)}),B(()=>n.splice(0,n.length))}P&&e.isHydrating&&(r.error.value||d())?(r.pending.value=!1,r.status.value=r.error.value?"error":"success"):o&&(e.payload.serverRendered&&e.isHydrating||a.lazy)&&a.immediate?o._nuxtOnBeforeMountCbs.push(D):a.immediate&&D();const l=H();if(a.watch){const n=E(a.watch,()=>r.refresh());l&&_(n)}const c=e.hook("app:data:refresh",async n=>{(!n||n.includes(t))&&await r.refresh()});l&&_(c)}const h=Promise.resolve(e._asyncDataPromises[t]).then(()=>r);return Object.assign(h,r),h}function j(s,i){i in s.payload.data&&(s.payload.data[i]=void 0),i in s.payload._errors&&(s.payload._errors[i]=null),s._asyncData[i]&&(s._asyncData[i].data.value=void 0,s._asyncData[i].error.value=null,s._asyncData[i].pending.value=!1,s._asyncData[i].status.value="idle"),i in s._asyncDataPromises&&(s._asyncDataPromises[i].cancelled=!0,s._asyncDataPromises[i]=void 0)}function K(s,i){const t={};for(const u of i)t[u]=s[u];return t}export{U as u}; diff --git a/_nuxt/BQTmeGxM.js b/_nuxt/CSXQV5-h.js similarity index 77% rename from _nuxt/BQTmeGxM.js rename to _nuxt/CSXQV5-h.js index 792720f..1276425 100644 --- a/_nuxt/BQTmeGxM.js +++ b/_nuxt/CSXQV5-h.js @@ -1 +1 @@ -import i from"./DHy7JUVR.js";import{f as s,c as a,a as t,b as m,u as c,o as p}from"./Bu7SZk0z.js";import{u as g}from"./B5qANkaG.js";import{_}from"./Ukwwp72Y.js";import"./pvtjWFi2.js";import"./qxZzs3oh.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";import"./Bkm5lGB3.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";const d={class:"page-wrapper"},l={class:"legal-outer"},f=t("h1",{class:"page-header"},"Terms of Service",-1),I=s({__name:"terms-of-service",setup(u){const o=c(),e=new URL(o.public.baseUrl);e.pathname=_;const r=e.toString();return g({title:"QAComet - Terms of Service",meta:[{name:"description",content:"Terms of Service for QAComet"},{property:"og:image",content:r},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/terms-of-service"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(h,y)=>{const n=i;return p(),a("div",d,[t("div",l,[f,m(n,{path:"/terms-of-service"})])])}}});export{I as default}; +import i from"./Cz78Sion.js";import{f as s,c as a,a as t,b as m,u as c,o as p}from"./BlS8upJP.js";import{u as g}from"./maW11VfC.js";import{_}from"./Czu_W2CL.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./Bse8ef0b.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const d={class:"page-wrapper"},l={class:"legal-outer"},f=t("h1",{class:"page-header"},"Terms of Service",-1),I=s({__name:"terms-of-service",setup(u){const o=c(),e=new URL(o.public.baseUrl);e.pathname=_;const r=e.toString();return g({title:"QAComet - Terms of Service",meta:[{name:"description",content:"Terms of Service for QAComet"},{property:"og:image",content:r},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/terms-of-service"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(h,y)=>{const n=i;return p(),a("div",d,[t("div",l,[f,m(n,{path:"/terms-of-service"})])])}}});export{I as default}; diff --git a/_nuxt/8dPTDCd1.js b/_nuxt/CToKNNT4.js similarity index 63% rename from _nuxt/8dPTDCd1.js rename to _nuxt/CToKNNT4.js index 2cae238..71ea8b2 100644 --- a/_nuxt/8dPTDCd1.js +++ b/_nuxt/CToKNNT4.js @@ -1 +1 @@ -import{_ as r,o,c as t,l as s}from"./Bu7SZk0z.js";const c={};function n(e,a){return o(),t("tr",null,[s(e.$slots,"default")])}const _=r(c,[["render",n]]);export{_ as default}; +import{_ as r,o,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return o(),t("tr",null,[s(e.$slots,"default")])}const _=r(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/BvZyYzvi.js b/_nuxt/CZNwzoXQ.js similarity index 65% rename from _nuxt/BvZyYzvi.js rename to _nuxt/CZNwzoXQ.js index 1d692fc..ce1aa7a 100644 --- a/_nuxt/BvZyYzvi.js +++ b/_nuxt/CZNwzoXQ.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./Bu7SZk0z.js";const a={};function c(e,n){return r(),t("thead",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const a={};function c(e,n){return r(),t("thead",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; diff --git a/_nuxt/CZdjxv7A.js b/_nuxt/CZcQ1mDI.js similarity index 80% rename from _nuxt/CZdjxv7A.js rename to _nuxt/CZcQ1mDI.js index fcfd8c4..e9aa1c1 100644 --- a/_nuxt/CZdjxv7A.js +++ b/_nuxt/CZcQ1mDI.js @@ -1 +1 @@ -import{_ as w}from"./DBoACagk.js";import{f as _,j as n,k as s,o as t,c as l,l as Z,m as V,n as A,a,C as S,i as g,t as H,b as y,d as M,w as $,p as k,e as x,_ as L}from"./Bu7SZk0z.js";const b=["width","height","fill","transform"],z={key:0},B=a("path",{d:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"},null,-1),C=[B],N={key:1},P=a("path",{d:"M216,128l-72,72V56Z",opacity:"0.2"},null,-1),j=a("path",{d:"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z"},null,-1),I=[P,j],U={key:2},E=a("path",{d:"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),R=[E],q={key:3},D=a("path",{d:"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z"},null,-1),Q=[D],T={key:4},W=a("path",{d:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),F=[W],G={key:5},O=a("path",{d:"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z"},null,-1),J=[O],K={name:"PhArrowRight"},X=_({...K,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(e){const o=e,i=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),h=n("mirrored",!1),r=s(()=>o.weight??i),c=s(()=>o.size??u),m=s(()=>o.color??v),p=s(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:h?"scale(-1, 1)":void 0);return(d,f)=>(t(),l("svg",A({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:m.value,transform:p.value},d.$attrs),[Z(d.$slots,"default"),r.value==="bold"?(t(),l("g",z,C)):r.value==="duotone"?(t(),l("g",N,I)):r.value==="fill"?(t(),l("g",U,R)):r.value==="light"?(t(),l("g",q,Q)):r.value==="regular"?(t(),l("g",T,F)):r.value==="thin"?(t(),l("g",G,J)):V("",!0)],16,b))}}),Y=["width","height","fill","transform"],a0={key:0},e0=a("path",{d:"M100,52H40A20,20,0,0,0,20,72v64a20,20,0,0,0,20,20H96v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,100,52Zm-4,80H44V76H96ZM216,52H156a20,20,0,0,0-20,20v64a20,20,0,0,0,20,20h56v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,216,52Zm-4,80H160V76h52Z"},null,-1),t0=[e0],l0={key:1},o0=a("path",{d:"M108,72v72H40a8,8,0,0,1-8-8V72a8,8,0,0,1,8-8h60A8,8,0,0,1,108,72Zm108-8H156a8,8,0,0,0-8,8v64a8,8,0,0,0,8,8h68V72A8,8,0,0,0,216,64Z",opacity:"0.2"},null,-1),r0=a("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),s0=[o0,r0],n0={key:2},i0=a("path",{d:"M116,72v88a48.05,48.05,0,0,1-48,48,8,8,0,0,1,0-16,32,32,0,0,0,32-32v-8H40a16,16,0,0,1-16-16V72A16,16,0,0,1,40,56h60A16,16,0,0,1,116,72ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Z"},null,-1),h0=[i0],c0={key:3},d0=a("path",{d:"M100,58H40A14,14,0,0,0,26,72v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,100,58Zm2,80H40a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2ZM216,58H156a14,14,0,0,0-14,14v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,216,58Zm2,80H156a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2Z"},null,-1),u0=[d0],v0={key:4},m0=a("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),p0=[m0],g0={key:5},H0=a("path",{d:"M100,60H40A12,12,0,0,0,28,72v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,100,60Zm4,80H40a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM216,60H156a12,12,0,0,0-12,12v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,216,60Zm4,80H156a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4Z"},null,-1),y0=[H0],_0={name:"PhQuotes"},V0=_({..._0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(e){const o=e,i=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),h=n("mirrored",!1),r=s(()=>o.weight??i),c=s(()=>o.size??u),m=s(()=>o.color??v),p=s(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:h?"scale(-1, 1)":void 0);return(d,f)=>(t(),l("svg",A({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:m.value,transform:p.value},d.$attrs),[Z(d.$slots,"default"),r.value==="bold"?(t(),l("g",a0,t0)):r.value==="duotone"?(t(),l("g",l0,s0)):r.value==="fill"?(t(),l("g",n0,h0)):r.value==="light"?(t(),l("g",c0,u0)):r.value==="regular"?(t(),l("g",v0,p0)):r.value==="thin"?(t(),l("g",g0,y0)):V("",!0)],16,Y))}}),Z0=e=>(k("data-v-529eaafe"),e=e(),x(),e),A0={class:"testimonial-wrapper"},f0={class:"left"},w0={class:"image-wrapper"},S0=["href"],M0={class:"right"},$0={class:"text-wrapper"},k0={class:"text"},x0={class:"name"},L0=["href"],b0={key:0,class:"see-more-outer"},z0=Z0(()=>a("span",{class:"see-more-text"},"Read Our Case Study",-1)),B0=_({__name:"Testimonial",props:{image:String,imageAlt:String,company:String,companyUrl:String,person:String,personUrl:String,testimonial:String,caseStudy:String},setup(e){const o=e,i=s(()=>({"background-image":'url("'+o.image+'")'}));return(u,v)=>{const h=w;return t(),l("div",A0,[a("div",f0,[a("div",w0,[a("div",{class:"image-container",style:S(g(i))},null,4)]),a("a",{class:"brand-wrapper",href:e.companyUrl},H(e.company),9,S0)]),a("div",M0,[a("div",$0,[y(g(V0),{color:"#f5f5f1"}),a("div",k0,[a("span",null,H(e.testimonial),1),a("span",x0,[M(" — "),a("a",{href:e.personUrl},H(e.person),9,L0)])])]),e.caseStudy?(t(),l("div",b0,[y(h,{to:e.caseStudy,class:"see-more-wrapper"},{default:$(()=>[z0,a("span",null,[y(g(X))])]),_:1},8,["to"])])):V("",!0)])])}}}),P0=L(B0,[["__scopeId","data-v-529eaafe"]]);export{X as F,V0 as G,P0 as _}; +import{_ as S}from"./CFzORWKb.js";import{f as _,j as n,k as s,o as t,c as l,l as Z,m as V,n as A,a,C as f,i as g,t as H,b as y,d as M,w as $,p as k,e as x,_ as L}from"./BlS8upJP.js";const b=["width","height","fill","transform"],z={key:0},B=a("path",{d:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"},null,-1),C=[B],N={key:1},P=a("path",{d:"M216,128l-72,72V56Z",opacity:"0.2"},null,-1),j=a("path",{d:"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z"},null,-1),F=[P,j],I={key:2},U=a("path",{d:"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),E=[U],R={key:3},q=a("path",{d:"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z"},null,-1),D=[q],Q={key:4},T=a("path",{d:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),W=[T],G={key:5},O=a("path",{d:"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z"},null,-1),J=[O],K={name:"PhArrowRight"},X=_({...K,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(e){const o=e,i=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),h=n("mirrored",!1),r=s(()=>o.weight??i),c=s(()=>o.size??u),m=s(()=>o.color??v),p=s(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:h?"scale(-1, 1)":void 0);return(d,w)=>(t(),l("svg",A({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:m.value,transform:p.value},d.$attrs),[Z(d.$slots,"default"),r.value==="bold"?(t(),l("g",z,C)):r.value==="duotone"?(t(),l("g",N,F)):r.value==="fill"?(t(),l("g",I,E)):r.value==="light"?(t(),l("g",R,D)):r.value==="regular"?(t(),l("g",Q,W)):r.value==="thin"?(t(),l("g",G,J)):V("",!0)],16,b))}}),Y=["width","height","fill","transform"],a0={key:0},e0=a("path",{d:"M100,52H40A20,20,0,0,0,20,72v64a20,20,0,0,0,20,20H96v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,100,52Zm-4,80H44V76H96ZM216,52H156a20,20,0,0,0-20,20v64a20,20,0,0,0,20,20h56v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,216,52Zm-4,80H160V76h52Z"},null,-1),t0=[e0],l0={key:1},o0=a("path",{d:"M108,72v72H40a8,8,0,0,1-8-8V72a8,8,0,0,1,8-8h60A8,8,0,0,1,108,72Zm108-8H156a8,8,0,0,0-8,8v64a8,8,0,0,0,8,8h68V72A8,8,0,0,0,216,64Z",opacity:"0.2"},null,-1),r0=a("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),s0=[o0,r0],n0={key:2},i0=a("path",{d:"M116,72v88a48.05,48.05,0,0,1-48,48,8,8,0,0,1,0-16,32,32,0,0,0,32-32v-8H40a16,16,0,0,1-16-16V72A16,16,0,0,1,40,56h60A16,16,0,0,1,116,72ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Z"},null,-1),h0=[i0],c0={key:3},d0=a("path",{d:"M100,58H40A14,14,0,0,0,26,72v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,100,58Zm2,80H40a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2ZM216,58H156a14,14,0,0,0-14,14v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,216,58Zm2,80H156a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2Z"},null,-1),u0=[d0],v0={key:4},m0=a("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),p0=[m0],g0={key:5},H0=a("path",{d:"M100,60H40A12,12,0,0,0,28,72v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,100,60Zm4,80H40a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM216,60H156a12,12,0,0,0-12,12v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,216,60Zm4,80H156a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4Z"},null,-1),y0=[H0],_0={name:"PhQuotes"},V0=_({..._0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(e){const o=e,i=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),h=n("mirrored",!1),r=s(()=>o.weight??i),c=s(()=>o.size??u),m=s(()=>o.color??v),p=s(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:h?"scale(-1, 1)":void 0);return(d,w)=>(t(),l("svg",A({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:m.value,transform:p.value},d.$attrs),[Z(d.$slots,"default"),r.value==="bold"?(t(),l("g",a0,t0)):r.value==="duotone"?(t(),l("g",l0,s0)):r.value==="fill"?(t(),l("g",n0,h0)):r.value==="light"?(t(),l("g",c0,u0)):r.value==="regular"?(t(),l("g",v0,p0)):r.value==="thin"?(t(),l("g",g0,y0)):V("",!0)],16,Y))}}),Z0=e=>(k("data-v-97758cd8"),e=e(),x(),e),A0={class:"testimonial-wrapper"},w0={class:"left"},S0={class:"image-wrapper"},f0=["href"],M0={class:"right"},$0={class:"text-wrapper"},k0={class:"text"},x0={class:"name"},L0=["href"],b0={key:0,class:"see-more-outer"},z0=Z0(()=>a("span",{class:"see-more-text"},"Read Our Case Study",-1)),B0=_({__name:"Testimonial",props:{image:String,imageAlt:String,company:String,companyUrl:String,person:String,personUrl:String,testimonial:String,caseStudy:String},setup(e){const o=e,i=s(()=>({"background-image":'url("'+o.image+'")'}));return(u,v)=>{const h=S;return t(),l("div",A0,[a("div",w0,[a("div",S0,[a("div",{class:"image-container",style:f(g(i))},null,4)]),a("a",{class:"brand-wrapper",href:e.companyUrl},H(e.company),9,f0)]),a("div",M0,[a("div",$0,[y(g(V0),{color:"#F5F6F1"}),a("div",k0,[a("span",null,H(e.testimonial),1),a("span",x0,[M(" — "),a("a",{href:e.personUrl},H(e.person),9,L0)])])]),e.caseStudy?(t(),l("div",b0,[y(h,{to:e.caseStudy,class:"see-more-wrapper"},{default:$(()=>[z0,a("span",null,[y(g(X))])]),_:1},8,["to"])])):V("",!0)])])}}}),P0=L(B0,[["__scopeId","data-v-97758cd8"]]);export{X as F,V0 as G,P0 as _}; diff --git a/_nuxt/DUi0I8oe.js b/_nuxt/C_1yPr0e.js similarity index 85% rename from _nuxt/DUi0I8oe.js rename to _nuxt/C_1yPr0e.js index ff86bdc..d9de803 100644 --- a/_nuxt/DUi0I8oe.js +++ b/_nuxt/C_1yPr0e.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./Bu7SZk0z.js";const l=["id"],p=["href"],k=d({__name:"ProseH4",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h4)});return(e,m)=>(s(),n("h4",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH4",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h4)});return(e,m)=>(s(),n("h4",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/D9PIjOys.js b/_nuxt/Cn1tIV_T.js similarity index 86% rename from _nuxt/D9PIjOys.js rename to _nuxt/Cn1tIV_T.js index 866ac65..dfe2b45 100644 --- a/_nuxt/D9PIjOys.js +++ b/_nuxt/Cn1tIV_T.js @@ -1 +1 @@ -import{_ as h}from"./DBoACagk.js";import{u as _}from"./Bb9rc-i1.js";import{q as m}from"./Du3a2oyP.js";import{u as g}from"./B5qANkaG.js";import{f as y,h as w,c as n,a as t,F as u,r as f,i as v,o as a,t as o,b as l,w as d,d as i}from"./Bu7SZk0z.js";import"./D3rhYO6_.js";const k={class:"blog-outer"},C={class:"blog-wrapper"},b=t("div",{class:"blog-header"},[t("h1",null,"Playwright Internals"),t("h2",{class:"subheader"},"A series on the inner workings of Microsoft's Playwright framework")],-1),x={class:"content-wrapper"},A={class:"blog-post-wrapper"},P={class:"date-wrapper"},Q={class:"month"},q={class:"day"},D={class:"year"},N={class:"description-wrapper"},E=y({__name:"index",async setup(B){let r,s;const{data:p}=([r,s]=w(()=>_("playwright-posts",()=>m("/playwright").only(["title","link","created","shortDescription"]).sort({"created.number":-1,$numeric:!0}).find())),r=await r,s(),r);return g({title:"QAComet | Internals of Playwright",meta:[{name:"description",content:"Have you ever wanted to dive into the internals of Playwright? This series of posts will take you deep into the inner workings of Playwright."},{property:"og:image",content:"https://qacomet.com/img/playwright/architecture_of_playwright_linkedin.jpg"},{property:"og:image:width",content:"1200"},{property:"og:image:height",content:"630"},{property:"og:title",content:"QAComet | Internals of Playwright"},{property:"og:url",content:"https://qacomet.com/playwright"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Have you ever wanted to dive into the internals of Playwright? This series of posts will take you deep into the inner workings of Playwright."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(H,I)=>{const c=h;return a(),n("div",k,[t("div",C,[b,t("div",x,[(a(!0),n(u,null,f(v(p),e=>(a(),n("div",A,[t("div",P,[t("div",Q,o(e.created.month),1),t("div",q,o(e.created.day),1),t("div",D,o(e.created.year),1)]),t("div",N,[t("h3",null,[l(c,{to:e.link},{default:d(()=>[i(o(e.title),1)]),_:2},1032,["to"])]),t("p",null,[i(o(e.shortDescription)+" ",1),l(c,{class:"read",to:e.link},{default:d(()=>[i("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{E as default}; +import{_ as h}from"./CFzORWKb.js";import{u as _}from"./CRh1_mKz.js";import{q as m}from"./DF1VbFfH.js";import{u as g}from"./maW11VfC.js";import{f as y,h as w,c as n,a as t,F as u,r as f,i as v,o as a,t as o,b as l,w as d,d as i}from"./BlS8upJP.js";import"./BECgZIvk.js";const k={class:"blog-outer"},C={class:"blog-wrapper"},b=t("div",{class:"blog-header"},[t("h1",null,"Playwright Internals"),t("h2",{class:"subheader"},"A series on the inner workings of Microsoft's Playwright framework")],-1),x={class:"content-wrapper"},A={class:"blog-post-wrapper"},P={class:"date-wrapper"},Q={class:"month"},q={class:"day"},D={class:"year"},N={class:"description-wrapper"},E=y({__name:"index",async setup(B){let r,s;const{data:p}=([r,s]=w(()=>_("playwright-posts",()=>m("/playwright").only(["title","link","created","shortDescription"]).sort({"created.number":-1,$numeric:!0}).find())),r=await r,s(),r);return g({title:"QAComet | Internals of Playwright",meta:[{name:"description",content:"Have you ever wanted to dive into the internals of Playwright? This series of posts will take you deep into the inner workings of Playwright."},{property:"og:image",content:"https://qacomet.com/img/playwright/architecture_of_playwright_linkedin.jpg"},{property:"og:image:width",content:"1200"},{property:"og:image:height",content:"630"},{property:"og:title",content:"QAComet | Internals of Playwright"},{property:"og:url",content:"https://qacomet.com/playwright"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Have you ever wanted to dive into the internals of Playwright? This series of posts will take you deep into the inner workings of Playwright."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(H,I)=>{const c=h;return a(),n("div",k,[t("div",C,[b,t("div",x,[(a(!0),n(u,null,f(v(p),e=>(a(),n("div",A,[t("div",P,[t("div",Q,o(e.created.month),1),t("div",q,o(e.created.day),1),t("div",D,o(e.created.year),1)]),t("div",N,[t("h3",null,[l(c,{to:e.link},{default:d(()=>[i(o(e.title),1)]),_:2},1032,["to"])]),t("p",null,[i(o(e.shortDescription)+" ",1),l(c,{class:"read",to:e.link},{default:d(()=>[i("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{E as default}; diff --git a/_nuxt/BDF7_qnw.js b/_nuxt/Cst9DoAH.js similarity index 65% rename from _nuxt/BDF7_qnw.js rename to _nuxt/Cst9DoAH.js index 8871824..7a9dd4b 100644 --- a/_nuxt/BDF7_qnw.js +++ b/_nuxt/Cst9DoAH.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./Bu7SZk0z.js";const a={};function c(e,l){return r(),t("table",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const a={};function c(e,l){return r(),t("table",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; diff --git a/_nuxt/DHy7JUVR.js b/_nuxt/Cz78Sion.js similarity index 87% rename from _nuxt/DHy7JUVR.js rename to _nuxt/Cz78Sion.js index 4328d5c..bab2b2d 100644 --- a/_nuxt/DHy7JUVR.js +++ b/_nuxt/Cz78Sion.js @@ -1 +1 @@ -import{i as d,E as w,q as y,G as D,u as g,f as H,H as q,I as S,J as u}from"./Bu7SZk0z.js";import{u as _}from"./B5qANkaG.js";import b from"./pvtjWFi2.js";import x from"./Bkm5lGB3.js";import"./qxZzs3oh.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";const a=(p,s=y())=>{const e=d(p),f=g();w(()=>d(p),(n=e)=>{if(!s.path||!n)return;const t=Object.assign({},(n==null?void 0:n.head)||{});t.meta=[...t.meta||[]],t.link=[...t.link||[]];const r=t.title||(n==null?void 0:n.title);r&&(t.title=r),f.public.content.host;const c=(t==null?void 0:t.description)||(n==null?void 0:n.description);c&&t.meta.filter(l=>l.name==="description").length===0&&t.meta.push({name:"description",content:c}),t!=null&&t.image||(n==null||n.image),D(()=>_(t))},{immediate:!0})},$=H({name:"ContentDoc",props:{tag:{type:String,required:!1,default:"div"},excerpt:{type:Boolean,default:!1},path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0},head:{type:Boolean,required:!1,default:void 0}},render(p){const{contentHead:s}=g().public.content,e=q(),{tag:f,excerpt:m,path:n,query:t,head:r}=p,c=r===void 0?s:r,l={...t||{},path:n||(t==null?void 0:t.path)||S(y().path),find:"one"},C=(o,i)=>u("pre",null,JSON.stringify({message:"You should use slots with ",slot:o,data:i},null,2));return u(x,l,{default:e!=null&&e.default?({data:o,refresh:i,isPartial:v})=>{var h;return c&&a(o),(h=e.default)==null?void 0:h.call(e,{doc:o,refresh:i,isPartial:v,excerpt:m,...this.$attrs})}:({data:o})=>(c&&a(o),u(b,{value:o,excerpt:m,tag:f,...this.$attrs},{empty:i=>e!=null&&e.empty?e.empty(i):C("default",o)})),empty:o=>{var i;return((i=e==null?void 0:e.empty)==null?void 0:i.call(e,o))||u("p",null,"Document is empty, overwrite this content with #empty slot in .")},"not-found":o=>{var i;return((i=e==null?void 0:e["not-found"])==null?void 0:i.call(e,o))||u("p",null,"Document not found, overwrite this content with #not-found slot in .")}})}}),E=$;export{E as default}; +import{i as d,E as w,q as y,G as D,u as g,f as H,H as q,I as S,J as u}from"./BlS8upJP.js";import{u as _}from"./maW11VfC.js";import b from"./BxiCSTFT.js";import x from"./Bse8ef0b.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const a=(p,s=y())=>{const e=d(p),f=g();w(()=>d(p),(n=e)=>{if(!s.path||!n)return;const t=Object.assign({},(n==null?void 0:n.head)||{});t.meta=[...t.meta||[]],t.link=[...t.link||[]];const r=t.title||(n==null?void 0:n.title);r&&(t.title=r),f.public.content.host;const c=(t==null?void 0:t.description)||(n==null?void 0:n.description);c&&t.meta.filter(l=>l.name==="description").length===0&&t.meta.push({name:"description",content:c}),t!=null&&t.image||(n==null||n.image),D(()=>_(t))},{immediate:!0})},$=H({name:"ContentDoc",props:{tag:{type:String,required:!1,default:"div"},excerpt:{type:Boolean,default:!1},path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0},head:{type:Boolean,required:!1,default:void 0}},render(p){const{contentHead:s}=g().public.content,e=q(),{tag:f,excerpt:m,path:n,query:t,head:r}=p,c=r===void 0?s:r,l={...t||{},path:n||(t==null?void 0:t.path)||S(y().path),find:"one"},C=(o,i)=>u("pre",null,JSON.stringify({message:"You should use slots with ",slot:o,data:i},null,2));return u(x,l,{default:e!=null&&e.default?({data:o,refresh:i,isPartial:v})=>{var h;return c&&a(o),(h=e.default)==null?void 0:h.call(e,{doc:o,refresh:i,isPartial:v,excerpt:m,...this.$attrs})}:({data:o})=>(c&&a(o),u(b,{value:o,excerpt:m,tag:f,...this.$attrs},{empty:i=>e!=null&&e.empty?e.empty(i):C("default",o)})),empty:o=>{var i;return((i=e==null?void 0:e.empty)==null?void 0:i.call(e,o))||u("p",null,"Document is empty, overwrite this content with #empty slot in .")},"not-found":o=>{var i;return((i=e==null?void 0:e["not-found"])==null?void 0:i.call(e,o))||u("p",null,"Document not found, overwrite this content with #not-found slot in .")}})}}),E=$;export{E as default}; diff --git a/_nuxt/Czu_W2CL.js b/_nuxt/Czu_W2CL.js new file mode 100644 index 0000000..0ded20c --- /dev/null +++ b/_nuxt/Czu_W2CL.js @@ -0,0 +1 @@ +import"./BlS8upJP.js";const o=""+new URL("open-graph-banner.Cso2_SHa.jpg",import.meta.url).href;export{o as _}; diff --git a/_nuxt/tGLQVeD8.js b/_nuxt/D2xr6gf6.js similarity index 85% rename from _nuxt/tGLQVeD8.js rename to _nuxt/D2xr6gf6.js index 63f1a02..0e1e21b 100644 --- a/_nuxt/tGLQVeD8.js +++ b/_nuxt/D2xr6gf6.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./Bu7SZk0z.js";const l=["id"],p=["href"],k=d({__name:"ProseH3",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h3)});return(e,m)=>(s(),n("h3",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH3",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h3)});return(e,m)=>(s(),n("h3",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/Du3a2oyP.js b/_nuxt/DF1VbFfH.js similarity index 93% rename from _nuxt/Du3a2oyP.js rename to _nuxt/DF1VbFfH.js index c6e4b42..570310a 100644 --- a/_nuxt/Du3a2oyP.js +++ b/_nuxt/DF1VbFfH.js @@ -1,7 +1,7 @@ function __vite__mapDeps(indexes) { if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["./CiI5X-ZH.js","./Bu7SZk0z.js","./entry.Ck87SGOn.css","./BsYmvPZw.js","./D3rhYO6_.js"] + __vite__mapDeps.viteFileDeps = ["./CFwVd7gV.js","./BlS8upJP.js","./entry.DiT2Mvoi.css","./BsYmvPZw.js","./BECgZIvk.js"] } return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) } -import{N as P,u as h,O as $,P as b,Q as C,K as E}from"./Bu7SZk0z.js";import{u as w,h as l}from"./D3rhYO6_.js";const d=(t,r)=>r.split(".").reduce((n,i)=>n&&n[i],t),f=(t,r)=>Object.keys(t).filter(r).reduce((n,i)=>Object.assign(n,{[i]:t[i]}),{}),T=t=>r=>t&&t.length?f(r,n=>!t.includes(n)):r,B=t=>r=>Array.isArray(r)?r.map(n=>t(n)):t(r),g=t=>{const r=[],n=[];for(const i of t)["$","_"].includes(i)?r.push(i):n.push(i);return{prefixes:r,properties:n}},j=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>!i.includes(s)&&!n.includes(s[0]))},q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>i.includes(s)||n.includes(s[0]))},Q=(t,r)=>{const n=new Intl.Collator(r.$locale,{numeric:r.$numeric,caseFirst:r.$caseFirst,sensitivity:r.$sensitivity}),i=Object.keys(r).filter(s=>!s.startsWith("$"));for(const s of i)t=t.sort((a,e)=>{const o=[d(a,s),d(e,s)].map(c=>{if(c!==null)return c instanceof Date?c.toISOString():c});return r[s]===-1&&o.reverse(),n.compare(o[0],o[1])});return t},I=(t,r="Expected an array")=>{if(!Array.isArray(t))throw new TypeError(r)},u=t=>Array.isArray(t)?t:[void 0,null].includes(t)?[]:[t],S=["sort","where","only","without"];function x(t,r={}){const n={};for(const e of Object.keys(r.initialParams||{}))n[e]=S.includes(e)?u(r.initialParams[e]):r.initialParams[e];const i=(e,o=c=>c)=>(...c)=>(n[e]=o(...c),a),s=e=>{var o;return r.legacy?e!=null&&e.surround?e.surround:e&&(e!=null&&e.dirConfig&&(e.result={_path:(o=e.dirConfig)==null?void 0:o._path,...e.result,_dir:e.dirConfig}),e!=null&&e._path||Array.isArray(e)||!Object.prototype.hasOwnProperty.call(e,"result")?e:e==null?void 0:e.result):e},a={params:()=>({...n,...n.where?{where:[...u(n.where)]}:{},...n.sort?{sort:[...u(n.sort)]}:{}}),only:i("only",u),without:i("without",u),where:i("where",e=>[...u(n.where),...u(e)]),sort:i("sort",e=>[...u(n.sort),...u(e)]),limit:i("limit",e=>parseInt(String(e),10)),skip:i("skip",e=>parseInt(String(e),10)),find:()=>t(a).then(s),findOne:()=>t(i("first")(!0)).then(s),count:()=>t(i("count")(!0)).then(s),locale:e=>a.where({_locale:e}),withSurround:i("surround",(e,o)=>({query:e,...o})),withDirConfig:()=>i("dirConfig")(!0)};return r.legacy&&(a.findSurround=(e,o)=>a.withSurround(e,o).find().then(s)),a}function m(t){return JSON.stringify(t,O)}function O(t,r){return r instanceof RegExp?`--REGEX ${r.toString()}`:r}const A=t=>{let r=m(t);return r=typeof Buffer<"u"?Buffer.from(r).toString("base64"):btoa(r),r=r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),(r.match(/.{1,100}/g)||[]).join("/")},y=t=>P(t,h().public.content.api.baseURL),F=()=>{throw console.warn("useContent is only accessible when you are using `documentDriven` mode."),console.warn("Learn more by visiting: https://content.nuxt.com/document-driven"),new Error("useContent is only accessible when you are using `documentDriven` mode.")},D=()=>{const{experimental:t}=h().public.content;return t.clientDB?!0:w().isEnabled()},v=()=>async t=>{const{content:r}=h().public,n=t.params(),i=r.experimental.stripQueryParameters?y(`/query/${`${l(n)}.${r.integrity}`}/${A(n)}.json`):y(`/query/${l(n)}.${r.integrity}.json`);if(D())return(await E(()=>import("./CiI5X-ZH.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url).then(e=>e.useContentDatabase())).fetch(t);const s=await $fetch(i,{method:"GET",responseType:"json",params:r.experimental.stripQueryParameters?void 0:{_params:m(n),previewToken:w().getPreviewToken()}});if(typeof s=="string"&&s.startsWith(""))throw new Error("Not found");return s};function K(t,...r){const{content:n}=h().public,i=x(v(),{initialParams:typeof t!="string"?t:{},legacy:!0});let s;typeof t=="string"&&(s=$(b(t,...r)));const a=i.params;return i.params=()=>{var o,c,p;const e=a();return s&&(e.where=e.where||[],e.first&&(e.where||[]).length===0?e.where.push({_path:C(s)}):e.where.push({_path:new RegExp(`^${s.replace(/[-[\]{}()*+.,^$\s/]/g,"\\$&")}`)})),(o=e.sort)!=null&&o.length||(e.sort=[{_file:1,$numeric:!0}]),n.locales.length&&((p=(c=e.where)==null?void 0:c.find(_=>_._locale))!=null&&p._locale||(e.where=e.where||[],e.where.push({_locale:n.defaultLocale}))),e},i}export{I as a,u as b,Q as c,B as d,A as e,j as f,d as g,q as h,x as i,m as j,T as o,K as q,D as s,F as u,y as w}; +import{N as P,u as h,O as $,P as b,Q as C,K as E}from"./BlS8upJP.js";import{u as w,h as l}from"./BECgZIvk.js";const d=(t,r)=>r.split(".").reduce((n,i)=>n&&n[i],t),f=(t,r)=>Object.keys(t).filter(r).reduce((n,i)=>Object.assign(n,{[i]:t[i]}),{}),T=t=>r=>t&&t.length?f(r,n=>!t.includes(n)):r,B=t=>r=>Array.isArray(r)?r.map(n=>t(n)):t(r),g=t=>{const r=[],n=[];for(const i of t)["$","_"].includes(i)?r.push(i):n.push(i);return{prefixes:r,properties:n}},j=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>!i.includes(s)&&!n.includes(s[0]))},q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>i.includes(s)||n.includes(s[0]))},Q=(t,r)=>{const n=new Intl.Collator(r.$locale,{numeric:r.$numeric,caseFirst:r.$caseFirst,sensitivity:r.$sensitivity}),i=Object.keys(r).filter(s=>!s.startsWith("$"));for(const s of i)t=t.sort((a,e)=>{const o=[d(a,s),d(e,s)].map(c=>{if(c!==null)return c instanceof Date?c.toISOString():c});return r[s]===-1&&o.reverse(),n.compare(o[0],o[1])});return t},I=(t,r="Expected an array")=>{if(!Array.isArray(t))throw new TypeError(r)},u=t=>Array.isArray(t)?t:[void 0,null].includes(t)?[]:[t],S=["sort","where","only","without"];function x(t,r={}){const n={};for(const e of Object.keys(r.initialParams||{}))n[e]=S.includes(e)?u(r.initialParams[e]):r.initialParams[e];const i=(e,o=c=>c)=>(...c)=>(n[e]=o(...c),a),s=e=>{var o;return r.legacy?e!=null&&e.surround?e.surround:e&&(e!=null&&e.dirConfig&&(e.result={_path:(o=e.dirConfig)==null?void 0:o._path,...e.result,_dir:e.dirConfig}),e!=null&&e._path||Array.isArray(e)||!Object.prototype.hasOwnProperty.call(e,"result")?e:e==null?void 0:e.result):e},a={params:()=>({...n,...n.where?{where:[...u(n.where)]}:{},...n.sort?{sort:[...u(n.sort)]}:{}}),only:i("only",u),without:i("without",u),where:i("where",e=>[...u(n.where),...u(e)]),sort:i("sort",e=>[...u(n.sort),...u(e)]),limit:i("limit",e=>parseInt(String(e),10)),skip:i("skip",e=>parseInt(String(e),10)),find:()=>t(a).then(s),findOne:()=>t(i("first")(!0)).then(s),count:()=>t(i("count")(!0)).then(s),locale:e=>a.where({_locale:e}),withSurround:i("surround",(e,o)=>({query:e,...o})),withDirConfig:()=>i("dirConfig")(!0)};return r.legacy&&(a.findSurround=(e,o)=>a.withSurround(e,o).find().then(s)),a}function m(t){return JSON.stringify(t,O)}function O(t,r){return r instanceof RegExp?`--REGEX ${r.toString()}`:r}const A=t=>{let r=m(t);return r=typeof Buffer<"u"?Buffer.from(r).toString("base64"):btoa(r),r=r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),(r.match(/.{1,100}/g)||[]).join("/")},y=t=>P(t,h().public.content.api.baseURL),F=()=>{throw console.warn("useContent is only accessible when you are using `documentDriven` mode."),console.warn("Learn more by visiting: https://content.nuxt.com/document-driven"),new Error("useContent is only accessible when you are using `documentDriven` mode.")},D=()=>{const{experimental:t}=h().public.content;return t.clientDB?!0:w().isEnabled()},v=()=>async t=>{const{content:r}=h().public,n=t.params(),i=r.experimental.stripQueryParameters?y(`/query/${`${l(n)}.${r.integrity}`}/${A(n)}.json`):y(`/query/${l(n)}.${r.integrity}.json`);if(D())return(await E(()=>import("./CFwVd7gV.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url).then(e=>e.useContentDatabase())).fetch(t);const s=await $fetch(i,{method:"GET",responseType:"json",params:r.experimental.stripQueryParameters?void 0:{_params:m(n),previewToken:w().getPreviewToken()}});if(typeof s=="string"&&s.startsWith(""))throw new Error("Not found");return s};function K(t,...r){const{content:n}=h().public,i=x(v(),{initialParams:typeof t!="string"?t:{},legacy:!0});let s;typeof t=="string"&&(s=$(b(t,...r)));const a=i.params;return i.params=()=>{var o,c,p;const e=a();return s&&(e.where=e.where||[],e.first&&(e.where||[]).length===0?e.where.push({_path:C(s)}):e.where.push({_path:new RegExp(`^${s.replace(/[-[\]{}()*+.,^$\s/]/g,"\\$&")}`)})),(o=e.sort)!=null&&o.length||(e.sort=[{_file:1,$numeric:!0}]),n.locales.length&&((p=(c=e.where)==null?void 0:c.find(_=>_._locale))!=null&&p._locale||(e.where=e.where||[],e.where.push({_locale:n.defaultLocale}))),e},i}export{I as a,u as b,Q as c,B as d,A as e,j as f,d as g,q as h,x as i,m as j,T as o,K as q,D as s,F as u,y as w}; diff --git a/_nuxt/DOMMcfGQ.js b/_nuxt/DOMMcfGQ.js deleted file mode 100644 index ecd4feb..0000000 --- a/_nuxt/DOMMcfGQ.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./CLiedZiS.js";import{u as o}from"./B5qANkaG.js";import{f as r,g as i,o as n}from"./Bu7SZk0z.js";import"./DBoACagk.js";import"./pvtjWFi2.js";import"./qxZzs3oh.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";import"./Bb9rc-i1.js";import"./Du3a2oyP.js";const f=r({__name:"architecture",setup(a){return o({title:"Architecture of Playwright",meta:[{name:"description",content:"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components."},{property:"og:image",content:"https://qacomet.com/img/playwright/architecture_diagram.jpg"},{property:"og:image:width",content:"800"},{property:"og:image:height",content:"500"},{property:"og:title",content:"QAComet | Architecture of Playwright"},{property:"og:url",content:"https://qacomet.com/playwright/how-playwright-initializes"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Let's dive into Playwright's internals by looking at how the project is structured and discover it's essential components."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(c,p)=>{const t=e;return n(),i(t,{path:"playwright/architecture"})}}});export{f as default}; diff --git a/_nuxt/Dtop_YE0.js b/_nuxt/DQA0lbK1.js similarity index 85% rename from _nuxt/Dtop_YE0.js rename to _nuxt/DQA0lbK1.js index 5c1cc38..8074549 100644 --- a/_nuxt/Dtop_YE0.js +++ b/_nuxt/DQA0lbK1.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./Bu7SZk0z.js";const l=["id"],p=["href"],k=d({__name:"ProseH5",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h5)});return(e,m)=>(s(),n("h5",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH5",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h5)});return(e,m)=>(s(),n("h5",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/qxZzs3oh.js b/_nuxt/DQv0CMQg.js similarity index 99% rename from _nuxt/qxZzs3oh.js rename to _nuxt/DQv0CMQg.js index 7341ef8..d78cfe5 100644 --- a/_nuxt/qxZzs3oh.js +++ b/_nuxt/DQv0CMQg.js @@ -1 +1 @@ -import{f as j,z as ln,Y as en,k as w,J as z,A as on,Z as P,$ as tn,a0 as rn,o as an,g as un,i as sn}from"./Bu7SZk0z.js";import{p as F,k as cn}from"./BsYmvPZw.js";import{u as pn}from"./D3rhYO6_.js";class S{constructor(l,o,t){this.property=l,this.normal=o,t&&(this.space=t)}}S.prototype.property={};S.prototype.normal={};S.prototype.space=null;function H(n,l){const o={},t={};let r=-1;for(;++r4&&o.slice(0,4)==="data"&&mn.test(l)){if(l.charAt(4)==="-"){const a=l.slice(5).replace(_,kn);t="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=l.slice(4);if(!_.test(a)){let i=a.replace(yn,bn);i.charAt(0)!=="-"&&(i="-"+i),l="data"+i}}r=T}return new r(t,l)}function bn(n){return"-"+n.toLowerCase()}function kn(n){return n.charAt(1).toUpperCase()}const Cn=H([q,N,X,Y,hn],"html");H([q,N,X,Y,fn],"svg");const A=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],R="default",$=/^@|^v-on:/,Z=/^:|^v-bind:/,J=/^v-model/,Sn=["select","textarea","input"],xn=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(n=>[n,`prose-${n}`])),wn=j({name:"MDCRenderer",props:{body:{type:Object,required:!0},data:{type:Object,default:()=>({})},tag:{type:[String,Boolean],default:void 0},prose:{type:Boolean,default:void 0},components:{type:Object,default:()=>({})}},async setup(n){var i,s,c,g,m,p,y,B;const l=(c=(s=(i=ln())==null?void 0:i.appContext)==null?void 0:s.app)==null?void 0:c.$nuxt,o=(l==null?void 0:l.$route)||(l==null?void 0:l._route),{mdc:t}=((g=l==null?void 0:l.$config)==null?void 0:g.public)||{},r={...(m=t==null?void 0:t.components)!=null&&m.prose&&n.prose!==!1?xn:{},...((p=t==null?void 0:t.components)==null?void 0:p.map)||{},...en(((B=(y=n.data)==null?void 0:y.mdc)==null?void 0:B.components)||{}),...n.components},a=w(()=>{var U;const nn=(((U=n.body)==null?void 0:U.children)||[]).map(x=>x.tag||x.type).filter(x=>!A.includes(x));return Array.from(new Set(nn)).sort().join(".")});return await Un(n.body,{tags:r}),{tags:r,contentKey:a,route:o}},render(n){var m,p,y;const{tags:l,tag:o,body:t,data:r,contentKey:a,route:i}=n;if(!t)return null;const s={...r,tags:l,$route:i},c=o!==!1?E(o||((m=s.component)==null?void 0:m.name)||s.component||"div"):void 0,g=G(t,z,s,s);return c?z(c,{...(p=s.component)==null?void 0:p.props,...this.$attrs,key:a},g):(y=g.default)==null?void 0:y.call(g)}});function Pn(n,l,o,t={}){if(n.type==="text")return l(P,n.value);if(n.type==="comment")return l(tn,null,n.value);const r=n.tag,a=Q(n,o.tags);if(n.tag==="binding")return On(n,l,o,t);const i=E(a);typeof i=="object"&&(i.tag=r);const s=Dn(n,o);return l(i,s,G(n,l,o,{...t,...s}))}function On(n,l,o,t={}){var g,m;const r={...t,$document:o,$doc:o},a=/\.|\[(\d+)\]/,s=((g=n.props)==null?void 0:g.value.trim().split(a).filter(Boolean)).reduce((p,y)=>{if(p&&y in p)return typeof p[y]=="function"?p[y]():p[y]},r),c=(m=n.props)==null?void 0:m.defaultValue;return l(P,s??c??"")}function G(n,l,o,t){const a=(n.children||[]).reduce((s,c)=>{if(!En(c))return s[R].push(c),s;const g=An(c);return s[g]=s[g]||[],c.type==="element"&&s[g].push(...c.children||[]),s},{[R]:[]});return Object.entries(a).reduce((s,[c,g])=>(g.length&&(s[c]=()=>{const m=g.map(p=>Pn(p,l,o,t));return Bn(m)}),s),{})}function Dn(n,l){const{tag:o="",props:t={}}=n;return Object.keys(t).reduce(function(r,a){if(a==="__ignoreMap")return r;const i=t[a];if(J.test(a)&&!Sn.includes(o))return Ln(a,i,r,l);if(a==="v-bind")return Mn(a,i,r,l);if($.test(a))return Rn(a,i,r,l);if(Z.test(a))return Tn(a,i,r,l);const{attribute:s}=vn(Cn,a);return Array.isArray(i)&&i.every(c=>typeof c=="string")?(r[s]=i.join(" "),r):(r[s]=i,r)},{})}function Ln(n,l,o,t){const r=p=>+p,a=p=>p.trim(),i=p=>p,s=n.replace(J,"").split(".").filter(p=>p).reduce((p,y)=>(p[y]=!0,p),{}),c="value",g=s.lazy?"change":"input",m=s.number?r:s.trim?a:i;return o[c]=O(l,t),o.on=o.on||{},o.on[g]=p=>t[l]=m(p),o}function Mn(n,l,o,t){const r=O(l,t);return o=Object.assign(o,r),o}function Rn(n,l,o,t){return n=n.replace($,""),o.on=o.on||{},o.on[n]=()=>O(l,t),o}function Tn(n,l,o,t){return n=n.replace(Z,""),o[n]=O(l,t),o}const E=n=>{if(!A.includes(n)&&!(n!=null&&n.render)&&!(n!=null&&n.ssrRender)){const l=on(F(n),!1);if(typeof l=="object")return l}return n};function O(n,l){const o=n.split(".").reduce((t,r)=>typeof t=="object"?t[r]:void 0,l);return typeof o>"u"?rn(n):o}function An(n){let l="";for(const o of Object.keys(n.props||{}))if(!(!o.startsWith("#")&&!o.startsWith("v-slot:"))){l=o.split(/[:#]/,2)[1];break}return l||R}function En(n){return n.tag==="template"}function Bn(n){const l=[];for(const o of n){const t=l[l.length-1];o.type===P&&(t==null?void 0:t.type)===P?t.children=t.children+o.children:l.push(o)}return l}async function Un(n,l){if(!n)return;const o=Array.from(new Set(t(n,l)));await Promise.all(o.map(async r=>{if(r!=null&&r.render||r!=null&&r.ssrRender||r!=null&&r.__ssrInlineRender)return;const a=E(r);a!=null&&a.__asyncLoader&&!a.__asyncResolved&&await a.__asyncLoader()}));function t(r,a){const i=r.tag;if(r.type==="text"||i==="binding"||r.type==="comment")return[];const s=Q(r,a.tags),c=[];r.type!=="root"&&!A.includes(s)&&c.push(s);for(const g of r.children||[])c.push(...t(g,a));return c}}function Q(n,l){var t;const o=n.tag;return!o||typeof((t=n.props)==null?void 0:t.__ignoreMap)<"u"?o:l[o]||l[F(o)]||l[cn(n.tag)]||o}const jn=j({__name:"ContentRendererMarkdown",props:{value:{type:Object,required:!0},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"},components:{type:Object,default:()=>({})},data:{type:Object,default:()=>({})}},setup(n){const l=n,o=pn().isEnabled(),t=w(()=>{let i=l.value.body||l.value;return l.excerpt&&l.value.excerpt&&(i=l.value.excerpt),i}),r=w(()=>{const{body:i,excerpt:s,...c}=l.value;return{...c,...l.data}}),a=w(()=>({...l.components,...r.value._components||{}}));return(i,s)=>{const c=wn;return an(),un(c,{body:t.value,data:r.value,tag:n.tag,components:a.value,"data-content-id":sn(o)?n.value._id:void 0},null,8,["body","data","tag","components","data-content-id"])}}});export{jn as _}; +import{f as j,z as ln,Y as en,k as w,J as z,A as on,Z as P,$ as tn,a0 as rn,o as an,g as un,i as sn}from"./BlS8upJP.js";import{p as F,k as cn}from"./BsYmvPZw.js";import{u as pn}from"./BECgZIvk.js";class S{constructor(l,o,t){this.property=l,this.normal=o,t&&(this.space=t)}}S.prototype.property={};S.prototype.normal={};S.prototype.space=null;function H(n,l){const o={},t={};let r=-1;for(;++r4&&o.slice(0,4)==="data"&&mn.test(l)){if(l.charAt(4)==="-"){const a=l.slice(5).replace(_,kn);t="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=l.slice(4);if(!_.test(a)){let i=a.replace(yn,bn);i.charAt(0)!=="-"&&(i="-"+i),l="data"+i}}r=T}return new r(t,l)}function bn(n){return"-"+n.toLowerCase()}function kn(n){return n.charAt(1).toUpperCase()}const Cn=H([q,N,X,Y,hn],"html");H([q,N,X,Y,fn],"svg");const A=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],R="default",$=/^@|^v-on:/,Z=/^:|^v-bind:/,J=/^v-model/,Sn=["select","textarea","input"],xn=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(n=>[n,`prose-${n}`])),wn=j({name:"MDCRenderer",props:{body:{type:Object,required:!0},data:{type:Object,default:()=>({})},tag:{type:[String,Boolean],default:void 0},prose:{type:Boolean,default:void 0},components:{type:Object,default:()=>({})}},async setup(n){var i,s,c,g,m,p,y,B;const l=(c=(s=(i=ln())==null?void 0:i.appContext)==null?void 0:s.app)==null?void 0:c.$nuxt,o=(l==null?void 0:l.$route)||(l==null?void 0:l._route),{mdc:t}=((g=l==null?void 0:l.$config)==null?void 0:g.public)||{},r={...(m=t==null?void 0:t.components)!=null&&m.prose&&n.prose!==!1?xn:{},...((p=t==null?void 0:t.components)==null?void 0:p.map)||{},...en(((B=(y=n.data)==null?void 0:y.mdc)==null?void 0:B.components)||{}),...n.components},a=w(()=>{var U;const nn=(((U=n.body)==null?void 0:U.children)||[]).map(x=>x.tag||x.type).filter(x=>!A.includes(x));return Array.from(new Set(nn)).sort().join(".")});return await Un(n.body,{tags:r}),{tags:r,contentKey:a,route:o}},render(n){var m,p,y;const{tags:l,tag:o,body:t,data:r,contentKey:a,route:i}=n;if(!t)return null;const s={...r,tags:l,$route:i},c=o!==!1?E(o||((m=s.component)==null?void 0:m.name)||s.component||"div"):void 0,g=G(t,z,s,s);return c?z(c,{...(p=s.component)==null?void 0:p.props,...this.$attrs,key:a},g):(y=g.default)==null?void 0:y.call(g)}});function Pn(n,l,o,t={}){if(n.type==="text")return l(P,n.value);if(n.type==="comment")return l(tn,null,n.value);const r=n.tag,a=Q(n,o.tags);if(n.tag==="binding")return On(n,l,o,t);const i=E(a);typeof i=="object"&&(i.tag=r);const s=Dn(n,o);return l(i,s,G(n,l,o,{...t,...s}))}function On(n,l,o,t={}){var g,m;const r={...t,$document:o,$doc:o},a=/\.|\[(\d+)\]/,s=((g=n.props)==null?void 0:g.value.trim().split(a).filter(Boolean)).reduce((p,y)=>{if(p&&y in p)return typeof p[y]=="function"?p[y]():p[y]},r),c=(m=n.props)==null?void 0:m.defaultValue;return l(P,s??c??"")}function G(n,l,o,t){const a=(n.children||[]).reduce((s,c)=>{if(!En(c))return s[R].push(c),s;const g=An(c);return s[g]=s[g]||[],c.type==="element"&&s[g].push(...c.children||[]),s},{[R]:[]});return Object.entries(a).reduce((s,[c,g])=>(g.length&&(s[c]=()=>{const m=g.map(p=>Pn(p,l,o,t));return Bn(m)}),s),{})}function Dn(n,l){const{tag:o="",props:t={}}=n;return Object.keys(t).reduce(function(r,a){if(a==="__ignoreMap")return r;const i=t[a];if(J.test(a)&&!Sn.includes(o))return Ln(a,i,r,l);if(a==="v-bind")return Mn(a,i,r,l);if($.test(a))return Rn(a,i,r,l);if(Z.test(a))return Tn(a,i,r,l);const{attribute:s}=vn(Cn,a);return Array.isArray(i)&&i.every(c=>typeof c=="string")?(r[s]=i.join(" "),r):(r[s]=i,r)},{})}function Ln(n,l,o,t){const r=p=>+p,a=p=>p.trim(),i=p=>p,s=n.replace(J,"").split(".").filter(p=>p).reduce((p,y)=>(p[y]=!0,p),{}),c="value",g=s.lazy?"change":"input",m=s.number?r:s.trim?a:i;return o[c]=O(l,t),o.on=o.on||{},o.on[g]=p=>t[l]=m(p),o}function Mn(n,l,o,t){const r=O(l,t);return o=Object.assign(o,r),o}function Rn(n,l,o,t){return n=n.replace($,""),o.on=o.on||{},o.on[n]=()=>O(l,t),o}function Tn(n,l,o,t){return n=n.replace(Z,""),o[n]=O(l,t),o}const E=n=>{if(!A.includes(n)&&!(n!=null&&n.render)&&!(n!=null&&n.ssrRender)){const l=on(F(n),!1);if(typeof l=="object")return l}return n};function O(n,l){const o=n.split(".").reduce((t,r)=>typeof t=="object"?t[r]:void 0,l);return typeof o>"u"?rn(n):o}function An(n){let l="";for(const o of Object.keys(n.props||{}))if(!(!o.startsWith("#")&&!o.startsWith("v-slot:"))){l=o.split(/[:#]/,2)[1];break}return l||R}function En(n){return n.tag==="template"}function Bn(n){const l=[];for(const o of n){const t=l[l.length-1];o.type===P&&(t==null?void 0:t.type)===P?t.children=t.children+o.children:l.push(o)}return l}async function Un(n,l){if(!n)return;const o=Array.from(new Set(t(n,l)));await Promise.all(o.map(async r=>{if(r!=null&&r.render||r!=null&&r.ssrRender||r!=null&&r.__ssrInlineRender)return;const a=E(r);a!=null&&a.__asyncLoader&&!a.__asyncResolved&&await a.__asyncLoader()}));function t(r,a){const i=r.tag;if(r.type==="text"||i==="binding"||r.type==="comment")return[];const s=Q(r,a.tags),c=[];r.type!=="root"&&!A.includes(s)&&c.push(s);for(const g of r.children||[])c.push(...t(g,a));return c}}function Q(n,l){var t;const o=n.tag;return!o||typeof((t=n.props)==null?void 0:t.__ignoreMap)<"u"?o:l[o]||l[F(o)]||l[cn(n.tag)]||o}const jn=j({__name:"ContentRendererMarkdown",props:{value:{type:Object,required:!0},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"},components:{type:Object,default:()=>({})},data:{type:Object,default:()=>({})}},setup(n){const l=n,o=pn().isEnabled(),t=w(()=>{let i=l.value.body||l.value;return l.excerpt&&l.value.excerpt&&(i=l.value.excerpt),i}),r=w(()=>{const{body:i,excerpt:s,...c}=l.value;return{...c,...l.data}}),a=w(()=>({...l.components,...r.value._components||{}}));return(i,s)=>{const c=wn;return an(),un(c,{body:t.value,data:r.value,tag:n.tag,components:a.value,"data-content-id":sn(o)?n.value._id:void 0},null,8,["body","data","tag","components","data-content-id"])}}});export{jn as _}; diff --git a/_nuxt/DgGP7C2m.js b/_nuxt/DS-4onvx.js similarity index 96% rename from _nuxt/DgGP7C2m.js rename to _nuxt/DS-4onvx.js index a2cb860..b850b9f 100644 --- a/_nuxt/DgGP7C2m.js +++ b/_nuxt/DS-4onvx.js @@ -1 +1 @@ -import{u as C}from"./B5qANkaG.js";import{f,j as i,k as c,o as a,c as l,l as A,m as _,n as Z,a as e,q as z,s as q,v as D,x as F,y as V,z as N,_ as L,A as H,b as v,d as $,B as R,C as W,t as b,D as j,w as y,F as Q,u as T}from"./Bu7SZk0z.js";import{u as E}from"./Bb9rc-i1.js";import{F as U,G as X,_ as G}from"./CZdjxv7A.js";import{_ as J}from"./Ukwwp72Y.js";import"./DBoACagk.js";const Y=["width","height","fill","transform"],I={key:0},O=e("path",{d:"M216,36H68.53a20.09,20.09,0,0,0-17.15,9.71L5.71,121.83a12,12,0,0,0,0,12.34l45.67,76.12A20.09,20.09,0,0,0,68.53,220H216a20,20,0,0,0,20-20V56A20,20,0,0,0,216,36Zm-4,160H70.8L30,128,70.8,60H212ZM103.51,143.51,119,128l-15.52-15.51a12,12,0,0,1,17-17L136,111l15.51-15.52a12,12,0,0,1,17,17L153,128l15.52,15.51a12,12,0,0,1-17,17L136,145l-15.51,15.52a12,12,0,0,1-17-17Z"},null,-1),K=[O],e1={key:1},t1=e("path",{d:"M224,56V200a8,8,0,0,1-8,8H68.53a8,8,0,0,1-6.86-3.88L16,128,61.67,51.88A8,8,0,0,1,68.53,48H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),a1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),l1=[t1,a1],o1={key:2},s1=e("path",{d:"M216,40H68.53a16.12,16.12,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11h0A16.11,16.11,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM165.66,146.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.35,18.35a8,8,0,0,1-11.31-11.32L124.69,128l-18.35-18.34a8,8,0,1,1,11.31-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128Z"},null,-1),n1=[s1],r1={key:3},i1=e("path",{d:"M216,42H68.53a14,14,0,0,0-12,6.8L10.86,124.91a6,6,0,0,0,0,6.18L56.53,207.2a14,14,0,0,0,12,6.8H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42Zm2,158a2,2,0,0,1-2,2H68.53a2,2,0,0,1-1.71-1h0L23,128,66.82,55a2,2,0,0,1,1.71-1H216a2,2,0,0,1,2,2Zm-53.76-91.76L144.48,128l19.76,19.76a6,6,0,1,1-8.48,8.48L136,136.48l-19.76,19.76a6,6,0,0,1-8.48-8.48L127.52,128l-19.76-19.76a6,6,0,0,1,8.48-8.48L136,119.52l19.76-19.76a6,6,0,0,1,8.48,8.48Z"},null,-1),c1=[i1],h1={key:4},d1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),u1=[d1],p1={key:5},g1=e("path",{d:"M216,44H68.53a12.06,12.06,0,0,0-10.29,5.83L12.57,125.94a4,4,0,0,0,0,4.12l45.67,76.11A12.06,12.06,0,0,0,68.53,212H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44Zm4,156a4,4,0,0,1-4,4H68.53a4,4,0,0,1-3.43-1.94L20.67,128,65.1,53.94A4,4,0,0,1,68.53,52H216a4,4,0,0,1,4,4Zm-57.17-93.17L141.66,128l21.17,21.17a4,4,0,0,1-5.66,5.66L136,133.66l-21.17,21.17a4,4,0,0,1-5.66-5.66L130.34,128l-21.17-21.17a4,4,0,0,1,5.66-5.66L136,122.34l21.17-21.17a4,4,0,1,1,5.66,5.66Z"},null,-1),m1=[g1],v1={name:"PhBackspace"},$1=f({...v1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",I,K)):t.value==="duotone"?(a(),l("g",e1,l1)):t.value==="fill"?(a(),l("g",o1,n1)):t.value==="light"?(a(),l("g",r1,c1)):t.value==="regular"?(a(),l("g",h1,u1)):t.value==="thin"?(a(),l("g",p1,m1)):_("",!0)],16,Y))}}),y1=["width","height","fill","transform"],w1={key:0},A1=e("path",{d:"M220,32H76A20,20,0,0,0,56,52V72H36A20,20,0,0,0,16,92V204a20,20,0,0,0,20,20H180a20,20,0,0,0,20-20V184h20a20,20,0,0,0,20-20V52A20,20,0,0,0,220,32ZM176,96v16H40V96Zm0,104H40V136H176Zm40-40H200V92a20,20,0,0,0-20-20H80V56H216Z"},null,-1),f1=[A1],_1={key:1},Z1=e("path",{d:"M224,56V168a8,8,0,0,1-8,8H192V88a8,8,0,0,0-8-8H64V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),H1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,88H184v16H40ZM184,200H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),L1=[Z1,H1],k1={key:2},M1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm32,80H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),V1=[M1],b1={key:3},x1=e("path",{d:"M216,42H72A14,14,0,0,0,58,56V74H40A14,14,0,0,0,26,88V200a14,14,0,0,0,14,14H184a14,14,0,0,0,14-14V182h18a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM40,86H184a2,2,0,0,1,2,2v18H38V88A2,2,0,0,1,40,86ZM186,200a2,2,0,0,1-2,2H40a2,2,0,0,1-2-2V118H186Zm32-32a2,2,0,0,1-2,2H198V88a14,14,0,0,0-14-14H70V56a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2Z"},null,-1),C1=[x1],S1={key:4},B1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm0,112H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),P1=[B1],z1={key:5},q1=e("path",{d:"M216,44H72A12,12,0,0,0,60,56V76H40A12,12,0,0,0,28,88V200a12,12,0,0,0,12,12H184a12,12,0,0,0,12-12V180h20a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM40,84H184a4,4,0,0,1,4,4v20H36V88A4,4,0,0,1,40,84ZM188,200a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V116H188Zm32-32a4,4,0,0,1-4,4H196V88a12,12,0,0,0-12-12H68V56a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4Z"},null,-1),D1=[q1],F1={name:"PhBrowsers"},N1=f({...F1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",w1,f1)):t.value==="duotone"?(a(),l("g",_1,L1)):t.value==="fill"?(a(),l("g",k1,V1)):t.value==="light"?(a(),l("g",b1,C1)):t.value==="regular"?(a(),l("g",S1,P1)):t.value==="thin"?(a(),l("g",z1,D1)):_("",!0)],16,y1))}}),R1=["width","height","fill","transform"],W1={key:0},j1=e("path",{d:"M168.49,199.51a12,12,0,0,1-17,17l-80-80a12,12,0,0,1,0-17l80-80a12,12,0,0,1,17,17L97,128Z"},null,-1),Q1=[j1],T1={key:1},E1=e("path",{d:"M160,48V208L80,128Z",opacity:"0.2"},null,-1),U1=e("path",{d:"M163.06,40.61a8,8,0,0,0-8.72,1.73l-80,80a8,8,0,0,0,0,11.32l80,80A8,8,0,0,0,168,208V48A8,8,0,0,0,163.06,40.61ZM152,188.69,91.31,128,152,67.31Z"},null,-1),X1=[E1,U1],G1={key:2},J1=e("path",{d:"M168,48V208a8,8,0,0,1-13.66,5.66l-80-80a8,8,0,0,1,0-11.32l80-80A8,8,0,0,1,168,48Z"},null,-1),Y1=[J1],I1={key:3},O1=e("path",{d:"M164.24,203.76a6,6,0,1,1-8.48,8.48l-80-80a6,6,0,0,1,0-8.48l80-80a6,6,0,0,1,8.48,8.48L88.49,128Z"},null,-1),K1=[O1],e0={key:4},t0=e("path",{d:"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z"},null,-1),a0=[t0],l0={key:5},o0=e("path",{d:"M162.83,205.17a4,4,0,0,1-5.66,5.66l-80-80a4,4,0,0,1,0-5.66l80-80a4,4,0,1,1,5.66,5.66L85.66,128Z"},null,-1),s0=[o0],n0={name:"PhCaretLeft"},r0=f({...n0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",W1,Q1)):t.value==="duotone"?(a(),l("g",T1,X1)):t.value==="fill"?(a(),l("g",G1,Y1)):t.value==="light"?(a(),l("g",I1,K1)):t.value==="regular"?(a(),l("g",e0,a0)):t.value==="thin"?(a(),l("g",l0,s0)):_("",!0)],16,R1))}}),i0=["width","height","fill","transform"],c0={key:0},h0=e("path",{d:"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z"},null,-1),d0=[h0],u0={key:1},p0=e("path",{d:"M176,128,96,208V48Z",opacity:"0.2"},null,-1),g0=e("path",{d:"M181.66,122.34l-80-80A8,8,0,0,0,88,48V208a8,8,0,0,0,13.66,5.66l80-80A8,8,0,0,0,181.66,122.34ZM104,188.69V67.31L164.69,128Z"},null,-1),m0=[p0,g0],v0={key:2},$0=e("path",{d:"M181.66,133.66l-80,80A8,8,0,0,1,88,208V48a8,8,0,0,1,13.66-5.66l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),y0=[$0],w0={key:3},A0=e("path",{d:"M180.24,132.24l-80,80a6,6,0,0,1-8.48-8.48L167.51,128,91.76,52.24a6,6,0,0,1,8.48-8.48l80,80A6,6,0,0,1,180.24,132.24Z"},null,-1),f0=[A0],_0={key:4},Z0=e("path",{d:"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),H0=[Z0],L0={key:5},k0=e("path",{d:"M178.83,130.83l-80,80a4,4,0,0,1-5.66-5.66L170.34,128,93.17,50.83a4,4,0,0,1,5.66-5.66l80,80A4,4,0,0,1,178.83,130.83Z"},null,-1),M0=[k0],V0={name:"PhCaretRight"},b0=f({...V0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",c0,d0)):t.value==="duotone"?(a(),l("g",u0,m0)):t.value==="fill"?(a(),l("g",v0,y0)):t.value==="light"?(a(),l("g",w0,f0)):t.value==="regular"?(a(),l("g",_0,H0)):t.value==="thin"?(a(),l("g",L0,M0)):_("",!0)],16,i0))}}),x0=["width","height","fill","transform"],C0={key:0},S0=e("path",{d:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"},null,-1),B0=[S0],P0={key:1},z0=e("path",{d:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",opacity:"0.2"},null,-1),q0=e("path",{d:"M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),D0=[z0,q0],F0={key:2},N0=e("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),R0=[N0],W0={key:3},j0=e("path",{d:"M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z"},null,-1),Q0=[j0],T0={key:4},E0=e("path",{d:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z"},null,-1),U0=[E0],X0={key:5},G0=e("path",{d:"M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z"},null,-1),J0=[G0],Y0={name:"PhCheck"},I0=f({...Y0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",C0,B0)):t.value==="duotone"?(a(),l("g",P0,D0)):t.value==="fill"?(a(),l("g",F0,R0)):t.value==="light"?(a(),l("g",W0,Q0)):t.value==="regular"?(a(),l("g",T0,U0)):t.value==="thin"?(a(),l("g",X0,J0)):_("",!0)],16,x0))}}),O0=["width","height","fill","transform"],K0={key:0},e2=e("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Zm40.49-92.49a12,12,0,0,1,0,17l-48,48a12,12,0,0,1-17,0l-24-24a12,12,0,1,1,17-17L144,143l39.51-39.52A12,12,0,0,1,200.49,103.51Z"},null,-1),t2=[e2],a2={key:1},l2=e("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"},null,-1),o2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),s2=[l2,o2],n2={key:2},r2=e("path",{d:"M247.93,124.52C246.11,77.54,207.07,40,160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160A88.09,88.09,0,0,0,247.93,124.52Zm-50.27-6.86-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35a8,8,0,0,1,11.32,11.32Z"},null,-1),i2=[r2],c2={key:3},h2=e("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Zm36.24-94.24a6,6,0,0,1,0,8.48l-48,48a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L144,151.51l43.76-43.75A6,6,0,0,1,196.24,107.76Z"},null,-1),d2=[h2],u2={key:4},p2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),g2=[p2],m2={key:5},v2=e("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Zm34.83-94.83a4,4,0,0,1,0,5.66l-48,48a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L144,154.34l45.17-45.17A4,4,0,0,1,194.83,109.17Z"},null,-1),$2=[v2],y2={name:"PhCloudCheck"},w2=f({...y2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",K0,t2)):t.value==="duotone"?(a(),l("g",a2,s2)):t.value==="fill"?(a(),l("g",n2,i2)):t.value==="light"?(a(),l("g",c2,d2)):t.value==="regular"?(a(),l("g",u2,g2)):t.value==="thin"?(a(),l("g",m2,$2)):_("",!0)],16,O0))}}),A2=["width","height","fill","transform"],f2={key:0},_2=e("path",{d:"M224,44H32A20,20,0,0,0,12,64V192a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V64A20,20,0,0,0,224,44Zm-4,24V88H36V68ZM36,188V112H220v76Zm172-24a12,12,0,0,1-12,12H164a12,12,0,0,1,0-24h32A12,12,0,0,1,208,164Zm-68,0a12,12,0,0,1-12,12H116a12,12,0,0,1,0-24h12A12,12,0,0,1,140,164Z"},null,-1),Z2=[_2],H2={key:1},L2=e("path",{d:"M232,96v96a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V96Z",opacity:"0.2"},null,-1),k2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),M2=[L2,k2],V2={key:2},b2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM136,176H120a8,8,0,0,1,0-16h16a8,8,0,0,1,0,16Zm64,0H168a8,8,0,0,1,0-16h32a8,8,0,0,1,0,16ZM32,88V64H224V88Z"},null,-1),x2=[b2],C2={key:3},S2=e("path",{d:"M224,50H32A14,14,0,0,0,18,64V192a14,14,0,0,0,14,14H224a14,14,0,0,0,14-14V64A14,14,0,0,0,224,50ZM32,62H224a2,2,0,0,1,2,2V90H30V64A2,2,0,0,1,32,62ZM224,194H32a2,2,0,0,1-2-2V102H226v90A2,2,0,0,1,224,194Zm-18-26a6,6,0,0,1-6,6H168a6,6,0,0,1,0-12h32A6,6,0,0,1,206,168Zm-64,0a6,6,0,0,1-6,6H120a6,6,0,0,1,0-12h16A6,6,0,0,1,142,168Z"},null,-1),B2=[S2],P2={key:4},z2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),q2=[z2],D2={key:5},F2=e("path",{d:"M224,52H32A12,12,0,0,0,20,64V192a12,12,0,0,0,12,12H224a12,12,0,0,0,12-12V64A12,12,0,0,0,224,52ZM32,60H224a4,4,0,0,1,4,4V92H28V64A4,4,0,0,1,32,60ZM224,196H32a4,4,0,0,1-4-4V100H228v92A4,4,0,0,1,224,196Zm-20-28a4,4,0,0,1-4,4H168a4,4,0,0,1,0-8h32A4,4,0,0,1,204,168Zm-64,0a4,4,0,0,1-4,4H120a4,4,0,0,1,0-8h16A4,4,0,0,1,140,168Z"},null,-1),N2=[F2],R2={name:"PhCreditCard"},W2=f({...R2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",f2,Z2)):t.value==="duotone"?(a(),l("g",H2,M2)):t.value==="fill"?(a(),l("g",V2,x2)):t.value==="light"?(a(),l("g",C2,B2)):t.value==="regular"?(a(),l("g",P2,q2)):t.value==="thin"?(a(),l("g",D2,N2)):_("",!0)],16,A2))}}),j2=["width","height","fill","transform"],Q2={key:0},T2=e("path",{d:"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Zm100.49-60.49a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17,0l-24-24a12,12,0,0,1,17-17L116,155V124a12,12,0,0,1,24,0v31l3.51-3.52A12,12,0,0,1,160.49,151.51Z"},null,-1),E2=[T2],U2={key:1},X2=e("path",{d:"M208,88H152V32Z",opacity:"0.2"},null,-1),G2=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),J2=[X2,G2],Y2={key:2},I2=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34Zm-56,83.32-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35a8,8,0,0,1,11.32,11.32ZM152,88V44l44,44Z"},null,-1),O2=[I2],K2={key:3},e6=e("path",{d:"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Zm-43.76-62.24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L122,169.51V120a6,6,0,0,1,12,0v49.51l13.76-13.75A6,6,0,0,1,156.24,155.76Z"},null,-1),t6=[e6],a6={key:4},l6=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),o6=[l6],s6={key:5},n6=e("path",{d:"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Zm-45.17-62.83a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L124,174.34V120a4,4,0,0,1,8,0v54.34l17.17-17.17A4,4,0,0,1,154.83,157.17Z"},null,-1),r6=[n6],i6={name:"PhFileArrowDown"},c6=f({...i6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",Q2,E2)):t.value==="duotone"?(a(),l("g",U2,J2)):t.value==="fill"?(a(),l("g",Y2,O2)):t.value==="light"?(a(),l("g",K2,t6)):t.value==="regular"?(a(),l("g",a6,o6)):t.value==="thin"?(a(),l("g",s6,r6)):_("",!0)],16,j2))}}),h6=["width","height","fill","transform"],d6={key:0},u6=e("path",{d:"M216,44H40A12,12,0,0,0,28,56V208a20,20,0,0,0,20,20H88a20,20,0,0,0,20-20V164h40v12a20,20,0,0,0,20,20h40a20,20,0,0,0,20-20V56A12,12,0,0,0,216,44Zm-12,64H172V68h32ZM84,68v40H52V68Zm0,136H52V132H84Zm24-64V68h40v72Zm64,32V132h32v40Z"},null,-1),p6=[u6],g6={key:1},m6=e("path",{d:"M216,56v64H160V56ZM40,208a8,8,0,0,0,8,8H88a8,8,0,0,0,8-8V120H40Z",opacity:"0.2"},null,-1),v6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48Zm-8,64H168V64h40ZM88,64v48H48V64Zm0,144H48V128H88Zm16-64V64h48v80Zm64,32V128h40v48Z"},null,-1),$6=[m6,v6],y6={key:2},w6=e("path",{d:"M160,56v96a8,8,0,0,1-8,8H112a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h40A8,8,0,0,1,160,56Zm64-8H184a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4h48a4,4,0,0,0,4-4V56A8,8,0,0,0,224,48Zm4,80H180a4,4,0,0,0-4,4v44a16,16,0,0,0,16,16h24a16,16,0,0,0,16-16V132A4,4,0,0,0,228,128ZM80,48H40a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4H84a4,4,0,0,0,4-4V56A8,8,0,0,0,80,48Zm4,80H36a4,4,0,0,0-4,4v76a16,16,0,0,0,16,16H72a16,16,0,0,0,16-16V132A4,4,0,0,0,84,128Z"},null,-1),A6=[w6],f6={key:3},_6=e("path",{d:"M216,50H40a6,6,0,0,0-6,6V208a14,14,0,0,0,14,14H88a14,14,0,0,0,14-14V158h52v18a14,14,0,0,0,14,14h40a14,14,0,0,0,14-14V56A6,6,0,0,0,216,50Zm-6,64H166V62h44ZM90,62v52H46V62Zm0,146a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V126H90Zm12-62V62h52v84Zm106,32H168a2,2,0,0,1-2-2V126h44v50A2,2,0,0,1,208,178Z"},null,-1),Z6=[_6],H6={key:4},L6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48ZM88,208H48V128H88Zm0-96H48V64H88Zm64,32H104V64h48Zm56,32H168V128h40Zm0-64H168V64h40Z"},null,-1),k6=[L6],M6={key:5},V6=e("path",{d:"M216,52H40a4,4,0,0,0-4,4V208a12,12,0,0,0,12,12H88a12,12,0,0,0,12-12V156h56v20a12,12,0,0,0,12,12h40a12,12,0,0,0,12-12V56A4,4,0,0,0,216,52ZM92,208a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V124H92Zm0-92H44V60H92Zm64,32H100V60h56Zm56,28a4,4,0,0,1-4,4H168a4,4,0,0,1-4-4V124h48Zm0-60H164V60h48Z"},null,-1),b6=[V6],x6={name:"PhKanban"},C6=f({...x6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",d6,p6)):t.value==="duotone"?(a(),l("g",g6,$6)):t.value==="fill"?(a(),l("g",y6,A6)):t.value==="light"?(a(),l("g",f6,Z6)):t.value==="regular"?(a(),l("g",H6,k6)):t.value==="thin"?(a(),l("g",M6,b6)):_("",!0)],16,h6))}}),S6=["width","height","fill","transform"],B6={key:0},P6=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128Z"},null,-1),z6=[P6],q6={key:1},D6=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),F6=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),N6=[D6,F6],R6={key:2},W6=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H72a8,8,0,0,1,0-16H184a8,8,0,0,1,0,16Z"},null,-1),j6=[W6],Q6={key:3},T6=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128Z"},null,-1),E6=[T6],U6={key:4},X6=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),G6=[X6],J6={key:5},Y6=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128Z"},null,-1),I6=[Y6],O6={name:"PhMinus"},K6=f({...O6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",B6,z6)):t.value==="duotone"?(a(),l("g",q6,N6)):t.value==="fill"?(a(),l("g",R6,j6)):t.value==="light"?(a(),l("g",Q6,E6)):t.value==="regular"?(a(),l("g",U6,G6)):t.value==="thin"?(a(),l("g",J6,I6)):_("",!0)],16,S6))}}),e4=["width","height","fill","transform"],t4={key:0},a4=e("path",{d:"M224,154.8l-47.09-21.11-.18-.08a19.94,19.94,0,0,0-19,1.75,13.08,13.08,0,0,0-1.12.84l-22.31,19c-13-7.05-26.43-20.37-33.49-33.21l19.06-22.66a11.76,11.76,0,0,0,.85-1.15,20,20,0,0,0,1.66-18.83,1.42,1.42,0,0,1-.08-.18L101.2,32A20.06,20.06,0,0,0,80.42,20.15,60.27,60.27,0,0,0,28,80c0,81.61,66.39,148,148,148a60.27,60.27,0,0,0,59.85-52.42A20.06,20.06,0,0,0,224,154.8ZM176,204A124.15,124.15,0,0,1,52,80,36.29,36.29,0,0,1,80.48,44.46l18.82,42L80.14,109.28a12,12,0,0,0-.86,1.16A20,20,0,0,0,78,130.08c9.42,19.28,28.83,38.56,48.31,48A20,20,0,0,0,146,176.63a11.63,11.63,0,0,0,1.11-.85l22.43-19.07,42,18.81A36.29,36.29,0,0,1,176,204Z"},null,-1),l4=[a4],o4={key:1},s4=e("path",{d:"M223.94,174.08A48.33,48.33,0,0,1,176,216,136,136,0,0,1,40,80,48.33,48.33,0,0,1,81.92,32.06a8,8,0,0,1,8.3,4.8l21.13,47.2a8,8,0,0,1-.66,7.53L89.32,117a7.93,7.93,0,0,0-.54,7.81c8.27,16.93,25.77,34.22,42.75,42.41a7.92,7.92,0,0,0,7.83-.59l25-21.3a8,8,0,0,1,7.59-.69l47.16,21.13A8,8,0,0,1,223.94,174.08Z",opacity:"0.2"},null,-1),n4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),r4=[s4,n4],i4={key:2},c4=e("path",{d:"M231.88,175.08A56.26,56.26,0,0,1,176,224C96.6,224,32,159.4,32,80A56.26,56.26,0,0,1,80.92,24.12a16,16,0,0,1,16.62,9.52l21.12,47.15,0,.12A16,16,0,0,1,117.39,96c-.18.27-.37.52-.57.77L96,121.45c7.49,15.22,23.41,31,38.83,38.51l24.34-20.71a8.12,8.12,0,0,1,.75-.56,16,16,0,0,1,15.17-1.4l.13.06,47.11,21.11A16,16,0,0,1,231.88,175.08Z"},null,-1),h4=[c4],d4={key:3},u4=e("path",{d:"M221.59,160.3l-47.24-21.17a14,14,0,0,0-13.28,1.22,4.81,4.81,0,0,0-.56.42l-24.69,21a1.88,1.88,0,0,1-1.68.06c-15.87-7.66-32.31-24-40-39.65a1.91,1.91,0,0,1,0-1.68l21.07-25a6.13,6.13,0,0,0,.42-.58,14,14,0,0,0,1.12-13.27L95.73,34.49a14,14,0,0,0-14.56-8.38A54.24,54.24,0,0,0,34,80c0,78.3,63.7,142,142,142a54.25,54.25,0,0,0,53.89-47.17A14,14,0,0,0,221.59,160.3ZM176,210C104.32,210,46,151.68,46,80A42.23,42.23,0,0,1,82.67,38h.23a2,2,0,0,1,1.84,1.31l21.1,47.11a2,2,0,0,1,0,1.67L84.73,113.15a4.73,4.73,0,0,0-.43.57,14,14,0,0,0-.91,13.73c8.87,18.16,27.17,36.32,45.53,45.19a14,14,0,0,0,13.77-1c.19-.13.38-.27.56-.42l24.68-21a1.92,1.92,0,0,1,1.6-.1l47.25,21.17a2,2,0,0,1,1.21,2A42.24,42.24,0,0,1,176,210Z"},null,-1),p4=[u4],g4={key:4},m4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),v4=[m4],$4={key:5},y4=e("path",{d:"M220.78,162.13,173.56,141A12,12,0,0,0,162.18,142a3.37,3.37,0,0,0-.38.28L137,163.42a3.93,3.93,0,0,1-3.7.21c-16.24-7.84-33.05-24.52-40.89-40.57a3.9,3.9,0,0,1,.18-3.69l21.2-25.21c.1-.12.19-.25.28-.38a12,12,0,0,0,1-11.36L93.9,35.28a12,12,0,0,0-12.48-7.19A52.25,52.25,0,0,0,36,80c0,77.2,62.8,140,140,140a52.25,52.25,0,0,0,51.91-45.42A12,12,0,0,0,220.78,162.13ZM220,173.58A44.23,44.23,0,0,1,176,212C103.22,212,44,152.78,44,80A44.23,44.23,0,0,1,82.42,36a3.87,3.87,0,0,1,.48,0,4,4,0,0,1,3.67,2.49l21.11,47.14a4,4,0,0,1-.23,3.6l-21.19,25.2c-.1.13-.2.25-.29.39a12,12,0,0,0-.78,11.75c8.69,17.79,26.61,35.58,44.6,44.27a12,12,0,0,0,11.79-.87l.37-.28,24.83-21.12a3.93,3.93,0,0,1,3.57-.27l47.21,21.16A4,4,0,0,1,220,173.58Z"},null,-1),w4=[y4],A4={name:"PhPhone"},S=f({...A4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",t4,l4)):t.value==="duotone"?(a(),l("g",o4,r4)):t.value==="fill"?(a(),l("g",i4,h4)):t.value==="light"?(a(),l("g",d4,p4)):t.value==="regular"?(a(),l("g",g4,v4)):t.value==="thin"?(a(),l("g",$4,w4)):_("",!0)],16,e4))}}),f4=["width","height","fill","transform"],_4={key:0},Z4=e("path",{d:"M137,168l11.52-11.51a12,12,0,0,0-17-17L120,151l-15-15,11.52-11.51a12,12,0,0,0-17-17L88,119,72.49,103.51a12,12,0,0,0-17,17L59,124,38.54,144.49a36,36,0,0,0,0,50.91l2.55,2.54L15.51,223.51a12,12,0,0,0,17,17l25.57-25.58,2.54,2.55a36.06,36.06,0,0,0,50.91,0L132,197l3.51,3.52a12,12,0,0,0,17-17ZM94.54,200.49a12,12,0,0,1-17,0L55.51,178.43a12,12,0,0,1,0-17L76,141l39,39Zm146-185a12,12,0,0,0-17,0L197.94,41.09l-2.54-2.55a36.05,36.05,0,0,0-50.91,0L124,59l-3.51-3.52a12,12,0,0,0-17,17l80,80a12,12,0,0,0,17-17L197,132l20.49-20.49a36,36,0,0,0,0-50.91l-2.55-2.54,25.58-25.57A12,12,0,0,0,240.49,15.51Zm-40,79L180,115,141,76l20.49-20.49a12,12,0,0,1,17,0l22.06,22.06a12,12,0,0,1,0,17Z"},null,-1),H4=[Z4],L4={key:1},k4=e("path",{d:"M76,124l56,56-29,29a24,24,0,0,1-33.94,0L47,186.91A24,24,0,0,1,47,153ZM209,69.09,186.91,47A24,24,0,0,0,153,47L124,76l56,56,29-29A24,24,0,0,0,209,69.09Z",opacity:"0.2"},null,-1),M4=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),V4=[k4,M4],b4={key:2},x4=e("path",{d:"M149.66,149.66,131.31,168l18.35,18.34a8,8,0,0,1-11.32,11.32L132,191.31l-23.31,23.32a32.06,32.06,0,0,1-45.26,0l-5.37-5.38-28.4,28.41a8,8,0,0,1-11.32-11.32l28.41-28.4-5.38-5.37a32,32,0,0,1,0-45.26L64.69,124l-6.35-6.34a8,8,0,0,1,11.32-11.32L88,124.69l18.34-18.35a8,8,0,0,1,11.32,11.32L99.31,136,120,156.69l18.34-18.35a8,8,0,0,1,11.32,11.32Zm88-131.32a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Z"},null,-1),C4=[x4],S4={key:3},B4=e("path",{d:"M148.24,139.76a6,6,0,0,0-8.48,0L120,159.51,96.49,136l19.75-19.76a6,6,0,0,0-8.48-8.48L88,127.51,68.24,107.76a6,6,0,0,0-8.48,8.48L67.51,124,42.79,148.73a30,30,0,0,0,0,42.42l6.78,6.79L19.76,227.76a6,6,0,1,0,8.48,8.48l29.82-29.81,6.79,6.78a30,30,0,0,0,42.42,0L132,188.49l7.76,7.75a6,6,0,0,0,8.48-8.48L128.49,168l19.75-19.76A6,6,0,0,0,148.24,139.76Zm-49.45,65a18,18,0,0,1-25.46,0L51.27,182.67a18,18,0,0,1,0-25.46L76,132.49,123.51,180Zm137.45-185a6,6,0,0,0-8.48,0L197.94,49.57l-6.79-6.78a30,30,0,0,0-42.42,0L124,67.51l-7.76-7.75a6,6,0,0,0-8.48,8.48l80,80a6,6,0,0,0,8.48-8.48L188.49,132l24.72-24.73a30,30,0,0,0,0-42.42l-6.78-6.79,29.81-29.82A6,6,0,0,0,236.24,19.76Zm-31.51,79L180,123.51,132.49,76l24.72-24.73a18,18,0,0,1,25.46,0l22.06,22.06a18,18,0,0,1,0,25.46Z"},null,-1),P4=[B4],z4={key:4},q4=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),D4=[q4],F4={key:5},N4=e("path",{d:"M146.83,141.17a4,4,0,0,0-5.66,0L120,162.34,93.66,136l21.17-21.17a4,4,0,0,0-5.66-5.66L88,130.34,66.83,109.17a4,4,0,0,0-5.66,5.66L70.34,124,44.2,150.14a28,28,0,0,0,0,39.6l8.2,8.2L21.17,229.17a4,4,0,0,0,5.66,5.66L58.06,203.6l8.2,8.2a28,28,0,0,0,39.6,0L132,185.66l9.17,9.17a4,4,0,0,0,5.66-5.66L125.66,168l21.17-21.17A4,4,0,0,0,146.83,141.17Zm-46.63,65a20,20,0,0,1-28.28,0L49.86,184.08a20,20,0,0,1,0-28.28L76,129.66,126.34,180Zm134.63-185a4,4,0,0,0-5.66,0L197.94,52.4l-8.2-8.2a28,28,0,0,0-39.6,0L124,70.34l-9.17-9.17a4,4,0,0,0-5.66,5.66l80,80a4,4,0,0,0,5.66-5.66L185.66,132l26.14-26.14a28,28,0,0,0,0-39.6l-8.2-8.2,31.23-31.23A4,4,0,0,0,234.83,21.17ZM212,86.06a19.86,19.86,0,0,1-5.86,14.14L180,126.34,129.66,76,155.8,49.86a20,20,0,0,1,28.28,0l22.06,22.06A19.85,19.85,0,0,1,212,86.06Z"},null,-1),R4=[N4],W4={name:"PhPlugs"},j4=f({...W4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",_4,H4)):t.value==="duotone"?(a(),l("g",L4,V4)):t.value==="fill"?(a(),l("g",b4,C4)):t.value==="light"?(a(),l("g",S4,P4)):t.value==="regular"?(a(),l("g",z4,D4)):t.value==="thin"?(a(),l("g",F4,R4)):_("",!0)],16,f4))}}),Q4=["width","height","fill","transform"],T4={key:0},E4=e("path",{d:"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z"},null,-1),U4=[E4],X4={key:1},G4=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),J4=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),Y4=[G4,J4],I4={key:2},O4=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z"},null,-1),K4=[O4],e8={key:3},t8=e("path",{d:"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z"},null,-1),a8=[t8],l8={key:4},o8=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),s8=[o8],n8={key:5},r8=e("path",{d:"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z"},null,-1),i8=[r8],c8={name:"PhPlus"},h8=f({...c8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",T4,U4)):t.value==="duotone"?(a(),l("g",X4,Y4)):t.value==="fill"?(a(),l("g",I4,K4)):t.value==="light"?(a(),l("g",e8,a8)):t.value==="regular"?(a(),l("g",l8,s8)):t.value==="thin"?(a(),l("g",n8,i8)):_("",!0)],16,Q4))}}),d8=["width","height","fill","transform"],u8={key:0},p8=e("path",{d:"M20,128A76.08,76.08,0,0,1,96,52h99l-3.52-3.51a12,12,0,1,1,17-17l24,24a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17-17L195,76H96a52.06,52.06,0,0,0-52,52,12,12,0,0,1-24,0Zm204-12a12,12,0,0,0-12,12,52.06,52.06,0,0,1-52,52H61l3.52-3.51a12,12,0,1,0-17-17l-24,24a12,12,0,0,0,0,17l24,24a12,12,0,1,0,17-17L61,204h99a76.08,76.08,0,0,0,76-76A12,12,0,0,0,224,116Z"},null,-1),g8=[p8],m8={key:1},v8=e("path",{d:"M224,64v64a64,64,0,0,1-64,64H32V128A64,64,0,0,1,96,64Z",opacity:"0.2"},null,-1),$8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),y8=[v8,$8],w8={key:2},A8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56h96V40a8,8,0,0,1,13.66-5.66l24,24a8,8,0,0,1,0,11.32l-24,24A8,8,0,0,1,192,88V72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H64V168a8,8,0,0,0-13.66-5.66l-24,24a8,8,0,0,0,0,11.32l24,24A8,8,0,0,0,64,216V200h96a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),f8=[A8],_8={key:3},Z8=e("path",{d:"M26,128A70.08,70.08,0,0,1,96,58H209.51L195.76,44.24a6,6,0,0,1,8.48-8.48l24,24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48-8.48L209.51,70H96a58.07,58.07,0,0,0-58,58,6,6,0,0,1-12,0Zm198-6a6,6,0,0,0-6,6,58.07,58.07,0,0,1-58,58H46.49l13.75-13.76a6,6,0,0,0-8.48-8.48l-24,24a6,6,0,0,0,0,8.48l24,24a6,6,0,0,0,8.48-8.48L46.49,198H160a70.08,70.08,0,0,0,70-70A6,6,0,0,0,224,122Z"},null,-1),H8=[Z8],L8={key:4},k8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),M8=[k8],V8={key:5},b8=e("path",{d:"M28,128A68.07,68.07,0,0,1,96,60H214.34L197.17,42.83a4,4,0,0,1,5.66-5.66l24,24a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66-5.66L214.34,68H96a60.07,60.07,0,0,0-60,60,4,4,0,0,1-8,0Zm196-4a4,4,0,0,0-4,4,60.07,60.07,0,0,1-60,60H41.66l17.17-17.17a4,4,0,0,0-5.66-5.66l-24,24a4,4,0,0,0,0,5.66l24,24a4,4,0,1,0,5.66-5.66L41.66,196H160a68.07,68.07,0,0,0,68-68A4,4,0,0,0,224,124Z"},null,-1),x8=[b8],C8={name:"PhRepeat"},S8=f({...C8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",u8,g8)):t.value==="duotone"?(a(),l("g",m8,y8)):t.value==="fill"?(a(),l("g",w8,f8)):t.value==="light"?(a(),l("g",_8,H8)):t.value==="regular"?(a(),l("g",L8,M8)):t.value==="thin"?(a(),l("g",V8,x8)):_("",!0)],16,d8))}}),B8=["width","height","fill","transform"],P8={key:0},z8=e("path",{d:"M227.85,46.89a20,20,0,0,0-18.74-18.74c-13.13-.77-46.65.42-74.48,28.24L131,60H74.36a19.83,19.83,0,0,0-14.14,5.86L25.87,100.19a20,20,0,0,0,11.35,33.95l37.14,5.18,42.32,42.32,5.19,37.18A19.88,19.88,0,0,0,135.34,235a20.13,20.13,0,0,0,6.37,1,19.9,19.9,0,0,0,14.1-5.87l34.34-34.35A19.85,19.85,0,0,0,196,181.64V125l3.6-3.59C227.43,93.54,228.62,60,227.85,46.89ZM76,84h31L75.75,115.28l-27.23-3.8ZM151.6,73.37A72.27,72.27,0,0,1,204,52a72.17,72.17,0,0,1-21.38,52.41L128,159,97,128ZM172,180l-27.49,27.49-3.8-27.23L172,149Zm-72,22c-8.71,11.85-26.19,26-60,26a12,12,0,0,1-12-12c0-33.84,14.12-51.32,26-60A12,12,0,1,1,68.18,175.3C62.3,179.63,55.51,187.8,53,203c15.21-2.51,23.37-9.3,27.7-15.18A12,12,0,1,1,100,202Z"},null,-1),q8=[z8],D8={key:1},F8=e("path",{d:"M184,120v61.65a8,8,0,0,1-2.34,5.65l-34.35,34.35a8,8,0,0,1-13.57-4.53L128,176ZM136,72H74.35a8,8,0,0,0-5.65,2.34L34.35,108.69a8,8,0,0,0,4.53,13.57L80,128ZM40,216c37.65,0,50.69-19.69,54.56-28.18L68.18,161.44C59.69,165.31,40,178.35,40,216Z",opacity:"0.2"},null,-1),N8=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),R8=[F8,N8],W8={key:2},j8=e("path",{d:"M101.85,191.14C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Zm122-144a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.4,27.07h0L88,108.7A8,8,0,0,1,76.67,97.39l26.56-26.57A4,4,0,0,0,100.41,64H74.35A15.9,15.9,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A16,16,0,0,0,192,181.65V155.59a4,4,0,0,0-6.83-2.82l-26.57,26.56a8,8,0,0,1-11.71-.42,8.2,8.2,0,0,1,.6-11.1l49.27-49.27h0C223.45,91.86,224.6,59.71,223.85,47.12Z"},null,-1),Q8=[j8],T8={key:3},E8=e("path",{d:"M221.86,47.24a14,14,0,0,0-13.11-13.1c-12.31-.73-43.77.39-69.88,26.5L133.52,66H74.35a13.9,13.9,0,0,0-9.89,4.1L30.11,104.44a14,14,0,0,0,7.94,23.76l39.13,5.46,45.16,45.16L127.8,218a14,14,0,0,0,23.76,7.92l34.35-34.35a13.91,13.91,0,0,0,4.1-9.89V122.48l5.35-5.35h0C221.46,91,222.59,59.56,221.86,47.24ZM38.11,115a2,2,0,0,1,.49-2L72.94,78.58A2,2,0,0,1,74.35,78h47.17L77.87,121.64l-38.14-5.32A1.93,1.93,0,0,1,38.11,115ZM178,181.65a2,2,0,0,1-.59,1.41L143.08,217.4a2,2,0,0,1-3.4-1.11l-5.32-38.16L178,134.48Zm8.87-73h0L128,167.51,88.49,128l58.87-58.88a78.47,78.47,0,0,1,60.69-23A2,2,0,0,1,209.88,48,78.47,78.47,0,0,1,186.88,108.64ZM100,190.31C95.68,199.84,81.13,222,40,222a6,6,0,0,1-6-6c0-41.13,22.16-55.68,31.69-60a6,6,0,1,1,5,10.92c-7,3.17-22.53,13.52-24.47,42.91,29.39-1.94,39.74-17.52,42.91-24.47a6,6,0,1,1,10.92,5Z"},null,-1),U8=[E8],X8={key:4},G8=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),J8=[G8],Y8={key:5},I8=e("path",{d:"M219.86,47.36a12,12,0,0,0-11.22-11.22c-12-.71-42.82.38-68.35,25.91L134.35,68h-60a11.9,11.9,0,0,0-8.48,3.52L31.52,105.85a12,12,0,0,0,6.81,20.37l39.79,5.55,46.11,46.11,5.55,39.81a12,12,0,0,0,20.37,6.79l34.34-34.35a11.9,11.9,0,0,0,3.52-8.48v-60l5.94-5.94C219.48,90.18,220.57,59.41,219.86,47.36ZM36.21,115.6a3.94,3.94,0,0,1,1-4.09L71.53,77.17A4,4,0,0,1,74.35,76h52L78.58,123.76,39.44,118.3A3.94,3.94,0,0,1,36.21,115.6ZM180,181.65a4,4,0,0,1-1.17,2.83l-34.35,34.34a4,4,0,0,1-6.79-2.25l-5.46-39.15L180,129.65Zm-52-11.31L85.66,128l60.28-60.29c23.24-23.24,51.25-24.23,62.22-23.58a3.93,3.93,0,0,1,3.71,3.71c.65,11-.35,39-23.58,62.22ZM98.21,189.48C94,198.66,80,220,40,220a4,4,0,0,1-4-4c0-40,21.34-54,30.52-58.21a4,4,0,0,1,3.32,7.28c-7.46,3.41-24.43,14.66-25.76,46.85,32.19-1.33,43.44-18.3,46.85-25.76a4,4,0,1,1,7.28,3.32Z"},null,-1),O8=[I8],K8={name:"PhRocketLaunch"},ee=f({...K8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",P8,q8)):t.value==="duotone"?(a(),l("g",D8,R8)):t.value==="fill"?(a(),l("g",W8,Q8)):t.value==="light"?(a(),l("g",T8,U8)):t.value==="regular"?(a(),l("g",X8,J8)):t.value==="thin"?(a(),l("g",Y8,O8)):_("",!0)],16,B8))}}),te=["width","height","fill","transform"],ae={key:0},le=e("path",{d:"M125.18,156.94a64,64,0,1,0-82.36,0,100.23,100.23,0,0,0-39.49,32,12,12,0,0,0,19.35,14.2,76,76,0,0,1,122.64,0,12,12,0,0,0,19.36-14.2A100.33,100.33,0,0,0,125.18,156.94ZM44,108a40,40,0,1,1,40,40A40,40,0,0,1,44,108Zm206.1,97.67a12,12,0,0,1-16.78-2.57A76.31,76.31,0,0,0,172,172a12,12,0,0,1,0-24,40,40,0,1,0-10.3-78.67,12,12,0,1,1-6.16-23.19,64,64,0,0,1,57.64,110.8,100.23,100.23,0,0,1,39.49,32A12,12,0,0,1,250.1,205.67Z"},null,-1),oe=[le],se={key:1},ne=e("path",{d:"M136,108A52,52,0,1,1,84,56,52,52,0,0,1,136,108Z",opacity:"0.2"},null,-1),re=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),ie=[ne,re],ce={key:2},he=e("path",{d:"M164.47,195.63a8,8,0,0,1-6.7,12.37H10.23a8,8,0,0,1-6.7-12.37,95.83,95.83,0,0,1,47.22-37.71,60,60,0,1,1,66.5,0A95.83,95.83,0,0,1,164.47,195.63Zm87.91-.15a95.87,95.87,0,0,0-47.13-37.56A60,60,0,0,0,144.7,54.59a4,4,0,0,0-1.33,6A75.83,75.83,0,0,1,147,150.53a4,4,0,0,0,1.07,5.53,112.32,112.32,0,0,1,29.85,30.83,23.92,23.92,0,0,1,3.65,16.47,4,4,0,0,0,3.95,4.64h60.3a8,8,0,0,0,7.73-5.93A8.22,8.22,0,0,0,252.38,195.48Z"},null,-1),de=[he],ue={key:3},pe=e("path",{d:"M112.6,158.43a58,58,0,1,0-57.2,0A93.83,93.83,0,0,0,5.21,196.72a6,6,0,0,0,10.05,6.56,82,82,0,0,1,137.48,0,6,6,0,0,0,10-6.56A93.83,93.83,0,0,0,112.6,158.43ZM38,108a46,46,0,1,1,46,46A46.06,46.06,0,0,1,38,108Zm211,97a6,6,0,0,1-8.3-1.74A81.8,81.8,0,0,0,172,166a6,6,0,0,1,0-12,46,46,0,1,0-17.08-88.73,6,6,0,1,1-4.46-11.14,58,58,0,0,1,50.14,104.3,93.83,93.83,0,0,1,50.19,38.29A6,6,0,0,1,249,205Z"},null,-1),ge=[pe],me={key:4},ve=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),$e=[ve],ye={key:5},we=e("path",{d:"M107.19,159a56,56,0,1,0-46.38,0A91.83,91.83,0,0,0,6.88,197.81a4,4,0,1,0,6.7,4.37,84,84,0,0,1,140.84,0,4,4,0,1,0,6.7-4.37A91.83,91.83,0,0,0,107.19,159ZM36,108a48,48,0,1,1,48,48A48.05,48.05,0,0,1,36,108Zm212,95.35a4,4,0,0,1-5.53-1.17A83.81,83.81,0,0,0,172,164a4,4,0,0,1,0-8,48,48,0,1,0-17.82-92.58,4,4,0,1,1-3-7.43,56,56,0,0,1,44,103,91.83,91.83,0,0,1,53.93,38.86A4,4,0,0,1,248,203.35Z"},null,-1),Ae=[we],fe={name:"PhUsers"},_e=f({...fe,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",ae,oe)):t.value==="duotone"?(a(),l("g",se,ie)):t.value==="fill"?(a(),l("g",ce,de)):t.value==="light"?(a(),l("g",ue,ge)):t.value==="regular"?(a(),l("g",me,$e)):t.value==="thin"?(a(),l("g",ye,Ae)):_("",!0)],16,te))}}),x="__nuxt_component";async function Ze(s,o){const n=V(),h=z(),u=N(),{fetchKey:p,_fetchKeyBase:t}=u.proxy.$options,r=(typeof p=="function"?p(()=>""):p)||[t,h.fullPath,h.matched.findIndex(d=>Object.values(d.components||{}).includes(u.type))].join(":"),{data:g,error:m}=await E(`options:asyncdata:${r}`,()=>n.runWithContext(()=>o(n)));if(m.value)throw q(m.value);g.value&&typeof g.value=="object"&&Object.assign(await s,D(F(g.value)))}const k=function(...o){const[n,h]=o,{setup:u}=n;return!u&&!n.asyncData&&!n.head?{[x]:!0,...n}:{[x]:!0,_fetchKeyBase:h,...n,setup(p,t){const r=V(),g=u?Promise.resolve(r.runWithContext(()=>u(p,t))).then(d=>d||{}):{},m=[];if(n.asyncData&&m.push(Ze(g,n.asyncData)),n.head){const d=V();C(typeof n.head=="function"?()=>n.head(d):n.head)}return Promise.resolve(g).then(()=>Promise.all(m)).then(()=>g).finally(()=>{m.length=0})}}},He=k({components:{PhRocketLaunch:ee}},"$zFVJLCtHYa"),M="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABgWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8zQyM/GmJhYTFpWBkNamJjMWIoLMYog83Mm19qfrzeG0m2ylZRYuPXgr+ArbJWikjJljWxYXrOmzc1k8y53XM/93vPOd17LtjDGSWr1/kgmytooWDAvRBZdDtfcdKGjTq8UUVXZ+YmwtS0rweJFLvzmrVqx/1rTfGEroCtQXhUUbWC8KTw9FpBNXlXuENJR+PC58J9mlxQ+N7UYxa/mZyy+MdkLRwaA3ursDtVxbEqVtJaVlhejiebWVXK9zFf0pzIzc/J2i2zC50QQQK4mWKcMfwMMCLej5dB+mVHjXxfKX+WvOQq4lXW0VghRZoCfaKuSvWErEnREzIyrJv9/9tXPTk0aFVvDkD9i2F89IBzB4rbhvF9bBjFE3A8w1Wukp8/guFP0bcrmucQXJtwcV3RYntwuQWdT2pUi5Ykh0x7MgnvZ9ASgfZbaFyyelY+5/QRwhvyVTewfwC9Eu9a/gU46mfRWXQCPQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcxJREFUSIm91sGLjlEUx/HPDAt11WWlbEYUNsqCsrChhCQSWSg2alIsrJQ/wsLKxsLORs1sJDY0TdEYTUqzmYWIMlm4i2M2M43F+yrG+77PfXjNb3nOved7z3nOPc+lpSLKlYjyPqKsRJSpiLKvzf6RlrCTeLzG/AV7UsqlJsZoGyCu9rBtw9naAG0zXMaGHq7XKeWDQwVGlFGs9POnlKtitSnpjoYDjQ0beKLBX/Udq8oQUTJeYu+AZXM4kFLuW3YqMowouzHRAIP9uNEU748MI8pG7MRhHMf5moN19R2XUsoTA4ER5TTGcaoycJPu4xFmUspffwNGlMt4MCRQPz3EvZTyi5GIsoBd/xkIq7gwElGWsGkdgDA/iul1gsHYKK7j0zoBX/3s0s06HXoEF7HlP8AWcbTnpIkoW3ETt/X+O9ToXXfvNKYwmVL+NnC0RZRDOvdpeyVkFXdwN6X8odeCxlkaUY7haQVsEedSygObsHFkpZSf4UkFcLwJVgXs6nmD/82g+fk3wNkG/9qH1T8DezbAL6oeHrXAjwa8Z/B2qMCU8hIm+7hnU8qfhwrs6haW1tiWca1FjHpgSnlB5yE1p3PB53EmpTzTBvgD8suAQT4OgVAAAAAASUVORK5CYII=",Le=""+new URL("planet-blue.Dl2xr_Rd.png",import.meta.url).href,ke=""+new URL("planet-ring.Cu48O4jc.png",import.meta.url).href,Me=""+new URL("planet-red.BluWtDiz.png",import.meta.url).href,Ve={class:"page-wrapper hero-wrapper"},be={class:"hero"},xe=e("h1",null,[$("Blast your Startup to the "),e("span",{class:"emph"},"Cosmos")],-1),Ce=e("h2",null,"QAComet: Subscription-Based Quality Assurance for your SaaS",-1),Se={class:"cta-outer"},Be={class:"hero-cta",href:"#plan"},Pe=e("span",{class:"hero-cta-text"},"Get Started",-1),ze={class:"hero-cta-icon"},qe=e("img",{class:"star star-1",src:M},null,-1),De=e("img",{class:"star star-2",src:M},null,-1),Fe=e("img",{class:"star star-3",src:M},null,-1),Ne=e("img",{class:"star star-4",src:M},null,-1),Re=e("div",{class:"hero-images"},[e("img",{class:"star planet-1",src:Le}),e("img",{class:"star planet-2",src:ke}),e("img",{class:"star planet-3",src:Me})],-1);function We(s,o,n,h,u,p){const t=H("PhRocketLaunch");return a(),l("div",Ve,[e("div",be,[xe,Ce,e("div",Se,[e("a",Be,[Pe,e("div",ze,[v(t)])]),qe,De,Fe,Ne])]),Re])}const je=L(He,[["render",We]]),Qe=k({components:{}},"$0jV3At8Fqp"),Te="data:image/png;base64,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",Ee=""+new URL("linkwarden-logo.Cnb5oU7W.png",import.meta.url).href,Ue={class:"brand-logos-wrapper"},Xe=R('
',1),Ge=[Xe];function Je(s,o,n,h,u,p){return a(),l("div",Ue,Ge)}const Ye=L(Qe,[["render",Je]]),Ie=k({name:"HowItWorks",components:{PhFileArrowDown:c6,PhKanban:C6,PhRepeat:S8}},"$Y4gCXyqNGe"),Oe={class:"how-it-works-outer"},Ke=e("div",{class:"bg-img"},null,-1),et={class:"how-it-works-inner",id:"how-it-works"},tt={class:"page-wrapper"},at=e("div",{class:"section-header"},[e("h1",null,"We've Revamped QA"),e("h2",null,[$("Now it's an Asnyc Workflow"),e("br"),$("Orbiting around your Product")])],-1),lt={class:"steps-wrapper pt-8"},ot={class:"step"},st={class:"step-icon shadow-main"},nt=e("div",{class:"step-copy"},[e("h3",null,"Schedule"),e("span",null,"Subscribe to our service and submit as many tickets as you want on our Github Project board.")],-1),rt={class:"step"},it={class:"step-icon shadow-main"},ct=e("div",{class:"step-copy"},[e("h3",null,"Receive"),e("span",null,"You'll see a response with a full QA report, test code, etc. within 2-3 business days")],-1),ht={class:"step"},dt={class:"step-icon shadow-main"},ut=e("div",{class:"step-copy"},[e("h3",null,"Update"),e("span",null,"We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.")],-1);function pt(s,o,n,h,u,p){const t=H("ph-kanban"),r=H("ph-file-arrow-down"),g=H("ph-repeat");return a(),l("div",Oe,[Ke,e("div",et,[e("div",tt,[at,e("div",lt,[e("div",ot,[e("div",st,[v(t,{weight:"duotone"})]),nt]),e("div",rt,[e("div",it,[v(r,{weight:"duotone"})]),ct]),e("div",ht,[e("div",dt,[v(g)]),ut])])])])])}const gt=L(Ie,[["render",pt]]),mt=""+new URL("ali-photo.C0U5PBBD.jpg",import.meta.url).href,vt=k({components:{PhArrowRight:U,PhCaretLeft:r0,PhCaretRight:b0,PhQuotes:X},data(){return{image:mt,slides:[{}]}},methods:{slideLeft(){},slideRight(){}}},"$WfSQQL4a1P"),$t={class:"recent-work-outer",id:"recent-work"},yt={class:"page-wrapper"},wt=e("div",{class:"section-header"},[e("h1",null,"Recent QA Work")],-1),At={class:"slider-outer"};function ft(s,o,n,h,u,p){const t=G;return a(),l("div",$t,[e("div",yt,[wt,e("div",At,[v(t,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali B.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",caseStudy:"/case-studies/automatisch",testimonial:"Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier."})])])])}const _t=L(vt,[["render",ft]]),Zt=k({name:"HowItWorks",components:{PhBackspace:$1,PhBrowsers:N1,PhCloudCheck:w2,PhCreditCard:W2,PhPlugs:j4,PhUsers:_e}},"$qIsZyFbGE8"),Ht="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20413%20213'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-229.252,-1518.25)'%3e%3cg%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,142.617,1012.17)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,2.5,0)'%3e%3cpath%20d='M245.577,1528.18L406.577,1577.68C407.368,1577.93%20408.208,1577.48%20408.451,1576.69C408.695,1575.9%20408.25,1575.06%20407.458,1574.82L246.458,1525.32C245.667,1525.07%20244.827,1525.52%20244.584,1526.31C244.34,1527.1%20244.785,1527.94%20245.577,1528.18Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Lt="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20255%20257'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-918.017,-1484.25)'%3e%3cg%20transform='matrix(1,0,0,1,499,10)'%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,534.882,968.167)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,576.882,1136.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M251.03,1514.78L258.03,1568.94C258.136,1569.76%20258.889,1570.34%20259.71,1570.24C260.531,1570.13%20261.111,1569.38%20261.005,1568.56L254.005,1514.39C253.899,1513.57%20253.146,1512.99%20252.325,1513.1C251.504,1513.2%20250.924,1513.95%20251.03,1514.78Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M265.344,1593.85L287.344,1660.22C287.604,1661.01%20288.454,1661.43%20289.239,1661.17C290.025,1660.91%20290.452,1660.06%20290.191,1659.28L268.191,1592.9C267.931,1592.12%20267.081,1591.69%20266.296,1591.95C265.51,1592.21%20265.083,1593.06%20265.344,1593.85Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",kt={class:"services-outer",id:"tasks"},Mt=e("img",{class:"constellation-1",width:"320",src:Ht},null,-1),Vt=e("img",{class:"constellation-2",width:"240",src:Lt},null,-1),bt={class:"services-inner"},xt={class:"page-wrapper"},Ct=e("div",{class:"section-header"},[e("h1",null,"Subscription Benefits"),e("h2",null,"A Constellation of QA and Testing Services for Robust Launches of New Products and Features")],-1),St={class:"steps-wrapper first-steps-wrapper"},Bt={class:"step"},Pt={class:"step-icon shadow-main"},zt=e("div",{class:"step-copy"},[e("h3",null,"Sales Funnel Testing"),e("span",null,"Find bugs before potential customers leave from frustration")],-1),qt={class:"step"},Dt={class:"step-icon shadow-main"},Ft=e("div",{class:"step-copy"},[e("h3",null,"Usability Testing"),e("span",null,"Extensive usability tests for those hard to find edge cases and bugs")],-1),Nt={class:"step"},Rt={class:"step-icon shadow-main"},Wt=e("div",{class:"step-copy"},[e("h3",null,"E2E Testing"),e("span",null,"We'll test user workflows guaranteeing minimal functionality before deployment")],-1),jt={class:"steps-wrapper"},Qt={class:"step"},Tt={class:"step-icon shadow-main"},Et=e("div",{class:"step-copy"},[e("h3",null,"Multi-Browser Support"),e("span",null,"We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac")],-1),Ut={class:"step"},Xt={class:"step-icon shadow-main"},Gt=e("div",{class:"step-copy"},[e("h3",null,"Regression Testing"),e("span",null,"Make sure bug fixes don't revert, especially for core functionality")],-1),Jt={class:"step"},Yt={class:"step-icon shadow-main"},It=e("div",{class:"step-copy"},[e("h3",null,"Integration Testing"),e("span",null,"Ensure your systems are coordinating together")],-1);function Ot(s,o,n,h,u,p){const t=H("ph-credit-card"),r=H("ph-users"),g=H("ph-cloud-check"),m=H("ph-browsers"),d=H("ph-backspace"),w=H("ph-plugs");return a(),l("div",kt,[Mt,Vt,e("div",bt,[e("div",xt,[Ct,e("div",St,[e("div",Bt,[e("div",Pt,[v(t)]),zt]),e("div",qt,[e("div",Dt,[v(r)]),Ft]),e("div",Nt,[e("div",Rt,[v(g)]),Wt])]),e("div",jt,[e("div",Qt,[e("div",Tt,[v(m)]),Et]),e("div",Ut,[e("div",Xt,[v(d)]),Gt]),e("div",Jt,[e("div",Yt,[v(w)]),It])])])])])}const Kt=L(Zt,[["render",Ot]]),ea=k({props:{setOption:{type:Function,default:s=>{}}},watch:{option(){this.setBgStyle()}},data(){return{option:"monthly",bgStyle:{width:"0px",height:"0px"}}},computed:{ariaLabel(){return this.option==="monthly"?"Toggle yearly plan":"Toggle monthly plan"}},mounted(){this.setBgStyle(),document.fonts.ready.finally(()=>{this.setBgStyle()})},methods:{setBgStyle(){const s=this.$refs.wrapper;if(!s)return;const o=s.getBoundingClientRect();if(this.option==="monthly"){const n=this.$refs.monthly;if(n){const h=n.getBoundingClientRect(),u=h.x-o.x-2;this.bgStyle={width:h.width+"px",height:h.height-4+"px",borderRadius:Math.ceil((n.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}else{const n=this.$refs.yearly;if(n){const h=n.getBoundingClientRect(),u=h.x-o.x;this.bgStyle={width:h.width+"px",height:h.height-4+"px",borderRadius:Math.ceil((n.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}},toggle(){this.option=this.option==="monthly"?"yearly":"monthly",this.setOption(this.option)}}},"$m7wA03iy9u"),ta=["aria-label"],aa={class:"text",ref:"monthly"},la={class:"text",ref:"yearly"};function oa(s,o,n,h,u,p){return a(),l("button",{class:"toggle-wrapper",ref:"wrapper",onClick:o[0]||(o[0]=(...t)=>s.toggle&&s.toggle(...t)),"aria-label":s.ariaLabel},[e("div",{class:"toggle-bg",style:W(s.bgStyle)},null,4),e("span",aa,"Monthly",512),e("span",la,"Yearly",512)],8,ta)}const sa=L(ea,[["render",oa]]),na=k({name:"Plan",components:{PhCheck:I0,PhPhone:S},data(){return{option:"monthly"}},computed:{signupLink(){return"mailto:hello@qacomet.com?subject=Get Started "+(this.option==="monthly"?"Monthly":"Yearly")+"&body=Hey,%0D%0A%0D%0AI'm interested in using your service, could you send me an invoice and we can get started?"},bookLink(){const s=new Date,o=s.getMonth()<9?"0"+(s.getMonth()+1):s.getMonth()+1;return"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month="+(s.getFullYear()+"-"+o)},price(){return this.option==="monthly"?"4,999":"4,249"}},methods:{setOption(s){this.option=s}}},"$DqbyBHNawb"),ra={class:"plan-outer",id:"plan"},ia={class:"page-wrapper"},ca=e("div",{class:"section-header plan-header",style:{"padding-bottom":"2rem"}},[e("img",{class:"star star-1",src:M}),e("img",{class:"star star-2",src:M}),e("img",{class:"star star-3",src:M}),e("h1",null,"Clear Pricing"),e("h2",null,[$("Building great products is hard,"),e("br"),$("pricing shouldn't be")])],-1),ha={class:"plan-toggle-wrapper"},da={class:"plan"},ua={class:"plan-body"},pa={class:"plan-info"},ga=e("span",{class:"slash"},null,-1),ma=e("span",{class:"slash"},"/",-1),va=e("span",{class:"mo"},"mo",-1),$a=e("br",null,null,-1),ya=e("h3",null,"Pause or cancel anytime",-1),wa=["href"],Aa={class:"plan-features"},fa={class:"plan-feature-row"},_a={class:"check"},Za=e("div",{class:"plan-feature"},"1 request at a time",-1),Ha={class:"plan-feature-row"},La={class:"check"},ka=e("div",{class:"plan-feature"},"2 week $50 trial",-1),Ma={class:"plan-feature-row"},Va={class:"check"},ba=e("div",{class:"plan-feature"},"2-3 business day delivery",-1),xa={class:"plan-feature-row"},Ca={class:"check"},Sa=e("div",{class:"plan-feature"},"Unlimited users",-1),Ba={class:"plan-feature-row"},Pa={class:"check"},za=e("div",{class:"plan-feature"},"No contracts, pause or cancel anytime",-1),qa={class:"booking-wrapper"},Da=e("div",{class:"booking-text"},"Curious how QAComet will work for you?",-1),Fa=["href"],Na=e("span",null,"Book a call",-1),Ra=[Na];function Wa(s,o,n,h,u,p){const t=sa,r=H("ph-check");return a(),l("div",ra,[e("div",ia,[ca,e("div",ha,[v(t,{setOption:s.setOption},null,8,["setOption"])]),e("div",da,[e("div",ua,[e("div",pa,[e("h1",null,[ga,$("$"+b(s.price),1),ma,va]),e("h2",null,[$("Billed "+b(s.option),1),$a,$("no contracts, no commitments")]),ya,e("a",{class:"payment",href:s.signupLink},"Signup",8,wa)]),e("div",Aa,[e("div",fa,[e("div",_a,[v(r,{weight:"bold"})]),Za]),e("div",Ha,[e("div",La,[v(r,{weight:"bold"})]),ka]),e("div",Ma,[e("div",Va,[v(r,{weight:"bold"})]),ba]),e("div",xa,[e("div",Ca,[v(r,{weight:"bold"})]),Sa]),e("div",Ba,[e("div",Pa,[v(r,{weight:"bold"})]),za])])])]),e("div",qa,[Da,e("a",{href:s.bookLink,class:"booking-cta"},Ra,8,Fa)])])])}const ja=L(na,[["render",Wa]]),Qa=k({name:"Accordion",components:{PhMinus:K6,PhPlus:h8},data(){return{expanded:!1}},methods:{handleExpanded(){this.expanded=!this.expanded}}},"$Y0yju32yn3"),Ta={class:"accordion-wrapper"},Ea={class:"accordion-header-text"},Ua={class:"accordion-header-icon","aria-label":"Expand accordion"},Xa={key:0,class:"icon"},Ga={key:1,class:"icon"},Ja={class:"accordion-text"};function Ya(s,o,n,h,u,p){const t=H("PhMinus"),r=H("PhPlus");return a(),l("div",Ta,[e("div",{class:"accordion-header",onClick:o[0]||(o[0]=(...g)=>s.handleExpanded&&s.handleExpanded(...g))},[e("div",Ea,[e("span",null,[A(s.$slots,"header")])]),e("button",Ua,[s.expanded?(a(),l("div",Xa,[v(t,{weight:"bold"})])):(a(),l("div",Ga,[v(r,{weight:"bold"})]))])]),e("div",{class:j(["accordion-text-wrapper",{"accordion-text-hidden":!s.expanded,"accordion-text-expanded":s.expanded}])},[e("div",Ja,[A(s.$slots,"text")])],2)])}const Ia=L(Qa,[["render",Ya]]),Oa=k({},"$Wb7gDotc3K"),Ka={class:"faqs-outer",id:"faqs"},e3={class:"page-wrapper"},t3=e("div",{class:"section-header"},[e("h1",null,"FAQ's")],-1),a3={class:"faqs-body"},l3=e("a",{href:"https://playwright.dev/"},"Playwright",-1);function o3(s,o,n,h,u,p){const t=Ia;return a(),l("div",Ka,[e("div",e3,[t3,e("div",a3,[v(t,null,{header:y(()=>[$("Why wouldn't I just hire a full-time QA engineer?")]),text:y(()=>[$("Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.")]),_:1}),v(t,null,{header:y(()=>[$("Which frameworks do you use for testing?")]),text:y(()=>[$("We mainly write tests in javascript using "),l3,$(". We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.")]),_:1}),v(t,null,{header:y(()=>[$("What kind of platforms do you offer testing on?")]),text:y(()=>[$("We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.")]),_:1}),v(t,null,{header:y(()=>[$("How can I run these tests?")]),text:y(()=>[$("Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.")]),_:1}),v(t,null,{header:y(()=>[$("How quickly will tests be ready?")]),text:y(()=>[$("We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.")]),_:1}),v(t,null,{header:y(()=>[$("Can we use another project management tool?")]),text:y(()=>[$("We can, but that's an add on cost since it slows down our workflow.")]),_:1}),v(t,null,{header:y(()=>[$("How are projects split up?")]),text:y(()=>[$("You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.")]),_:1}),v(t,null,{header:y(()=>[$("How can I get started?")]),text:y(()=>[$('You can click on the "Start Today" button in the navbar and it will take you to the registration section.')]),_:1}),v(t,null,{header:y(()=>[$("Do you offer yearly pricing?")]),text:y(()=>[$("Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!")]),_:1}),v(t,null,{header:y(()=>[$("Can I get a refund if I'm not satisfied?")]),text:y(()=>[$("We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.")]),_:1})])])])}const s3=L(Oa,[["render",o3]]),n3=k({name:"Plan",components:{PhPhone:S},computed:{bookLink(){const s=new Date,o=s.getMonth()<9?"0"+(s.getMonth()+1):s.getMonth()+1;return"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month="+(s.getFullYear()+"-"+o)}}},"$lLdJQFVJ7l"),r3={class:"end-outer"},i3={class:"page-wrapper end-wrapper"},c3=e("h2",null,"Book a call and see if QAComet works for you",-1),h3=e("h3",null,"Receive a guided tour through our QA process and find out how your company can benefit from QAComet.",-1),d3=["href"],u3=e("span",null,"Book a call",-1);function p3(s,o,n,h,u,p){const t=H("PhPhone");return a(),l("div",r3,[e("div",i3,[c3,h3,e("a",{href:s.bookLink,class:"end-cta"},[u3,v(t)],8,d3)])])}const g3=L(n3,[["render",p3]]),f3=f({__name:"index",setup(s){const o=T(),n=new URL(o.public.baseUrl);n.pathname=J;const h=n.toString();return C({title:"QAComet - QA as a service for only $5k/month",meta:[{name:"description",content:"QAComet is built for testing your SaaS or webapp. We effectively find bugs and hard to reach edge cases and quickly write robust tests using playwright. If you try us today, we have a $50 14 day trial available for new customers, limited to the first 5 customers. Start today!"},{property:"og:image",content:h},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:h}],link:[{rel:"canonical",href:"https://qacomet.com"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"Organization",image:["https://qacomet.com/img/qacomet-logo.png","https://qacomet.com/img/open-graph-banner.jpg"],url:"https://qacomet.com",logo:"https://qacomet.com/img/qacomet-logo.png",sameAs:["https://github.com/QAComet","https://mastodon.social/@qacomet","https://bsky.app/profile/qacomet.bsky.social","https://twitter.com/QACometOfficial"],name:"QAComet",legalName:"QAComet LLC",description:"QAComet is a subscription service for unlimited QA work. For $5k/month you get unlimited requests to write end-to-end tests, integration tests, unit tests, do QA and usability reviews, and work on finding and reporting bugs.",email:"hello@qacomet.com",contactPoint:{"@type":"ContactPoint",email:"hello@qacomet.com"}})}]}),(u,p)=>{const t=je,r=Ye,g=gt,m=_t,d=Kt,w=ja,B=s3,P=g3;return a(),l(Q,null,[v(t),v(r),v(g),v(m),v(d),v(w),v(B),v(P)],64)}}});export{f3 as default}; +import{u as C}from"./maW11VfC.js";import{f,j as i,k as c,o as a,c as l,l as A,m as _,n as Z,a as e,q as z,s as q,v as D,x as F,y as V,z as N,_ as L,A as H,b as v,d as $,B as R,C as W,t as b,D as j,w as y,F as Q,u as T}from"./BlS8upJP.js";import{u as E}from"./CRh1_mKz.js";import{F as U,G as X,_ as G}from"./CZcQ1mDI.js";import{_ as J}from"./Czu_W2CL.js";import"./CFzORWKb.js";const Y=["width","height","fill","transform"],I={key:0},O=e("path",{d:"M216,36H68.53a20.09,20.09,0,0,0-17.15,9.71L5.71,121.83a12,12,0,0,0,0,12.34l45.67,76.12A20.09,20.09,0,0,0,68.53,220H216a20,20,0,0,0,20-20V56A20,20,0,0,0,216,36Zm-4,160H70.8L30,128,70.8,60H212ZM103.51,143.51,119,128l-15.52-15.51a12,12,0,0,1,17-17L136,111l15.51-15.52a12,12,0,0,1,17,17L153,128l15.52,15.51a12,12,0,0,1-17,17L136,145l-15.51,15.52a12,12,0,0,1-17-17Z"},null,-1),K=[O],e1={key:1},t1=e("path",{d:"M224,56V200a8,8,0,0,1-8,8H68.53a8,8,0,0,1-6.86-3.88L16,128,61.67,51.88A8,8,0,0,1,68.53,48H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),a1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),l1=[t1,a1],o1={key:2},s1=e("path",{d:"M216,40H68.53a16.12,16.12,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11h0A16.11,16.11,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM165.66,146.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.35,18.35a8,8,0,0,1-11.31-11.32L124.69,128l-18.35-18.34a8,8,0,1,1,11.31-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128Z"},null,-1),n1=[s1],r1={key:3},i1=e("path",{d:"M216,42H68.53a14,14,0,0,0-12,6.8L10.86,124.91a6,6,0,0,0,0,6.18L56.53,207.2a14,14,0,0,0,12,6.8H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42Zm2,158a2,2,0,0,1-2,2H68.53a2,2,0,0,1-1.71-1h0L23,128,66.82,55a2,2,0,0,1,1.71-1H216a2,2,0,0,1,2,2Zm-53.76-91.76L144.48,128l19.76,19.76a6,6,0,1,1-8.48,8.48L136,136.48l-19.76,19.76a6,6,0,0,1-8.48-8.48L127.52,128l-19.76-19.76a6,6,0,0,1,8.48-8.48L136,119.52l19.76-19.76a6,6,0,0,1,8.48,8.48Z"},null,-1),c1=[i1],h1={key:4},d1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),u1=[d1],p1={key:5},g1=e("path",{d:"M216,44H68.53a12.06,12.06,0,0,0-10.29,5.83L12.57,125.94a4,4,0,0,0,0,4.12l45.67,76.11A12.06,12.06,0,0,0,68.53,212H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44Zm4,156a4,4,0,0,1-4,4H68.53a4,4,0,0,1-3.43-1.94L20.67,128,65.1,53.94A4,4,0,0,1,68.53,52H216a4,4,0,0,1,4,4Zm-57.17-93.17L141.66,128l21.17,21.17a4,4,0,0,1-5.66,5.66L136,133.66l-21.17,21.17a4,4,0,0,1-5.66-5.66L130.34,128l-21.17-21.17a4,4,0,0,1,5.66-5.66L136,122.34l21.17-21.17a4,4,0,1,1,5.66,5.66Z"},null,-1),m1=[g1],v1={name:"PhBackspace"},$1=f({...v1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",I,K)):t.value==="duotone"?(a(),l("g",e1,l1)):t.value==="fill"?(a(),l("g",o1,n1)):t.value==="light"?(a(),l("g",r1,c1)):t.value==="regular"?(a(),l("g",h1,u1)):t.value==="thin"?(a(),l("g",p1,m1)):_("",!0)],16,Y))}}),y1=["width","height","fill","transform"],w1={key:0},A1=e("path",{d:"M220,32H76A20,20,0,0,0,56,52V72H36A20,20,0,0,0,16,92V204a20,20,0,0,0,20,20H180a20,20,0,0,0,20-20V184h20a20,20,0,0,0,20-20V52A20,20,0,0,0,220,32ZM176,96v16H40V96Zm0,104H40V136H176Zm40-40H200V92a20,20,0,0,0-20-20H80V56H216Z"},null,-1),f1=[A1],_1={key:1},Z1=e("path",{d:"M224,56V168a8,8,0,0,1-8,8H192V88a8,8,0,0,0-8-8H64V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),H1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,88H184v16H40ZM184,200H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),L1=[Z1,H1],k1={key:2},M1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm32,80H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),V1=[M1],b1={key:3},x1=e("path",{d:"M216,42H72A14,14,0,0,0,58,56V74H40A14,14,0,0,0,26,88V200a14,14,0,0,0,14,14H184a14,14,0,0,0,14-14V182h18a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM40,86H184a2,2,0,0,1,2,2v18H38V88A2,2,0,0,1,40,86ZM186,200a2,2,0,0,1-2,2H40a2,2,0,0,1-2-2V118H186Zm32-32a2,2,0,0,1-2,2H198V88a14,14,0,0,0-14-14H70V56a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2Z"},null,-1),C1=[x1],S1={key:4},B1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm0,112H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),P1=[B1],z1={key:5},q1=e("path",{d:"M216,44H72A12,12,0,0,0,60,56V76H40A12,12,0,0,0,28,88V200a12,12,0,0,0,12,12H184a12,12,0,0,0,12-12V180h20a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM40,84H184a4,4,0,0,1,4,4v20H36V88A4,4,0,0,1,40,84ZM188,200a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V116H188Zm32-32a4,4,0,0,1-4,4H196V88a12,12,0,0,0-12-12H68V56a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4Z"},null,-1),D1=[q1],F1={name:"PhBrowsers"},N1=f({...F1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",w1,f1)):t.value==="duotone"?(a(),l("g",_1,L1)):t.value==="fill"?(a(),l("g",k1,V1)):t.value==="light"?(a(),l("g",b1,C1)):t.value==="regular"?(a(),l("g",S1,P1)):t.value==="thin"?(a(),l("g",z1,D1)):_("",!0)],16,y1))}}),R1=["width","height","fill","transform"],W1={key:0},j1=e("path",{d:"M168.49,199.51a12,12,0,0,1-17,17l-80-80a12,12,0,0,1,0-17l80-80a12,12,0,0,1,17,17L97,128Z"},null,-1),Q1=[j1],T1={key:1},E1=e("path",{d:"M160,48V208L80,128Z",opacity:"0.2"},null,-1),U1=e("path",{d:"M163.06,40.61a8,8,0,0,0-8.72,1.73l-80,80a8,8,0,0,0,0,11.32l80,80A8,8,0,0,0,168,208V48A8,8,0,0,0,163.06,40.61ZM152,188.69,91.31,128,152,67.31Z"},null,-1),X1=[E1,U1],G1={key:2},J1=e("path",{d:"M168,48V208a8,8,0,0,1-13.66,5.66l-80-80a8,8,0,0,1,0-11.32l80-80A8,8,0,0,1,168,48Z"},null,-1),Y1=[J1],I1={key:3},O1=e("path",{d:"M164.24,203.76a6,6,0,1,1-8.48,8.48l-80-80a6,6,0,0,1,0-8.48l80-80a6,6,0,0,1,8.48,8.48L88.49,128Z"},null,-1),K1=[O1],e0={key:4},t0=e("path",{d:"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z"},null,-1),a0=[t0],l0={key:5},o0=e("path",{d:"M162.83,205.17a4,4,0,0,1-5.66,5.66l-80-80a4,4,0,0,1,0-5.66l80-80a4,4,0,1,1,5.66,5.66L85.66,128Z"},null,-1),s0=[o0],n0={name:"PhCaretLeft"},r0=f({...n0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",W1,Q1)):t.value==="duotone"?(a(),l("g",T1,X1)):t.value==="fill"?(a(),l("g",G1,Y1)):t.value==="light"?(a(),l("g",I1,K1)):t.value==="regular"?(a(),l("g",e0,a0)):t.value==="thin"?(a(),l("g",l0,s0)):_("",!0)],16,R1))}}),i0=["width","height","fill","transform"],c0={key:0},h0=e("path",{d:"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z"},null,-1),d0=[h0],u0={key:1},p0=e("path",{d:"M176,128,96,208V48Z",opacity:"0.2"},null,-1),g0=e("path",{d:"M181.66,122.34l-80-80A8,8,0,0,0,88,48V208a8,8,0,0,0,13.66,5.66l80-80A8,8,0,0,0,181.66,122.34ZM104,188.69V67.31L164.69,128Z"},null,-1),m0=[p0,g0],v0={key:2},$0=e("path",{d:"M181.66,133.66l-80,80A8,8,0,0,1,88,208V48a8,8,0,0,1,13.66-5.66l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),y0=[$0],w0={key:3},A0=e("path",{d:"M180.24,132.24l-80,80a6,6,0,0,1-8.48-8.48L167.51,128,91.76,52.24a6,6,0,0,1,8.48-8.48l80,80A6,6,0,0,1,180.24,132.24Z"},null,-1),f0=[A0],_0={key:4},Z0=e("path",{d:"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),H0=[Z0],L0={key:5},k0=e("path",{d:"M178.83,130.83l-80,80a4,4,0,0,1-5.66-5.66L170.34,128,93.17,50.83a4,4,0,0,1,5.66-5.66l80,80A4,4,0,0,1,178.83,130.83Z"},null,-1),M0=[k0],V0={name:"PhCaretRight"},b0=f({...V0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",c0,d0)):t.value==="duotone"?(a(),l("g",u0,m0)):t.value==="fill"?(a(),l("g",v0,y0)):t.value==="light"?(a(),l("g",w0,f0)):t.value==="regular"?(a(),l("g",_0,H0)):t.value==="thin"?(a(),l("g",L0,M0)):_("",!0)],16,i0))}}),x0=["width","height","fill","transform"],C0={key:0},S0=e("path",{d:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"},null,-1),B0=[S0],P0={key:1},z0=e("path",{d:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",opacity:"0.2"},null,-1),q0=e("path",{d:"M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),D0=[z0,q0],F0={key:2},N0=e("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),R0=[N0],W0={key:3},j0=e("path",{d:"M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z"},null,-1),Q0=[j0],T0={key:4},E0=e("path",{d:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z"},null,-1),U0=[E0],X0={key:5},G0=e("path",{d:"M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z"},null,-1),J0=[G0],Y0={name:"PhCheck"},I0=f({...Y0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",C0,B0)):t.value==="duotone"?(a(),l("g",P0,D0)):t.value==="fill"?(a(),l("g",F0,R0)):t.value==="light"?(a(),l("g",W0,Q0)):t.value==="regular"?(a(),l("g",T0,U0)):t.value==="thin"?(a(),l("g",X0,J0)):_("",!0)],16,x0))}}),O0=["width","height","fill","transform"],K0={key:0},e2=e("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Zm40.49-92.49a12,12,0,0,1,0,17l-48,48a12,12,0,0,1-17,0l-24-24a12,12,0,1,1,17-17L144,143l39.51-39.52A12,12,0,0,1,200.49,103.51Z"},null,-1),t2=[e2],a2={key:1},l2=e("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"},null,-1),o2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),s2=[l2,o2],n2={key:2},r2=e("path",{d:"M247.93,124.52C246.11,77.54,207.07,40,160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160A88.09,88.09,0,0,0,247.93,124.52Zm-50.27-6.86-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35a8,8,0,0,1,11.32,11.32Z"},null,-1),i2=[r2],c2={key:3},h2=e("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Zm36.24-94.24a6,6,0,0,1,0,8.48l-48,48a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L144,151.51l43.76-43.75A6,6,0,0,1,196.24,107.76Z"},null,-1),d2=[h2],u2={key:4},p2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),g2=[p2],m2={key:5},v2=e("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Zm34.83-94.83a4,4,0,0,1,0,5.66l-48,48a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L144,154.34l45.17-45.17A4,4,0,0,1,194.83,109.17Z"},null,-1),$2=[v2],y2={name:"PhCloudCheck"},w2=f({...y2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",K0,t2)):t.value==="duotone"?(a(),l("g",a2,s2)):t.value==="fill"?(a(),l("g",n2,i2)):t.value==="light"?(a(),l("g",c2,d2)):t.value==="regular"?(a(),l("g",u2,g2)):t.value==="thin"?(a(),l("g",m2,$2)):_("",!0)],16,O0))}}),A2=["width","height","fill","transform"],f2={key:0},_2=e("path",{d:"M224,44H32A20,20,0,0,0,12,64V192a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V64A20,20,0,0,0,224,44Zm-4,24V88H36V68ZM36,188V112H220v76Zm172-24a12,12,0,0,1-12,12H164a12,12,0,0,1,0-24h32A12,12,0,0,1,208,164Zm-68,0a12,12,0,0,1-12,12H116a12,12,0,0,1,0-24h12A12,12,0,0,1,140,164Z"},null,-1),Z2=[_2],H2={key:1},L2=e("path",{d:"M232,96v96a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V96Z",opacity:"0.2"},null,-1),k2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),M2=[L2,k2],V2={key:2},b2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM136,176H120a8,8,0,0,1,0-16h16a8,8,0,0,1,0,16Zm64,0H168a8,8,0,0,1,0-16h32a8,8,0,0,1,0,16ZM32,88V64H224V88Z"},null,-1),x2=[b2],C2={key:3},S2=e("path",{d:"M224,50H32A14,14,0,0,0,18,64V192a14,14,0,0,0,14,14H224a14,14,0,0,0,14-14V64A14,14,0,0,0,224,50ZM32,62H224a2,2,0,0,1,2,2V90H30V64A2,2,0,0,1,32,62ZM224,194H32a2,2,0,0,1-2-2V102H226v90A2,2,0,0,1,224,194Zm-18-26a6,6,0,0,1-6,6H168a6,6,0,0,1,0-12h32A6,6,0,0,1,206,168Zm-64,0a6,6,0,0,1-6,6H120a6,6,0,0,1,0-12h16A6,6,0,0,1,142,168Z"},null,-1),B2=[S2],P2={key:4},z2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),q2=[z2],D2={key:5},F2=e("path",{d:"M224,52H32A12,12,0,0,0,20,64V192a12,12,0,0,0,12,12H224a12,12,0,0,0,12-12V64A12,12,0,0,0,224,52ZM32,60H224a4,4,0,0,1,4,4V92H28V64A4,4,0,0,1,32,60ZM224,196H32a4,4,0,0,1-4-4V100H228v92A4,4,0,0,1,224,196Zm-20-28a4,4,0,0,1-4,4H168a4,4,0,0,1,0-8h32A4,4,0,0,1,204,168Zm-64,0a4,4,0,0,1-4,4H120a4,4,0,0,1,0-8h16A4,4,0,0,1,140,168Z"},null,-1),N2=[F2],R2={name:"PhCreditCard"},W2=f({...R2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",f2,Z2)):t.value==="duotone"?(a(),l("g",H2,M2)):t.value==="fill"?(a(),l("g",V2,x2)):t.value==="light"?(a(),l("g",C2,B2)):t.value==="regular"?(a(),l("g",P2,q2)):t.value==="thin"?(a(),l("g",D2,N2)):_("",!0)],16,A2))}}),j2=["width","height","fill","transform"],Q2={key:0},T2=e("path",{d:"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Zm100.49-60.49a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17,0l-24-24a12,12,0,0,1,17-17L116,155V124a12,12,0,0,1,24,0v31l3.51-3.52A12,12,0,0,1,160.49,151.51Z"},null,-1),E2=[T2],U2={key:1},X2=e("path",{d:"M208,88H152V32Z",opacity:"0.2"},null,-1),G2=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),J2=[X2,G2],Y2={key:2},I2=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34Zm-56,83.32-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35a8,8,0,0,1,11.32,11.32ZM152,88V44l44,44Z"},null,-1),O2=[I2],K2={key:3},e6=e("path",{d:"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Zm-43.76-62.24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L122,169.51V120a6,6,0,0,1,12,0v49.51l13.76-13.75A6,6,0,0,1,156.24,155.76Z"},null,-1),t6=[e6],a6={key:4},l6=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),o6=[l6],s6={key:5},n6=e("path",{d:"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Zm-45.17-62.83a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L124,174.34V120a4,4,0,0,1,8,0v54.34l17.17-17.17A4,4,0,0,1,154.83,157.17Z"},null,-1),r6=[n6],i6={name:"PhFileArrowDown"},c6=f({...i6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",Q2,E2)):t.value==="duotone"?(a(),l("g",U2,J2)):t.value==="fill"?(a(),l("g",Y2,O2)):t.value==="light"?(a(),l("g",K2,t6)):t.value==="regular"?(a(),l("g",a6,o6)):t.value==="thin"?(a(),l("g",s6,r6)):_("",!0)],16,j2))}}),h6=["width","height","fill","transform"],d6={key:0},u6=e("path",{d:"M216,44H40A12,12,0,0,0,28,56V208a20,20,0,0,0,20,20H88a20,20,0,0,0,20-20V164h40v12a20,20,0,0,0,20,20h40a20,20,0,0,0,20-20V56A12,12,0,0,0,216,44Zm-12,64H172V68h32ZM84,68v40H52V68Zm0,136H52V132H84Zm24-64V68h40v72Zm64,32V132h32v40Z"},null,-1),p6=[u6],g6={key:1},m6=e("path",{d:"M216,56v64H160V56ZM40,208a8,8,0,0,0,8,8H88a8,8,0,0,0,8-8V120H40Z",opacity:"0.2"},null,-1),v6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48Zm-8,64H168V64h40ZM88,64v48H48V64Zm0,144H48V128H88Zm16-64V64h48v80Zm64,32V128h40v48Z"},null,-1),$6=[m6,v6],y6={key:2},w6=e("path",{d:"M160,56v96a8,8,0,0,1-8,8H112a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h40A8,8,0,0,1,160,56Zm64-8H184a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4h48a4,4,0,0,0,4-4V56A8,8,0,0,0,224,48Zm4,80H180a4,4,0,0,0-4,4v44a16,16,0,0,0,16,16h24a16,16,0,0,0,16-16V132A4,4,0,0,0,228,128ZM80,48H40a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4H84a4,4,0,0,0,4-4V56A8,8,0,0,0,80,48Zm4,80H36a4,4,0,0,0-4,4v76a16,16,0,0,0,16,16H72a16,16,0,0,0,16-16V132A4,4,0,0,0,84,128Z"},null,-1),A6=[w6],f6={key:3},_6=e("path",{d:"M216,50H40a6,6,0,0,0-6,6V208a14,14,0,0,0,14,14H88a14,14,0,0,0,14-14V158h52v18a14,14,0,0,0,14,14h40a14,14,0,0,0,14-14V56A6,6,0,0,0,216,50Zm-6,64H166V62h44ZM90,62v52H46V62Zm0,146a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V126H90Zm12-62V62h52v84Zm106,32H168a2,2,0,0,1-2-2V126h44v50A2,2,0,0,1,208,178Z"},null,-1),Z6=[_6],H6={key:4},L6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48ZM88,208H48V128H88Zm0-96H48V64H88Zm64,32H104V64h48Zm56,32H168V128h40Zm0-64H168V64h40Z"},null,-1),k6=[L6],M6={key:5},V6=e("path",{d:"M216,52H40a4,4,0,0,0-4,4V208a12,12,0,0,0,12,12H88a12,12,0,0,0,12-12V156h56v20a12,12,0,0,0,12,12h40a12,12,0,0,0,12-12V56A4,4,0,0,0,216,52ZM92,208a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V124H92Zm0-92H44V60H92Zm64,32H100V60h56Zm56,28a4,4,0,0,1-4,4H168a4,4,0,0,1-4-4V124h48Zm0-60H164V60h48Z"},null,-1),b6=[V6],x6={name:"PhKanban"},C6=f({...x6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",d6,p6)):t.value==="duotone"?(a(),l("g",g6,$6)):t.value==="fill"?(a(),l("g",y6,A6)):t.value==="light"?(a(),l("g",f6,Z6)):t.value==="regular"?(a(),l("g",H6,k6)):t.value==="thin"?(a(),l("g",M6,b6)):_("",!0)],16,h6))}}),S6=["width","height","fill","transform"],B6={key:0},P6=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128Z"},null,-1),z6=[P6],q6={key:1},D6=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),F6=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),N6=[D6,F6],R6={key:2},W6=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H72a8,8,0,0,1,0-16H184a8,8,0,0,1,0,16Z"},null,-1),j6=[W6],Q6={key:3},T6=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128Z"},null,-1),E6=[T6],U6={key:4},X6=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),G6=[X6],J6={key:5},Y6=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128Z"},null,-1),I6=[Y6],O6={name:"PhMinus"},K6=f({...O6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",B6,z6)):t.value==="duotone"?(a(),l("g",q6,N6)):t.value==="fill"?(a(),l("g",R6,j6)):t.value==="light"?(a(),l("g",Q6,E6)):t.value==="regular"?(a(),l("g",U6,G6)):t.value==="thin"?(a(),l("g",J6,I6)):_("",!0)],16,S6))}}),e4=["width","height","fill","transform"],t4={key:0},a4=e("path",{d:"M224,154.8l-47.09-21.11-.18-.08a19.94,19.94,0,0,0-19,1.75,13.08,13.08,0,0,0-1.12.84l-22.31,19c-13-7.05-26.43-20.37-33.49-33.21l19.06-22.66a11.76,11.76,0,0,0,.85-1.15,20,20,0,0,0,1.66-18.83,1.42,1.42,0,0,1-.08-.18L101.2,32A20.06,20.06,0,0,0,80.42,20.15,60.27,60.27,0,0,0,28,80c0,81.61,66.39,148,148,148a60.27,60.27,0,0,0,59.85-52.42A20.06,20.06,0,0,0,224,154.8ZM176,204A124.15,124.15,0,0,1,52,80,36.29,36.29,0,0,1,80.48,44.46l18.82,42L80.14,109.28a12,12,0,0,0-.86,1.16A20,20,0,0,0,78,130.08c9.42,19.28,28.83,38.56,48.31,48A20,20,0,0,0,146,176.63a11.63,11.63,0,0,0,1.11-.85l22.43-19.07,42,18.81A36.29,36.29,0,0,1,176,204Z"},null,-1),l4=[a4],o4={key:1},s4=e("path",{d:"M223.94,174.08A48.33,48.33,0,0,1,176,216,136,136,0,0,1,40,80,48.33,48.33,0,0,1,81.92,32.06a8,8,0,0,1,8.3,4.8l21.13,47.2a8,8,0,0,1-.66,7.53L89.32,117a7.93,7.93,0,0,0-.54,7.81c8.27,16.93,25.77,34.22,42.75,42.41a7.92,7.92,0,0,0,7.83-.59l25-21.3a8,8,0,0,1,7.59-.69l47.16,21.13A8,8,0,0,1,223.94,174.08Z",opacity:"0.2"},null,-1),n4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),r4=[s4,n4],i4={key:2},c4=e("path",{d:"M231.88,175.08A56.26,56.26,0,0,1,176,224C96.6,224,32,159.4,32,80A56.26,56.26,0,0,1,80.92,24.12a16,16,0,0,1,16.62,9.52l21.12,47.15,0,.12A16,16,0,0,1,117.39,96c-.18.27-.37.52-.57.77L96,121.45c7.49,15.22,23.41,31,38.83,38.51l24.34-20.71a8.12,8.12,0,0,1,.75-.56,16,16,0,0,1,15.17-1.4l.13.06,47.11,21.11A16,16,0,0,1,231.88,175.08Z"},null,-1),h4=[c4],d4={key:3},u4=e("path",{d:"M221.59,160.3l-47.24-21.17a14,14,0,0,0-13.28,1.22,4.81,4.81,0,0,0-.56.42l-24.69,21a1.88,1.88,0,0,1-1.68.06c-15.87-7.66-32.31-24-40-39.65a1.91,1.91,0,0,1,0-1.68l21.07-25a6.13,6.13,0,0,0,.42-.58,14,14,0,0,0,1.12-13.27L95.73,34.49a14,14,0,0,0-14.56-8.38A54.24,54.24,0,0,0,34,80c0,78.3,63.7,142,142,142a54.25,54.25,0,0,0,53.89-47.17A14,14,0,0,0,221.59,160.3ZM176,210C104.32,210,46,151.68,46,80A42.23,42.23,0,0,1,82.67,38h.23a2,2,0,0,1,1.84,1.31l21.1,47.11a2,2,0,0,1,0,1.67L84.73,113.15a4.73,4.73,0,0,0-.43.57,14,14,0,0,0-.91,13.73c8.87,18.16,27.17,36.32,45.53,45.19a14,14,0,0,0,13.77-1c.19-.13.38-.27.56-.42l24.68-21a1.92,1.92,0,0,1,1.6-.1l47.25,21.17a2,2,0,0,1,1.21,2A42.24,42.24,0,0,1,176,210Z"},null,-1),p4=[u4],g4={key:4},m4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),v4=[m4],$4={key:5},y4=e("path",{d:"M220.78,162.13,173.56,141A12,12,0,0,0,162.18,142a3.37,3.37,0,0,0-.38.28L137,163.42a3.93,3.93,0,0,1-3.7.21c-16.24-7.84-33.05-24.52-40.89-40.57a3.9,3.9,0,0,1,.18-3.69l21.2-25.21c.1-.12.19-.25.28-.38a12,12,0,0,0,1-11.36L93.9,35.28a12,12,0,0,0-12.48-7.19A52.25,52.25,0,0,0,36,80c0,77.2,62.8,140,140,140a52.25,52.25,0,0,0,51.91-45.42A12,12,0,0,0,220.78,162.13ZM220,173.58A44.23,44.23,0,0,1,176,212C103.22,212,44,152.78,44,80A44.23,44.23,0,0,1,82.42,36a3.87,3.87,0,0,1,.48,0,4,4,0,0,1,3.67,2.49l21.11,47.14a4,4,0,0,1-.23,3.6l-21.19,25.2c-.1.13-.2.25-.29.39a12,12,0,0,0-.78,11.75c8.69,17.79,26.61,35.58,44.6,44.27a12,12,0,0,0,11.79-.87l.37-.28,24.83-21.12a3.93,3.93,0,0,1,3.57-.27l47.21,21.16A4,4,0,0,1,220,173.58Z"},null,-1),w4=[y4],A4={name:"PhPhone"},S=f({...A4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",t4,l4)):t.value==="duotone"?(a(),l("g",o4,r4)):t.value==="fill"?(a(),l("g",i4,h4)):t.value==="light"?(a(),l("g",d4,p4)):t.value==="regular"?(a(),l("g",g4,v4)):t.value==="thin"?(a(),l("g",$4,w4)):_("",!0)],16,e4))}}),f4=["width","height","fill","transform"],_4={key:0},Z4=e("path",{d:"M137,168l11.52-11.51a12,12,0,0,0-17-17L120,151l-15-15,11.52-11.51a12,12,0,0,0-17-17L88,119,72.49,103.51a12,12,0,0,0-17,17L59,124,38.54,144.49a36,36,0,0,0,0,50.91l2.55,2.54L15.51,223.51a12,12,0,0,0,17,17l25.57-25.58,2.54,2.55a36.06,36.06,0,0,0,50.91,0L132,197l3.51,3.52a12,12,0,0,0,17-17ZM94.54,200.49a12,12,0,0,1-17,0L55.51,178.43a12,12,0,0,1,0-17L76,141l39,39Zm146-185a12,12,0,0,0-17,0L197.94,41.09l-2.54-2.55a36.05,36.05,0,0,0-50.91,0L124,59l-3.51-3.52a12,12,0,0,0-17,17l80,80a12,12,0,0,0,17-17L197,132l20.49-20.49a36,36,0,0,0,0-50.91l-2.55-2.54,25.58-25.57A12,12,0,0,0,240.49,15.51Zm-40,79L180,115,141,76l20.49-20.49a12,12,0,0,1,17,0l22.06,22.06a12,12,0,0,1,0,17Z"},null,-1),H4=[Z4],L4={key:1},k4=e("path",{d:"M76,124l56,56-29,29a24,24,0,0,1-33.94,0L47,186.91A24,24,0,0,1,47,153ZM209,69.09,186.91,47A24,24,0,0,0,153,47L124,76l56,56,29-29A24,24,0,0,0,209,69.09Z",opacity:"0.2"},null,-1),M4=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),V4=[k4,M4],b4={key:2},x4=e("path",{d:"M149.66,149.66,131.31,168l18.35,18.34a8,8,0,0,1-11.32,11.32L132,191.31l-23.31,23.32a32.06,32.06,0,0,1-45.26,0l-5.37-5.38-28.4,28.41a8,8,0,0,1-11.32-11.32l28.41-28.4-5.38-5.37a32,32,0,0,1,0-45.26L64.69,124l-6.35-6.34a8,8,0,0,1,11.32-11.32L88,124.69l18.34-18.35a8,8,0,0,1,11.32,11.32L99.31,136,120,156.69l18.34-18.35a8,8,0,0,1,11.32,11.32Zm88-131.32a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Z"},null,-1),C4=[x4],S4={key:3},B4=e("path",{d:"M148.24,139.76a6,6,0,0,0-8.48,0L120,159.51,96.49,136l19.75-19.76a6,6,0,0,0-8.48-8.48L88,127.51,68.24,107.76a6,6,0,0,0-8.48,8.48L67.51,124,42.79,148.73a30,30,0,0,0,0,42.42l6.78,6.79L19.76,227.76a6,6,0,1,0,8.48,8.48l29.82-29.81,6.79,6.78a30,30,0,0,0,42.42,0L132,188.49l7.76,7.75a6,6,0,0,0,8.48-8.48L128.49,168l19.75-19.76A6,6,0,0,0,148.24,139.76Zm-49.45,65a18,18,0,0,1-25.46,0L51.27,182.67a18,18,0,0,1,0-25.46L76,132.49,123.51,180Zm137.45-185a6,6,0,0,0-8.48,0L197.94,49.57l-6.79-6.78a30,30,0,0,0-42.42,0L124,67.51l-7.76-7.75a6,6,0,0,0-8.48,8.48l80,80a6,6,0,0,0,8.48-8.48L188.49,132l24.72-24.73a30,30,0,0,0,0-42.42l-6.78-6.79,29.81-29.82A6,6,0,0,0,236.24,19.76Zm-31.51,79L180,123.51,132.49,76l24.72-24.73a18,18,0,0,1,25.46,0l22.06,22.06a18,18,0,0,1,0,25.46Z"},null,-1),P4=[B4],z4={key:4},q4=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),D4=[q4],F4={key:5},N4=e("path",{d:"M146.83,141.17a4,4,0,0,0-5.66,0L120,162.34,93.66,136l21.17-21.17a4,4,0,0,0-5.66-5.66L88,130.34,66.83,109.17a4,4,0,0,0-5.66,5.66L70.34,124,44.2,150.14a28,28,0,0,0,0,39.6l8.2,8.2L21.17,229.17a4,4,0,0,0,5.66,5.66L58.06,203.6l8.2,8.2a28,28,0,0,0,39.6,0L132,185.66l9.17,9.17a4,4,0,0,0,5.66-5.66L125.66,168l21.17-21.17A4,4,0,0,0,146.83,141.17Zm-46.63,65a20,20,0,0,1-28.28,0L49.86,184.08a20,20,0,0,1,0-28.28L76,129.66,126.34,180Zm134.63-185a4,4,0,0,0-5.66,0L197.94,52.4l-8.2-8.2a28,28,0,0,0-39.6,0L124,70.34l-9.17-9.17a4,4,0,0,0-5.66,5.66l80,80a4,4,0,0,0,5.66-5.66L185.66,132l26.14-26.14a28,28,0,0,0,0-39.6l-8.2-8.2,31.23-31.23A4,4,0,0,0,234.83,21.17ZM212,86.06a19.86,19.86,0,0,1-5.86,14.14L180,126.34,129.66,76,155.8,49.86a20,20,0,0,1,28.28,0l22.06,22.06A19.85,19.85,0,0,1,212,86.06Z"},null,-1),R4=[N4],W4={name:"PhPlugs"},j4=f({...W4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",_4,H4)):t.value==="duotone"?(a(),l("g",L4,V4)):t.value==="fill"?(a(),l("g",b4,C4)):t.value==="light"?(a(),l("g",S4,P4)):t.value==="regular"?(a(),l("g",z4,D4)):t.value==="thin"?(a(),l("g",F4,R4)):_("",!0)],16,f4))}}),Q4=["width","height","fill","transform"],T4={key:0},E4=e("path",{d:"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z"},null,-1),U4=[E4],X4={key:1},G4=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),J4=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),Y4=[G4,J4],I4={key:2},O4=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z"},null,-1),K4=[O4],e8={key:3},t8=e("path",{d:"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z"},null,-1),a8=[t8],l8={key:4},o8=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),s8=[o8],n8={key:5},r8=e("path",{d:"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z"},null,-1),i8=[r8],c8={name:"PhPlus"},h8=f({...c8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",T4,U4)):t.value==="duotone"?(a(),l("g",X4,Y4)):t.value==="fill"?(a(),l("g",I4,K4)):t.value==="light"?(a(),l("g",e8,a8)):t.value==="regular"?(a(),l("g",l8,s8)):t.value==="thin"?(a(),l("g",n8,i8)):_("",!0)],16,Q4))}}),d8=["width","height","fill","transform"],u8={key:0},p8=e("path",{d:"M20,128A76.08,76.08,0,0,1,96,52h99l-3.52-3.51a12,12,0,1,1,17-17l24,24a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17-17L195,76H96a52.06,52.06,0,0,0-52,52,12,12,0,0,1-24,0Zm204-12a12,12,0,0,0-12,12,52.06,52.06,0,0,1-52,52H61l3.52-3.51a12,12,0,1,0-17-17l-24,24a12,12,0,0,0,0,17l24,24a12,12,0,1,0,17-17L61,204h99a76.08,76.08,0,0,0,76-76A12,12,0,0,0,224,116Z"},null,-1),g8=[p8],m8={key:1},v8=e("path",{d:"M224,64v64a64,64,0,0,1-64,64H32V128A64,64,0,0,1,96,64Z",opacity:"0.2"},null,-1),$8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),y8=[v8,$8],w8={key:2},A8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56h96V40a8,8,0,0,1,13.66-5.66l24,24a8,8,0,0,1,0,11.32l-24,24A8,8,0,0,1,192,88V72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H64V168a8,8,0,0,0-13.66-5.66l-24,24a8,8,0,0,0,0,11.32l24,24A8,8,0,0,0,64,216V200h96a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),f8=[A8],_8={key:3},Z8=e("path",{d:"M26,128A70.08,70.08,0,0,1,96,58H209.51L195.76,44.24a6,6,0,0,1,8.48-8.48l24,24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48-8.48L209.51,70H96a58.07,58.07,0,0,0-58,58,6,6,0,0,1-12,0Zm198-6a6,6,0,0,0-6,6,58.07,58.07,0,0,1-58,58H46.49l13.75-13.76a6,6,0,0,0-8.48-8.48l-24,24a6,6,0,0,0,0,8.48l24,24a6,6,0,0,0,8.48-8.48L46.49,198H160a70.08,70.08,0,0,0,70-70A6,6,0,0,0,224,122Z"},null,-1),H8=[Z8],L8={key:4},k8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),M8=[k8],V8={key:5},b8=e("path",{d:"M28,128A68.07,68.07,0,0,1,96,60H214.34L197.17,42.83a4,4,0,0,1,5.66-5.66l24,24a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66-5.66L214.34,68H96a60.07,60.07,0,0,0-60,60,4,4,0,0,1-8,0Zm196-4a4,4,0,0,0-4,4,60.07,60.07,0,0,1-60,60H41.66l17.17-17.17a4,4,0,0,0-5.66-5.66l-24,24a4,4,0,0,0,0,5.66l24,24a4,4,0,1,0,5.66-5.66L41.66,196H160a68.07,68.07,0,0,0,68-68A4,4,0,0,0,224,124Z"},null,-1),x8=[b8],C8={name:"PhRepeat"},S8=f({...C8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",u8,g8)):t.value==="duotone"?(a(),l("g",m8,y8)):t.value==="fill"?(a(),l("g",w8,f8)):t.value==="light"?(a(),l("g",_8,H8)):t.value==="regular"?(a(),l("g",L8,M8)):t.value==="thin"?(a(),l("g",V8,x8)):_("",!0)],16,d8))}}),B8=["width","height","fill","transform"],P8={key:0},z8=e("path",{d:"M227.85,46.89a20,20,0,0,0-18.74-18.74c-13.13-.77-46.65.42-74.48,28.24L131,60H74.36a19.83,19.83,0,0,0-14.14,5.86L25.87,100.19a20,20,0,0,0,11.35,33.95l37.14,5.18,42.32,42.32,5.19,37.18A19.88,19.88,0,0,0,135.34,235a20.13,20.13,0,0,0,6.37,1,19.9,19.9,0,0,0,14.1-5.87l34.34-34.35A19.85,19.85,0,0,0,196,181.64V125l3.6-3.59C227.43,93.54,228.62,60,227.85,46.89ZM76,84h31L75.75,115.28l-27.23-3.8ZM151.6,73.37A72.27,72.27,0,0,1,204,52a72.17,72.17,0,0,1-21.38,52.41L128,159,97,128ZM172,180l-27.49,27.49-3.8-27.23L172,149Zm-72,22c-8.71,11.85-26.19,26-60,26a12,12,0,0,1-12-12c0-33.84,14.12-51.32,26-60A12,12,0,1,1,68.18,175.3C62.3,179.63,55.51,187.8,53,203c15.21-2.51,23.37-9.3,27.7-15.18A12,12,0,1,1,100,202Z"},null,-1),q8=[z8],D8={key:1},F8=e("path",{d:"M184,120v61.65a8,8,0,0,1-2.34,5.65l-34.35,34.35a8,8,0,0,1-13.57-4.53L128,176ZM136,72H74.35a8,8,0,0,0-5.65,2.34L34.35,108.69a8,8,0,0,0,4.53,13.57L80,128ZM40,216c37.65,0,50.69-19.69,54.56-28.18L68.18,161.44C59.69,165.31,40,178.35,40,216Z",opacity:"0.2"},null,-1),N8=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),R8=[F8,N8],W8={key:2},j8=e("path",{d:"M101.85,191.14C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Zm122-144a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.4,27.07h0L88,108.7A8,8,0,0,1,76.67,97.39l26.56-26.57A4,4,0,0,0,100.41,64H74.35A15.9,15.9,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A16,16,0,0,0,192,181.65V155.59a4,4,0,0,0-6.83-2.82l-26.57,26.56a8,8,0,0,1-11.71-.42,8.2,8.2,0,0,1,.6-11.1l49.27-49.27h0C223.45,91.86,224.6,59.71,223.85,47.12Z"},null,-1),Q8=[j8],T8={key:3},E8=e("path",{d:"M221.86,47.24a14,14,0,0,0-13.11-13.1c-12.31-.73-43.77.39-69.88,26.5L133.52,66H74.35a13.9,13.9,0,0,0-9.89,4.1L30.11,104.44a14,14,0,0,0,7.94,23.76l39.13,5.46,45.16,45.16L127.8,218a14,14,0,0,0,23.76,7.92l34.35-34.35a13.91,13.91,0,0,0,4.1-9.89V122.48l5.35-5.35h0C221.46,91,222.59,59.56,221.86,47.24ZM38.11,115a2,2,0,0,1,.49-2L72.94,78.58A2,2,0,0,1,74.35,78h47.17L77.87,121.64l-38.14-5.32A1.93,1.93,0,0,1,38.11,115ZM178,181.65a2,2,0,0,1-.59,1.41L143.08,217.4a2,2,0,0,1-3.4-1.11l-5.32-38.16L178,134.48Zm8.87-73h0L128,167.51,88.49,128l58.87-58.88a78.47,78.47,0,0,1,60.69-23A2,2,0,0,1,209.88,48,78.47,78.47,0,0,1,186.88,108.64ZM100,190.31C95.68,199.84,81.13,222,40,222a6,6,0,0,1-6-6c0-41.13,22.16-55.68,31.69-60a6,6,0,1,1,5,10.92c-7,3.17-22.53,13.52-24.47,42.91,29.39-1.94,39.74-17.52,42.91-24.47a6,6,0,1,1,10.92,5Z"},null,-1),U8=[E8],X8={key:4},G8=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),J8=[G8],Y8={key:5},I8=e("path",{d:"M219.86,47.36a12,12,0,0,0-11.22-11.22c-12-.71-42.82.38-68.35,25.91L134.35,68h-60a11.9,11.9,0,0,0-8.48,3.52L31.52,105.85a12,12,0,0,0,6.81,20.37l39.79,5.55,46.11,46.11,5.55,39.81a12,12,0,0,0,20.37,6.79l34.34-34.35a11.9,11.9,0,0,0,3.52-8.48v-60l5.94-5.94C219.48,90.18,220.57,59.41,219.86,47.36ZM36.21,115.6a3.94,3.94,0,0,1,1-4.09L71.53,77.17A4,4,0,0,1,74.35,76h52L78.58,123.76,39.44,118.3A3.94,3.94,0,0,1,36.21,115.6ZM180,181.65a4,4,0,0,1-1.17,2.83l-34.35,34.34a4,4,0,0,1-6.79-2.25l-5.46-39.15L180,129.65Zm-52-11.31L85.66,128l60.28-60.29c23.24-23.24,51.25-24.23,62.22-23.58a3.93,3.93,0,0,1,3.71,3.71c.65,11-.35,39-23.58,62.22ZM98.21,189.48C94,198.66,80,220,40,220a4,4,0,0,1-4-4c0-40,21.34-54,30.52-58.21a4,4,0,0,1,3.32,7.28c-7.46,3.41-24.43,14.66-25.76,46.85,32.19-1.33,43.44-18.3,46.85-25.76a4,4,0,1,1,7.28,3.32Z"},null,-1),O8=[I8],K8={name:"PhRocketLaunch"},ee=f({...K8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",P8,q8)):t.value==="duotone"?(a(),l("g",D8,R8)):t.value==="fill"?(a(),l("g",W8,Q8)):t.value==="light"?(a(),l("g",T8,U8)):t.value==="regular"?(a(),l("g",X8,J8)):t.value==="thin"?(a(),l("g",Y8,O8)):_("",!0)],16,B8))}}),te=["width","height","fill","transform"],ae={key:0},le=e("path",{d:"M125.18,156.94a64,64,0,1,0-82.36,0,100.23,100.23,0,0,0-39.49,32,12,12,0,0,0,19.35,14.2,76,76,0,0,1,122.64,0,12,12,0,0,0,19.36-14.2A100.33,100.33,0,0,0,125.18,156.94ZM44,108a40,40,0,1,1,40,40A40,40,0,0,1,44,108Zm206.1,97.67a12,12,0,0,1-16.78-2.57A76.31,76.31,0,0,0,172,172a12,12,0,0,1,0-24,40,40,0,1,0-10.3-78.67,12,12,0,1,1-6.16-23.19,64,64,0,0,1,57.64,110.8,100.23,100.23,0,0,1,39.49,32A12,12,0,0,1,250.1,205.67Z"},null,-1),oe=[le],se={key:1},ne=e("path",{d:"M136,108A52,52,0,1,1,84,56,52,52,0,0,1,136,108Z",opacity:"0.2"},null,-1),re=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),ie=[ne,re],ce={key:2},he=e("path",{d:"M164.47,195.63a8,8,0,0,1-6.7,12.37H10.23a8,8,0,0,1-6.7-12.37,95.83,95.83,0,0,1,47.22-37.71,60,60,0,1,1,66.5,0A95.83,95.83,0,0,1,164.47,195.63Zm87.91-.15a95.87,95.87,0,0,0-47.13-37.56A60,60,0,0,0,144.7,54.59a4,4,0,0,0-1.33,6A75.83,75.83,0,0,1,147,150.53a4,4,0,0,0,1.07,5.53,112.32,112.32,0,0,1,29.85,30.83,23.92,23.92,0,0,1,3.65,16.47,4,4,0,0,0,3.95,4.64h60.3a8,8,0,0,0,7.73-5.93A8.22,8.22,0,0,0,252.38,195.48Z"},null,-1),de=[he],ue={key:3},pe=e("path",{d:"M112.6,158.43a58,58,0,1,0-57.2,0A93.83,93.83,0,0,0,5.21,196.72a6,6,0,0,0,10.05,6.56,82,82,0,0,1,137.48,0,6,6,0,0,0,10-6.56A93.83,93.83,0,0,0,112.6,158.43ZM38,108a46,46,0,1,1,46,46A46.06,46.06,0,0,1,38,108Zm211,97a6,6,0,0,1-8.3-1.74A81.8,81.8,0,0,0,172,166a6,6,0,0,1,0-12,46,46,0,1,0-17.08-88.73,6,6,0,1,1-4.46-11.14,58,58,0,0,1,50.14,104.3,93.83,93.83,0,0,1,50.19,38.29A6,6,0,0,1,249,205Z"},null,-1),ge=[pe],me={key:4},ve=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),$e=[ve],ye={key:5},we=e("path",{d:"M107.19,159a56,56,0,1,0-46.38,0A91.83,91.83,0,0,0,6.88,197.81a4,4,0,1,0,6.7,4.37,84,84,0,0,1,140.84,0,4,4,0,1,0,6.7-4.37A91.83,91.83,0,0,0,107.19,159ZM36,108a48,48,0,1,1,48,48A48.05,48.05,0,0,1,36,108Zm212,95.35a4,4,0,0,1-5.53-1.17A83.81,83.81,0,0,0,172,164a4,4,0,0,1,0-8,48,48,0,1,0-17.82-92.58,4,4,0,1,1-3-7.43,56,56,0,0,1,44,103,91.83,91.83,0,0,1,53.93,38.86A4,4,0,0,1,248,203.35Z"},null,-1),Ae=[we],fe={name:"PhUsers"},_e=f({...fe,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",ae,oe)):t.value==="duotone"?(a(),l("g",se,ie)):t.value==="fill"?(a(),l("g",ce,de)):t.value==="light"?(a(),l("g",ue,ge)):t.value==="regular"?(a(),l("g",me,$e)):t.value==="thin"?(a(),l("g",ye,Ae)):_("",!0)],16,te))}}),x="__nuxt_component";async function Ze(s,o){const n=V(),h=z(),u=N(),{fetchKey:p,_fetchKeyBase:t}=u.proxy.$options,r=(typeof p=="function"?p(()=>""):p)||[t,h.fullPath,h.matched.findIndex(d=>Object.values(d.components||{}).includes(u.type))].join(":"),{data:g,error:m}=await E(`options:asyncdata:${r}`,()=>n.runWithContext(()=>o(n)));if(m.value)throw q(m.value);g.value&&typeof g.value=="object"&&Object.assign(await s,D(F(g.value)))}const k=function(...o){const[n,h]=o,{setup:u}=n;return!u&&!n.asyncData&&!n.head?{[x]:!0,...n}:{[x]:!0,_fetchKeyBase:h,...n,setup(p,t){const r=V(),g=u?Promise.resolve(r.runWithContext(()=>u(p,t))).then(d=>d||{}):{},m=[];if(n.asyncData&&m.push(Ze(g,n.asyncData)),n.head){const d=V();C(typeof n.head=="function"?()=>n.head(d):n.head)}return Promise.resolve(g).then(()=>Promise.all(m)).then(()=>g).finally(()=>{m.length=0})}}},He=k({components:{PhRocketLaunch:ee}},"$zFVJLCtHYa"),M="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABgWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8zQyM/GmJhYTFpWBkNamJjMWIoLMYog83Mm19qfrzeG0m2ylZRYuPXgr+ArbJWikjJljWxYXrOmzc1k8y53XM/93vPOd17LtjDGSWr1/kgmytooWDAvRBZdDtfcdKGjTq8UUVXZ+YmwtS0rweJFLvzmrVqx/1rTfGEroCtQXhUUbWC8KTw9FpBNXlXuENJR+PC58J9mlxQ+N7UYxa/mZyy+MdkLRwaA3ursDtVxbEqVtJaVlhejiebWVXK9zFf0pzIzc/J2i2zC50QQQK4mWKcMfwMMCLej5dB+mVHjXxfKX+WvOQq4lXW0VghRZoCfaKuSvWErEnREzIyrJv9/9tXPTk0aFVvDkD9i2F89IBzB4rbhvF9bBjFE3A8w1Wukp8/guFP0bcrmucQXJtwcV3RYntwuQWdT2pUi5Ykh0x7MgnvZ9ASgfZbaFyyelY+5/QRwhvyVTewfwC9Eu9a/gU46mfRWXQCPQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcxJREFUSIm91sGLjlEUx/HPDAt11WWlbEYUNsqCsrChhCQSWSg2alIsrJQ/wsLKxsLORs1sJDY0TdEYTUqzmYWIMlm4i2M2M43F+yrG+77PfXjNb3nOved7z3nOPc+lpSLKlYjyPqKsRJSpiLKvzf6RlrCTeLzG/AV7UsqlJsZoGyCu9rBtw9naAG0zXMaGHq7XKeWDQwVGlFGs9POnlKtitSnpjoYDjQ0beKLBX/Udq8oQUTJeYu+AZXM4kFLuW3YqMowouzHRAIP9uNEU748MI8pG7MRhHMf5moN19R2XUsoTA4ER5TTGcaoycJPu4xFmUspffwNGlMt4MCRQPz3EvZTyi5GIsoBd/xkIq7gwElGWsGkdgDA/iul1gsHYKK7j0zoBX/3s0s06HXoEF7HlP8AWcbTnpIkoW3ETt/X+O9ToXXfvNKYwmVL+NnC0RZRDOvdpeyVkFXdwN6X8odeCxlkaUY7haQVsEedSygObsHFkpZSf4UkFcLwJVgXs6nmD/82g+fk3wNkG/9qH1T8DezbAL6oeHrXAjwa8Z/B2qMCU8hIm+7hnU8qfhwrs6haW1tiWca1FjHpgSnlB5yE1p3PB53EmpTzTBvgD8suAQT4OgVAAAAAASUVORK5CYII=",Le=""+new URL("planet-blue.Dl2xr_Rd.png",import.meta.url).href,ke=""+new URL("planet-ring.Cu48O4jc.png",import.meta.url).href,Me=""+new URL("planet-red.BluWtDiz.png",import.meta.url).href,Ve={class:"page-wrapper hero-wrapper"},be={class:"hero"},xe=e("h1",null,[$("Blast your Startup to the "),e("span",{class:"emph"},"Cosmos")],-1),Ce=e("h2",null,"QAComet: Subscription-Based Quality Assurance for your SaaS",-1),Se={class:"cta-outer"},Be={class:"hero-cta",href:"#plan"},Pe=e("span",{class:"hero-cta-text"},"Get Started",-1),ze={class:"hero-cta-icon"},qe=e("img",{class:"star star-1",src:M},null,-1),De=e("img",{class:"star star-2",src:M},null,-1),Fe=e("img",{class:"star star-3",src:M},null,-1),Ne=e("img",{class:"star star-4",src:M},null,-1),Re=e("div",{class:"hero-images"},[e("img",{class:"star planet-1",src:Le}),e("img",{class:"star planet-2",src:ke}),e("img",{class:"star planet-3",src:Me})],-1);function We(s,o,n,h,u,p){const t=H("PhRocketLaunch");return a(),l("div",Ve,[e("div",be,[xe,Ce,e("div",Se,[e("a",Be,[Pe,e("div",ze,[v(t)])]),qe,De,Fe,Ne])]),Re])}const je=L(He,[["render",We]]),Qe=k({components:{}},"$0jV3At8Fqp"),Te="data:image/png;base64,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",Ee=""+new URL("linkwarden-logo.Cnb5oU7W.png",import.meta.url).href,Ue={class:"brand-logos-wrapper"},Xe=R('
',1),Ge=[Xe];function Je(s,o,n,h,u,p){return a(),l("div",Ue,Ge)}const Ye=L(Qe,[["render",Je]]),Ie=k({name:"HowItWorks",components:{PhFileArrowDown:c6,PhKanban:C6,PhRepeat:S8}},"$Y4gCXyqNGe"),Oe={class:"how-it-works-outer"},Ke=e("div",{class:"bg-img"},null,-1),et={class:"how-it-works-inner",id:"how-it-works"},tt={class:"page-wrapper"},at=e("div",{class:"section-header"},[e("h1",null,"We've Revamped QA"),e("h2",null,[$("Now it's an Asnyc Workflow"),e("br"),$("Orbiting around your Product")])],-1),lt={class:"steps-wrapper pt-8"},ot={class:"step"},st={class:"step-icon shadow-main"},nt=e("div",{class:"step-copy"},[e("h3",null,"Schedule"),e("span",null,"Subscribe to our service and submit as many tickets as you want on our Github Project board.")],-1),rt={class:"step"},it={class:"step-icon shadow-main"},ct=e("div",{class:"step-copy"},[e("h3",null,"Receive"),e("span",null,"You'll see a response with a full QA report, test code, etc. within 2-3 business days")],-1),ht={class:"step"},dt={class:"step-icon shadow-main"},ut=e("div",{class:"step-copy"},[e("h3",null,"Update"),e("span",null,"We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.")],-1);function pt(s,o,n,h,u,p){const t=H("ph-kanban"),r=H("ph-file-arrow-down"),g=H("ph-repeat");return a(),l("div",Oe,[Ke,e("div",et,[e("div",tt,[at,e("div",lt,[e("div",ot,[e("div",st,[v(t,{weight:"duotone"})]),nt]),e("div",rt,[e("div",it,[v(r,{weight:"duotone"})]),ct]),e("div",ht,[e("div",dt,[v(g)]),ut])])])])])}const gt=L(Ie,[["render",pt]]),mt=""+new URL("ali-photo.C0U5PBBD.jpg",import.meta.url).href,vt=k({components:{PhArrowRight:U,PhCaretLeft:r0,PhCaretRight:b0,PhQuotes:X},data(){return{image:mt,slides:[{}]}},methods:{slideLeft(){},slideRight(){}}},"$WfSQQL4a1P"),$t={class:"recent-work-outer",id:"recent-work"},yt={class:"page-wrapper"},wt=e("div",{class:"section-header"},[e("h1",null,"Recent QA Work")],-1),At={class:"slider-outer"};function ft(s,o,n,h,u,p){const t=G;return a(),l("div",$t,[e("div",yt,[wt,e("div",At,[v(t,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali B.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",caseStudy:"/case-studies/automatisch",testimonial:"Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier."})])])])}const _t=L(vt,[["render",ft]]),Zt=k({name:"HowItWorks",components:{PhBackspace:$1,PhBrowsers:N1,PhCloudCheck:w2,PhCreditCard:W2,PhPlugs:j4,PhUsers:_e}},"$qIsZyFbGE8"),Ht="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20413%20213'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-229.252,-1518.25)'%3e%3cg%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,142.617,1012.17)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,2.5,0)'%3e%3cpath%20d='M245.577,1528.18L406.577,1577.68C407.368,1577.93%20408.208,1577.48%20408.451,1576.69C408.695,1575.9%20408.25,1575.06%20407.458,1574.82L246.458,1525.32C245.667,1525.07%20244.827,1525.52%20244.584,1526.31C244.34,1527.1%20244.785,1527.94%20245.577,1528.18Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Lt="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20255%20257'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-918.017,-1484.25)'%3e%3cg%20transform='matrix(1,0,0,1,499,10)'%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,534.882,968.167)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,576.882,1136.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M251.03,1514.78L258.03,1568.94C258.136,1569.76%20258.889,1570.34%20259.71,1570.24C260.531,1570.13%20261.111,1569.38%20261.005,1568.56L254.005,1514.39C253.899,1513.57%20253.146,1512.99%20252.325,1513.1C251.504,1513.2%20250.924,1513.95%20251.03,1514.78Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M265.344,1593.85L287.344,1660.22C287.604,1661.01%20288.454,1661.43%20289.239,1661.17C290.025,1660.91%20290.452,1660.06%20290.191,1659.28L268.191,1592.9C267.931,1592.12%20267.081,1591.69%20266.296,1591.95C265.51,1592.21%20265.083,1593.06%20265.344,1593.85Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",kt={class:"services-outer",id:"tasks"},Mt=e("img",{class:"constellation-1",width:"320",src:Ht},null,-1),Vt=e("img",{class:"constellation-2",width:"240",src:Lt},null,-1),bt={class:"services-inner"},xt={class:"page-wrapper"},Ct=e("div",{class:"section-header"},[e("h1",null,"Subscription Benefits"),e("h2",null,"A Constellation of QA and Testing Services for Robust Launches of New Products and Features")],-1),St={class:"steps-wrapper first-steps-wrapper"},Bt={class:"step"},Pt={class:"step-icon shadow-main"},zt=e("div",{class:"step-copy"},[e("h3",null,"Sales Funnel Testing"),e("span",null,"Find bugs before potential customers leave from frustration")],-1),qt={class:"step"},Dt={class:"step-icon shadow-main"},Ft=e("div",{class:"step-copy"},[e("h3",null,"Usability Testing"),e("span",null,"Extensive usability tests for those hard to find edge cases and bugs")],-1),Nt={class:"step"},Rt={class:"step-icon shadow-main"},Wt=e("div",{class:"step-copy"},[e("h3",null,"E2E Testing"),e("span",null,"We'll test user workflows guaranteeing minimal functionality before deployment")],-1),jt={class:"steps-wrapper"},Qt={class:"step"},Tt={class:"step-icon shadow-main"},Et=e("div",{class:"step-copy"},[e("h3",null,"Multi-Browser Support"),e("span",null,"We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac")],-1),Ut={class:"step"},Xt={class:"step-icon shadow-main"},Gt=e("div",{class:"step-copy"},[e("h3",null,"Regression Testing"),e("span",null,"Make sure bug fixes don't revert, especially for core functionality")],-1),Jt={class:"step"},Yt={class:"step-icon shadow-main"},It=e("div",{class:"step-copy"},[e("h3",null,"Integration Testing"),e("span",null,"Ensure your systems are coordinating together")],-1);function Ot(s,o,n,h,u,p){const t=H("ph-credit-card"),r=H("ph-users"),g=H("ph-cloud-check"),m=H("ph-browsers"),d=H("ph-backspace"),w=H("ph-plugs");return a(),l("div",kt,[Mt,Vt,e("div",bt,[e("div",xt,[Ct,e("div",St,[e("div",Bt,[e("div",Pt,[v(t)]),zt]),e("div",qt,[e("div",Dt,[v(r)]),Ft]),e("div",Nt,[e("div",Rt,[v(g)]),Wt])]),e("div",jt,[e("div",Qt,[e("div",Tt,[v(m)]),Et]),e("div",Ut,[e("div",Xt,[v(d)]),Gt]),e("div",Jt,[e("div",Yt,[v(w)]),It])])])])])}const Kt=L(Zt,[["render",Ot]]),ea=k({props:{setOption:{type:Function,default:s=>{}}},watch:{option(){this.setBgStyle()}},data(){return{option:"monthly",bgStyle:{width:"0px",height:"0px"}}},computed:{ariaLabel(){return this.option==="monthly"?"Toggle yearly plan":"Toggle monthly plan"}},mounted(){this.setBgStyle(),document.fonts.ready.finally(()=>{this.setBgStyle()})},methods:{setBgStyle(){const s=this.$refs.wrapper;if(!s)return;const o=s.getBoundingClientRect();if(this.option==="monthly"){const n=this.$refs.monthly;if(n){const h=n.getBoundingClientRect(),u=h.x-o.x-2;this.bgStyle={width:h.width+"px",height:h.height-4+"px",borderRadius:Math.ceil((n.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}else{const n=this.$refs.yearly;if(n){const h=n.getBoundingClientRect(),u=h.x-o.x;this.bgStyle={width:h.width+"px",height:h.height-4+"px",borderRadius:Math.ceil((n.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}},toggle(){this.option=this.option==="monthly"?"yearly":"monthly",this.setOption(this.option)}}},"$m7wA03iy9u"),ta=["aria-label"],aa={class:"text",ref:"monthly"},la={class:"text",ref:"yearly"};function oa(s,o,n,h,u,p){return a(),l("button",{class:"toggle-wrapper",ref:"wrapper",onClick:o[0]||(o[0]=(...t)=>s.toggle&&s.toggle(...t)),"aria-label":s.ariaLabel},[e("div",{class:"toggle-bg",style:W(s.bgStyle)},null,4),e("span",aa,"Monthly",512),e("span",la,"Yearly",512)],8,ta)}const sa=L(ea,[["render",oa]]),na=k({name:"Plan",components:{PhCheck:I0,PhPhone:S},data(){return{option:"monthly"}},computed:{signupLink(){return"mailto:hello@qacomet.com?subject=Get Started "+(this.option==="monthly"?"Monthly":"Yearly")+"&body=Hey,%0D%0A%0D%0AI'm interested in using your service, could you send me an invoice and we can get started?"},bookLink(){const s=new Date,o=s.getMonth()<9?"0"+(s.getMonth()+1):s.getMonth()+1;return"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month="+(s.getFullYear()+"-"+o)},price(){return this.option==="monthly"?"4,999":"4,249"}},methods:{setOption(s){this.option=s}}},"$DqbyBHNawb"),ra={class:"plan-outer",id:"plan"},ia={class:"page-wrapper"},ca=e("div",{class:"section-header plan-header",style:{"padding-bottom":"2rem"}},[e("img",{class:"star star-1",src:M}),e("img",{class:"star star-2",src:M}),e("img",{class:"star star-3",src:M}),e("h1",null,"Clear Pricing"),e("h2",null,[$("Building great products is hard,"),e("br"),$("pricing shouldn't be")])],-1),ha={class:"plan-toggle-wrapper"},da={class:"plan"},ua={class:"plan-body"},pa={class:"plan-info"},ga=e("span",{class:"slash"},null,-1),ma=e("span",{class:"slash"},"/",-1),va=e("span",{class:"mo"},"mo",-1),$a=e("br",null,null,-1),ya=e("h3",null,"Pause or cancel anytime",-1),wa=["href"],Aa={class:"plan-features"},fa={class:"plan-feature-row"},_a={class:"check"},Za=e("div",{class:"plan-feature"},"1 request at a time",-1),Ha={class:"plan-feature-row"},La={class:"check"},ka=e("div",{class:"plan-feature"},"2 week $50 trial",-1),Ma={class:"plan-feature-row"},Va={class:"check"},ba=e("div",{class:"plan-feature"},"2-3 business day delivery",-1),xa={class:"plan-feature-row"},Ca={class:"check"},Sa=e("div",{class:"plan-feature"},"Unlimited users",-1),Ba={class:"plan-feature-row"},Pa={class:"check"},za=e("div",{class:"plan-feature"},"No contracts, pause or cancel anytime",-1),qa={class:"booking-wrapper"},Da=e("div",{class:"booking-text"},"Curious how QAComet will work for you?",-1),Fa=["href"],Na=e("span",null,"Book a call",-1),Ra=[Na];function Wa(s,o,n,h,u,p){const t=sa,r=H("ph-check");return a(),l("div",ra,[e("div",ia,[ca,e("div",ha,[v(t,{setOption:s.setOption},null,8,["setOption"])]),e("div",da,[e("div",ua,[e("div",pa,[e("h1",null,[ga,$("$"+b(s.price),1),ma,va]),e("h2",null,[$("Billed "+b(s.option),1),$a,$("no contracts, no commitments")]),ya,e("a",{class:"payment",href:s.signupLink},"Signup",8,wa)]),e("div",Aa,[e("div",fa,[e("div",_a,[v(r,{weight:"bold"})]),Za]),e("div",Ha,[e("div",La,[v(r,{weight:"bold"})]),ka]),e("div",Ma,[e("div",Va,[v(r,{weight:"bold"})]),ba]),e("div",xa,[e("div",Ca,[v(r,{weight:"bold"})]),Sa]),e("div",Ba,[e("div",Pa,[v(r,{weight:"bold"})]),za])])])]),e("div",qa,[Da,e("a",{href:s.bookLink,class:"booking-cta"},Ra,8,Fa)])])])}const ja=L(na,[["render",Wa]]),Qa=k({name:"Accordion",components:{PhMinus:K6,PhPlus:h8},data(){return{expanded:!1}},methods:{handleExpanded(){this.expanded=!this.expanded}}},"$Y0yju32yn3"),Ta={class:"accordion-wrapper"},Ea={class:"accordion-header-text"},Ua={class:"accordion-header-icon","aria-label":"Expand accordion"},Xa={key:0,class:"icon"},Ga={key:1,class:"icon"},Ja={class:"accordion-text"};function Ya(s,o,n,h,u,p){const t=H("PhMinus"),r=H("PhPlus");return a(),l("div",Ta,[e("div",{class:"accordion-header",onClick:o[0]||(o[0]=(...g)=>s.handleExpanded&&s.handleExpanded(...g))},[e("div",Ea,[e("span",null,[A(s.$slots,"header")])]),e("button",Ua,[s.expanded?(a(),l("div",Xa,[v(t,{weight:"bold"})])):(a(),l("div",Ga,[v(r,{weight:"bold"})]))])]),e("div",{class:j(["accordion-text-wrapper",{"accordion-text-hidden":!s.expanded,"accordion-text-expanded":s.expanded}])},[e("div",Ja,[A(s.$slots,"text")])],2)])}const Ia=L(Qa,[["render",Ya]]),Oa=k({},"$Wb7gDotc3K"),Ka={class:"faqs-outer",id:"faqs"},e3={class:"page-wrapper"},t3=e("div",{class:"section-header"},[e("h1",null,"FAQ's")],-1),a3={class:"faqs-body"},l3=e("a",{href:"https://playwright.dev/"},"Playwright",-1);function o3(s,o,n,h,u,p){const t=Ia;return a(),l("div",Ka,[e("div",e3,[t3,e("div",a3,[v(t,null,{header:y(()=>[$("Why wouldn't I just hire a full-time QA engineer?")]),text:y(()=>[$("Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.")]),_:1}),v(t,null,{header:y(()=>[$("Which frameworks do you use for testing?")]),text:y(()=>[$("We mainly write tests in javascript using "),l3,$(". We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.")]),_:1}),v(t,null,{header:y(()=>[$("What kind of platforms do you offer testing on?")]),text:y(()=>[$("We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.")]),_:1}),v(t,null,{header:y(()=>[$("How can I run these tests?")]),text:y(()=>[$("Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.")]),_:1}),v(t,null,{header:y(()=>[$("How quickly will tests be ready?")]),text:y(()=>[$("We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.")]),_:1}),v(t,null,{header:y(()=>[$("Can we use another project management tool?")]),text:y(()=>[$("We can, but that's an add on cost since it slows down our workflow.")]),_:1}),v(t,null,{header:y(()=>[$("How are projects split up?")]),text:y(()=>[$("You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.")]),_:1}),v(t,null,{header:y(()=>[$("How can I get started?")]),text:y(()=>[$('You can click on the "Start Today" button in the navbar and it will take you to the registration section.')]),_:1}),v(t,null,{header:y(()=>[$("Do you offer yearly pricing?")]),text:y(()=>[$("Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!")]),_:1}),v(t,null,{header:y(()=>[$("Can I get a refund if I'm not satisfied?")]),text:y(()=>[$("We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.")]),_:1})])])])}const s3=L(Oa,[["render",o3]]),n3=k({name:"Plan",components:{PhPhone:S},computed:{bookLink(){const s=new Date,o=s.getMonth()<9?"0"+(s.getMonth()+1):s.getMonth()+1;return"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month="+(s.getFullYear()+"-"+o)}}},"$lLdJQFVJ7l"),r3={class:"end-outer"},i3={class:"page-wrapper end-wrapper"},c3=e("h2",null,"Book a call and see if QAComet works for you",-1),h3=e("h3",null,"Receive a guided tour through our QA process and find out how your company can benefit from QAComet.",-1),d3=["href"],u3=e("span",null,"Book a call",-1);function p3(s,o,n,h,u,p){const t=H("PhPhone");return a(),l("div",r3,[e("div",i3,[c3,h3,e("a",{href:s.bookLink,class:"end-cta"},[u3,v(t)],8,d3)])])}const g3=L(n3,[["render",p3]]),f3=f({__name:"index",setup(s){const o=T(),n=new URL(o.public.baseUrl);n.pathname=J,n.searchParams.set("utm_source","ab5");const h=n.toString();return C({title:"QAComet - QA as a service for only $5k/month",meta:[{name:"description",content:"QAComet is built for testing your SaaS or webapp. We effectively find bugs and hard to reach edge cases and quickly write robust tests using playwright. If you try us today, we have a $50 14 day trial available for new customers, limited to the first 5 customers. Start today!"},{property:"og:image",content:h},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:h}],link:[{rel:"canonical",href:"https://qacomet.com"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"Organization",image:["https://qacomet.com/img/qacomet-logo.png","https://qacomet.com/img/open-graph-banner.jpg"],url:"https://qacomet.com",logo:"https://qacomet.com/img/qacomet-logo.png",sameAs:["https://github.com/QAComet","https://mastodon.social/@qacomet","https://bsky.app/profile/qacomet.bsky.social","https://twitter.com/QACometOfficial"],name:"QAComet",legalName:"QAComet LLC",description:"QAComet is a subscription service for unlimited QA work. For $5k/month you get unlimited requests to write end-to-end tests, integration tests, unit tests, do QA and usability reviews, and work on finding and reporting bugs.",email:"hello@qacomet.com",contactPoint:{"@type":"ContactPoint",email:"hello@qacomet.com"}})}]}),(u,p)=>{const t=je,r=Ye,g=gt,m=_t,d=Kt,w=ja,B=s3,P=g3;return a(),l(Q,null,[v(t),v(r),v(g),v(m),v(d),v(w),v(B),v(P)],64)}}});export{f3 as default}; diff --git a/_nuxt/Ctq4P3QF.js b/_nuxt/DbrryaCF.js similarity index 65% rename from _nuxt/Ctq4P3QF.js rename to _nuxt/DbrryaCF.js index 37c5e84..9cb9113 100644 --- a/_nuxt/Ctq4P3QF.js +++ b/_nuxt/DbrryaCF.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./Bu7SZk0z.js";const c={};function n(e,a){return r(),t("tbody",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return r(),t("tbody",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/Df2pBprM.js b/_nuxt/Df2pBprM.js deleted file mode 100644 index a63fe27..0000000 --- a/_nuxt/Df2pBprM.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o}from"./qxZzs3oh.js";import"./Bu7SZk0z.js";import"./BsYmvPZw.js";import"./D3rhYO6_.js";export{o as default}; diff --git a/_nuxt/D33P3ETq.js b/_nuxt/DgaJ7ELG.js similarity index 65% rename from _nuxt/D33P3ETq.js rename to _nuxt/DgaJ7ELG.js index da8b7a6..3eee571 100644 --- a/_nuxt/D33P3ETq.js +++ b/_nuxt/DgaJ7ELG.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as n}from"./Bu7SZk0z.js";const s={};function c(e,a){return r(),t("strong",null,[n(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,l as n}from"./BlS8upJP.js";const s={};function c(e,a){return r(),t("strong",null,[n(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; diff --git a/_nuxt/Dxr2xmOe.js b/_nuxt/Dhont5qJ.js similarity index 92% rename from _nuxt/Dxr2xmOe.js rename to _nuxt/Dhont5qJ.js index 70b424d..ec88d29 100644 --- a/_nuxt/Dxr2xmOe.js +++ b/_nuxt/Dhont5qJ.js @@ -1 +1 @@ -import{_ as V}from"./DBoACagk.js";import{u as $}from"./B5qANkaG.js";import{f as H,j as i,k as r,o as a,c as t,l as _,m as Z,n as k,a as e,x,b as n,w as v,D as A,i as w,F as L,B as y,d as u}from"./Bu7SZk0z.js";const b=["width","height","fill","transform"],B={key:0},S=e("path",{d:"M224,44H32A12,12,0,0,0,20,56V192a20,20,0,0,0,20,20H216a20,20,0,0,0,20-20V56A12,12,0,0,0,224,44Zm-96,83.72L62.85,68h130.3ZM92.79,128,44,172.72V83.28Zm17.76,16.28,9.34,8.57a12,12,0,0,0,16.22,0l9.34-8.57L193.15,188H62.85ZM163.21,128,212,83.28v89.44Z"},null,-1),z=[S],N={key:1},T=e("path",{d:"M224,56l-96,88L32,56Z",opacity:"0.2"},null,-1),P=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),q=[T,P],D={key:2},E=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),j=[E],F={key:3},W=e("path",{d:"M224,50H32a6,6,0,0,0-6,6V192a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A6,6,0,0,0,224,50Zm-96,85.86L47.42,62H208.58ZM101.67,128,38,186.36V69.64Zm8.88,8.14L124,148.42a6,6,0,0,0,8.1,0l13.4-12.28L208.58,194H47.43ZM154.33,128,218,69.64V186.36Z"},null,-1),G=[W],Q={key:4},I=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),O=[I],U={key:5},R=e("path",{d:"M224,52H32a4,4,0,0,0-4,4V192a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A4,4,0,0,0,224,52Zm-96,86.57L42.28,60H213.72ZM104.63,128,36,190.91V65.09Zm5.92,5.43L125.3,147a4,4,0,0,0,5.4,0l14.75-13.52L213.72,196H42.28ZM151.37,128,220,65.09V190.91Z"},null,-1),Y=[R],J={name:"PhEnvelope"},K=H({...J,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",B,z)):l.value==="duotone"?(a(),t("g",N,q)):l.value==="fill"?(a(),t("g",D,j)):l.value==="light"?(a(),t("g",F,G)):l.value==="regular"?(a(),t("g",Q,O)):l.value==="thin"?(a(),t("g",U,Y)):Z("",!0)],16,b))}}),X=["width","height","fill","transform"],e1={key:0},a1=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM40,76H216a12,12,0,0,0,0-24H40a12,12,0,0,0,0,24ZM216,180H40a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24Z"},null,-1),t1=[a1],o1={key:1},l1=e("path",{d:"M216,64V192H40V64Z",opacity:"0.2"},null,-1),s1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),i1=[l1,s1],r1={key:2},n1=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM192,184H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Z"},null,-1),c1=[n1],h1={key:3},d1=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM40,70H216a6,6,0,0,0,0-12H40a6,6,0,0,0,0,12ZM216,186H40a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12Z"},null,-1),m1=[d1],p1={key:4},g1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),v1=[g1],u1={key:5},f1=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM40,68H216a4,4,0,0,0,0-8H40a4,4,0,0,0,0,8ZM216,188H40a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8Z"},null,-1),C1=[f1],w1={name:"PhList"},H1=H({...w1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",e1,t1)):l.value==="duotone"?(a(),t("g",o1,i1)):l.value==="fill"?(a(),t("g",r1,c1)):l.value==="light"?(a(),t("g",h1,m1)):l.value==="regular"?(a(),t("g",p1,v1)):l.value==="thin"?(a(),t("g",u1,C1)):Z("",!0)],16,X))}}),_1=["width","height","fill","transform"],Z1={key:0},k1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-56,0a16,16,0,1,1,16,16A16,16,0,0,1,112,104Zm112,92H140v-8.87a84,84,0,1,0-24,0V196H32a12,12,0,0,0,0,24H224a12,12,0,0,0,0-24ZM68,104a60,60,0,1,1,60,60A60.07,60.07,0,0,1,68,104Z"},null,-1),M1=[k1],y1={key:1},V1=e("path",{d:"M128,32a72,72,0,1,0,72,72A72,72,0,0,0,128,32Zm0,104a32,32,0,1,1,32-32A32,32,0,0,1,128,136Z",opacity:"0.2"},null,-1),$1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),x1=[V1,$1],A1={key:2},L1=e("path",{d:"M160,104a32,32,0,1,1-32-32A32,32,0,0,1,160,104Zm72,104a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16h88V183.6a80,80,0,1,1,16,0V200h88A8,8,0,0,1,232,208ZM128,152a48,48,0,1,0-48-48A48.05,48.05,0,0,0,128,152Z"},null,-1),b1=[L1],B1={key:3},S1=e("path",{d:"M166,104a38,38,0,1,0-38,38A38,38,0,0,0,166,104Zm-64,0a26,26,0,1,1,26,26A26,26,0,0,1,102,104Zm122,98H134V181.75a78,78,0,1,0-12,0V202H32a6,6,0,0,0,0,12H224a6,6,0,0,0,0-12ZM62,104a66,66,0,1,1,66,66A66.08,66.08,0,0,1,62,104Z"},null,-1),z1=[S1],N1={key:4},T1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),P1=[T1],q1={key:5},D1=e("path",{d:"M164,104a36,36,0,1,0-36,36A36,36,0,0,0,164,104Zm-64,0a28,28,0,1,1,28,28A28,28,0,0,1,100,104ZM224,204H132V179.89a76,76,0,1,0-8,0V204H32a4,4,0,0,0,0,8H224a4,4,0,0,0,0-8ZM60,104a68,68,0,1,1,68,68A68.07,68.07,0,0,1,60,104Z"},null,-1),E1=[D1],j1={name:"PhWebcam"},F1=H({...j1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",Z1,M1)):l.value==="duotone"?(a(),t("g",y1,x1)):l.value==="fill"?(a(),t("g",A1,b1)):l.value==="light"?(a(),t("g",B1,z1)):l.value==="regular"?(a(),t("g",N1,P1)):l.value==="thin"?(a(),t("g",q1,E1)):Z("",!0)],16,_1))}}),W1="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%2027%2027'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;'%3e%3cg%20transform='matrix(1,0,0,1,-2.69278,-2.69278)'%3e%3cg%20transform='matrix(0.707107,0.707107,-0.707107,0.707107,15.9609,-5.3514)'%3e%3cg%20transform='matrix(-1,5.72459e-17,-1.78677e-16,1.16352,31.1254,-2.7646)'%3e%3cpath%20d='M16,30.287C17.302,27.607%2018.843,23.262%2019.905,22.248C20.664,21.523%2022.019,25.187%2022.374,24.2C23.063,22.286%2024.039,16.218%2024.039,10.763C24.039,5.307%2018.68,2.723%2016,2.723C13.32,2.723%207.961,5.307%207.961,10.763C7.961,16.218%208.937,22.286%209.626,24.2C9.981,25.187%2011.336,21.523%2012.095,22.248C13.157,23.262%2014.698,27.607%2016,30.287'%20style='fill:rgb(245,245,241);stroke:rgb(245,245,241);stroke-width:1.84px;'/%3e%3c/g%3e%3cg%20transform='matrix(0.61912,-0.61912,0.554112,0.554112,-6.10261,3.31527)'%3e%3cellipse%20cx='13.502'%20cy='23.224'%20rx='5.14'%20ry='5.742'%20style='fill:rgb(16,12,10);'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",G1="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='1800'%20height='1200'%3e%3cpath%20fill='%23002868'%20d='M0%200h1800v1200H0'/%3e%3cpath%20fill='%23fff'%20d='M0%20400h1800v400H0'/%3e%3cpath%20d='M1130.81,750A400,400%200%201,1%201130.81,450L760,600'%20fill='%23BF0A30'/%3e%3ccircle%20cx='760'%20cy='600'%20r='200'%20fill='gold'/%3e%3c/svg%3e",Q1={class:"navbar"},I1={class:"nav-main"},O1=e("img",{src:W1,alt:"QAComet Logo"},null,-1),U1=e("span",null,"QAComet",-1),R1=y('Why QAComet?Recent WorkTasksFAQsStart Today',5),Y1=[R1],J1=e("a",{href:"/#plan",class:"nav-cta"},"Start Today",-1),K1={class:"main"},X1={class:"page-footer"},e0={class:"page-wrapper footer-wrapper"},a0={class:"footer-sections"},t0={class:"footer-section"},o0=e("div",{class:"footer-logo"},null,-1),l0=e("div",{class:"footer-section-title"},"Contact",-1),s0={class:"footer-links"},i0={class:"link-wrapper"},r0={class:"link-icon"},n0=e("div",{class:"link-text"},[e("a",{href:"mailto:hello@qacomet.com"},"Email us")],-1),c0={class:"link-wrapper"},h0={class:"link-icon"},d0=e("div",{class:"link-text"},[e("a",{href:"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month=2024-03"},"Book a free call")],-1),m0=y('',2),p0={class:"footer-section"},g0=e("div",{class:"footer-section-title"},"Blog",-1),v0={class:"footer-links"},u0={class:"footer-section"},f0=e("div",{class:"footer-section-title"},"Links",-1),C0={class:"footer-links"},w0=e("a",{href:"mailto:hello@qacomet.com"},"Contact",-1),H0=e("div",{class:"footer-end"},[e("span",{class:"copy"},[e("img",{src:G1,alt:"Colorado Flag"}),u(" © 2024 QAComet LLC")])],-1),M0=H({__name:"default",setup(p){const o=x({menu:!1});function d(){o.menu=!o.menu}return $({meta:[{name:"msapplication-TileColor",content:"#f5f5f3"},{name:"theme-color",content:"#f5f5f3"}],link:[{rel:"apple-touch-icon",sizes:"180x180",href:"/apple-touch-icon.png"},{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32x32.png"},{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicon-16x16.png"},{rel:"icon",href:"/favicon.ico"},{rel:"manifest",href:"/site.webmanifest"},{rel:"mask-icon",href:"/safari-pinned-tab.svg",color:"#100c09"}]}),(m,g)=>{const s=V;return a(),t(L,null,[e("nav",Q1,[e("div",I1,[n(s,{to:"/",class:"nav-logo"},{default:v(()=>[O1,U1]),_:1}),e("div",{class:A(["nav-links",{"display-nav-links":w(o).menu}])},Y1,2),J1,e("button",{class:"menu",onClick:d,"aria-label":"Toggle mobile menu"},[n(w(H1),{color:"#f5f5f3",weight:"bold"})])])]),e("div",K1,[_(m.$slots,"default"),e("footer",X1,[e("div",e0,[e("div",a0,[e("div",t0,[o0,l0,e("div",s0,[e("div",i0,[e("div",r0,[n(w(K))]),n0]),e("div",c0,[e("div",h0,[n(w(F1))]),d0])]),m0]),e("div",p0,[g0,e("div",v0,[n(s,{to:"/case-studies/",prefetch:""},{default:v(()=>[u("Case Studies")]),_:1}),n(s,{to:"/playwright/",prefetch:""},{default:v(()=>[u("Playwright Internals")]),_:1})])]),e("div",u0,[f0,e("div",C0,[n(s,{to:"/terms-of-service/",prefetch:""},{default:v(()=>[u("Terms of Service")]),_:1}),n(s,{to:"/terms-and-conditions/",prefetch:""},{default:v(()=>[u("Terms & Conditions")]),_:1}),n(s,{to:"/privacy-policy/",prefetch:""},{default:v(()=>[u("Privacy Policy")]),_:1}),w0])])]),H0])])])],64)}}});export{M0 as default}; +import{_ as V}from"./CFzORWKb.js";import{u as $}from"./maW11VfC.js";import{f as H,j as i,k as r,o as a,c as t,l as _,m as Z,n as k,a as e,x,b as n,w as v,D as A,i as w,F as L,B as y,d as u}from"./BlS8upJP.js";const b=["width","height","fill","transform"],B={key:0},S=e("path",{d:"M224,44H32A12,12,0,0,0,20,56V192a20,20,0,0,0,20,20H216a20,20,0,0,0,20-20V56A12,12,0,0,0,224,44Zm-96,83.72L62.85,68h130.3ZM92.79,128,44,172.72V83.28Zm17.76,16.28,9.34,8.57a12,12,0,0,0,16.22,0l9.34-8.57L193.15,188H62.85ZM163.21,128,212,83.28v89.44Z"},null,-1),z=[S],F={key:1},N=e("path",{d:"M224,56l-96,88L32,56Z",opacity:"0.2"},null,-1),T=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),P=[N,T],q={key:2},D=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),E=[D],j={key:3},W=e("path",{d:"M224,50H32a6,6,0,0,0-6,6V192a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A6,6,0,0,0,224,50Zm-96,85.86L47.42,62H208.58ZM101.67,128,38,186.36V69.64Zm8.88,8.14L124,148.42a6,6,0,0,0,8.1,0l13.4-12.28L208.58,194H47.43ZM154.33,128,218,69.64V186.36Z"},null,-1),G=[W],Q={key:4},I=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),O=[I],U={key:5},R=e("path",{d:"M224,52H32a4,4,0,0,0-4,4V192a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A4,4,0,0,0,224,52Zm-96,86.57L42.28,60H213.72ZM104.63,128,36,190.91V65.09Zm5.92,5.43L125.3,147a4,4,0,0,0,5.4,0l14.75-13.52L213.72,196H42.28ZM151.37,128,220,65.09V190.91Z"},null,-1),Y=[R],J={name:"PhEnvelope"},K=H({...J,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",B,z)):l.value==="duotone"?(a(),t("g",F,P)):l.value==="fill"?(a(),t("g",q,E)):l.value==="light"?(a(),t("g",j,G)):l.value==="regular"?(a(),t("g",Q,O)):l.value==="thin"?(a(),t("g",U,Y)):Z("",!0)],16,b))}}),X=["width","height","fill","transform"],e1={key:0},a1=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM40,76H216a12,12,0,0,0,0-24H40a12,12,0,0,0,0,24ZM216,180H40a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24Z"},null,-1),t1=[a1],o1={key:1},l1=e("path",{d:"M216,64V192H40V64Z",opacity:"0.2"},null,-1),s1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),i1=[l1,s1],r1={key:2},n1=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM192,184H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Z"},null,-1),c1=[n1],h1={key:3},d1=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM40,70H216a6,6,0,0,0,0-12H40a6,6,0,0,0,0,12ZM216,186H40a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12Z"},null,-1),m1=[d1],p1={key:4},g1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),v1=[g1],u1={key:5},f1=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM40,68H216a4,4,0,0,0,0-8H40a4,4,0,0,0,0,8ZM216,188H40a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8Z"},null,-1),C1=[f1],w1={name:"PhList"},H1=H({...w1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",e1,t1)):l.value==="duotone"?(a(),t("g",o1,i1)):l.value==="fill"?(a(),t("g",r1,c1)):l.value==="light"?(a(),t("g",h1,m1)):l.value==="regular"?(a(),t("g",p1,v1)):l.value==="thin"?(a(),t("g",u1,C1)):Z("",!0)],16,X))}}),_1=["width","height","fill","transform"],Z1={key:0},k1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-56,0a16,16,0,1,1,16,16A16,16,0,0,1,112,104Zm112,92H140v-8.87a84,84,0,1,0-24,0V196H32a12,12,0,0,0,0,24H224a12,12,0,0,0,0-24ZM68,104a60,60,0,1,1,60,60A60.07,60.07,0,0,1,68,104Z"},null,-1),M1=[k1],y1={key:1},V1=e("path",{d:"M128,32a72,72,0,1,0,72,72A72,72,0,0,0,128,32Zm0,104a32,32,0,1,1,32-32A32,32,0,0,1,128,136Z",opacity:"0.2"},null,-1),$1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),x1=[V1,$1],A1={key:2},L1=e("path",{d:"M160,104a32,32,0,1,1-32-32A32,32,0,0,1,160,104Zm72,104a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16h88V183.6a80,80,0,1,1,16,0V200h88A8,8,0,0,1,232,208ZM128,152a48,48,0,1,0-48-48A48.05,48.05,0,0,0,128,152Z"},null,-1),b1=[L1],B1={key:3},S1=e("path",{d:"M166,104a38,38,0,1,0-38,38A38,38,0,0,0,166,104Zm-64,0a26,26,0,1,1,26,26A26,26,0,0,1,102,104Zm122,98H134V181.75a78,78,0,1,0-12,0V202H32a6,6,0,0,0,0,12H224a6,6,0,0,0,0-12ZM62,104a66,66,0,1,1,66,66A66.08,66.08,0,0,1,62,104Z"},null,-1),z1=[S1],F1={key:4},N1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),T1=[N1],P1={key:5},q1=e("path",{d:"M164,104a36,36,0,1,0-36,36A36,36,0,0,0,164,104Zm-64,0a28,28,0,1,1,28,28A28,28,0,0,1,100,104ZM224,204H132V179.89a76,76,0,1,0-8,0V204H32a4,4,0,0,0,0,8H224a4,4,0,0,0,0-8ZM60,104a68,68,0,1,1,68,68A68.07,68.07,0,0,1,60,104Z"},null,-1),D1=[q1],E1={name:"PhWebcam"},j1=H({...E1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",Z1,M1)):l.value==="duotone"?(a(),t("g",y1,x1)):l.value==="fill"?(a(),t("g",A1,b1)):l.value==="light"?(a(),t("g",B1,z1)):l.value==="regular"?(a(),t("g",F1,T1)):l.value==="thin"?(a(),t("g",P1,D1)):Z("",!0)],16,_1))}}),W1="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%2027%2027'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;'%3e%3cg%20transform='matrix(1,0,0,1,-2.69278,-2.69278)'%3e%3cg%20transform='matrix(0.707107,0.707107,-0.707107,0.707107,15.9609,-5.3514)'%3e%3cg%20transform='matrix(-1,5.72459e-17,-1.78677e-16,1.16352,31.1254,-2.7646)'%3e%3cpath%20d='M16,30.287C17.302,27.607%2018.843,23.262%2019.905,22.248C20.664,21.523%2022.019,25.187%2022.374,24.2C23.063,22.286%2024.039,16.218%2024.039,10.763C24.039,5.307%2018.68,2.723%2016,2.723C13.32,2.723%207.961,5.307%207.961,10.763C7.961,16.218%208.937,22.286%209.626,24.2C9.981,25.187%2011.336,21.523%2012.095,22.248C13.157,23.262%2014.698,27.607%2016,30.287'%20style='fill:rgb(245,245,241);stroke:rgb(245,245,241);stroke-width:1.84px;'/%3e%3c/g%3e%3cg%20transform='matrix(0.61912,-0.61912,0.554112,0.554112,-6.10261,3.31527)'%3e%3cellipse%20cx='13.502'%20cy='23.224'%20rx='5.14'%20ry='5.742'%20style='fill:rgb(16,12,10);'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",G1="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='1800'%20height='1200'%3e%3cpath%20fill='%23002868'%20d='M0%200h1800v1200H0'/%3e%3cpath%20fill='%23fff'%20d='M0%20400h1800v400H0'/%3e%3cpath%20d='M1130.81,750A400,400%200%201,1%201130.81,450L760,600'%20fill='%23BF0A30'/%3e%3ccircle%20cx='760'%20cy='600'%20r='200'%20fill='gold'/%3e%3c/svg%3e",Q1={class:"navbar"},I1={class:"nav-main"},O1=e("img",{src:W1,alt:"QAComet Logo"},null,-1),U1=e("span",null,"QAComet",-1),R1=y('Why QAComet?Recent WorkTasksFAQsStart Today',5),Y1=[R1],J1=e("a",{href:"/#plan",class:"nav-cta"},"Start Today",-1),K1={class:"main"},X1={class:"page-footer"},e0={class:"page-wrapper footer-wrapper"},a0={class:"footer-sections"},t0={class:"footer-section"},o0=e("div",{class:"footer-logo"},null,-1),l0=e("div",{class:"footer-section-title"},"Contact",-1),s0={class:"footer-links"},i0={class:"link-wrapper"},r0={class:"link-icon"},n0=e("div",{class:"link-text"},[e("a",{href:"mailto:hello@qacomet.com"},"Email us")],-1),c0={class:"link-wrapper"},h0={class:"link-icon"},d0=e("div",{class:"link-text"},[e("a",{href:"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month=2024-03"},"Book a free call")],-1),m0=y('',2),p0={class:"footer-section"},g0=e("div",{class:"footer-section-title"},"Blog",-1),v0={class:"footer-links"},u0={class:"footer-section"},f0=e("div",{class:"footer-section-title"},"Links",-1),C0={class:"footer-links"},w0=e("a",{href:"mailto:hello@qacomet.com"},"Contact",-1),H0=e("div",{class:"footer-end"},[e("span",{class:"copy"},[e("img",{src:G1,alt:"Colorado Flag"}),u(" © 2024 QAComet LLC")])],-1),M0=H({__name:"default",setup(p){const o=x({menu:!1});function d(){o.menu=!o.menu}return $({meta:[{name:"msapplication-TileColor",content:"#F5F6F1"},{name:"theme-color",content:"#F5F6F1"}],link:[{rel:"apple-touch-icon",sizes:"180x180",href:"/apple-touch-icon.png"},{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32x32.png"},{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicon-16x16.png"},{rel:"icon",href:"/favicon.ico"},{rel:"manifest",href:"/site.webmanifest"},{rel:"mask-icon",href:"/safari-pinned-tab.svg",color:"#100c09"}]}),(m,g)=>{const s=V;return a(),t(L,null,[e("nav",Q1,[e("div",I1,[n(s,{to:"/",class:"nav-logo"},{default:v(()=>[O1,U1]),_:1}),e("div",{class:A(["nav-links",{"display-nav-links":w(o).menu}])},Y1,2),J1,e("button",{class:"menu",onClick:d,"aria-label":"Toggle mobile menu"},[n(w(H1),{color:"#F5F6F1",weight:"bold"})])])]),e("div",K1,[_(m.$slots,"default"),e("footer",X1,[e("div",e0,[e("div",a0,[e("div",t0,[o0,l0,e("div",s0,[e("div",i0,[e("div",r0,[n(w(K))]),n0]),e("div",c0,[e("div",h0,[n(w(j1))]),d0])]),m0]),e("div",p0,[g0,e("div",v0,[n(s,{to:"/case-studies/",prefetch:""},{default:v(()=>[u("Case Studies")]),_:1}),n(s,{to:"/playwright/",prefetch:""},{default:v(()=>[u("Playwright Internals")]),_:1})])]),e("div",u0,[f0,e("div",C0,[n(s,{to:"/terms-of-service/",prefetch:""},{default:v(()=>[u("Terms of Service")]),_:1}),n(s,{to:"/terms-and-conditions/",prefetch:""},{default:v(()=>[u("Terms & Conditions")]),_:1}),n(s,{to:"/privacy-policy/",prefetch:""},{default:v(()=>[u("Privacy Policy")]),_:1}),w0])])]),H0])])])],64)}}});export{M0 as default}; diff --git a/_nuxt/twebAfCg.js b/_nuxt/DkuQMAl2.js similarity index 65% rename from _nuxt/twebAfCg.js rename to _nuxt/DkuQMAl2.js index a91b076..0588705 100644 --- a/_nuxt/twebAfCg.js +++ b/_nuxt/DkuQMAl2.js @@ -1 +1 @@ -import{_ as a}from"./DBoACagk.js";import{f as o,o as n,g as f,w as s,l}from"./Bu7SZk0z.js";const i=o({__name:"ProseA",props:{href:{type:String,default:""},target:{type:String,default:void 0,required:!1}},setup(e){return(t,u)=>{const r=a;return n(),f(r,{href:e.href,target:e.target},{default:s(()=>[l(t.$slots,"default")]),_:3},8,["href","target"])}}});export{i as default}; +import{_ as a}from"./CFzORWKb.js";import{f as o,o as n,g as f,w as s,l}from"./BlS8upJP.js";const i=o({__name:"ProseA",props:{href:{type:String,default:""},target:{type:String,default:void 0,required:!1}},setup(e){return(t,u)=>{const r=a;return n(),f(r,{href:e.href,target:e.target},{default:s(()=>[l(t.$slots,"default")]),_:3},8,["href","target"])}}});export{i as default}; diff --git a/_nuxt/uY7d0eSg.js b/_nuxt/DmSip271.js similarity index 64% rename from _nuxt/uY7d0eSg.js rename to _nuxt/DmSip271.js index 1f9dbba..218fdb8 100644 --- a/_nuxt/uY7d0eSg.js +++ b/_nuxt/DmSip271.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./Bu7SZk0z.js";const c={};function l(e,n){return r(),s("ol",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function l(e,n){return r(),s("ol",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; diff --git a/_nuxt/Blt55MqG.js b/_nuxt/DxghXiKV.js similarity index 64% rename from _nuxt/Blt55MqG.js rename to _nuxt/DxghXiKV.js index 32127cb..2fc4b74 100644 --- a/_nuxt/Blt55MqG.js +++ b/_nuxt/DxghXiKV.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./Bu7SZk0z.js";const c={};function n(e,a){return r(),t("th",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return r(),t("th",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/IHox2P6B.js b/_nuxt/J2jEMbcE.js similarity index 82% rename from _nuxt/IHox2P6B.js rename to _nuxt/J2jEMbcE.js index 21dcdb4..f3618c4 100644 --- a/_nuxt/IHox2P6B.js +++ b/_nuxt/J2jEMbcE.js @@ -1 +1 @@ -import{_ as l}from"./a3lCQdJr.js";import{f as n,o as s,g as i,w as o,a as r,D as g,C as u,l as f}from"./Bu7SZk0z.js";const h=n({__name:"ProsePre",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null},class:{type:String,default:null},style:{type:[String,Object],default:null}},setup(e){return(a,m)=>{const t=l;return s(),i(t,{code:e.code,language:e.language,filename:e.filename,highlights:e.highlights,meta:e.meta},{default:o(()=>[r("pre",{class:g(a.$props.class),style:u(e.style)},[f(a.$slots,"default")],6)]),_:3},8,["code","language","filename","highlights","meta"])}}});export{h as default}; +import{_ as l}from"./BnI7OW5X.js";import{f as n,o as s,g as i,w as o,a as r,D as g,C as u,l as f}from"./BlS8upJP.js";const h=n({__name:"ProsePre",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null},class:{type:String,default:null},style:{type:[String,Object],default:null}},setup(e){return(a,m)=>{const t=l;return s(),i(t,{code:e.code,language:e.language,filename:e.filename,highlights:e.highlights,meta:e.meta},{default:o(()=>[r("pre",{class:g(a.$props.class),style:u(e.style)},[f(a.$slots,"default")],6)]),_:3},8,["code","language","filename","highlights","meta"])}}});export{h as default}; diff --git a/_nuxt/N-K5-nTu.js b/_nuxt/N8b39uzv.js similarity index 77% rename from _nuxt/N-K5-nTu.js rename to _nuxt/N8b39uzv.js index 286129f..ee31f16 100644 --- a/_nuxt/N-K5-nTu.js +++ b/_nuxt/N8b39uzv.js @@ -1 +1 @@ -import{f as n,J as e}from"./Bu7SZk0z.js";const r=n({name:"DocumentDrivenEmpty",props:{value:{type:Object,required:!0}},render({value:t}){return e("div",void 0,[e("p","Document is empty"),e("p",`Add content to it by opening ${t._source}/${t._file} file.`)])}});export{r as default}; +import{f as n,J as e}from"./BlS8upJP.js";const r=n({name:"DocumentDrivenEmpty",props:{value:{type:Object,required:!0}},render({value:t}){return e("div",void 0,[e("p","Document is empty"),e("p",`Add content to it by opening ${t._source}/${t._file} file.`)])}});export{r as default}; diff --git a/_nuxt/Dfba2t6l.js b/_nuxt/Q0Y17sdK.js similarity index 85% rename from _nuxt/Dfba2t6l.js rename to _nuxt/Q0Y17sdK.js index ae826e0..f605c7a 100644 --- a/_nuxt/Dfba2t6l.js +++ b/_nuxt/Q0Y17sdK.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./Bu7SZk0z.js";const l=["id"],p=["href"],k=d({__name:"ProseH6",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h6)});return(e,m)=>(s(),n("h6",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH6",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h6)});return(e,m)=>(s(),n("h6",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/BHlee23A.js b/_nuxt/R-gFWJPL.js similarity index 95% rename from _nuxt/BHlee23A.js rename to _nuxt/R-gFWJPL.js index 8559634..f173dd0 100644 --- a/_nuxt/BHlee23A.js +++ b/_nuxt/R-gFWJPL.js @@ -1 +1 @@ -import{_ as a}from"./DBoACagk.js";import{u as s}from"./B5qANkaG.js";import{_ as i,o as u,c,a as e,t as o,b as d,w as l,d as p,p as h,e as f}from"./Bu7SZk0z.js";const g=t=>(h("data-v-73a07988"),t=t(),f(),t),b={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},m=g(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),x={class:"max-w-520px text-center z-20"},y=["textContent"],_=["textContent"],k={class:"w-full flex items-center justify-center"},w={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const n=t;return s({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(z,S)=>{const r=a;return u(),c("div",b,[m,e("div",x,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:o(t.statusCode)},null,8,y),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:o(t.description)},null,8,_),e("div",k,[d(r,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:l(()=>[p(o(t.backHome),1)]),_:1})])])])}}},I=i(w,[["__scopeId","data-v-73a07988"]]);export{I as default}; +import{_ as a}from"./CFzORWKb.js";import{u as s}from"./maW11VfC.js";import{_ as i,o as u,c,a as e,t as o,b as d,w as l,d as p,p as h,e as f}from"./BlS8upJP.js";const g=t=>(h("data-v-73a07988"),t=t(),f(),t),b={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},m=g(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),x={class:"max-w-520px text-center z-20"},y=["textContent"],_=["textContent"],k={class:"w-full flex items-center justify-center"},w={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const n=t;return s({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(z,S)=>{const r=a;return u(),c("div",b,[m,e("div",x,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:o(t.statusCode)},null,8,y),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:o(t.description)},null,8,_),e("div",k,[d(r,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:l(()=>[p(o(t.backHome),1)]),_:1})])])])}}},I=i(w,[["__scopeId","data-v-73a07988"]]);export{I as default}; diff --git a/_nuxt/Testimonial.BamnguDL.css b/_nuxt/Testimonial.BamnguDL.css new file mode 100644 index 0000000..eafbbbc --- /dev/null +++ b/_nuxt/Testimonial.BamnguDL.css @@ -0,0 +1 @@ +.testimonial-wrapper[data-v-97758cd8]{align-items:center;display:flex;flex-direction:row;width:100%}.testimonial-wrapper .left[data-v-97758cd8]{border-radius:.5rem;display:flex;flex-direction:column;margin-bottom:auto;margin-right:2rem;margin-top:auto;max-width:33%;padding:2rem;width:100%}.testimonial-wrapper .left .image-wrapper[data-v-97758cd8]{border-radius:9999px;height:200px;margin-bottom:3rem;margin-left:auto;margin-right:auto;overflow:hidden;width:200px}.testimonial-wrapper .left .image-wrapper .image-container[data-v-97758cd8]{background-position:50%;background-size:cover;height:100%;width:100%}.testimonial-wrapper .left .brand-wrapper[data-v-97758cd8]{background:#ffffff26;border-radius:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;margin-left:auto;margin-right:auto;padding:.5rem 1rem}.testimonial-wrapper .right .text-wrapper[data-v-97758cd8]{background:#ffffff26;border-radius:.5rem;display:block;font-size:1.5rem;font-style:italic;line-height:2rem;line-height:1.6;padding:2rem}.testimonial-wrapper .right .text-wrapper svg[data-v-97758cd8]{display:block;flex-shrink:0;float:left;height:64px;margin-right:1rem;width:64px}.testimonial-wrapper .right .text-wrapper .text[data-v-97758cd8]{margin-bottom:auto;margin-top:auto}.testimonial-wrapper .right .text-wrapper .text a[data-v-97758cd8]{color:#18caf9}.testimonial-wrapper .right .text-wrapper .text span[data-v-97758cd8]{display:inline}.testimonial-wrapper .right .text-wrapper .text .name[data-v-97758cd8]{display:block;font-style:normal;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer[data-v-97758cd8]{padding-top:1rem;width:100%}.testimonial-wrapper .right .see-more-outer .see-more-wrapper[data-v-97758cd8]{align-items:center;display:flex;flex-direction:row;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer .see-more-wrapper .see-more-text[data-v-97758cd8]{padding-right:.5rem}@media (max-width:768px){.testimonial-wrapper[data-v-97758cd8]{flex-direction:column}.testimonial-wrapper .left[data-v-97758cd8]{align-items:center;margin-right:0;max-width:100%}.testimonial-wrapper .left .image-wrapper[data-v-97758cd8]{margin-bottom:1.5rem}.testimonial-wrapper .right .text-wrapper[data-v-97758cd8]{font-size:1.5rem;line-height:2rem;line-height:1.6;padding:1rem}.testimonial-wrapper .right .text-wrapper svg[data-v-97758cd8]{height:48px;margin-right:.5rem;width:48px}} diff --git a/_nuxt/Testimonial.Cue4Qr-t.css b/_nuxt/Testimonial.Cue4Qr-t.css deleted file mode 100644 index dc979ff..0000000 --- a/_nuxt/Testimonial.Cue4Qr-t.css +++ /dev/null @@ -1 +0,0 @@ -.testimonial-wrapper[data-v-529eaafe]{align-items:center;display:flex;flex-direction:row;width:100%}.testimonial-wrapper .left[data-v-529eaafe]{border-radius:.5rem;display:flex;flex-direction:column;margin-bottom:auto;margin-right:2rem;margin-top:auto;max-width:33%;padding:2rem;width:100%}.testimonial-wrapper .left .image-wrapper[data-v-529eaafe]{border-radius:9999px;height:200px;margin-bottom:3rem;margin-left:auto;margin-right:auto;overflow:hidden;width:200px}.testimonial-wrapper .left .image-wrapper .image-container[data-v-529eaafe]{background-position:50%;background-size:cover;height:100%;width:100%}.testimonial-wrapper .left .brand-wrapper[data-v-529eaafe]{background:#ffffff26;border-radius:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;margin-left:auto;margin-right:auto;padding:.5rem 1rem}.testimonial-wrapper .right .text-wrapper[data-v-529eaafe]{background:#ffffff26;border-radius:.5rem;display:block;font-size:1.5rem;font-style:italic;line-height:2rem;line-height:1.6;padding:2rem}.testimonial-wrapper .right .text-wrapper svg[data-v-529eaafe]{display:block;flex-shrink:0;float:left;height:64px;margin-right:1rem;width:64px}.testimonial-wrapper .right .text-wrapper .text[data-v-529eaafe]{margin-bottom:auto;margin-top:auto}.testimonial-wrapper .right .text-wrapper .text a[data-v-529eaafe]{color:#18caf9}.testimonial-wrapper .right .text-wrapper .text span[data-v-529eaafe]{display:inline}.testimonial-wrapper .right .text-wrapper .text .name[data-v-529eaafe]{display:block;font-style:normal;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer[data-v-529eaafe]{padding-top:1rem;width:100%}.testimonial-wrapper .right .see-more-outer .see-more-wrapper[data-v-529eaafe]{align-items:center;display:flex;flex-direction:row;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer .see-more-wrapper .see-more-text[data-v-529eaafe]{padding-right:.5rem}@media (max-width:768px){.testimonial-wrapper[data-v-529eaafe]{flex-direction:column}.testimonial-wrapper .left[data-v-529eaafe]{align-items:center;margin-right:0;max-width:100%}.testimonial-wrapper .left .image-wrapper[data-v-529eaafe]{margin-bottom:1.5rem}.testimonial-wrapper .right .text-wrapper[data-v-529eaafe]{font-size:1.5rem;line-height:2rem;line-height:1.6;padding:1rem}.testimonial-wrapper .right .text-wrapper svg[data-v-529eaafe]{height:48px;margin-right:.5rem;width:48px}} diff --git a/_nuxt/Ukwwp72Y.js b/_nuxt/Ukwwp72Y.js deleted file mode 100644 index 200ce9a..0000000 --- a/_nuxt/Ukwwp72Y.js +++ /dev/null @@ -1 +0,0 @@ -import"./Bu7SZk0z.js";const r=""+new URL("open-graph-banner.DatA27wH.jpg",import.meta.url).href;export{r as _}; diff --git a/_nuxt/CIDPYlRW.js b/_nuxt/X2wNORNR.js similarity index 78% rename from _nuxt/CIDPYlRW.js rename to _nuxt/X2wNORNR.js index 4182021..f46aff6 100644 --- a/_nuxt/CIDPYlRW.js +++ b/_nuxt/X2wNORNR.js @@ -1,7 +1,7 @@ function __vite__mapDeps(indexes) { if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["./CiI5X-ZH.js","./Bu7SZk0z.js","./entry.Ck87SGOn.css","./Du3a2oyP.js","./D3rhYO6_.js","./BsYmvPZw.js"] + __vite__mapDeps.viteFileDeps = ["./CFwVd7gV.js","./BlS8upJP.js","./entry.DiT2Mvoi.css","./DF1VbFfH.js","./BECgZIvk.js","./BsYmvPZw.js"] } return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) } -import{u as m}from"./Bb9rc-i1.js";import{u as v,K as l,L as d,M as g,y,f as h,v as _,k as w,H as C,J as p}from"./Bu7SZk0z.js";import{h as f,u as P}from"./D3rhYO6_.js";import{q as $,w as c,e as x,s as N,j as E,u as T}from"./Du3a2oyP.js";import{_ as j}from"./DBoACagk.js";const S=async t=>{const{content:e}=v().public;typeof(t==null?void 0:t.params)!="function"&&(t=$(t));const n=t.params(),o=e.experimental.stripQueryParameters?c(`/navigation/${`${f(n)}.${e.integrity}`}/${x(n)}.json`):c(`/navigation/${f(n)}.${e.integrity}.json`);if(N())return(await l(()=>import("./CiI5X-ZH.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url).then(i=>i.generateNavigation))(n);const a=await $fetch(o,{method:"GET",responseType:"json",params:e.experimental.stripQueryParameters?void 0:{_params:E(n),previewToken:P().getPreviewToken()}});if(typeof a=="string"&&a.startsWith(""))throw new Error("Not found");return a},b="$s";function D(...t){const e=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(e);const[n,o]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const a=b+n,r=y(),i=d(r.payload.state,a);if(i.value===void 0&&o){const s=o();if(g(s))return r.payload.state[a]=s,s;i.value=s}return i}const R=h({name:"ContentNavigation",props:{query:{type:Object,required:!1,default:void 0}},async setup(t){const{query:e}=_(t),n=w(()=>{var a;return typeof((a=e.value)==null?void 0:a.params)=="function"?e.value.params():e.value});if(!n.value&&D("dd-navigation").value){const{navigation:a}=T();return{navigation:a}}const{data:o}=await m(`content-navigation-${f(n.value)}`,()=>S(n.value));return{navigation:o}},render(t){const e=C(),{navigation:n}=t,o=i=>p(j,{to:i._path},()=>i.title),a=(i,s)=>p("ul",s?{"data-level":s}:null,i.map(u=>u.children?p("li",null,[o(u),a(u.children,s+1)]):p("li",null,o(u)))),r=i=>a(i,0);return e!=null&&e.default?e.default({navigation:n,...this.$attrs}):r(n)}}),Q=R;export{Q as default}; +import{u as m}from"./CRh1_mKz.js";import{u as v,K as l,L as d,M as g,y,f as h,v as _,k as w,H as C,J as p}from"./BlS8upJP.js";import{h as f,u as P}from"./BECgZIvk.js";import{q as $,w as c,e as x,s as N,j as E,u as T}from"./DF1VbFfH.js";import{_ as j}from"./CFzORWKb.js";const S=async t=>{const{content:e}=v().public;typeof(t==null?void 0:t.params)!="function"&&(t=$(t));const n=t.params(),o=e.experimental.stripQueryParameters?c(`/navigation/${`${f(n)}.${e.integrity}`}/${x(n)}.json`):c(`/navigation/${f(n)}.${e.integrity}.json`);if(N())return(await l(()=>import("./CFwVd7gV.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url).then(i=>i.generateNavigation))(n);const a=await $fetch(o,{method:"GET",responseType:"json",params:e.experimental.stripQueryParameters?void 0:{_params:E(n),previewToken:P().getPreviewToken()}});if(typeof a=="string"&&a.startsWith(""))throw new Error("Not found");return a},b="$s";function D(...t){const e=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(e);const[n,o]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const a=b+n,r=y(),i=d(r.payload.state,a);if(i.value===void 0&&o){const s=o();if(g(s))return r.payload.state[a]=s,s;i.value=s}return i}const R=h({name:"ContentNavigation",props:{query:{type:Object,required:!1,default:void 0}},async setup(t){const{query:e}=_(t),n=w(()=>{var a;return typeof((a=e.value)==null?void 0:a.params)=="function"?e.value.params():e.value});if(!n.value&&D("dd-navigation").value){const{navigation:a}=T();return{navigation:a}}const{data:o}=await m(`content-navigation-${f(n.value)}`,()=>S(n.value));return{navigation:o}},render(t){const e=C(),{navigation:n}=t,o=i=>p(j,{to:i._path},()=>i.title),a=(i,s)=>p("ul",s?{"data-level":s}:null,i.map(u=>u.children?p("li",null,[o(u),a(u.children,s+1)]):p("li",null,o(u)))),r=i=>a(i,0);return e!=null&&e.default?e.default({navigation:n,...this.$attrs}):r(n)}}),Q=R;export{Q as default}; diff --git a/_nuxt/ZkJgmw7I.js b/_nuxt/ZkJgmw7I.js new file mode 100644 index 0000000..574246d --- /dev/null +++ b/_nuxt/ZkJgmw7I.js @@ -0,0 +1 @@ +import{_ as e}from"./BneHlRLI.js";import{u as o}from"./maW11VfC.js";import{f as r,g as i,o as n}from"./BlS8upJP.js";import"./CFzORWKb.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const f=r({__name:"architecture",setup(a){return o({title:"QAComet | Architecture of Playwright",meta:[{name:"description",content:"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components."},{property:"og:image",content:"https://qacomet.com/img/playwright/architecture_diagram.jpg"},{property:"og:image:width",content:"800"},{property:"og:image:height",content:"500"},{property:"og:title",content:"QAComet | Architecture of Playwright"},{property:"og:url",content:"https://qacomet.com/playwright/how-playwright-initializes"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Let's dive into Playwright's internals by looking at how the project is structured and discover it's essential components."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(c,p)=>{const t=e;return n(),i(t,{path:"playwright/architecture"})}}});export{f as default}; diff --git a/_nuxt/BZVFcOsn.js b/_nuxt/_tWtRPYx.js similarity index 53% rename from _nuxt/BZVFcOsn.js rename to _nuxt/_tWtRPYx.js index e57657f..a2b8246 100644 --- a/_nuxt/BZVFcOsn.js +++ b/_nuxt/_tWtRPYx.js @@ -1 +1 @@ -import{_ as e,o as r,c}from"./Bu7SZk0z.js";const o={};function t(n,s){return r(),c("hr")}const a=e(o,[["render",t]]);export{a as default}; +import{_ as e,o as r,c}from"./BlS8upJP.js";const o={};function t(n,s){return r(),c("hr")}const a=e(o,[["render",t]]);export{a as default}; diff --git a/_nuxt/builds/latest.json b/_nuxt/builds/latest.json index 6386063..3855654 100644 --- a/_nuxt/builds/latest.json +++ b/_nuxt/builds/latest.json @@ -1 +1 @@ -{"id":"ca109cee-b19c-4e04-8198-82d8546b7421","timestamp":1714069884916} \ No newline at end of file +{"id":"d8c635a6-4df4-43ae-ac4a-a06023848560","timestamp":1714258600734} \ No newline at end of file diff --git a/_nuxt/builds/meta/ca109cee-b19c-4e04-8198-82d8546b7421.json b/_nuxt/builds/meta/ca109cee-b19c-4e04-8198-82d8546b7421.json deleted file mode 100644 index 318c5f5..0000000 --- a/_nuxt/builds/meta/ca109cee-b19c-4e04-8198-82d8546b7421.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"ca109cee-b19c-4e04-8198-82d8546b7421","timestamp":1714069884916,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/terms-of-service","/privacy-policy","/terms-and-conditions","/case-studies","/case-studies/automatisch","/playwright","/playwright/architecture","/playwright/how-playwright-initializes","/"]} \ No newline at end of file diff --git a/_nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json b/_nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json new file mode 100644 index 0000000..85a67f1 --- /dev/null +++ b/_nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json @@ -0,0 +1 @@ +{"id":"d8c635a6-4df4-43ae-ac4a-a06023848560","timestamp":1714258600734,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/terms-of-service","/terms-and-conditions","/privacy-policy","/case-studies","/playwright","/case-studies/automatisch","/playwright/architecture","/playwright/how-playwright-initializes","/"]} \ No newline at end of file diff --git a/_nuxt/j7haMJK9.js b/_nuxt/dGARKcZ6.js similarity index 58% rename from _nuxt/j7haMJK9.js rename to _nuxt/dGARKcZ6.js index 51bc3bf..9668836 100644 --- a/_nuxt/j7haMJK9.js +++ b/_nuxt/dGARKcZ6.js @@ -1 +1 @@ -import r from"./DxMaKacJ.js";import{f as o,H as f,k as u,z as c}from"./Bu7SZk0z.js";const i=o({name:"Markdown",extends:r,setup(t){const{parent:e}=c(),{between:n,default:a}=f(),s=u(()=>typeof t.unwrap=="string"?t.unwrap.split(" "):["*"]);return{fallbackSlot:a,tags:s,between:n,parent:e}}});export{i as default}; +import r from"./C17h_atD.js";import{f as o,H as f,k as u,z as c}from"./BlS8upJP.js";const i=o({name:"Markdown",extends:r,setup(t){const{parent:e}=c(),{between:n,default:a}=f(),s=u(()=>typeof t.unwrap=="string"?t.unwrap.split(" "):["*"]);return{fallbackSlot:a,tags:s,between:n,parent:e}}});export{i as default}; diff --git a/_nuxt/default.CnGTIgSd.css b/_nuxt/default.C6rz2lqQ.css similarity index 85% rename from _nuxt/default.CnGTIgSd.css rename to _nuxt/default.C6rz2lqQ.css index 960ddb6..64bbcca 100644 --- a/_nuxt/default.CnGTIgSd.css +++ b/_nuxt/default.C6rz2lqQ.css @@ -1 +1 @@ -.main{display:flex;flex-direction:column;min-height:100vh;overflow-x:hidden;width:100%}.shadow-main{background:#ffffff26;box-shadow:0 2.8px 2.3px #ffffff04,0 6.7px 5.5px #ffffff06,0 12.5px 10.4px #ffffff07,0 22.3px 18.5px #ffffff08,0 41.8px 34.7px #ffffff09,0 100px 83px #ffffff0d}body{--text:#f5f5f3;--bg:#100c09;background:#100c09;background:#100c09 url(./bg-noise.X4MxhxlM.png);background-repeat:repeat;min-height:100vh;overflow-x:hidden}::-moz-selection{background:var(--main);color:var(--text)}::selection{background:var(--main);color:var(--text)}.navbar{left:0;pointer-events:none;position:fixed;top:0;width:100%;z-index:1000}.navbar .nav-main{margin-left:auto;margin-right:auto;max-width:1232px;padding:1rem;width:100%}.navbar .nav-main,.navbar .nav-main .nav-logo{align-items:center;display:flex;flex-direction:row}.navbar .nav-main .nav-logo{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:.5rem;font-family:Inter Tight,sans-serif;font-size:1.5rem;font-weight:900;line-height:2rem;padding:.5rem 1rem;pointer-events:auto}.navbar .nav-main .nav-logo img{height:28px;width:28px}.navbar .nav-main .nav-logo span{padding-left:.5rem}.navbar .nav-main .nav-links{display:flex;flex-direction:row;margin-left:auto}.navbar .nav-main .nav-links .link{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:.5rem;margin-right:.5rem;padding:.5rem;pointer-events:auto;-webkit-user-select:initial;-moz-user-select:initial;user-select:auto}.navbar .nav-main .nav-links .link:hover{text-decoration:underline}.navbar .nav-main .link-cta{display:none}.navbar .nav-main .nav-cta{background:var(--bg);border:2px solid #18caf9;border-radius:.5rem;color:#18caf9;font-weight:500;padding:.5rem 1rem;pointer-events:auto}.navbar .menu{border:2px solid var(--text);border-radius:.5rem;color:var(--text);display:none;padding:.75rem;pointer-events:auto}.navbar .menu svg{fill:var(--text);color:var(--text)}@media (max-width:768px){.navbar .nav-main .nav-logo{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.navbar .nav-main .nav-links{display:none}.navbar .nav-main .display-nav-links{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#fff9;border-radius:.5rem;color:var(--bg);display:flex;flex-direction:column;left:16px;position:fixed;text-align:center;top:80px;width:90%;width:calc(100% - 32px)}.navbar .nav-main .display-nav-links .link{-webkit-backdrop-filter:none;backdrop-filter:none}.navbar .nav-cta{margin-left:auto;margin-right:1rem}.navbar .menu{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);display:initial}.navbar .menu svg{color:var(--text)}}@media (max-width:400px){.navbar .nav-cta{display:none}.navbar .menu{margin-left:auto}.navbar .nav-links .link-cta{display:initial}}.page-footer{background:var(--bg);margin-top:auto;padding-bottom:2rem;padding-top:2rem}.page-footer .footer-wrapper{color:#ccc;display:flex;flex-direction:column}.page-footer .footer-wrapper .footer-sections{display:flex;flex-direction:row;justify-content:space-around}.page-footer .footer-wrapper .footer-end{display:flex;flex-direction:row;justify-content:center;padding-top:.5rem}.page-footer .footer-wrapper .footer-section-title{font-weight:700}.page-footer .footer-wrapper .footer-links{display:flex;flex-direction:column;padding-bottom:1rem}.page-footer .footer-wrapper .footer-links .link-wrapper{align-items:center;display:flex;flex-direction:row}.page-footer .footer-wrapper .footer-links .link-wrapper .link-icon{padding-right:.375rem}.page-footer .footer-wrapper .footer-links .link-wrapper .link-icon svg{height:18px;width:18px}.page-footer .footer-wrapper .footer-social-links{display:flex;flex-direction:row;padding-bottom:1rem;padding-top:.25rem}.page-footer .footer-wrapper .footer-social-links a{margin-right:.75rem}.page-footer .footer-wrapper .footer-social-links a:last-child{margin-right:0}.page-footer .footer-wrapper .copy{align-items:center;display:flex;flex-direction:row}.page-footer .footer-wrapper .copy img{display:inline;margin-right:.5rem;max-height:30px}.page-footer .footer-wrapper .flag-outer{align-items:center;display:flex;flex-direction:row;justify-content:center;padding-left:1rem}.page-footer .footer-wrapper .flag-outer img{max-height:30px}.page-footer .footer-wrapper .flag-outer span{padding-left:.5rem;padding-right:1rem}.page-footer .footer-wrapper .links{margin-left:auto}.page-footer .footer-wrapper .links a{padding-left:.5rem;padding-right:.5rem}@media (max-width:780px){.page-footer .footer-wrapper .copy{margin-left:auto;margin-right:auto;padding-top:1rem}.page-footer .footer-wrapper .flag-outer{margin-bottom:.5rem;margin-top:.5rem}.page-footer .footer-wrapper .links{display:flex;flex-direction:column;margin-left:auto;margin-right:auto}.page-footer .footer-wrapper .links a{margin-bottom:.25rem;margin-top:.25rem;padding-bottom:.25rem;padding-top:.25rem;text-align:center}}@media (max-width:700px){.page-footer .footer-wrapper .footer-sections{align-items:center;display:flex;flex-direction:column}.page-footer .footer-wrapper .footer-links .link-wrapper,.page-footer .footer-wrapper .footer-links a{margin-bottom:.125rem;margin-top:.125rem}}.legal-outer{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);border-radius:.5rem;margin-bottom:8rem;margin-left:auto;margin-right:auto;margin-top:100px;max-width:832px;padding:2rem;width:100%}.legal-outer .page-header{font-size:3rem;font-weight:700;line-height:1;padding-bottom:2rem}.legal-outer h2{font-size:1.5rem;font-weight:700;line-height:2rem;padding-bottom:1rem;padding-top:1rem;text-decoration:underline}.legal-outer h3{font-weight:700;padding-bottom:.5rem}.legal-outer ol,.legal-outer ul{padding-left:2rem}.legal-outer ol li,.legal-outer ul li{list-style:disc;padding-bottom:.5rem}.legal-outer ol li{list-style:decimal;list-style-type:decimal}.legal-outer p{padding-bottom:.75rem}.legal-outer li a,.legal-outer p a{color:#18caf9;text-decoration:underline} +.main{display:flex;flex-direction:column;min-height:100vh;overflow-x:hidden;width:100%}.shadow-main{background:#ffffff26;box-shadow:0 2.8px 2.3px #ffffff04,0 6.7px 5.5px #ffffff06,0 12.5px 10.4px #ffffff07,0 22.3px 18.5px #ffffff08,0 41.8px 34.7px #ffffff09,0 100px 83px #ffffff0d}body{--text:#f5f6f1;--bg:#100c09;background:#100c09;background:#100c09 url(./bg-noise.X4MxhxlM.png);background-repeat:repeat;min-height:100vh;overflow-x:hidden}::-moz-selection{background:var(--main);color:var(--text)}::selection{background:var(--main);color:var(--text)}.navbar{left:0;pointer-events:none;position:fixed;top:0;width:100%;z-index:1000}.navbar .nav-main{margin-left:auto;margin-right:auto;max-width:1232px;padding:1rem;width:100%}.navbar .nav-main,.navbar .nav-main .nav-logo{align-items:center;display:flex;flex-direction:row}.navbar .nav-main .nav-logo{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:.5rem;font-family:Inter Tight,sans-serif;font-size:1.5rem;font-weight:900;line-height:2rem;padding:.5rem 1rem;pointer-events:auto}.navbar .nav-main .nav-logo img{height:28px;width:28px}.navbar .nav-main .nav-logo span{padding-left:.5rem}.navbar .nav-main .nav-links{display:flex;flex-direction:row;margin-left:auto}.navbar .nav-main .nav-links .link{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:.5rem;margin-right:.5rem;padding:.5rem;pointer-events:auto;-webkit-user-select:initial;-moz-user-select:initial;user-select:auto}.navbar .nav-main .nav-links .link:hover{text-decoration:underline}.navbar .nav-main .link-cta{display:none}.navbar .nav-main .nav-cta{background:var(--bg);border:2px solid #18caf9;border-radius:.5rem;color:#18caf9;font-weight:500;padding:.5rem 1rem;pointer-events:auto}.navbar .menu{border:2px solid var(--text);border-radius:.5rem;color:var(--text);display:none;padding:.75rem;pointer-events:auto}.navbar .menu svg{fill:var(--text);color:var(--text)}@media (max-width:768px){.navbar .nav-main .nav-logo{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.navbar .nav-main .nav-links{display:none}.navbar .nav-main .display-nav-links{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#fff9;border-radius:.5rem;color:var(--bg);display:flex;flex-direction:column;left:16px;position:fixed;text-align:center;top:80px;width:90%;width:calc(100% - 32px)}.navbar .nav-main .display-nav-links .link{-webkit-backdrop-filter:none;backdrop-filter:none}.navbar .nav-cta{margin-left:auto;margin-right:1rem}.navbar .menu{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);display:initial}.navbar .menu svg{color:var(--text)}}@media (max-width:400px){.navbar .nav-cta{display:none}.navbar .menu{margin-left:auto}.navbar .nav-links .link-cta{display:initial}}.page-footer{background:var(--bg);margin-top:auto;padding-bottom:2rem;padding-top:2rem}.page-footer .footer-wrapper{color:#ccc;display:flex;flex-direction:column}.page-footer .footer-wrapper .footer-sections{display:flex;flex-direction:row;justify-content:space-around}.page-footer .footer-wrapper .footer-end{display:flex;flex-direction:row;justify-content:center;padding-top:.5rem}.page-footer .footer-wrapper .footer-section-title{font-weight:700}.page-footer .footer-wrapper .footer-links{display:flex;flex-direction:column;padding-bottom:1rem}.page-footer .footer-wrapper .footer-links .link-wrapper{align-items:center;display:flex;flex-direction:row}.page-footer .footer-wrapper .footer-links .link-wrapper .link-icon{padding-right:.375rem}.page-footer .footer-wrapper .footer-links .link-wrapper .link-icon svg{height:18px;width:18px}.page-footer .footer-wrapper .footer-social-links{display:flex;flex-direction:row;padding-bottom:1rem;padding-top:.25rem}.page-footer .footer-wrapper .footer-social-links a{margin-right:.75rem}.page-footer .footer-wrapper .footer-social-links a:last-child{margin-right:0}.page-footer .footer-wrapper .copy{align-items:center;display:flex;flex-direction:row}.page-footer .footer-wrapper .copy img{display:inline;margin-right:.5rem;max-height:30px}.page-footer .footer-wrapper .flag-outer{align-items:center;display:flex;flex-direction:row;justify-content:center;padding-left:1rem}.page-footer .footer-wrapper .flag-outer img{max-height:30px}.page-footer .footer-wrapper .flag-outer span{padding-left:.5rem;padding-right:1rem}.page-footer .footer-wrapper .links{margin-left:auto}.page-footer .footer-wrapper .links a{padding-left:.5rem;padding-right:.5rem}@media (max-width:780px){.page-footer .footer-wrapper .copy{margin-left:auto;margin-right:auto;padding-top:1rem}.page-footer .footer-wrapper .flag-outer{margin-bottom:.5rem;margin-top:.5rem}.page-footer .footer-wrapper .links{display:flex;flex-direction:column;margin-left:auto;margin-right:auto}.page-footer .footer-wrapper .links a{margin-bottom:.25rem;margin-top:.25rem;padding-bottom:.25rem;padding-top:.25rem;text-align:center}}@media (max-width:700px){.page-footer .footer-wrapper .footer-sections{align-items:center;display:flex;flex-direction:column}.page-footer .footer-wrapper .footer-links .link-wrapper,.page-footer .footer-wrapper .footer-links a{margin-bottom:.125rem;margin-top:.125rem}}.legal-outer{background:#0006;border-radius:.5rem;margin-bottom:8rem;margin-left:auto;margin-right:auto;margin-top:100px;max-width:832px;padding:2rem;width:100%}.legal-outer .page-header{font-size:3rem;font-weight:700;line-height:1;padding-bottom:2rem}.legal-outer h2{font-size:1.5rem;font-weight:700;line-height:2rem;padding-bottom:1rem;padding-top:1rem;text-decoration:underline}.legal-outer h3{font-weight:700;padding-bottom:.5rem}.legal-outer ol,.legal-outer ul{padding-left:2rem}.legal-outer ol li,.legal-outer ul li{list-style:disc;padding-bottom:.5rem}.legal-outer ol li{list-style:decimal;list-style-type:decimal}.legal-outer p{padding-bottom:.75rem}.legal-outer li a,.legal-outer p a{color:#18caf9;text-decoration:underline} diff --git a/_nuxt/DedQPodZ.js b/_nuxt/dzMqTbw3.js similarity index 89% rename from _nuxt/DedQPodZ.js rename to _nuxt/dzMqTbw3.js index 2441823..3852490 100644 --- a/_nuxt/DedQPodZ.js +++ b/_nuxt/dzMqTbw3.js @@ -1 +1 @@ -import{f as r,k as n,o as c,c as h,i as o,O as u,I as l,u as d,P as f}from"./Bu7SZk0z.js";const g=["src","alt","width","height"],p=r({__name:"ProseImg",props:{src:{type:String,default:""},alt:{type:String,default:""},width:{type:[String,Number],default:void 0},height:{type:[String,Number],default:void 0}},setup(e){const t=e,a=n(()=>{var i;if((i=t.src)!=null&&i.startsWith("/")&&!t.src.startsWith("//")){const s=u(l(d().app.baseURL));if(s!=="/"&&!t.src.startsWith(s))return f(s,t.src)}return t.src});return(i,s)=>(c(),h("img",{src:o(a),alt:e.alt,width:e.width,height:e.height},null,8,g))}});export{p as default}; +import{f as r,k as n,o as c,c as h,i as o,O as u,I as l,u as d,P as f}from"./BlS8upJP.js";const g=["src","alt","width","height"],p=r({__name:"ProseImg",props:{src:{type:String,default:""},alt:{type:String,default:""},width:{type:[String,Number],default:void 0},height:{type:[String,Number],default:void 0}},setup(e){const t=e,a=n(()=>{var i;if((i=t.src)!=null&&i.startsWith("/")&&!t.src.startsWith("//")){const s=u(l(d().app.baseURL));if(s!=="/"&&!t.src.startsWith(s))return f(s,t.src)}return t.src});return(i,s)=>(c(),h("img",{src:o(a),alt:e.alt,width:e.width,height:e.height},null,8,g))}});export{p as default}; diff --git a/_nuxt/entry.Ck87SGOn.css b/_nuxt/entry.DiT2Mvoi.css similarity index 87% rename from _nuxt/entry.Ck87SGOn.css rename to _nuxt/entry.DiT2Mvoi.css index 63705e7..97f55e5 100644 --- a/_nuxt/entry.Ck87SGOn.css +++ b/_nuxt/entry.DiT2Mvoi.css @@ -1 +1 @@ -.blog-outer{margin-left:auto;margin-right:auto;max-width:832px;width:100%}.blog-wrapper{background:#0006;border-radius:.5rem;box-sizing:border-box;color:#f5f5f3;margin:6rem 1rem 4rem;padding:2rem}.blog-wrapper .blog-breadcrumbs{display:flex;flex-direction:row;margin-left:auto;width:100%}.blog-wrapper .blog-breadcrumbs .crumb{color:#a9a8a6;font-size:.875rem;line-height:1.25rem}.blog-wrapper .blog-breadcrumbs .crumb a{text-decoration:underline}.blog-wrapper .blog-breadcrumbs .crumb .sep{padding-left:.5rem;padding-right:.5rem}.blog-wrapper div h2{font-size:1.5rem;font-weight:700;line-height:2rem;padding-bottom:.5rem;padding-top:.75rem}.blog-wrapper div h2:first-child{padding-top:0}.blog-wrapper div p{font-size:1.125rem;font-weight:300;line-height:2rem;padding-bottom:1rem}.blog-wrapper img{border-radius:.5rem}.blog-wrapper h3{font-size:1.125rem;font-weight:700;line-height:1.75rem;padding-bottom:.75rem;padding-top:.5rem}.blog-wrapper h4{font-weight:700;margin-bottom:.25rem}.blog-wrapper p a{color:#18caf9;text-decoration:underline}.blog-wrapper ol,.blog-wrapper ul{padding-bottom:1rem;padding-left:2rem}.blog-wrapper ol li,.blog-wrapper ul li{font-size:1.125rem;line-height:2rem}.blog-wrapper ol li,.blog-wrapper ul li{list-style-type:disc}.blog-wrapper .testimonial-outer{padding-top:2rem}.blog-wrapper .testimonial-outer .testimonial-wrapper .left{margin-right:0}.blog-wrapper .testimonial-outer .testimonial-wrapper .image-wrapper{max-height:172px;max-width:172px}.blog-wrapper code{color:#79b8ff}.blog-wrapper .code-outer{margin-bottom:1.5rem;margin-top:.5rem}.blog-wrapper .blog-header{padding-bottom:2rem;padding-top:.5rem}.blog-wrapper .blog-header h1{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;line-height:1}.blog-wrapper .blog-header h3{font-size:1.875rem;font-weight:300;line-height:2.25rem;line-height:1.3;padding-top:1rem}.blog-wrapper .blog-header h2.subheader{font-size:1.125rem;font-weight:400;line-height:1.75rem;padding-top:1rem}.blog-wrapper .blog-header .blog-created-date{font-size:1.125rem;line-height:1.75rem;padding-top:.5rem}@media (max-width:768px){.blog-wrapper{margin-top:6rem;padding:1rem}.blog-wrapper .blog-header{padding-bottom:1rem}.blog-wrapper div h2{padding-top:.5rem}.blog-wrapper .testimonial-outer{padding-top:0}}@media (max-width:600px){.blog-wrapper .blog-header h1{font-size:2.25rem;line-height:2.5rem}}.blog-post-wrapper{padding-bottom:2rem}.blog-post-wrapper:last-child{padding-bottom:0}.blog-post-wrapper .date-wrapper{border:1px solid #f5f3f1;border-radius:.5rem;display:flex;flex-direction:column;float:left;font-size:.875rem;height:-moz-fit-content;height:fit-content;line-height:1.25rem;margin-right:1rem;min-width:60px;text-align:center}.blog-post-wrapper .date-wrapper .month{border-bottom:1px solid #f5f3f1}.blog-post-wrapper .date-wrapper .day{border-bottom:1px solid #f5f3f1;font-size:2.25rem;font-weight:700;line-height:2.5rem}.blog-post-wrapper .description-wrapper h3{font-size:1.25rem;font-weight:700;line-height:1.75rem;padding-bottom:0;padding-top:0;text-decoration:underline}.blog-post-wrapper .description-wrapper p{padding-bottom:0}.blog-post-wrapper .read{color:#18caf9;display:block;margin-left:auto;text-decoration:underline;width:-moz-fit-content;width:fit-content}:root{--bg:#f5f3f1;--text:#100c09;--main:#18caf9}#__nuxt,body{overflow-x:hidden}body{background:#f5f3f1;background:var(--bg);color:#100c09;color:var(--text);font-family:DM Sans,sans-serif} +.blog-outer{margin-left:auto;margin-right:auto;max-width:832px;width:100%}.blog-wrapper{background:#0006;border-radius:.5rem;box-sizing:border-box;color:#f5f6f1;margin:6rem 1rem 4rem;padding:2rem}.blog-wrapper .blog-breadcrumbs{display:flex;flex-direction:row;margin-left:auto;width:100%}.blog-wrapper .blog-breadcrumbs .crumb{color:#a9a8a6;font-size:.875rem;line-height:1.25rem}.blog-wrapper .blog-breadcrumbs .crumb a{text-decoration:underline}.blog-wrapper .blog-breadcrumbs .crumb .sep{padding-left:.5rem;padding-right:.5rem}.blog-wrapper div h2{font-size:1.5rem;font-weight:700;line-height:2rem;padding-bottom:.5rem;padding-top:.75rem}.blog-wrapper div h2:first-child{padding-top:0}.blog-wrapper div p{font-size:1.125rem;font-weight:300;line-height:2rem;padding-bottom:1rem}.blog-wrapper img{border-radius:.5rem}.blog-wrapper h3{font-size:1.125rem;font-weight:700;line-height:1.75rem;padding-bottom:.75rem;padding-top:.5rem}.blog-wrapper h4{font-weight:700;margin-bottom:.25rem}.blog-wrapper p a{color:#18caf9;text-decoration:underline}.blog-wrapper ol,.blog-wrapper ul{padding-bottom:1rem;padding-left:2rem}.blog-wrapper ol li,.blog-wrapper ul li{font-size:1.125rem;line-height:2rem}.blog-wrapper ol li,.blog-wrapper ul li{list-style-type:disc}.blog-wrapper .testimonial-outer{padding-top:2rem}.blog-wrapper .testimonial-outer .testimonial-wrapper .left{margin-right:0}.blog-wrapper .testimonial-outer .testimonial-wrapper .image-wrapper{max-height:172px;max-width:172px}.blog-wrapper code{color:#79b8ff}.blog-wrapper .code-outer{margin-bottom:1.5rem;margin-top:.5rem}.blog-wrapper .blog-header{padding-bottom:2rem;padding-top:.5rem}.blog-wrapper .blog-header h1{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;line-height:1}.blog-wrapper .blog-header h3{font-size:1.875rem;font-weight:300;line-height:2.25rem;line-height:1.3;padding-top:1rem}.blog-wrapper .blog-header h2.subheader{font-size:1.125rem;font-weight:400;line-height:1.75rem;padding-top:1rem}.blog-wrapper .blog-header .blog-created-date{font-size:1.125rem;line-height:1.75rem;padding-top:.5rem}@media (max-width:768px){.blog-wrapper{margin-top:6rem;padding:1rem}.blog-wrapper .blog-header{padding-bottom:1rem}.blog-wrapper div h2{padding-top:.5rem}.blog-wrapper .testimonial-outer{padding-top:0}}@media (max-width:600px){.blog-wrapper .blog-header h1{font-size:2.25rem;line-height:2.5rem}}.blog-post-wrapper{padding-bottom:2rem}.blog-post-wrapper:last-child{padding-bottom:0}.blog-post-wrapper .date-wrapper{border:1px solid #f5f6f1;border-radius:.5rem;display:flex;flex-direction:column;float:left;font-size:.875rem;height:-moz-fit-content;height:fit-content;line-height:1.25rem;margin-right:1rem;min-width:60px;text-align:center}.blog-post-wrapper .date-wrapper .month{border-bottom:1px solid #f5f6f1}.blog-post-wrapper .date-wrapper .day{border-bottom:1px solid #f5f6f1;font-size:2.25rem;font-weight:700;line-height:2.5rem}.blog-post-wrapper .description-wrapper h3{font-size:1.25rem;font-weight:700;line-height:1.75rem;padding-bottom:0;padding-top:0;text-decoration:underline}.blog-post-wrapper .description-wrapper p{padding-bottom:0}.blog-post-wrapper .read{color:#18caf9;display:block;margin-left:auto;text-decoration:underline;width:-moz-fit-content;width:fit-content}:root{--text:#f5f6f1;--bg:#100c09;--main:#18caf9}#__nuxt,body{overflow-x:hidden}body{background:#100c09;background:var(--bg);color:#f5f6f1;color:var(--text);font-family:DM Sans,sans-serif} diff --git a/_nuxt/DzjWGKN4.js b/_nuxt/lFVxmSVb.js similarity index 85% rename from _nuxt/DzjWGKN4.js rename to _nuxt/lFVxmSVb.js index 9788004..e498922 100644 --- a/_nuxt/DzjWGKN4.js +++ b/_nuxt/lFVxmSVb.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./Bu7SZk0z.js";const l=["id"],p=["href"],k=d({__name:"ProseH2",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h2)});return(e,m)=>(s(),n("h2",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH2",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h2)});return(e,m)=>(s(),n("h2",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/TPisoLyH.js b/_nuxt/mB4jvhnn.js similarity index 64% rename from _nuxt/TPisoLyH.js rename to _nuxt/mB4jvhnn.js index 8200ad6..d5027b0 100644 --- a/_nuxt/TPisoLyH.js +++ b/_nuxt/mB4jvhnn.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./Bu7SZk0z.js";const c={};function n(e,a){return r(),t("td",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return r(),t("td",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/B5qANkaG.js b/_nuxt/maW11VfC.js similarity index 83% rename from _nuxt/B5qANkaG.js rename to _nuxt/maW11VfC.js index 34a7384..e3942e2 100644 --- a/_nuxt/B5qANkaG.js +++ b/_nuxt/maW11VfC.js @@ -1 +1 @@ -import{ad as f,S as u,ae as o,E as d,a6 as v,af as l,ag as i,z as h,ah as m}from"./Bu7SZk0z.js";function U(t,a={}){const e=a.head||f();if(e)return e.ssr?e.push(t,a):p(e,t,a)}function p(t,a,e={}){const s=u(!1),n=u({});o(()=>{n.value=s.value?{}:m(a)});const r=t.push(n.value,e);return d(n,c=>{r.patch(c)}),h()&&(v(()=>{r.dispose()}),l(()=>{s.value=!0}),i(()=>{s.value=!1})),r}export{U as u}; +import{ad as f,S as u,ae as o,E as d,a6 as v,af as l,ag as i,z as h,ah as m}from"./BlS8upJP.js";function U(t,a={}){const e=a.head||f();if(e)return e.ssr?e.push(t,a):p(e,t,a)}function p(t,a,e={}){const s=u(!1),n=u({});o(()=>{n.value=s.value?{}:m(a)});const r=t.push(n.value,e);return d(n,c=>{r.patch(c)}),h()&&(v(()=>{r.dispose()}),l(()=>{s.value=!0}),i(()=>{s.value=!1})),r}export{U as u}; diff --git a/_nuxt/open-graph-banner.Cso2_SHa.jpg b/_nuxt/open-graph-banner.Cso2_SHa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..431eae87946e11e214dfc64fefaa14cc2549ee4d GIT binary patch literal 63380 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 {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" '@playwright/test'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" main"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://qacomet.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture."}]},{"type":"element","tag":"h3","props":{"id":"merging-playwright-and-playwright-core"},"children":[{"type":"text","value":"Merging "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Internally, when you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":", there is an underlying call to import from two merged packages, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":". This merge happens in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":", since "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is just an outward facinging export of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"require('playwright/test')"}]},{"type":"text","value":", an alias for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":". This is where the test execution API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" are combined with the browser automation API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will focus on the import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", since it provides the core browser automation and is the code every other client library wraps. Looking at its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" file"}]},{"type":"element","tag":"pre","props":{"className":"language-js shiki shiki-themes github-dark","code":"module.exports = require(\"./lib/inprocess\");\n","filename":"packages/playwright-core/index.js","language":"js","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"module"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"exports"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"./lib/inprocess\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"gives an export from its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib/inprocess.ts"}]},{"type":"text","value":" file (note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" directory is compiled to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib"}]},{"type":"text","value":" directory after playwright runs its build script, and is what's found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"node_modules/playwright-core"}]},{"type":"text","value":", hence the require imports from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./lib/"}]},{"type":"text","value":" and not "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./src/"}]},{"type":"text","value":"). The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inprocess.ts"}]},{"type":"text","value":" file just imports from the adjacent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" and executes the function from there, called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include the source below in its own section but note "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" dynamically intiailizes the interface between the client library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":", and the server library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-python","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-python"}]},{"type":"text","value":" source code, you will find the same design patterns and classes defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":"'s "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"h3","props":{"id":"rapid-overview-of-the-client-and-server-libraries"},"children":[{"type":"text","value":"Rapid overview of the client and server libraries"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" the main functionality can be found in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" folders. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" folder contains classes, many of which are subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class. This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class is a client-side representation of a corresponding server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" class in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server/dispatchers"}]},{"type":"text","value":" folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":", containing the client side APIs (such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":"), there is a corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":". When we call "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":" a message is send over the unique client "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" instance to the unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" instance, which calls the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works."}]},{"type":"element","tag":"h2","props":{"id":"playwrights-core-api-factory-createinprocessplaywright"},"children":[{"type":"text","value":"Playwright's core API factory, createInProcessPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This file, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":", contains only one function called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include it here as a reference:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createInProcessPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Dispatch synchronously at first.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"webkit\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI._android._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" AndroidServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Switch to async dispatch after we got Playwright object.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"toImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"x"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" x\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(x._guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")._toImpl "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection.toImpl;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you scan through the script and look at the return value, you'll see Playwright is returning the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" instance "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":", which is defined somewhere within the client library "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core/src/client/"}]},{"type":"text","value":" (which we find from our type hints). So when we write a script using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from \"playwright-core\";\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"really we are making an import of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":" object and accessing its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" property, so our script is secretly"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Tracing where this object is instantiated, we find the call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is not very descriptive. If you try looking in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class definition, you won't get very far either, you'll just see"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export class Connection extends EventEmitter {\n readonly _objects = new Map();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _objects"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Map"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is even more opaque. From this all we know is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class keeps an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" map which at some point contains an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":" will give us a clear picture of how this library is wrapped together."}]},{"type":"element","tag":"h2","props":{"id":"cross-communication-between-client-and-server"},"children":[{"type":"text","value":"Cross communication between client and server"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you look through the script's imports, anything with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" in its name, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":", come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" directroy. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function creates an instance of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similarly, the imports for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" directory. Looking through the first lines of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":", there is an instantiation of the server "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class and instantiation of objects for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ClientConnection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The next lines of code are the bridge between the internal client and server libraries"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"given by setting the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" properties for each of these objects. Notice each "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" calls the other's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" method; i.e., "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" through "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" and vice versa. This gives us the hint somehow "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" will be called somewhere in the codebase."}]},{"type":"element","tag":"h3","props":{"id":"server-side-createplaywright"},"children":[{"type":"text","value":"Server-side createPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before we continue down the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", let's go over what the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function actually does. It is a simple function call which instantiates the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":". Below is a simplified version of it"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n","filename":"packages/playwright-core/server/playwright.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./chromium/chromium\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Firefox } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./firefox/firefox\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Selectors } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./selectors\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { WebKit } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./webkit/webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { createInstrumentation, SdkObject } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./instrumentation\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" SdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" debugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { attribution: {}, instrumentation: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"createInstrumentation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"() } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".options "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" options;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".chromium "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".firefox "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".webkit "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".selectors "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".debugController "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/chromium/"}]},{"type":"text","value":" you will see all the functionality for automating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" browser."}]},{"type":"element","tag":"h3","props":{"id":"rootdispatcher-and-server-side-playwright"},"children":[{"type":"text","value":"RootDispatcher and server-side Playwright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuing down "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", we see there's the construction of a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RootDispatcher"}]},{"type":"text","value":" instance, and a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":" instance."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object is referenced throughout the dispatcher classes, and acts as a wrapper around the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" object instantiated above, so that each of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object. This wrapping functionality will become clearer when we dive into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor, where it passes the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" to all of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's a simplified version of what's happening in the constructor for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Rootscope"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","filename":"playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(connection, { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Root\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ParentScopeType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" object"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" channels"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"InitializerTraits"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent._connection;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._guid "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object.guid;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"registerDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" guid,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor we see the connection always comes from either the inherited parent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", or from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" passed into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"parent"}]},{"type":"text","value":" parameter. This, coupled with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" having the name "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"root"}]},{"type":"text","value":", gives us the hint that every dispatcher in the server library will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" instance (from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":"). Furthermore, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" will register every instance of a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", hinting that it will communicate with each of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" objects. These points will become more clear after looking at the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor."}]},{"type":"element","tag":"h4","props":{"id":"playwrightdispatcher-and-its-constructor"},"children":[{"type":"text","value":"PlaywrightDispatcher and its constructor"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's look closer at a slightly simplified version of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","filename":"packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Playwright } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core/src/server/playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"scope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.chromium),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.firefox),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.webkit),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notice the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"super"}]},{"type":"text","value":" call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" passed into it as the first parameter. Every call to the server will run through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":", which then can be traced through calls in each of the dispatcher classes. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserTypeDispatcher"}]},{"type":"text","value":" will launch a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserDispatcher"}]},{"type":"text","value":", which is responsible for creating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserContextDispatcher"}]},{"type":"text","value":", which can create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" defined in the factory method with confidence!"}]},{"type":"element","tag":"h3","props":{"id":"tying-back-to-the-onmessage-communication"},"children":[{"type":"text","value":"Tying back to the onmessage communication"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnect.onmessage"}]},{"type":"text","value":" functions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" function is called from two main methods. These are "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":". The first, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":", is called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":", so the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcher.onmessage"}]},{"type":"text","value":" call in that case acts as a response callback. The second, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", is called from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendEvent"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendAdopt"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendDestroy"}]},{"type":"text","value":" methods defined within the dispatcher. Calls to these functions are spread throughout the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses which call these functions from their internal "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_connection"}]},{"type":"text","value":" variable. These will tell the client to construct, update, and destroy, their corresponding client side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" objects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Separately on the client-side, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":" is called from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendMessageToServer"}]},{"type":"text","value":" whenever you use a client-side API. This sends a message over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":", which finds the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", as mentioned before."}]},{"type":"element","tag":"h3","props":{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners"},"children":[{"type":"text","value":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function is special because it is only called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" implementation, internally it calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":" with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" parameter:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","filename":"packages/playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" SdkObject) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(initializer, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplToWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"), binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._isLocal "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'toBase64'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent._guid, type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { type, initializer, guid }, sdkObject);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so if we search through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class on the client side, sure enough in its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" function it has a call to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" for the associated method "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":". This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" is what initializes the client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, and is the reason why we call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":". For the Playwright create message, the message looks something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" method"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" params"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@024d5a494527ece580841844a9a933a6'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@fae8f48651c02682ad3b276f0a046d63'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'android@832582c466c24c6933d3a5587059e1be'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'electron@3829a7608477101154e15c1e25bca9ca'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note before this "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" message is passed to create the Playwright API on the client side, there were "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" messages for each of the device types, meaning there already exists a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserType"}]},{"type":"text","value":" for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"firefox"}]},{"type":"text","value":", etc. before the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" message for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" is sent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class, which is a concept for a later section. For now, let's trace what happens in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"type: 'Playwright'"}]},{"type":"text","value":" message."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatchConnection.onmessage"}]},{"type":"text","value":", which calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" function, which then calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function with the following parameters"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// parentGuid - corresponds to Root, the root ChannelOwner\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// type\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// guid\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // initializer\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@024d5a494527ece580841844a9a933a6\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@fae8f48651c02682ad3b276f0a046d63\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" android: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"android@832582c466c24c6933d3a5587059e1be\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" electron: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"electron@3829a7608477101154e15c1e25bca9ca\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function there is a transformation of the data and then a large "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"switch-case"}]},{"type":"text","value":" function instantiating the corresponding client class."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid: string, type: string, guid: string, initializer: any) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// here the parentGuid is ''\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"`Cannot find parent object ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parentGuid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"} to create ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" let"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" ''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplFromWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._rawBuffers "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'fromBase64'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" switch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (type) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" case"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":":\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent, type, guid, initializer);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" break"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parameter "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tChannelImpl: _tChannelImplFromWire"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"validator"}]},{"type":"text","value":" function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class. If you look at the type definition in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable is a map returning one of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses. So in the result above for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"case: 'Playwright'"}]},{"type":"text","value":", it returns a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, which is a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":", defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"launching-the-browser-instance"},"children":[{"type":"text","value":"Launching the browser instance"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The final bit of code in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" to consider is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_serverLauncher"}]},{"type":"text","value":" variables being set in each of the drivers. This is written as"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" class is defined next to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" file in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browserServerLauncherImpl.ts"}]},{"type":"text","value":". The main functionality in this class lies in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"launchServer"}]},{"type":"text","value":" function, and is only called when you use the"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launchServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(serverOptions);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'playwright-core'"}]},{"type":"text","value":" library, something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({ headless: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" page."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://playwright.dev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ... automate page interactions here\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"})();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so for now we skip giving an overview of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" code and defer it to a later post."}]},{"type":"element","tag":"h2","props":{"id":"recap"},"children":[{"type":"text","value":"Recap"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Whew! That was quite the journey, so let's recap the main points we covered in this post:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is a wrapper around the test runner package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" and the browser automation package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Importing from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" is a dynamically generated process under the hood, which is done in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/src/inProcessFactory.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" there are two main libraries, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" libraries."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This separation exists so other programming languages can easily build a client library which communicates with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The client-side API and server-side API communicate with each other over a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" object and a server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" object. These pass messages with one another through their runtime-defined "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" callback."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is responsible for constructing client side API's, the API methods you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is responsible for keeping track of the dispatcher objects on the server side."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The instances of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is wrapped by "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses, which all point to the same instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":". Similarly, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is wrapped by a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" which is responsible for a part of the automated browser."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Both the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes keep track of the same object on each side of the client/server side of the divide with a unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GUID"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once you have parsed the functionality of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"peering-into-playwrights-import-process","depth":2,"text":"Peering into Playwright's import process","children":[{"id":"merging-playwright-and-playwright-core","depth":3,"text":"Merging playwright and playwright-core"},{"id":"rapid-overview-of-the-client-and-server-libraries","depth":3,"text":"Rapid overview of the client and server libraries"}]},{"id":"playwrights-core-api-factory-createinprocessplaywright","depth":2,"text":"Playwright's core API factory, createInProcessPlaywright"},{"id":"cross-communication-between-client-and-server","depth":2,"text":"Cross communication between client and server","children":[{"id":"server-side-createplaywright","depth":3,"text":"Server-side createPlaywright"},{"id":"rootdispatcher-and-server-side-playwright","depth":3,"text":"RootDispatcher and server-side Playwright"},{"id":"tying-back-to-the-onmessage-communication","depth":3,"text":"Tying back to the onmessage communication"},{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners","depth":3,"text":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"id":"launching-the-browser-instance","depth":2,"text":"Launching the browser instance"},{"id":"recap","depth":2,"text":"Recap"}]}},"_type":"markdown","_id":"content:playwright:how-playwright-initializes.md","_source":"content","_file":"playwright/how-playwright-initializes.md","_extension":"md"},{"_path":"/privacy-policy","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Privacy Policy","description":"Effective Date: This Privacy Policy is effective as of February 16, 2024.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Effective Date"}]},{"type":"text","value":": "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"This Privacy Policy is effective as of February 16, 2024."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this Privacy Policy, unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"QAComet"}]},{"type":"text","value":"\" refers to the website operated by QAComet LLC accessible at QAComet.com"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Personal Information"}]},{"type":"text","value":"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Non-Personal Information"}]},{"type":"text","value":"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Cookies"}]},{"type":"text","value":"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Google Analytics"}]},{"type":"text","value":"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"User"}]},{"type":"text","value":"\" refers to any individual who accesses or uses the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein."}]},{"type":"element","tag":"h2","props":{"id":"_1-information-collection"},"children":[{"type":"text","value":"1. INFORMATION COLLECTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We collect two types of information from users: personal information and non-personal information."}]},{"type":"element","tag":"h3","props":{"id":"personal-information"},"children":[{"type":"text","value":"Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website."}]}]},{"type":"element","tag":"h3","props":{"id":"non-personal-information"},"children":[{"type":"text","value":"Non-Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information."}]}]},{"type":"element","tag":"h3","props":{"id":"google-analytics"},"children":[{"type":"text","value":"Google Analytics:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-information"},"children":[{"type":"text","value":"2. USE OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users for the following purposes:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies."}]},{"type":"element","tag":"h2","props":{"id":"_3-sharing-of-information"},"children":[{"type":"text","value":"3. SHARING OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We may share both personal and non-personal information collected from users in the following circumstances:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone."}]}]},{"type":"element","tag":"h2","props":{"id":"_4-google-analytics"},"children":[{"type":"text","value":"4. GOOGLE ANALYTICS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: "},{"type":"element","tag":"a","props":{"href":"https://policies.google.com/privacy?hl=en-US","rel":["nofollow"]},"children":[{"type":"text","value":"Google Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website."}]},{"type":"element","tag":"h2","props":{"id":"_5-data-security"},"children":[{"type":"text","value":"5. DATA SECURITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels."}]},{"type":"element","tag":"h2","props":{"id":"_6-user-controls"},"children":[{"type":"text","value":"6. USER CONTROLS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":". This browser add-on allows users to prevent their data from being collected and used by Google Analytics."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights."}]},{"type":"element","tag":"h2","props":{"id":"_7-changes-to-the-privacy-policy"},"children":[{"type":"text","value":"7. CHANGES TO THE PRIVACY POLICY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_8-contact-information"},"children":[{"type":"text","value":"8. CONTACT INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS:"},{"id":"_1-information-collection","depth":2,"text":"1. INFORMATION COLLECTION:","children":[{"id":"personal-information","depth":3,"text":"Personal Information:"},{"id":"non-personal-information","depth":3,"text":"Non-Personal Information:"},{"id":"google-analytics","depth":3,"text":"Google Analytics:"}]},{"id":"_2-use-of-information","depth":2,"text":"2. USE OF INFORMATION:"},{"id":"_3-sharing-of-information","depth":2,"text":"3. SHARING OF INFORMATION:"},{"id":"_4-google-analytics","depth":2,"text":"4. GOOGLE ANALYTICS:"},{"id":"_5-data-security","depth":2,"text":"5. DATA SECURITY:"},{"id":"_6-user-controls","depth":2,"text":"6. USER CONTROLS:"},{"id":"_7-changes-to-the-privacy-policy","depth":2,"text":"7. CHANGES TO THE PRIVACY POLICY:"},{"id":"_8-contact-information","depth":2,"text":"8. CONTACT INFORMATION:"}]}},"_type":"markdown","_id":"content:privacy-policy.md","_source":"content","_file":"privacy-policy.md","_extension":"md"},{"_path":"/terms-and-conditions","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms And Conditions","description":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\")."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Website"}]},{"type":"text","value":"\" refers to the QAComet website, accessible at "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/","rel":["nofollow"]},"children":[{"type":"text","value":"QAComet.com"}]},{"type":"text","value":", including all associated web pages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":"\" refers to any products, features, or functionalities offered on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Content"}]},{"type":"text","value":"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Affiliates"}]},{"type":"text","value":"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Terms"}]},{"type":"text","value":"\" refers to these General Terms and Conditions governing the use of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Modification"}]},{"type":"text","value":"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion."}]},{"type":"element","tag":"h2","props":{"id":"_1-acceptance-of-terms"},"children":[{"type":"text","value":"1. ACCEPTANCE OF TERMS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-website"},"children":[{"type":"text","value":"2. USE OF WEBSITE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities"}]},{"type":"element","tag":"h2","props":{"id":"_3-intellectual-property"},"children":[{"type":"text","value":"3. INTELLECTUAL PROPERTY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties."}]},{"type":"element","tag":"h2","props":{"id":"_4-privacy-policy"},"children":[{"type":"text","value":"4. PRIVACY POLICY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/privacy-policy","rel":["nofollow"]},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"_5-disclaimer-of-warranties"},"children":[{"type":"text","value":"5. DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_6-limitation-of-liability"},"children":[{"type":"text","value":"6. LIMITATION OF LIABILITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_7-modification-and-termination"},"children":[{"type":"text","value":"7. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it."}]},{"type":"element","tag":"h2","props":{"id":"_8-governing-law-and-dispute-resolution"},"children":[{"type":"text","value":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The language of arbitration and all related proceedings shall be English."}]},{"type":"element","tag":"h2","props":{"id":"_9-miscellaneous"},"children":[{"type":"text","value":"9. MISCELLANEOUS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Contact Information: If you have any questions about these Terms or the QAComet website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS"},{"id":"_1-acceptance-of-terms","depth":2,"text":"1. ACCEPTANCE OF TERMS:"},{"id":"_2-use-of-website","depth":2,"text":"2. USE OF WEBSITE"},{"id":"_3-intellectual-property","depth":2,"text":"3. INTELLECTUAL PROPERTY:"},{"id":"_4-privacy-policy","depth":2,"text":"4. PRIVACY POLICY"},{"id":"_5-disclaimer-of-warranties","depth":2,"text":"5. DISCLAIMER OF WARRANTIES:"},{"id":"_6-limitation-of-liability","depth":2,"text":"6. LIMITATION OF LIABILITY:"},{"id":"_7-modification-and-termination","depth":2,"text":"7. MODIFICATION AND TERMINATION:"},{"id":"_8-governing-law-and-dispute-resolution","depth":2,"text":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"},{"id":"_9-miscellaneous","depth":2,"text":"9. MISCELLANEOUS:"}]}},"_type":"markdown","_id":"content:terms-and-conditions.md","_source":"content","_file":"terms-and-conditions.md","_extension":"md"},{"_path":"/terms-of-service","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms Of Service","description":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"Definitions:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client"}]},{"type":"text","value":": Refers to individuals or entities who utilize QAComet's QA/Testing services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Company"}]},{"type":"text","value":": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Materials"}]},{"type":"text","value":": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Ownership"}]},{"type":"text","value":": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client-Specific Utilities"}]},{"type":"text","value":": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Design Patterns"}]},{"type":"text","value":": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Trial Period"}]},{"type":"text","value":": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Subscription Fee"}]},{"type":"text","value":": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Intellectual Property Rights"}]},{"type":"text","value":": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Dispute Resolution"}]},{"type":"text","value":": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms."}]},{"type":"element","tag":"h2","props":{"id":"_2-scope-of-service"},"children":[{"type":"text","value":"2. SCOPE OF SERVICE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_3-account-security"},"children":[{"type":"text","value":"3. ACCOUNT SECURITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet."}]},{"type":"element","tag":"h2","props":{"id":"_4-right-to-refuse-or-cancel-services"},"children":[{"type":"text","value":"4. RIGHT TO REFUSE OR CANCEL SERVICES"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_5-promotional-rights"},"children":[{"type":"text","value":"5. PROMOTIONAL RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials."}]},{"type":"element","tag":"h2","props":{"id":"_6-ownership-of-materials"},"children":[{"type":"text","value":"6. OWNERSHIP OF MATERIALS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials."}]},{"type":"element","tag":"h2","props":{"id":"_7-client-responsibilities"},"children":[{"type":"text","value":"7. CLIENT RESPONSIBILITIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_8-billing-and-payments"},"children":[{"type":"text","value":"8. BILLING AND PAYMENTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client."}]},{"type":"element","tag":"h2","props":{"id":"_9-intellectual-property-rights"},"children":[{"type":"text","value":"9. INTELLECTUAL PROPERTY RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests."}]},{"type":"text","value":"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client."}]},{"type":"element","tag":"h2","props":{"id":"_10-qacomet-pre-existing-ip-materials"},"children":[{"type":"text","value":"10. QACOMET Pre-Existing IP MATERIALS."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement."}]},{"type":"element","tag":"h2","props":{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties"},"children":[{"type":"text","value":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances."}]},{"type":"element","tag":"h2","props":{"id":"_12-confidentiality"},"children":[{"type":"text","value":"12. CONFIDENTIALITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity."}]},{"type":"element","tag":"h2","props":{"id":"_13-dispute-resolution-and-governing-law"},"children":[{"type":"text","value":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts."}]},{"type":"element","tag":"h2","props":{"id":"_14-modification-and-termination"},"children":[{"type":"text","value":"14. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service."}]},{"type":"element","tag":"h2","props":{"id":"_15-severability"},"children":[{"type":"text","value":"15. SEVERABILITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision."}]},{"type":"element","tag":"h2","props":{"id":"_16-contact-us"},"children":[{"type":"text","value":"16. Contact Us:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"Definitions:"},{"id":"_2-scope-of-service","depth":2,"text":"2. SCOPE OF SERVICE"},{"id":"_3-account-security","depth":2,"text":"3. ACCOUNT SECURITY"},{"id":"_4-right-to-refuse-or-cancel-services","depth":2,"text":"4. RIGHT TO REFUSE OR CANCEL SERVICES"},{"id":"_5-promotional-rights","depth":2,"text":"5. PROMOTIONAL RIGHTS:"},{"id":"_6-ownership-of-materials","depth":2,"text":"6. OWNERSHIP OF MATERIALS:"},{"id":"_7-client-responsibilities","depth":2,"text":"7. CLIENT RESPONSIBILITIES:"},{"id":"_8-billing-and-payments","depth":2,"text":"8. BILLING AND PAYMENTS:"},{"id":"_9-intellectual-property-rights","depth":2,"text":"9. INTELLECTUAL PROPERTY RIGHTS:"},{"id":"_10-qacomet-pre-existing-ip-materials","depth":2,"text":"10. QACOMET Pre-Existing IP MATERIALS."},{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties","depth":2,"text":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"},{"id":"_12-confidentiality","depth":2,"text":"12. CONFIDENTIALITY:"},{"id":"_13-dispute-resolution-and-governing-law","depth":2,"text":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"},{"id":"_14-modification-and-termination","depth":2,"text":"14. MODIFICATION AND TERMINATION:"},{"id":"_15-severability","depth":2,"text":"15. SEVERABILITY"},{"id":"_16-contact-us","depth":2,"text":"16. Contact Us:"}]}},"_type":"markdown","_id":"content:terms-of-service.md","_source":"content","_file":"terms-of-service.md","_extension":"md"}],"navigation":[{"title":"Case Studies","_path":"/case-studies","children":[{"title":"Automatisch","_path":"/case-studies/automatisch"}]},{"title":"Playwright","_path":"/playwright","children":[{"title":"Architecture of Playwright","_path":"/playwright/architecture"},{"title":"How importing from Playwright works","_path":"/playwright/how-playwright-initializes"}]},{"title":"Privacy Policy","_path":"/privacy-policy"},{"title":"Terms And Conditions","_path":"/terms-and-conditions"},{"title":"Terms Of Service","_path":"/terms-of-service"}]} \ No newline at end of file +{"generatedAt":1714258642052,"generateTime":7501,"contents":[{"_path":"/case-studies/automatisch","_dir":"case-studies","_draft":false,"_partial":false,"_locale":"","title":"Automatisch","description":"W","subtitle":"Going from the launch pad to the cosmos with E2E testing","breadcrumbs":[{"name":"Case Studies","path":"/case-studies/"},{"name":"Automatisch","path":"/case-studies/automatisch/"}],"link":"/case-studies/automatisch","created":{"string":"February 26, 2024","month":"Feb","day":26,"year":2024},"shortDescription":"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch"},"children":[{"type":"text","value":"Improving Software Quality and Testing Infrastructure for Automatisch"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recently collaborated with an open source no-code automation company called "},{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"automatisch-the-open-source-zapier-alternative"},"children":[{"type":"text","value":"Automatisch: The Open Source Zapier Alternative"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" is a reputable "},{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch","rel":["nofollow"]},"children":[{"type":"text","value":"open source"}]},{"type":"text","value":" software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"proactive-bug-finding-and-reporting"},"children":[{"type":"text","value":"Proactive Bug Finding and Reporting"}]},{"type":"element","tag":"h3","props":{"id":"our-approach-to-reporting-bugs"},"children":[{"type":"text","value":"Our approach to reporting bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Overview"}]},{"type":"text","value":": A Quick overview of the bug found, which generally includes an image"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Reproduction"}]},{"type":"text","value":": Detailed list of instructions for reproducing the bug"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Improvements"}]},{"type":"text","value":": Suggestions for how to resolve the bug and improve the software"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket."}]},{"type":"element","tag":"h3","props":{"id":"some-bugs-we-found"},"children":[{"type":"text","value":"Some Bugs We Found"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1371","rel":["nofollow"]},"children":[{"type":"text","value":"Recreating deleted users"}]}]},{"type":"text","value":": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1370","rel":["nofollow"]},"children":[{"type":"text","value":"Inconsistent interface conveying permissions"}]}]},{"type":"text","value":": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1366","rel":["nofollow"]},"children":[{"type":"text","value":"Deleting roles edge case"}]}]},{"type":"text","value":": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1235","rel":["nofollow"]},"children":[{"type":"text","value":"Invalidating GitHub OAuth error"}]}]},{"type":"text","value":": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems."}]},{"type":"element","tag":"h2","props":{"id":"dive-into-testing"},"children":[{"type":"text","value":"Dive into Testing"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright."}]},{"type":"element","tag":"h3","props":{"id":"refactoring-workflow-tests"},"children":[{"type":"text","value":"Refactoring Workflow Tests"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"test.step"}]},{"type":"text","value":" interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases."}]},{"type":"element","tag":"h3","props":{"id":"user-management"},"children":[{"type":"text","value":"User Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We overcame these challenges by upgrading the library used so we could put "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data-"}]},{"type":"text","value":" props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information."}]},{"type":"element","tag":"h3","props":{"id":"role-management"},"children":[{"type":"text","value":"Role Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users."}]},{"type":"element","tag":"h2","props":{"id":"ci-pipeline-enhancements"},"children":[{"type":"text","value":"CI Pipeline Enhancements"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem."}]},{"type":"element","tag":"h2","props":{"id":"tangible-value"},"children":[{"type":"text","value":"Tangible Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch","depth":2,"text":"Improving Software Quality and Testing Infrastructure for Automatisch"},{"id":"automatisch-the-open-source-zapier-alternative","depth":2,"text":"Automatisch: The Open Source Zapier Alternative"},{"id":"proactive-bug-finding-and-reporting","depth":2,"text":"Proactive Bug Finding and Reporting","children":[{"id":"our-approach-to-reporting-bugs","depth":3,"text":"Our approach to reporting bugs"},{"id":"some-bugs-we-found","depth":3,"text":"Some Bugs We Found"}]},{"id":"dive-into-testing","depth":2,"text":"Dive into Testing","children":[{"id":"refactoring-workflow-tests","depth":3,"text":"Refactoring Workflow Tests"},{"id":"user-management","depth":3,"text":"User Management"},{"id":"role-management","depth":3,"text":"Role Management"}]},{"id":"ci-pipeline-enhancements","depth":2,"text":"CI Pipeline Enhancements"},{"id":"tangible-value","depth":2,"text":"Tangible Value"}]}},"_type":"markdown","_id":"content:case-studies:automatisch.md","_source":"content","_file":"case-studies/automatisch.md","_extension":"md"},{"_path":"/playwright/architecture","_dir":"playwright","_draft":false,"_partial":false,"_locale":"","title":"Architecture of Playwright","description":"In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.","breadcrumbs":[{"name":"Playwright","path":"/playwright/"},{"name":"Architecture","path":"/playwright/architecture/"}],"link":"/playwright/architecture","created":{"string":"March 11, 2024","number":1710136800000,"month":"Mar","day":11,"year":2024},"shortDescription":"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Diagram of Playwright's architecture","src":"/img/playwright/architecture_diagram.jpg"},"children":[]}]},{"type":"element","tag":"h2","props":{"id":"intro"},"children":[{"type":"text","value":"Intro"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you load up the "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright","rel":["nofollow"]},"children":[{"type":"text","value":"repository"}]},{"type":"text","value":" for the Playwright library, you may be overwhelmed by the numerous packages living both inside the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages"}]},{"type":"text","value":" folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { test, chromium } from \"@playwright/test\";\n","filename":"example-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { test, chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project."}]},{"type":"element","tag":"h2","props":{"id":"root-directory"},"children":[{"type":"text","value":"Root directory"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the root directory we find the following folders"}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"browser_patches/\ndocs/\nexamples/\npackages/\ntests/\nutils/\n","filename":"playwright/","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"browser_patches/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"docs/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"examples/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"packages/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"tests/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"utils/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"along with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" which includes the following keys"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-dark","code":"{\n \"name\": \"playwright-internal\",\n \"private\": true,\n \"workspaces\": [\"packages/*\"]\n}\n","filename":"package.json","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"playwright-internal\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"private\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"workspaces\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"packages/*\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" gives us the hint the core functionality is within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/"}]},{"type":"text","value":" directory since the root "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" file is labelled private, has \"internal\" in its name, and uses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\"workspaces\""}]},{"type":"text","value":" key, which tells node this project has multiple packages. Let's go over the other top-level directories real quick before diving into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/"}]},{"type":"text","value":" folder"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browser_patches"}]},{"type":"text","value":" - This folder contains browser patches improving adding additional controls and features to some of the browser engines used within this project. Interestingly, this give a patch to webkit so it can run within Windows."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"docs"}]},{"type":"text","value":" - The docs folder contains markdown files which compile to the documentation found on "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/intro","rel":["nofollow"]},"children":[{"type":"text","value":"the Playwright docs"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"examples"}]},{"type":"text","value":" - Here are examples of test scripts to refer to, while getting started with using the Playwright project."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tests"}]},{"type":"text","value":" - Even testing libraries should have automated tests, which are written in Playwright."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utils"}]},{"type":"text","value":" - The utils directory contains miscellaneous tools used during build time, docker images, functionality for Azure, a types file generator, and more."}]}]},{"type":"element","tag":"h2","props":{"id":"packages-directory"},"children":[{"type":"text","value":"Packages directory"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The packages directory contains over 20 separate packages, making it more difficult to understand. We will split up this list into easy-to-understand partitions."}]},{"type":"element","tag":"h3","props":{"id":"test-reportinggeneration-packages"},"children":[{"type":"text","value":"Test reporting/generation packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Playwright contains many different test reporting packages each with their own set of functionalities. Briefly, the list of packages in this category is"}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"html-reporter/\nrecorder/\ntrace-viewer/\ntrace/\nweb/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"html-reporter/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"recorder/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"trace-viewer/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"trace/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"web/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which contains the code associated with either handling test reports or "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/codegen-intro","rel":["nofollow"]},"children":[{"type":"text","value":"generating"}]},{"type":"text","value":" them with the recorder package. In addition, there is the "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/trace-viewer","rel":["nofollow"]},"children":[{"type":"text","value":"trace and trace viewer"}]},{"type":"text","value":" which can be recorded during playwright test runs. In addition, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"web/"}]},{"type":"text","value":" package provides utilities shared across the various web-based tools listed here."}]},{"type":"element","tag":"h3","props":{"id":"browser-specialized-packages"},"children":[{"type":"text","value":"Browser specialized packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each of the packages here are simply exports of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" package along with an install script for the associated browser only. You can find them on npmjs, for example, "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/playwright-chromium","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-chromium"}]},{"type":"text","value":" is its own package which has playwright specialized for only automating chromium."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-chromium/\nplaywright-firefox/\nplaywright-webkit/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-chromium/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-firefox/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-webkit/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"browser-installation-packages"},"children":[{"type":"text","value":"Browser installation packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The packages listed here only include install scripts for each of the browsers. For example, "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/@playwright/browser-chromium","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-browser-chromium"}]},{"type":"text","value":" corresponds to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/browser-chromium"}]},{"type":"text","value":" package on npmjs."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-browser-chromium/\nplaywright-browser-firefox/\nplaywright-browser-webkit/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-chromium/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-firefox/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-webkit/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"component-testing-packages"},"children":[{"type":"text","value":"Component testing packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These packages are all associated to the "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/test-components","rel":["nofollow"]},"children":[{"type":"text","value":"experimental component testing framework"}]},{"type":"text","value":" in playwright. These give functionality to playwright similar to how Jest can render individual components for different libraries."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-ct-core/\nplaywright-ct-react/\nplaywright-ct-react17/\nplaywright-ct-solid/\nplaywright-ct-svelte/\nplaywright-ct-vue/\nplaywright-ct-vue2/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-core/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-react/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-react17/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-solid/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-svelte/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-vue/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-vue2/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"core-functionality-packages"},"children":[{"type":"text","value":"Core functionality packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Finally, we reach the core packages provided in playwright, which contain all of the main functionality of the playwright project."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-core/\nplaywright-test/\nplaywright/\nprotocol/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-core/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-test/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"protocol/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-test"}]},{"type":"text","value":" folder is simply a wrapper for binding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" together in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" package installable through npm. If you look in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" file, all you'll see is an export of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright/test"}]},{"type":"text","value":", which lives in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" package."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another package to look at briefly is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"protocol"}]},{"type":"text","value":" package which has automatically generated code through some of the build scripts in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utils"}]},{"type":"text","value":" directory of the root directory of the playwright project. This simply contains a YAML file, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"protocol.yml"}]},{"type":"text","value":", which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, the two main packages of the entire playwright library are the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrite-core"}]},{"type":"text","value":" packages. The first of which is a wrapper around "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright.config.ts"}]},{"type":"text","value":" file, or any of the associated test running code, such as"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { test } from \"@playwright/test\";\n","filename":"my-test.spec.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { test } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"then you are likely importing code from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" package."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The other main package is "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" which contains all of the browser automation functionality. This functionality is split up into two main components, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library, found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/src/server"}]},{"type":"text","value":", contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the "},{"type":"element","tag":"a","props":{"href":"https://chromedevtools.github.io/devtools-protocol/","rel":["nofollow"]},"children":[{"type":"text","value":"Chrome Devtools Protocol"}]},{"type":"text","value":" (CDP), or something similar to it, which tells the browser to perform actions like \"click the login button\", \"input 'Hello' into the text form\", or \"navigate to '"},{"type":"element","tag":"a","props":{"href":"https://news.ycombinator.com","rel":["nofollow"]},"children":[{"type":"text","value":"https://news.ycombinator.com"}]},{"type":"text","value":"'\". The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"On the other hand, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from \"@playwright/test\";\n\n(async function () {\n const browser = await chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n})();\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({ headless: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" page."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://playwright.dev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"})();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"really you are importing "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" from an instance of the class in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core/client/playwright"}]},{"type":"text","value":". Then, calling "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browser.newPage"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":" is making requests to interfaces in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" package since it provides a comprehensive and battle tested API for this kind of functionality."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This splitting of responsibility design pattern works well because it allows for "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-python","rel":["nofollow"]},"children":[{"type":"text","value":"supporting"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-java/","rel":["nofollow"]},"children":[{"type":"text","value":"multiple"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-dotnet","rel":["nofollow"]},"children":[{"type":"text","value":"languages"}]},{"type":"text","value":" which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":") as you would in the the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"looking-beyond"},"children":[{"type":"text","value":"Looking beyond"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"intro","depth":2,"text":"Intro"},{"id":"root-directory","depth":2,"text":"Root directory"},{"id":"packages-directory","depth":2,"text":"Packages directory","children":[{"id":"test-reportinggeneration-packages","depth":3,"text":"Test reporting/generation packages"},{"id":"browser-specialized-packages","depth":3,"text":"Browser specialized packages"},{"id":"browser-installation-packages","depth":3,"text":"Browser installation packages"},{"id":"component-testing-packages","depth":3,"text":"Component testing packages"},{"id":"core-functionality-packages","depth":3,"text":"Core functionality packages"}]},{"id":"looking-beyond","depth":2,"text":"Looking beyond"}]}},"_type":"markdown","_id":"content:playwright:architecture.md","_source":"content","_file":"playwright/architecture.md","_extension":"md"},{"_path":"/playwright/how-playwright-initializes","_dir":"playwright","_draft":false,"_partial":false,"_locale":"","title":"How importing from Playwright works","description":"In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.","breadcrumbs":[{"name":"Playwright","path":"/playwright/"},{"name":"How Playwright Initializes","path":"/playwright/how-playwright-initializes/"}],"image":"img","shortDescription":"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.","created":{"string":"March 13, 2024","number":1710309600000,"month":"Mar","day":13,"year":2024},"link":"/playwright/how-playwright-initializes","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Diagram of playwright-core initialization process","src":"/img/playwright/playwright-core_initialization_diagram.jpg"},"children":[]}]},{"type":"element","tag":"h2","props":{"id":"peering-into-playwrights-import-process"},"children":[{"type":"text","value":"Peering into Playwright's import process"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from '@playwright/test'\n\nasync function main () => {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" '@playwright/test'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" main"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://qacomet.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture."}]},{"type":"element","tag":"h3","props":{"id":"merging-playwright-and-playwright-core"},"children":[{"type":"text","value":"Merging "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Internally, when you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":", there is an underlying call to import from two merged packages, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":". This merge happens in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":", since "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is just an outward facinging export of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"require('playwright/test')"}]},{"type":"text","value":", an alias for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":". This is where the test execution API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" are combined with the browser automation API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will focus on the import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", since it provides the core browser automation and is the code every other client library wraps. Looking at its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" file"}]},{"type":"element","tag":"pre","props":{"className":"language-js shiki shiki-themes github-dark","code":"module.exports = require(\"./lib/inprocess\");\n","filename":"packages/playwright-core/index.js","language":"js","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"module"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"exports"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"./lib/inprocess\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"gives an export from its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib/inprocess.ts"}]},{"type":"text","value":" file (note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" directory is compiled to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib"}]},{"type":"text","value":" directory after playwright runs its build script, and is what's found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"node_modules/playwright-core"}]},{"type":"text","value":", hence the require imports from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./lib/"}]},{"type":"text","value":" and not "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./src/"}]},{"type":"text","value":"). The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inprocess.ts"}]},{"type":"text","value":" file just imports from the adjacent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" and executes the function from there, called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include the source below in its own section but note "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" dynamically intiailizes the interface between the client library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":", and the server library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-python","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-python"}]},{"type":"text","value":" source code, you will find the same design patterns and classes defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":"'s "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"h3","props":{"id":"rapid-overview-of-the-client-and-server-libraries"},"children":[{"type":"text","value":"Rapid overview of the client and server libraries"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" the main functionality can be found in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" folders. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" folder contains classes, many of which are subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class. This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class is a client-side representation of a corresponding server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" class in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server/dispatchers"}]},{"type":"text","value":" folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":", containing the client side APIs (such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":"), there is a corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":". When we call "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":" a message is send over the unique client "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" instance to the unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" instance, which calls the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works."}]},{"type":"element","tag":"h2","props":{"id":"playwrights-core-api-factory-createinprocessplaywright"},"children":[{"type":"text","value":"Playwright's core API factory, createInProcessPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This file, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":", contains only one function called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include it here as a reference:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createInProcessPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Dispatch synchronously at first.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"webkit\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI._android._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" AndroidServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Switch to async dispatch after we got Playwright object.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"toImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"x"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" x\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(x._guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")._toImpl "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection.toImpl;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you scan through the script and look at the return value, you'll see Playwright is returning the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" instance "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":", which is defined somewhere within the client library "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core/src/client/"}]},{"type":"text","value":" (which we find from our type hints). So when we write a script using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from \"playwright-core\";\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"really we are making an import of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":" object and accessing its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" property, so our script is secretly"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Tracing where this object is instantiated, we find the call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is not very descriptive. If you try looking in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class definition, you won't get very far either, you'll just see"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export class Connection extends EventEmitter {\n readonly _objects = new Map();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _objects"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Map"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is even more opaque. From this all we know is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class keeps an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" map which at some point contains an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":" will give us a clear picture of how this library is wrapped together."}]},{"type":"element","tag":"h2","props":{"id":"cross-communication-between-client-and-server"},"children":[{"type":"text","value":"Cross communication between client and server"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you look through the script's imports, anything with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" in its name, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":", come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" directroy. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function creates an instance of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similarly, the imports for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" directory. Looking through the first lines of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":", there is an instantiation of the server "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class and instantiation of objects for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ClientConnection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The next lines of code are the bridge between the internal client and server libraries"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"given by setting the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" properties for each of these objects. Notice each "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" calls the other's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" method; i.e., "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" through "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" and vice versa. This gives us the hint somehow "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" will be called somewhere in the codebase."}]},{"type":"element","tag":"h3","props":{"id":"server-side-createplaywright"},"children":[{"type":"text","value":"Server-side createPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before we continue down the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", let's go over what the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function actually does. It is a simple function call which instantiates the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":". Below is a simplified version of it"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n","filename":"packages/playwright-core/server/playwright.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./chromium/chromium\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Firefox } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./firefox/firefox\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Selectors } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./selectors\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { WebKit } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./webkit/webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { createInstrumentation, SdkObject } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./instrumentation\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" SdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" debugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { attribution: {}, instrumentation: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"createInstrumentation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"() } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".options "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" options;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".chromium "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".firefox "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".webkit "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".selectors "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".debugController "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/chromium/"}]},{"type":"text","value":" you will see all the functionality for automating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" browser."}]},{"type":"element","tag":"h3","props":{"id":"rootdispatcher-and-server-side-playwright"},"children":[{"type":"text","value":"RootDispatcher and server-side Playwright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuing down "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", we see there's the construction of a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RootDispatcher"}]},{"type":"text","value":" instance, and a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":" instance."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object is referenced throughout the dispatcher classes, and acts as a wrapper around the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" object instantiated above, so that each of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object. This wrapping functionality will become clearer when we dive into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor, where it passes the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" to all of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's a simplified version of what's happening in the constructor for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Rootscope"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","filename":"playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(connection, { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Root\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ParentScopeType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" object"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" channels"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"InitializerTraits"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent._connection;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._guid "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object.guid;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"registerDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" guid,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor we see the connection always comes from either the inherited parent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", or from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" passed into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"parent"}]},{"type":"text","value":" parameter. This, coupled with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" having the name "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"root"}]},{"type":"text","value":", gives us the hint that every dispatcher in the server library will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" instance (from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":"). Furthermore, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" will register every instance of a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", hinting that it will communicate with each of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" objects. These points will become more clear after looking at the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor."}]},{"type":"element","tag":"h4","props":{"id":"playwrightdispatcher-and-its-constructor"},"children":[{"type":"text","value":"PlaywrightDispatcher and its constructor"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's look closer at a slightly simplified version of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","filename":"packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Playwright } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core/src/server/playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"scope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.chromium),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.firefox),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.webkit),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notice the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"super"}]},{"type":"text","value":" call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" passed into it as the first parameter. Every call to the server will run through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":", which then can be traced through calls in each of the dispatcher classes. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserTypeDispatcher"}]},{"type":"text","value":" will launch a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserDispatcher"}]},{"type":"text","value":", which is responsible for creating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserContextDispatcher"}]},{"type":"text","value":", which can create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" defined in the factory method with confidence!"}]},{"type":"element","tag":"h3","props":{"id":"tying-back-to-the-onmessage-communication"},"children":[{"type":"text","value":"Tying back to the onmessage communication"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnect.onmessage"}]},{"type":"text","value":" functions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" function is called from two main methods. These are "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":". The first, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":", is called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":", so the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcher.onmessage"}]},{"type":"text","value":" call in that case acts as a response callback. The second, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", is called from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendEvent"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendAdopt"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendDestroy"}]},{"type":"text","value":" methods defined within the dispatcher. Calls to these functions are spread throughout the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses which call these functions from their internal "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_connection"}]},{"type":"text","value":" variable. These will tell the client to construct, update, and destroy, their corresponding client side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" objects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Separately on the client-side, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":" is called from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendMessageToServer"}]},{"type":"text","value":" whenever you use a client-side API. This sends a message over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":", which finds the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", as mentioned before."}]},{"type":"element","tag":"h3","props":{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners"},"children":[{"type":"text","value":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function is special because it is only called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" implementation, internally it calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":" with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" parameter:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","filename":"packages/playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" SdkObject) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(initializer, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplToWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"), binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._isLocal "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'toBase64'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent._guid, type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { type, initializer, guid }, sdkObject);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so if we search through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class on the client side, sure enough in its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" function it has a call to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" for the associated method "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":". This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" is what initializes the client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, and is the reason why we call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":". For the Playwright create message, the message looks something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" method"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" params"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@024d5a494527ece580841844a9a933a6'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@fae8f48651c02682ad3b276f0a046d63'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'android@832582c466c24c6933d3a5587059e1be'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'electron@3829a7608477101154e15c1e25bca9ca'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note before this "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" message is passed to create the Playwright API on the client side, there were "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" messages for each of the device types, meaning there already exists a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserType"}]},{"type":"text","value":" for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"firefox"}]},{"type":"text","value":", etc. before the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" message for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" is sent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class, which is a concept for a later section. For now, let's trace what happens in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"type: 'Playwright'"}]},{"type":"text","value":" message."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatchConnection.onmessage"}]},{"type":"text","value":", which calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" function, which then calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function with the following parameters"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// parentGuid - corresponds to Root, the root ChannelOwner\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// type\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// guid\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // initializer\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@024d5a494527ece580841844a9a933a6\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@fae8f48651c02682ad3b276f0a046d63\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" android: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"android@832582c466c24c6933d3a5587059e1be\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" electron: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"electron@3829a7608477101154e15c1e25bca9ca\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function there is a transformation of the data and then a large "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"switch-case"}]},{"type":"text","value":" function instantiating the corresponding client class."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid: string, type: string, guid: string, initializer: any) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// here the parentGuid is ''\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"`Cannot find parent object ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parentGuid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"} to create ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" let"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" ''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplFromWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._rawBuffers "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'fromBase64'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" switch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (type) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" case"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":":\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent, type, guid, initializer);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" break"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parameter "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tChannelImpl: _tChannelImplFromWire"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"validator"}]},{"type":"text","value":" function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class. If you look at the type definition in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable is a map returning one of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses. So in the result above for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"case: 'Playwright'"}]},{"type":"text","value":", it returns a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, which is a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":", defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"launching-the-browser-instance"},"children":[{"type":"text","value":"Launching the browser instance"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The final bit of code in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" to consider is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_serverLauncher"}]},{"type":"text","value":" variables being set in each of the drivers. This is written as"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" class is defined next to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" file in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browserServerLauncherImpl.ts"}]},{"type":"text","value":". The main functionality in this class lies in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"launchServer"}]},{"type":"text","value":" function, and is only called when you use the"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launchServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(serverOptions);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'playwright-core'"}]},{"type":"text","value":" library, something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({ headless: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" page."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://playwright.dev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ... automate page interactions here\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"})();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so for now we skip giving an overview of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" code and defer it to a later post."}]},{"type":"element","tag":"h2","props":{"id":"recap"},"children":[{"type":"text","value":"Recap"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Whew! That was quite the journey, so let's recap the main points we covered in this post:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is a wrapper around the test runner package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" and the browser automation package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Importing from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" is a dynamically generated process under the hood, which is done in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/src/inProcessFactory.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" there are two main libraries, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" libraries."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This separation exists so other programming languages can easily build a client library which communicates with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The client-side API and server-side API communicate with each other over a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" object and a server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" object. These pass messages with one another through their runtime-defined "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" callback."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is responsible for constructing client side API's, the API methods you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is responsible for keeping track of the dispatcher objects on the server side."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The instances of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is wrapped by "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses, which all point to the same instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":". Similarly, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is wrapped by a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" which is responsible for a part of the automated browser."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Both the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes keep track of the same object on each side of the client/server side of the divide with a unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GUID"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once you have parsed the functionality of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"peering-into-playwrights-import-process","depth":2,"text":"Peering into Playwright's import process","children":[{"id":"merging-playwright-and-playwright-core","depth":3,"text":"Merging playwright and playwright-core"},{"id":"rapid-overview-of-the-client-and-server-libraries","depth":3,"text":"Rapid overview of the client and server libraries"}]},{"id":"playwrights-core-api-factory-createinprocessplaywright","depth":2,"text":"Playwright's core API factory, createInProcessPlaywright"},{"id":"cross-communication-between-client-and-server","depth":2,"text":"Cross communication between client and server","children":[{"id":"server-side-createplaywright","depth":3,"text":"Server-side createPlaywright"},{"id":"rootdispatcher-and-server-side-playwright","depth":3,"text":"RootDispatcher and server-side Playwright"},{"id":"tying-back-to-the-onmessage-communication","depth":3,"text":"Tying back to the onmessage communication"},{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners","depth":3,"text":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"id":"launching-the-browser-instance","depth":2,"text":"Launching the browser instance"},{"id":"recap","depth":2,"text":"Recap"}]}},"_type":"markdown","_id":"content:playwright:how-playwright-initializes.md","_source":"content","_file":"playwright/how-playwright-initializes.md","_extension":"md"},{"_path":"/privacy-policy","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Privacy Policy","description":"Effective Date: This Privacy Policy is effective as of February 16, 2024.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Effective Date"}]},{"type":"text","value":": "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"This Privacy Policy is effective as of February 16, 2024."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this Privacy Policy, unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"QAComet"}]},{"type":"text","value":"\" refers to the website operated by QAComet LLC accessible at QAComet.com"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Personal Information"}]},{"type":"text","value":"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Non-Personal Information"}]},{"type":"text","value":"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Cookies"}]},{"type":"text","value":"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Google Analytics"}]},{"type":"text","value":"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"User"}]},{"type":"text","value":"\" refers to any individual who accesses or uses the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein."}]},{"type":"element","tag":"h2","props":{"id":"_1-information-collection"},"children":[{"type":"text","value":"1. INFORMATION COLLECTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We collect two types of information from users: personal information and non-personal information."}]},{"type":"element","tag":"h3","props":{"id":"personal-information"},"children":[{"type":"text","value":"Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website."}]}]},{"type":"element","tag":"h3","props":{"id":"non-personal-information"},"children":[{"type":"text","value":"Non-Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information."}]}]},{"type":"element","tag":"h3","props":{"id":"google-analytics"},"children":[{"type":"text","value":"Google Analytics:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-information"},"children":[{"type":"text","value":"2. USE OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users for the following purposes:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies."}]},{"type":"element","tag":"h2","props":{"id":"_3-sharing-of-information"},"children":[{"type":"text","value":"3. SHARING OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We may share both personal and non-personal information collected from users in the following circumstances:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone."}]}]},{"type":"element","tag":"h2","props":{"id":"_4-google-analytics"},"children":[{"type":"text","value":"4. GOOGLE ANALYTICS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: "},{"type":"element","tag":"a","props":{"href":"https://policies.google.com/privacy?hl=en-US","rel":["nofollow"]},"children":[{"type":"text","value":"Google Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website."}]},{"type":"element","tag":"h2","props":{"id":"_5-data-security"},"children":[{"type":"text","value":"5. DATA SECURITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels."}]},{"type":"element","tag":"h2","props":{"id":"_6-user-controls"},"children":[{"type":"text","value":"6. USER CONTROLS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":". This browser add-on allows users to prevent their data from being collected and used by Google Analytics."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights."}]},{"type":"element","tag":"h2","props":{"id":"_7-changes-to-the-privacy-policy"},"children":[{"type":"text","value":"7. CHANGES TO THE PRIVACY POLICY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_8-contact-information"},"children":[{"type":"text","value":"8. CONTACT INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS:"},{"id":"_1-information-collection","depth":2,"text":"1. INFORMATION COLLECTION:","children":[{"id":"personal-information","depth":3,"text":"Personal Information:"},{"id":"non-personal-information","depth":3,"text":"Non-Personal Information:"},{"id":"google-analytics","depth":3,"text":"Google Analytics:"}]},{"id":"_2-use-of-information","depth":2,"text":"2. USE OF INFORMATION:"},{"id":"_3-sharing-of-information","depth":2,"text":"3. SHARING OF INFORMATION:"},{"id":"_4-google-analytics","depth":2,"text":"4. GOOGLE ANALYTICS:"},{"id":"_5-data-security","depth":2,"text":"5. DATA SECURITY:"},{"id":"_6-user-controls","depth":2,"text":"6. USER CONTROLS:"},{"id":"_7-changes-to-the-privacy-policy","depth":2,"text":"7. CHANGES TO THE PRIVACY POLICY:"},{"id":"_8-contact-information","depth":2,"text":"8. CONTACT INFORMATION:"}]}},"_type":"markdown","_id":"content:privacy-policy.md","_source":"content","_file":"privacy-policy.md","_extension":"md"},{"_path":"/terms-and-conditions","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms And Conditions","description":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\")."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Website"}]},{"type":"text","value":"\" refers to the QAComet website, accessible at "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/","rel":["nofollow"]},"children":[{"type":"text","value":"QAComet.com"}]},{"type":"text","value":", including all associated web pages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":"\" refers to any products, features, or functionalities offered on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Content"}]},{"type":"text","value":"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Affiliates"}]},{"type":"text","value":"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Terms"}]},{"type":"text","value":"\" refers to these General Terms and Conditions governing the use of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Modification"}]},{"type":"text","value":"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion."}]},{"type":"element","tag":"h2","props":{"id":"_1-acceptance-of-terms"},"children":[{"type":"text","value":"1. ACCEPTANCE OF TERMS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-website"},"children":[{"type":"text","value":"2. USE OF WEBSITE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities"}]},{"type":"element","tag":"h2","props":{"id":"_3-intellectual-property"},"children":[{"type":"text","value":"3. INTELLECTUAL PROPERTY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties."}]},{"type":"element","tag":"h2","props":{"id":"_4-privacy-policy"},"children":[{"type":"text","value":"4. PRIVACY POLICY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/privacy-policy","rel":["nofollow"]},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"_5-disclaimer-of-warranties"},"children":[{"type":"text","value":"5. DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_6-limitation-of-liability"},"children":[{"type":"text","value":"6. LIMITATION OF LIABILITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_7-modification-and-termination"},"children":[{"type":"text","value":"7. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it."}]},{"type":"element","tag":"h2","props":{"id":"_8-governing-law-and-dispute-resolution"},"children":[{"type":"text","value":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The language of arbitration and all related proceedings shall be English."}]},{"type":"element","tag":"h2","props":{"id":"_9-miscellaneous"},"children":[{"type":"text","value":"9. MISCELLANEOUS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Contact Information: If you have any questions about these Terms or the QAComet website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS"},{"id":"_1-acceptance-of-terms","depth":2,"text":"1. ACCEPTANCE OF TERMS:"},{"id":"_2-use-of-website","depth":2,"text":"2. USE OF WEBSITE"},{"id":"_3-intellectual-property","depth":2,"text":"3. INTELLECTUAL PROPERTY:"},{"id":"_4-privacy-policy","depth":2,"text":"4. PRIVACY POLICY"},{"id":"_5-disclaimer-of-warranties","depth":2,"text":"5. DISCLAIMER OF WARRANTIES:"},{"id":"_6-limitation-of-liability","depth":2,"text":"6. LIMITATION OF LIABILITY:"},{"id":"_7-modification-and-termination","depth":2,"text":"7. MODIFICATION AND TERMINATION:"},{"id":"_8-governing-law-and-dispute-resolution","depth":2,"text":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"},{"id":"_9-miscellaneous","depth":2,"text":"9. MISCELLANEOUS:"}]}},"_type":"markdown","_id":"content:terms-and-conditions.md","_source":"content","_file":"terms-and-conditions.md","_extension":"md"},{"_path":"/terms-of-service","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms Of Service","description":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"Definitions:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client"}]},{"type":"text","value":": Refers to individuals or entities who utilize QAComet's QA/Testing services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Company"}]},{"type":"text","value":": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Materials"}]},{"type":"text","value":": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Ownership"}]},{"type":"text","value":": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client-Specific Utilities"}]},{"type":"text","value":": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Design Patterns"}]},{"type":"text","value":": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Trial Period"}]},{"type":"text","value":": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Subscription Fee"}]},{"type":"text","value":": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Intellectual Property Rights"}]},{"type":"text","value":": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Dispute Resolution"}]},{"type":"text","value":": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms."}]},{"type":"element","tag":"h2","props":{"id":"_2-scope-of-service"},"children":[{"type":"text","value":"2. SCOPE OF SERVICE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_3-account-security"},"children":[{"type":"text","value":"3. ACCOUNT SECURITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet."}]},{"type":"element","tag":"h2","props":{"id":"_4-right-to-refuse-or-cancel-services"},"children":[{"type":"text","value":"4. RIGHT TO REFUSE OR CANCEL SERVICES"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_5-promotional-rights"},"children":[{"type":"text","value":"5. PROMOTIONAL RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials."}]},{"type":"element","tag":"h2","props":{"id":"_6-ownership-of-materials"},"children":[{"type":"text","value":"6. OWNERSHIP OF MATERIALS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials."}]},{"type":"element","tag":"h2","props":{"id":"_7-client-responsibilities"},"children":[{"type":"text","value":"7. CLIENT RESPONSIBILITIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_8-billing-and-payments"},"children":[{"type":"text","value":"8. BILLING AND PAYMENTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client."}]},{"type":"element","tag":"h2","props":{"id":"_9-intellectual-property-rights"},"children":[{"type":"text","value":"9. INTELLECTUAL PROPERTY RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests."}]},{"type":"text","value":"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client."}]},{"type":"element","tag":"h2","props":{"id":"_10-qacomet-pre-existing-ip-materials"},"children":[{"type":"text","value":"10. QACOMET Pre-Existing IP MATERIALS."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement."}]},{"type":"element","tag":"h2","props":{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties"},"children":[{"type":"text","value":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances."}]},{"type":"element","tag":"h2","props":{"id":"_12-confidentiality"},"children":[{"type":"text","value":"12. CONFIDENTIALITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity."}]},{"type":"element","tag":"h2","props":{"id":"_13-dispute-resolution-and-governing-law"},"children":[{"type":"text","value":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts."}]},{"type":"element","tag":"h2","props":{"id":"_14-modification-and-termination"},"children":[{"type":"text","value":"14. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service."}]},{"type":"element","tag":"h2","props":{"id":"_15-severability"},"children":[{"type":"text","value":"15. SEVERABILITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision."}]},{"type":"element","tag":"h2","props":{"id":"_16-contact-us"},"children":[{"type":"text","value":"16. Contact Us:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"Definitions:"},{"id":"_2-scope-of-service","depth":2,"text":"2. SCOPE OF SERVICE"},{"id":"_3-account-security","depth":2,"text":"3. ACCOUNT SECURITY"},{"id":"_4-right-to-refuse-or-cancel-services","depth":2,"text":"4. RIGHT TO REFUSE OR CANCEL SERVICES"},{"id":"_5-promotional-rights","depth":2,"text":"5. PROMOTIONAL RIGHTS:"},{"id":"_6-ownership-of-materials","depth":2,"text":"6. OWNERSHIP OF MATERIALS:"},{"id":"_7-client-responsibilities","depth":2,"text":"7. CLIENT RESPONSIBILITIES:"},{"id":"_8-billing-and-payments","depth":2,"text":"8. BILLING AND PAYMENTS:"},{"id":"_9-intellectual-property-rights","depth":2,"text":"9. INTELLECTUAL PROPERTY RIGHTS:"},{"id":"_10-qacomet-pre-existing-ip-materials","depth":2,"text":"10. QACOMET Pre-Existing IP MATERIALS."},{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties","depth":2,"text":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"},{"id":"_12-confidentiality","depth":2,"text":"12. CONFIDENTIALITY:"},{"id":"_13-dispute-resolution-and-governing-law","depth":2,"text":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"},{"id":"_14-modification-and-termination","depth":2,"text":"14. MODIFICATION AND TERMINATION:"},{"id":"_15-severability","depth":2,"text":"15. SEVERABILITY"},{"id":"_16-contact-us","depth":2,"text":"16. Contact Us:"}]}},"_type":"markdown","_id":"content:terms-of-service.md","_source":"content","_file":"terms-of-service.md","_extension":"md"}],"navigation":[{"title":"Case Studies","_path":"/case-studies","children":[{"title":"Automatisch","_path":"/case-studies/automatisch"}]},{"title":"Playwright","_path":"/playwright","children":[{"title":"Architecture of Playwright","_path":"/playwright/architecture"},{"title":"How importing from Playwright works","_path":"/playwright/how-playwright-initializes"}]},{"title":"Privacy Policy","_path":"/privacy-policy"},{"title":"Terms And Conditions","_path":"/terms-and-conditions"},{"title":"Terms Of Service","_path":"/terms-of-service"}]} \ No newline at end of file diff --git a/api/_content/query/9C0VBep6PV.1714069884582.json b/api/_content/query/9C0VBep6PV.1714258600178.json similarity index 100% rename from api/_content/query/9C0VBep6PV.1714069884582.json rename to api/_content/query/9C0VBep6PV.1714258600178.json diff --git a/api/_content/query/Cr3vX64g4U.1714069884582.json b/api/_content/query/Cr3vX64g4U.1714258600178.json similarity index 100% rename from api/_content/query/Cr3vX64g4U.1714069884582.json rename to api/_content/query/Cr3vX64g4U.1714258600178.json diff --git a/api/_content/query/Qfdjvn2t5d.1714069884582.json b/api/_content/query/Qfdjvn2t5d.1714258600178.json similarity index 100% rename from api/_content/query/Qfdjvn2t5d.1714069884582.json rename to api/_content/query/Qfdjvn2t5d.1714258600178.json diff --git a/api/_content/query/VlbRDfyd5U.1714069884582.json b/api/_content/query/VlbRDfyd5U.1714258600178.json similarity index 100% rename from api/_content/query/VlbRDfyd5U.1714069884582.json rename to api/_content/query/VlbRDfyd5U.1714258600178.json diff --git a/api/_content/query/c1NuIkbLFt.1714069884582.json b/api/_content/query/c1NuIkbLFt.1714258600178.json similarity index 100% rename from api/_content/query/c1NuIkbLFt.1714069884582.json rename to api/_content/query/c1NuIkbLFt.1714258600178.json diff --git a/api/_content/query/jaZDQs2Nrb.1714069884582.json b/api/_content/query/jaZDQs2Nrb.1714258600178.json similarity index 100% rename from api/_content/query/jaZDQs2Nrb.1714069884582.json rename to api/_content/query/jaZDQs2Nrb.1714258600178.json diff --git a/api/_content/query/muguO0VHIr.1714069884582.json b/api/_content/query/muguO0VHIr.1714258600178.json similarity index 100% rename from api/_content/query/muguO0VHIr.1714069884582.json rename to api/_content/query/muguO0VHIr.1714258600178.json diff --git a/api/_content/query/x1MOVa2EhJ.1714069884582.json b/api/_content/query/x1MOVa2EhJ.1714258600178.json similarity index 100% rename from api/_content/query/x1MOVa2EhJ.1714069884582.json rename to api/_content/query/x1MOVa2EhJ.1714258600178.json diff --git a/case-studies/_payload.json b/case-studies/_payload.json index 6b49c40..5d510b3 100644 --- a/case-studies/_payload.json +++ b/case-studies/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":13},["Reactive",2],{"case-studies":3},[4],{"title":5,"link":6,"created":7,"shortDescription":12},"Automatisch","/case-studies/automatisch",{"string":8,"month":9,"day":10,"year":11},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",1714069923272] \ No newline at end of file +[{"data":1,"prerenderedAt":13},["Reactive",2],{"case-studies":3},[4],{"title":5,"link":6,"created":7,"shortDescription":12},"Automatisch","/case-studies/automatisch",{"string":8,"month":9,"day":10,"year":11},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",1714258642186] \ No newline at end of file diff --git a/case-studies/automatisch/_payload.json b/case-studies/automatisch/_payload.json index e32c302..6fae2d2 100644 --- a/case-studies/automatisch/_payload.json +++ b/case-studies/automatisch/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":336},["Reactive",2],{"blog-post-/case-studies/automatisch":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"subtitle":10,"breadcrumbs":11,"link":4,"created":17,"shortDescription":22,"body":23,"_type":331,"_id":332,"_source":333,"_file":334,"_extension":335},"/case-studies/automatisch","case-studies",false,"","Automatisch","W","Going from the launch pad to the cosmos with E2E testing",[12,15],{"name":13,"path":14},"Case Studies","/case-studies/",{"name":8,"path":16},"/case-studies/automatisch/",{"string":18,"month":19,"day":20,"year":21},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",{"type":24,"children":25,"toc":314},"root",[26,35,51,57,76,82,89,94,130,135,141,156,171,186,201,207,212,218,232,238,243,248,253,258,271,277,282,287,292,298,303,309],{"type":27,"tag":28,"props":29,"children":31},"element","h2",{"id":30},"improving-software-quality-and-testing-infrastructure-for-automatisch",[32],{"type":33,"value":34},"text","Improving Software Quality and Testing Infrastructure for Automatisch",{"type":27,"tag":36,"props":37,"children":38},"p",{},[39,41,49],{"type":33,"value":40},"We recently collaborated with an open source no-code automation company called ",{"type":27,"tag":42,"props":43,"children":47},"a",{"href":44,"rel":45},"https://automatisch.io",[46],"nofollow",[48],{"type":33,"value":8},{"type":33,"value":50}," and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.",{"type":27,"tag":28,"props":52,"children":54},{"id":53},"automatisch-the-open-source-zapier-alternative",[55],{"type":33,"value":56},"Automatisch: The Open Source Zapier Alternative",{"type":27,"tag":36,"props":58,"children":59},{},[60,65,67,74],{"type":27,"tag":42,"props":61,"children":63},{"href":44,"rel":62},[46],[64],{"type":33,"value":8},{"type":33,"value":66}," is a reputable ",{"type":27,"tag":42,"props":68,"children":71},{"href":69,"rel":70},"https://github.com/automatisch/automatisch",[46],[72],{"type":33,"value":73},"open source",{"type":33,"value":75}," software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.",{"type":27,"tag":28,"props":77,"children":79},{"id":78},"proactive-bug-finding-and-reporting",[80],{"type":33,"value":81},"Proactive Bug Finding and Reporting",{"type":27,"tag":83,"props":84,"children":86},"h3",{"id":85},"our-approach-to-reporting-bugs",[87],{"type":33,"value":88},"Our approach to reporting bugs",{"type":27,"tag":36,"props":90,"children":91},{},[92],{"type":33,"value":93},"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections",{"type":27,"tag":95,"props":96,"children":97},"ul",{},[98,110,120],{"type":27,"tag":99,"props":100,"children":101},"li",{},[102,108],{"type":27,"tag":103,"props":104,"children":105},"strong",{},[106],{"type":33,"value":107},"Overview",{"type":33,"value":109},": A Quick overview of the bug found, which generally includes an image",{"type":27,"tag":99,"props":111,"children":112},{},[113,118],{"type":27,"tag":103,"props":114,"children":115},{},[116],{"type":33,"value":117},"Reproduction",{"type":33,"value":119},": Detailed list of instructions for reproducing the bug",{"type":27,"tag":99,"props":121,"children":122},{},[123,128],{"type":27,"tag":103,"props":124,"children":125},{},[126],{"type":33,"value":127},"Improvements",{"type":33,"value":129},": Suggestions for how to resolve the bug and improve the software",{"type":27,"tag":36,"props":131,"children":132},{},[133],{"type":33,"value":134},"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.",{"type":27,"tag":83,"props":136,"children":138},{"id":137},"some-bugs-we-found",[139],{"type":33,"value":140},"Some Bugs We Found",{"type":27,"tag":36,"props":142,"children":143},{},[144,154],{"type":27,"tag":103,"props":145,"children":146},{},[147],{"type":27,"tag":42,"props":148,"children":151},{"href":149,"rel":150},"https://github.com/automatisch/automatisch/issues/1371",[46],[152],{"type":33,"value":153},"Recreating deleted users",{"type":33,"value":155},": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.",{"type":27,"tag":36,"props":157,"children":158},{},[159,169],{"type":27,"tag":103,"props":160,"children":161},{},[162],{"type":27,"tag":42,"props":163,"children":166},{"href":164,"rel":165},"https://github.com/automatisch/automatisch/issues/1370",[46],[167],{"type":33,"value":168},"Inconsistent interface conveying permissions",{"type":33,"value":170},": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could",{"type":27,"tag":36,"props":172,"children":173},{},[174,184],{"type":27,"tag":103,"props":175,"children":176},{},[177],{"type":27,"tag":42,"props":178,"children":181},{"href":179,"rel":180},"https://github.com/automatisch/automatisch/issues/1366",[46],[182],{"type":33,"value":183},"Deleting roles edge case",{"type":33,"value":185},": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.",{"type":27,"tag":36,"props":187,"children":188},{},[189,199],{"type":27,"tag":103,"props":190,"children":191},{},[192],{"type":27,"tag":42,"props":193,"children":196},{"href":194,"rel":195},"https://github.com/automatisch/automatisch/issues/1235",[46],[197],{"type":33,"value":198},"Invalidating GitHub OAuth error",{"type":33,"value":200},": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.",{"type":27,"tag":28,"props":202,"children":204},{"id":203},"dive-into-testing",[205],{"type":33,"value":206},"Dive into Testing",{"type":27,"tag":36,"props":208,"children":209},{},[210],{"type":33,"value":211},"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.",{"type":27,"tag":83,"props":213,"children":215},{"id":214},"refactoring-workflow-tests",[216],{"type":33,"value":217},"Refactoring Workflow Tests",{"type":27,"tag":36,"props":219,"children":220},{},[221,223,230],{"type":33,"value":222},"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's ",{"type":27,"tag":224,"props":225,"children":227},"code",{"className":226},[],[228],{"type":33,"value":229},"test.step",{"type":33,"value":231}," interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.",{"type":27,"tag":83,"props":233,"children":235},{"id":234},"user-management",[236],{"type":33,"value":237},"User Management",{"type":27,"tag":36,"props":239,"children":240},{},[241],{"type":33,"value":242},"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.",{"type":27,"tag":36,"props":244,"children":245},{},[246],{"type":33,"value":247},"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username.",{"type":27,"tag":36,"props":249,"children":250},{},[251],{"type":33,"value":252},"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.",{"type":27,"tag":36,"props":254,"children":255},{},[256],{"type":33,"value":257},"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.",{"type":27,"tag":36,"props":259,"children":260},{},[261,263,269],{"type":33,"value":262},"We overcame these challenges by upgrading the library used so we could put ",{"type":27,"tag":224,"props":264,"children":266},{"className":265},[],[267],{"type":33,"value":268},"data-",{"type":33,"value":270}," props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.",{"type":27,"tag":83,"props":272,"children":274},{"id":273},"role-management",[275],{"type":33,"value":276},"Role Management",{"type":27,"tag":36,"props":278,"children":279},{},[280],{"type":33,"value":281},"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.",{"type":27,"tag":36,"props":283,"children":284},{},[285],{"type":33,"value":286},"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.",{"type":27,"tag":36,"props":288,"children":289},{},[290],{"type":33,"value":291},"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.",{"type":27,"tag":28,"props":293,"children":295},{"id":294},"ci-pipeline-enhancements",[296],{"type":33,"value":297},"CI Pipeline Enhancements",{"type":27,"tag":36,"props":299,"children":300},{},[301],{"type":33,"value":302},"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.",{"type":27,"tag":28,"props":304,"children":306},{"id":305},"tangible-value",[307],{"type":33,"value":308},"Tangible Value",{"type":27,"tag":36,"props":310,"children":311},{},[312],{"type":33,"value":313},"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.",{"title":7,"searchDepth":315,"depth":315,"links":316},2,[317,318,319,324,329,330],{"id":30,"depth":315,"text":34},{"id":53,"depth":315,"text":56},{"id":78,"depth":315,"text":81,"children":320},[321,323],{"id":85,"depth":322,"text":88},3,{"id":137,"depth":322,"text":140},{"id":203,"depth":315,"text":206,"children":325},[326,327,328],{"id":214,"depth":322,"text":217},{"id":234,"depth":322,"text":237},{"id":273,"depth":322,"text":276},{"id":294,"depth":315,"text":297},{"id":305,"depth":315,"text":308},"markdown","content:case-studies:automatisch.md","content","case-studies/automatisch.md","md",1714069929491] \ No newline at end of file +[{"data":1,"prerenderedAt":336},["Reactive",2],{"blog-post-/case-studies/automatisch":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"subtitle":10,"breadcrumbs":11,"link":4,"created":17,"shortDescription":22,"body":23,"_type":331,"_id":332,"_source":333,"_file":334,"_extension":335},"/case-studies/automatisch","case-studies",false,"","Automatisch","W","Going from the launch pad to the cosmos with E2E testing",[12,15],{"name":13,"path":14},"Case Studies","/case-studies/",{"name":8,"path":16},"/case-studies/automatisch/",{"string":18,"month":19,"day":20,"year":21},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",{"type":24,"children":25,"toc":314},"root",[26,35,51,57,76,82,89,94,130,135,141,156,171,186,201,207,212,218,232,238,243,248,253,258,271,277,282,287,292,298,303,309],{"type":27,"tag":28,"props":29,"children":31},"element","h2",{"id":30},"improving-software-quality-and-testing-infrastructure-for-automatisch",[32],{"type":33,"value":34},"text","Improving Software Quality and Testing Infrastructure for Automatisch",{"type":27,"tag":36,"props":37,"children":38},"p",{},[39,41,49],{"type":33,"value":40},"We recently collaborated with an open source no-code automation company called ",{"type":27,"tag":42,"props":43,"children":47},"a",{"href":44,"rel":45},"https://automatisch.io",[46],"nofollow",[48],{"type":33,"value":8},{"type":33,"value":50}," and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.",{"type":27,"tag":28,"props":52,"children":54},{"id":53},"automatisch-the-open-source-zapier-alternative",[55],{"type":33,"value":56},"Automatisch: The Open Source Zapier Alternative",{"type":27,"tag":36,"props":58,"children":59},{},[60,65,67,74],{"type":27,"tag":42,"props":61,"children":63},{"href":44,"rel":62},[46],[64],{"type":33,"value":8},{"type":33,"value":66}," is a reputable ",{"type":27,"tag":42,"props":68,"children":71},{"href":69,"rel":70},"https://github.com/automatisch/automatisch",[46],[72],{"type":33,"value":73},"open source",{"type":33,"value":75}," software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.",{"type":27,"tag":28,"props":77,"children":79},{"id":78},"proactive-bug-finding-and-reporting",[80],{"type":33,"value":81},"Proactive Bug Finding and Reporting",{"type":27,"tag":83,"props":84,"children":86},"h3",{"id":85},"our-approach-to-reporting-bugs",[87],{"type":33,"value":88},"Our approach to reporting bugs",{"type":27,"tag":36,"props":90,"children":91},{},[92],{"type":33,"value":93},"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections",{"type":27,"tag":95,"props":96,"children":97},"ul",{},[98,110,120],{"type":27,"tag":99,"props":100,"children":101},"li",{},[102,108],{"type":27,"tag":103,"props":104,"children":105},"strong",{},[106],{"type":33,"value":107},"Overview",{"type":33,"value":109},": A Quick overview of the bug found, which generally includes an image",{"type":27,"tag":99,"props":111,"children":112},{},[113,118],{"type":27,"tag":103,"props":114,"children":115},{},[116],{"type":33,"value":117},"Reproduction",{"type":33,"value":119},": Detailed list of instructions for reproducing the bug",{"type":27,"tag":99,"props":121,"children":122},{},[123,128],{"type":27,"tag":103,"props":124,"children":125},{},[126],{"type":33,"value":127},"Improvements",{"type":33,"value":129},": Suggestions for how to resolve the bug and improve the software",{"type":27,"tag":36,"props":131,"children":132},{},[133],{"type":33,"value":134},"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.",{"type":27,"tag":83,"props":136,"children":138},{"id":137},"some-bugs-we-found",[139],{"type":33,"value":140},"Some Bugs We Found",{"type":27,"tag":36,"props":142,"children":143},{},[144,154],{"type":27,"tag":103,"props":145,"children":146},{},[147],{"type":27,"tag":42,"props":148,"children":151},{"href":149,"rel":150},"https://github.com/automatisch/automatisch/issues/1371",[46],[152],{"type":33,"value":153},"Recreating deleted users",{"type":33,"value":155},": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.",{"type":27,"tag":36,"props":157,"children":158},{},[159,169],{"type":27,"tag":103,"props":160,"children":161},{},[162],{"type":27,"tag":42,"props":163,"children":166},{"href":164,"rel":165},"https://github.com/automatisch/automatisch/issues/1370",[46],[167],{"type":33,"value":168},"Inconsistent interface conveying permissions",{"type":33,"value":170},": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could",{"type":27,"tag":36,"props":172,"children":173},{},[174,184],{"type":27,"tag":103,"props":175,"children":176},{},[177],{"type":27,"tag":42,"props":178,"children":181},{"href":179,"rel":180},"https://github.com/automatisch/automatisch/issues/1366",[46],[182],{"type":33,"value":183},"Deleting roles edge case",{"type":33,"value":185},": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.",{"type":27,"tag":36,"props":187,"children":188},{},[189,199],{"type":27,"tag":103,"props":190,"children":191},{},[192],{"type":27,"tag":42,"props":193,"children":196},{"href":194,"rel":195},"https://github.com/automatisch/automatisch/issues/1235",[46],[197],{"type":33,"value":198},"Invalidating GitHub OAuth error",{"type":33,"value":200},": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.",{"type":27,"tag":28,"props":202,"children":204},{"id":203},"dive-into-testing",[205],{"type":33,"value":206},"Dive into Testing",{"type":27,"tag":36,"props":208,"children":209},{},[210],{"type":33,"value":211},"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.",{"type":27,"tag":83,"props":213,"children":215},{"id":214},"refactoring-workflow-tests",[216],{"type":33,"value":217},"Refactoring Workflow Tests",{"type":27,"tag":36,"props":219,"children":220},{},[221,223,230],{"type":33,"value":222},"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's ",{"type":27,"tag":224,"props":225,"children":227},"code",{"className":226},[],[228],{"type":33,"value":229},"test.step",{"type":33,"value":231}," interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.",{"type":27,"tag":83,"props":233,"children":235},{"id":234},"user-management",[236],{"type":33,"value":237},"User Management",{"type":27,"tag":36,"props":239,"children":240},{},[241],{"type":33,"value":242},"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.",{"type":27,"tag":36,"props":244,"children":245},{},[246],{"type":33,"value":247},"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username.",{"type":27,"tag":36,"props":249,"children":250},{},[251],{"type":33,"value":252},"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.",{"type":27,"tag":36,"props":254,"children":255},{},[256],{"type":33,"value":257},"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.",{"type":27,"tag":36,"props":259,"children":260},{},[261,263,269],{"type":33,"value":262},"We overcame these challenges by upgrading the library used so we could put ",{"type":27,"tag":224,"props":264,"children":266},{"className":265},[],[267],{"type":33,"value":268},"data-",{"type":33,"value":270}," props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.",{"type":27,"tag":83,"props":272,"children":274},{"id":273},"role-management",[275],{"type":33,"value":276},"Role Management",{"type":27,"tag":36,"props":278,"children":279},{},[280],{"type":33,"value":281},"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.",{"type":27,"tag":36,"props":283,"children":284},{},[285],{"type":33,"value":286},"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.",{"type":27,"tag":36,"props":288,"children":289},{},[290],{"type":33,"value":291},"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.",{"type":27,"tag":28,"props":293,"children":295},{"id":294},"ci-pipeline-enhancements",[296],{"type":33,"value":297},"CI Pipeline Enhancements",{"type":27,"tag":36,"props":299,"children":300},{},[301],{"type":33,"value":302},"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.",{"type":27,"tag":28,"props":304,"children":306},{"id":305},"tangible-value",[307],{"type":33,"value":308},"Tangible Value",{"type":27,"tag":36,"props":310,"children":311},{},[312],{"type":33,"value":313},"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.",{"title":7,"searchDepth":315,"depth":315,"links":316},2,[317,318,319,324,329,330],{"id":30,"depth":315,"text":34},{"id":53,"depth":315,"text":56},{"id":78,"depth":315,"text":81,"children":320},[321,323],{"id":85,"depth":322,"text":88},3,{"id":137,"depth":322,"text":140},{"id":203,"depth":315,"text":206,"children":325},[326,327,328],{"id":214,"depth":322,"text":217},{"id":234,"depth":322,"text":237},{"id":273,"depth":322,"text":276},{"id":294,"depth":315,"text":297},{"id":305,"depth":315,"text":308},"markdown","content:case-studies:automatisch.md","content","case-studies/automatisch.md","md",1714258649729] \ No newline at end of file diff --git a/case-studies/automatisch/index.html b/case-studies/automatisch/index.html index b536ddb..faee8b2 100644 --- a/case-studies/automatisch/index.html +++ b/case-studies/automatisch/index.html @@ -1,8 +1,8 @@ Automatisch - A QAComet Case Study - - + + @@ -22,40 +22,40 @@ - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + -

Automatisch

Going from the launch pad to the cosmos with E2E testing

February 26, 2024

Improving Software Quality and Testing Infrastructure for Automatisch

We recently collaborated with an open source no-code automation company called Automatisch and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.

Automatisch: The Open Source Zapier Alternative

Automatisch is a reputable open source software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.

Proactive Bug Finding and Reporting

Our approach to reporting bugs

While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections

  • Overview: A Quick overview of the bug found, which generally includes an image
  • Reproduction: Detailed list of instructions for reproducing the bug
  • Improvements: Suggestions for how to resolve the bug and improve the software

Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.

Some Bugs We Found

Recreating deleted users: If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.

Inconsistent interface conveying permissions: If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could

Deleting roles edge case: If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.

Invalidating GitHub OAuth error: If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.

Dive into Testing

Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.

Refactoring Workflow Tests

The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's test.step interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.

User Management

After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.

Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior. -Note that when a user accesses Automatisch, they must provide their email address as a username.

We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.

One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.

We overcame these challenges by upgrading the library used so we could put data- props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.

Role Management

Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.

We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.

In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.

CI Pipeline Enhancements

Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.

Tangible Value

Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.

I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product.Ali B.
- \ No newline at end of file +

Automatisch

Going from the launch pad to the cosmos with E2E testing

February 26, 2024

Improving Software Quality and Testing Infrastructure for Automatisch

We recently collaborated with an open source no-code automation company called Automatisch and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.

Automatisch: The Open Source Zapier Alternative

Automatisch is a reputable open source software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.

Proactive Bug Finding and Reporting

Our approach to reporting bugs

While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections

  • Overview: A Quick overview of the bug found, which generally includes an image
  • Reproduction: Detailed list of instructions for reproducing the bug
  • Improvements: Suggestions for how to resolve the bug and improve the software

Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.

Some Bugs We Found

Recreating deleted users: If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.

Inconsistent interface conveying permissions: If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could

Deleting roles edge case: If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.

Invalidating GitHub OAuth error: If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.

Dive into Testing

Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.

Refactoring Workflow Tests

The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's test.step interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.

User Management

After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.

Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior. +Note that when a user accesses Automatisch, they must provide their email address as a username.

We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.

One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.

We overcame these challenges by upgrading the library used so we could put data- props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.

Role Management

Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.

We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.

In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.

CI Pipeline Enhancements

Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.

Tangible Value

Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.

I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product.Ali B.
+ \ No newline at end of file diff --git a/case-studies/index.html b/case-studies/index.html index 1d5a5ce..1947f10 100644 --- a/case-studies/index.html +++ b/case-studies/index.html @@ -1,8 +1,8 @@ QAComet | Case Studies - - + + @@ -21,22 +21,22 @@ - + - - - - - - - - - - - - - + + + + + + + + + + + + + -

Case Studies

A showcase of some recent work we've done

Feb
26
2024

Automatisch

We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase. Continue Reading

- \ No newline at end of file +

Case Studies

A showcase of some recent work we've done

Feb
26
2024

Automatisch

We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase. Continue Reading

+ \ No newline at end of file diff --git a/index.html b/index.html index 01c1fa0..04abd84 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,8 @@ QAComet - QA as a service for only $5k/month - - + + @@ -10,7 +10,7 @@ - + @@ -21,44 +21,44 @@ - + - + - - + + - + - - - - - - - - - - - - + + + + + + + + + + + + - -

Blast your Startup to the Cosmos

QAComet: Subscription-Based Quality Assurance for your SaaS

We've Revamped QA

Now it's an Asnyc Workflow
Orbiting around your Product

Schedule

Subscribe to our service and submit as many tickets as you want on our Github Project board.

Receive

You'll see a response with a full QA report, test code, etc. within 2-3 business days

Update

We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.

Recent QA Work

Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier.Ali B.

Subscription Benefits

A Constellation of QA and Testing Services for Robust Launches of New Products and Features

Sales Funnel Testing

Find bugs before potential customers leave from frustration

Usability Testing

Extensive usability tests for those hard to find edge cases and bugs

E2E Testing

We'll test user workflows guaranteeing minimal functionality before deployment

Multi-Browser Support

We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac

Regression Testing

Make sure bug fixes don't revert, especially for core functionality

Integration Testing

Ensure your systems are coordinating together

Clear Pricing

Building great products is hard,
pricing shouldn't be

$4,999/mo

Billed monthly
no contracts, no commitments

Pause or cancel anytime

Signup
1 request at a time
2 week $50 trial
2-3 business day delivery
Unlimited users
No contracts, pause or cancel anytime
Curious how QAComet will work for you?
Book a call

FAQ's

Why wouldn't I just hire a full-time QA engineer?
Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.
Which frameworks do you use for testing?
We mainly write tests in javascript using Playwright. We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.
What kind of platforms do you offer testing on?
We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.
How can I run these tests?
Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.
How quickly will tests be ready?
We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.
Can we use another project management tool?
We can, but that's an add on cost since it slows down our workflow.
How are projects split up?
You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.
How can I get started?
You can click on the "Start Today" button in the navbar and it will take you to the registration section.
Do you offer yearly pricing?
Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!
Can I get a refund if I'm not satisfied?
We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.

Book a call and see if QAComet works for you

Receive a guided tour through our QA process and find out how your company can benefit from QAComet.

Book a call
- \ No newline at end of file + +

Blast your Startup to the Cosmos

QAComet: Subscription-Based Quality Assurance for your SaaS

We've Revamped QA

Now it's an Asnyc Workflow
Orbiting around your Product

Schedule

Subscribe to our service and submit as many tickets as you want on our Github Project board.

Receive

You'll see a response with a full QA report, test code, etc. within 2-3 business days

Update

We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.

Recent QA Work

Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier.Ali B.

Subscription Benefits

A Constellation of QA and Testing Services for Robust Launches of New Products and Features

Sales Funnel Testing

Find bugs before potential customers leave from frustration

Usability Testing

Extensive usability tests for those hard to find edge cases and bugs

E2E Testing

We'll test user workflows guaranteeing minimal functionality before deployment

Multi-Browser Support

We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac

Regression Testing

Make sure bug fixes don't revert, especially for core functionality

Integration Testing

Ensure your systems are coordinating together

Clear Pricing

Building great products is hard,
pricing shouldn't be

$4,999/mo

Billed monthly
no contracts, no commitments

Pause or cancel anytime

Signup
1 request at a time
2 week $50 trial
2-3 business day delivery
Unlimited users
No contracts, pause or cancel anytime
Curious how QAComet will work for you?
Book a call

FAQ's

Why wouldn't I just hire a full-time QA engineer?
Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.
Which frameworks do you use for testing?
We mainly write tests in javascript using Playwright. We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.
What kind of platforms do you offer testing on?
We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.
How can I run these tests?
Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.
How quickly will tests be ready?
We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.
Can we use another project management tool?
We can, but that's an add on cost since it slows down our workflow.
How are projects split up?
You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.
How can I get started?
You can click on the "Start Today" button in the navbar and it will take you to the registration section.
Do you offer yearly pricing?
Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!
Can I get a refund if I'm not satisfied?
We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.

Book a call and see if QAComet works for you

Receive a guided tour through our QA process and find out how your company can benefit from QAComet.

Book a call
+ \ No newline at end of file diff --git a/playwright/_payload.json b/playwright/_payload.json index 3fb43f1..55819c8 100644 --- a/playwright/_payload.json +++ b/playwright/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":22},["Reactive",2],{"playwright-posts":3},[4,14],{"title":5,"shortDescription":6,"created":7,"link":13},"How importing from Playwright works","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":8,"number":9,"month":10,"day":11,"year":12},"March 13, 2024",1710309600000,"Mar",13,2024,"/playwright/how-playwright-initializes",{"title":15,"link":16,"created":17,"shortDescription":21},"Architecture of Playwright","/playwright/architecture",{"string":18,"number":19,"month":10,"day":20,"year":12},"March 11, 2024",1710136800000,11,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",1714069923290] \ No newline at end of file +[{"data":1,"prerenderedAt":22},["Reactive",2],{"playwright-posts":3},[4,14],{"title":5,"shortDescription":6,"created":7,"link":13},"How importing from Playwright works","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":8,"number":9,"month":10,"day":11,"year":12},"March 13, 2024",1710309600000,"Mar",13,2024,"/playwright/how-playwright-initializes",{"title":15,"link":16,"created":17,"shortDescription":21},"Architecture of Playwright","/playwright/architecture",{"string":18,"number":19,"month":10,"day":20,"year":12},"March 11, 2024",1710136800000,11,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",1714258642226] \ No newline at end of file diff --git a/playwright/architecture/_payload.json b/playwright/architecture/_payload.json index 9185390..e8fca51 100644 --- a/playwright/architecture/_payload.json +++ b/playwright/architecture/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1344},["Reactive",2],{"blog-post-playwright/architecture":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"link":4,"created":17,"shortDescription":23,"body":24,"_type":1339,"_id":1340,"_source":1341,"_file":1342,"_extension":1343},"/playwright/architecture","playwright",false,"","Architecture of Playwright","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"Architecture","/playwright/architecture/",{"string":18,"number":19,"month":20,"day":21,"year":22},"March 11, 2024",1710136800000,"Mar",11,2024,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",{"type":25,"children":26,"toc":1327},"root",[27,38,46,71,116,121,127,132,195,208,301,343,412,418,423,430,435,483,514,520,542,573,579,601,632,638,652,716,722,727,766,824,852,886,918,929,996,1008,1196,1253,1305,1311,1316,1321],{"type":28,"tag":29,"props":30,"children":31},"element","p",{},[32],{"type":28,"tag":33,"props":34,"children":37},"img",{"alt":35,"src":36},"Diagram of Playwright's architecture","/img/playwright/architecture_diagram.jpg",[],{"type":28,"tag":39,"props":40,"children":42},"h2",{"id":41},"intro",[43],{"type":44,"value":45},"text","Intro",{"type":28,"tag":29,"props":47,"children":48},{},[49,51,60,62,69],{"type":44,"value":50},"When you load up the ",{"type":28,"tag":52,"props":53,"children":57},"a",{"href":54,"rel":55},"https://github.com/microsoft/playwright",[56],"nofollow",[58],{"type":44,"value":59},"repository",{"type":44,"value":61}," for the Playwright library, you may be overwhelmed by the numerous packages living both inside the ",{"type":28,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":44,"value":68},"packages",{"type":44,"value":70}," folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import",{"type":28,"tag":72,"props":73,"children":78},"pre",{"className":74,"code":75,"filename":76,"language":77,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { test, chromium } from \"@playwright/test\";\n","example-script.ts","ts",[79],{"type":28,"tag":63,"props":80,"children":81},{"__ignoreMap":7},[82],{"type":28,"tag":83,"props":84,"children":87},"span",{"class":85,"line":86},"line",1,[88,94,100,105,111],{"type":28,"tag":83,"props":89,"children":91},{"style":90},"--shiki-default:#F97583",[92],{"type":44,"value":93},"import",{"type":28,"tag":83,"props":95,"children":97},{"style":96},"--shiki-default:#E1E4E8",[98],{"type":44,"value":99}," { test, chromium } ",{"type":28,"tag":83,"props":101,"children":102},{"style":90},[103],{"type":44,"value":104},"from",{"type":28,"tag":83,"props":106,"children":108},{"style":107},"--shiki-default:#9ECBFF",[109],{"type":44,"value":110}," \"@playwright/test\"",{"type":28,"tag":83,"props":112,"children":113},{"style":96},[114],{"type":44,"value":115},";\n",{"type":28,"tag":29,"props":117,"children":118},{},[119],{"type":44,"value":120},"making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project.",{"type":28,"tag":39,"props":122,"children":124},{"id":123},"root-directory",[125],{"type":44,"value":126},"Root directory",{"type":28,"tag":29,"props":128,"children":129},{},[130],{"type":44,"value":131},"In the root directory we find the following folders",{"type":28,"tag":72,"props":133,"children":138},{"className":134,"code":135,"filename":136,"language":137,"meta":7,"style":7},"language-console shiki shiki-themes github-dark","browser_patches/\ndocs/\nexamples/\npackages/\ntests/\nutils/\n","playwright/","console",[139],{"type":28,"tag":63,"props":140,"children":141},{"__ignoreMap":7},[142,150,159,168,177,186],{"type":28,"tag":83,"props":143,"children":144},{"class":85,"line":86},[145],{"type":28,"tag":83,"props":146,"children":147},{},[148],{"type":44,"value":149},"browser_patches/\n",{"type":28,"tag":83,"props":151,"children":153},{"class":85,"line":152},2,[154],{"type":28,"tag":83,"props":155,"children":156},{},[157],{"type":44,"value":158},"docs/\n",{"type":28,"tag":83,"props":160,"children":162},{"class":85,"line":161},3,[163],{"type":28,"tag":83,"props":164,"children":165},{},[166],{"type":44,"value":167},"examples/\n",{"type":28,"tag":83,"props":169,"children":171},{"class":85,"line":170},4,[172],{"type":28,"tag":83,"props":173,"children":174},{},[175],{"type":44,"value":176},"packages/\n",{"type":28,"tag":83,"props":178,"children":180},{"class":85,"line":179},5,[181],{"type":28,"tag":83,"props":182,"children":183},{},[184],{"type":44,"value":185},"tests/\n",{"type":28,"tag":83,"props":187,"children":189},{"class":85,"line":188},6,[190],{"type":28,"tag":83,"props":191,"children":192},{},[193],{"type":44,"value":194},"utils/\n",{"type":28,"tag":29,"props":196,"children":197},{},[198,200,206],{"type":44,"value":199},"along with the ",{"type":28,"tag":63,"props":201,"children":203},{"className":202},[],[204],{"type":44,"value":205},"package.json",{"type":44,"value":207}," which includes the following keys",{"type":28,"tag":72,"props":209,"children":213},{"className":210,"code":211,"filename":205,"language":212,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n \"name\": \"playwright-internal\",\n \"private\": true,\n \"workspaces\": [\"packages/*\"]\n}\n","json",[214],{"type":28,"tag":63,"props":215,"children":216},{"__ignoreMap":7},[217,225,249,270,293],{"type":28,"tag":83,"props":218,"children":219},{"class":85,"line":86},[220],{"type":28,"tag":83,"props":221,"children":222},{"style":96},[223],{"type":44,"value":224},"{\n",{"type":28,"tag":83,"props":226,"children":227},{"class":85,"line":152},[228,234,239,244],{"type":28,"tag":83,"props":229,"children":231},{"style":230},"--shiki-default:#79B8FF",[232],{"type":44,"value":233}," \"name\"",{"type":28,"tag":83,"props":235,"children":236},{"style":96},[237],{"type":44,"value":238},": ",{"type":28,"tag":83,"props":240,"children":241},{"style":107},[242],{"type":44,"value":243},"\"playwright-internal\"",{"type":28,"tag":83,"props":245,"children":246},{"style":96},[247],{"type":44,"value":248},",\n",{"type":28,"tag":83,"props":250,"children":251},{"class":85,"line":161},[252,257,261,266],{"type":28,"tag":83,"props":253,"children":254},{"style":230},[255],{"type":44,"value":256}," \"private\"",{"type":28,"tag":83,"props":258,"children":259},{"style":96},[260],{"type":44,"value":238},{"type":28,"tag":83,"props":262,"children":263},{"style":230},[264],{"type":44,"value":265},"true",{"type":28,"tag":83,"props":267,"children":268},{"style":96},[269],{"type":44,"value":248},{"type":28,"tag":83,"props":271,"children":272},{"class":85,"line":170},[273,278,283,288],{"type":28,"tag":83,"props":274,"children":275},{"style":230},[276],{"type":44,"value":277}," \"workspaces\"",{"type":28,"tag":83,"props":279,"children":280},{"style":96},[281],{"type":44,"value":282},": [",{"type":28,"tag":83,"props":284,"children":285},{"style":107},[286],{"type":44,"value":287},"\"packages/*\"",{"type":28,"tag":83,"props":289,"children":290},{"style":96},[291],{"type":44,"value":292},"]\n",{"type":28,"tag":83,"props":294,"children":295},{"class":85,"line":179},[296],{"type":28,"tag":83,"props":297,"children":298},{"style":96},[299],{"type":44,"value":300},"}\n",{"type":28,"tag":29,"props":302,"children":303},{},[304,306,311,313,319,321,326,328,334,336,341],{"type":44,"value":305},"The ",{"type":28,"tag":63,"props":307,"children":309},{"className":308},[],[310],{"type":44,"value":205},{"type":44,"value":312}," gives us the hint the core functionality is within the ",{"type":28,"tag":63,"props":314,"children":316},{"className":315},[],[317],{"type":44,"value":318},"packages/",{"type":44,"value":320}," directory since the root ",{"type":28,"tag":63,"props":322,"children":324},{"className":323},[],[325],{"type":44,"value":205},{"type":44,"value":327}," file is labelled private, has \"internal\" in its name, and uses the ",{"type":28,"tag":63,"props":329,"children":331},{"className":330},[],[332],{"type":44,"value":333},"\"workspaces\"",{"type":44,"value":335}," key, which tells node this project has multiple packages. Let's go over the other top-level directories real quick before diving into the ",{"type":28,"tag":63,"props":337,"children":339},{"className":338},[],[340],{"type":44,"value":318},{"type":44,"value":342}," folder",{"type":28,"tag":344,"props":345,"children":346},"ul",{},[347,359,379,390,401],{"type":28,"tag":348,"props":349,"children":350},"li",{},[351,357],{"type":28,"tag":63,"props":352,"children":354},{"className":353},[],[355],{"type":44,"value":356},"browser_patches",{"type":44,"value":358}," - This folder contains browser patches improving adding additional controls and features to some of the browser engines used within this project. Interestingly, this give a patch to webkit so it can run within Windows.",{"type":28,"tag":348,"props":360,"children":361},{},[362,368,370,377],{"type":28,"tag":63,"props":363,"children":365},{"className":364},[],[366],{"type":44,"value":367},"docs",{"type":44,"value":369}," - The docs folder contains markdown files which compile to the documentation found on ",{"type":28,"tag":52,"props":371,"children":374},{"href":372,"rel":373},"https://playwright.dev/docs/intro",[56],[375],{"type":44,"value":376},"the Playwright docs",{"type":44,"value":378},".",{"type":28,"tag":348,"props":380,"children":381},{},[382,388],{"type":28,"tag":63,"props":383,"children":385},{"className":384},[],[386],{"type":44,"value":387},"examples",{"type":44,"value":389}," - Here are examples of test scripts to refer to, while getting started with using the Playwright project.",{"type":28,"tag":348,"props":391,"children":392},{},[393,399],{"type":28,"tag":63,"props":394,"children":396},{"className":395},[],[397],{"type":44,"value":398},"tests",{"type":44,"value":400}," - Even testing libraries should have automated tests, which are written in Playwright.",{"type":28,"tag":348,"props":402,"children":403},{},[404,410],{"type":28,"tag":63,"props":405,"children":407},{"className":406},[],[408],{"type":44,"value":409},"utils",{"type":44,"value":411}," - The utils directory contains miscellaneous tools used during build time, docker images, functionality for Azure, a types file generator, and more.",{"type":28,"tag":39,"props":413,"children":415},{"id":414},"packages-directory",[416],{"type":44,"value":417},"Packages directory",{"type":28,"tag":29,"props":419,"children":420},{},[421],{"type":44,"value":422},"The packages directory contains over 20 separate packages, making it more difficult to understand. We will split up this list into easy-to-understand partitions.",{"type":28,"tag":424,"props":425,"children":427},"h3",{"id":426},"test-reportinggeneration-packages",[428],{"type":44,"value":429},"Test reporting/generation packages",{"type":28,"tag":29,"props":431,"children":432},{},[433],{"type":44,"value":434},"Playwright contains many different test reporting packages each with their own set of functionalities. Briefly, the list of packages in this category is",{"type":28,"tag":72,"props":436,"children":439},{"className":134,"code":437,"filename":438,"language":137,"meta":7,"style":7},"html-reporter/\nrecorder/\ntrace-viewer/\ntrace/\nweb/\n","playwright/packages",[440],{"type":28,"tag":63,"props":441,"children":442},{"__ignoreMap":7},[443,451,459,467,475],{"type":28,"tag":83,"props":444,"children":445},{"class":85,"line":86},[446],{"type":28,"tag":83,"props":447,"children":448},{},[449],{"type":44,"value":450},"html-reporter/\n",{"type":28,"tag":83,"props":452,"children":453},{"class":85,"line":152},[454],{"type":28,"tag":83,"props":455,"children":456},{},[457],{"type":44,"value":458},"recorder/\n",{"type":28,"tag":83,"props":460,"children":461},{"class":85,"line":161},[462],{"type":28,"tag":83,"props":463,"children":464},{},[465],{"type":44,"value":466},"trace-viewer/\n",{"type":28,"tag":83,"props":468,"children":469},{"class":85,"line":170},[470],{"type":28,"tag":83,"props":471,"children":472},{},[473],{"type":44,"value":474},"trace/\n",{"type":28,"tag":83,"props":476,"children":477},{"class":85,"line":179},[478],{"type":28,"tag":83,"props":479,"children":480},{},[481],{"type":44,"value":482},"web/\n",{"type":28,"tag":29,"props":484,"children":485},{},[486,488,495,497,504,506,512],{"type":44,"value":487},"which contains the code associated with either handling test reports or ",{"type":28,"tag":52,"props":489,"children":492},{"href":490,"rel":491},"https://playwright.dev/docs/codegen-intro",[56],[493],{"type":44,"value":494},"generating",{"type":44,"value":496}," them with the recorder package. In addition, there is the ",{"type":28,"tag":52,"props":498,"children":501},{"href":499,"rel":500},"https://playwright.dev/docs/trace-viewer",[56],[502],{"type":44,"value":503},"trace and trace viewer",{"type":44,"value":505}," which can be recorded during playwright test runs. In addition, the ",{"type":28,"tag":63,"props":507,"children":509},{"className":508},[],[510],{"type":44,"value":511},"web/",{"type":44,"value":513}," package provides utilities shared across the various web-based tools listed here.",{"type":28,"tag":424,"props":515,"children":517},{"id":516},"browser-specialized-packages",[518],{"type":44,"value":519},"Browser specialized packages",{"type":28,"tag":29,"props":521,"children":522},{},[523,525,531,533,540],{"type":44,"value":524},"Each of the packages here are simply exports of the ",{"type":28,"tag":63,"props":526,"children":528},{"className":527},[],[529],{"type":44,"value":530},"playwright-core",{"type":44,"value":532}," package along with an install script for the associated browser only. You can find them on npmjs, for example, ",{"type":28,"tag":52,"props":534,"children":537},{"href":535,"rel":536},"https://www.npmjs.com/package/playwright-chromium",[56],[538],{"type":44,"value":539},"playwright-chromium",{"type":44,"value":541}," is its own package which has playwright specialized for only automating chromium.",{"type":28,"tag":72,"props":543,"children":545},{"className":134,"code":544,"filename":438,"language":137,"meta":7,"style":7},"playwright-chromium/\nplaywright-firefox/\nplaywright-webkit/\n",[546],{"type":28,"tag":63,"props":547,"children":548},{"__ignoreMap":7},[549,557,565],{"type":28,"tag":83,"props":550,"children":551},{"class":85,"line":86},[552],{"type":28,"tag":83,"props":553,"children":554},{},[555],{"type":44,"value":556},"playwright-chromium/\n",{"type":28,"tag":83,"props":558,"children":559},{"class":85,"line":152},[560],{"type":28,"tag":83,"props":561,"children":562},{},[563],{"type":44,"value":564},"playwright-firefox/\n",{"type":28,"tag":83,"props":566,"children":567},{"class":85,"line":161},[568],{"type":28,"tag":83,"props":569,"children":570},{},[571],{"type":44,"value":572},"playwright-webkit/\n",{"type":28,"tag":424,"props":574,"children":576},{"id":575},"browser-installation-packages",[577],{"type":44,"value":578},"Browser installation packages",{"type":28,"tag":29,"props":580,"children":581},{},[582,584,591,593,599],{"type":44,"value":583},"The packages listed here only include install scripts for each of the browsers. For example, ",{"type":28,"tag":52,"props":585,"children":588},{"href":586,"rel":587},"https://www.npmjs.com/package/@playwright/browser-chromium",[56],[589],{"type":44,"value":590},"playwright-browser-chromium",{"type":44,"value":592}," corresponds to the ",{"type":28,"tag":63,"props":594,"children":596},{"className":595},[],[597],{"type":44,"value":598},"@playwright/browser-chromium",{"type":44,"value":600}," package on npmjs.",{"type":28,"tag":72,"props":602,"children":604},{"className":134,"code":603,"filename":438,"language":137,"meta":7,"style":7},"playwright-browser-chromium/\nplaywright-browser-firefox/\nplaywright-browser-webkit/\n",[605],{"type":28,"tag":63,"props":606,"children":607},{"__ignoreMap":7},[608,616,624],{"type":28,"tag":83,"props":609,"children":610},{"class":85,"line":86},[611],{"type":28,"tag":83,"props":612,"children":613},{},[614],{"type":44,"value":615},"playwright-browser-chromium/\n",{"type":28,"tag":83,"props":617,"children":618},{"class":85,"line":152},[619],{"type":28,"tag":83,"props":620,"children":621},{},[622],{"type":44,"value":623},"playwright-browser-firefox/\n",{"type":28,"tag":83,"props":625,"children":626},{"class":85,"line":161},[627],{"type":28,"tag":83,"props":628,"children":629},{},[630],{"type":44,"value":631},"playwright-browser-webkit/\n",{"type":28,"tag":424,"props":633,"children":635},{"id":634},"component-testing-packages",[636],{"type":44,"value":637},"Component testing packages",{"type":28,"tag":29,"props":639,"children":640},{},[641,643,650],{"type":44,"value":642},"These packages are all associated to the ",{"type":28,"tag":52,"props":644,"children":647},{"href":645,"rel":646},"https://playwright.dev/docs/test-components",[56],[648],{"type":44,"value":649},"experimental component testing framework",{"type":44,"value":651}," in playwright. These give functionality to playwright similar to how Jest can render individual components for different libraries.",{"type":28,"tag":72,"props":653,"children":655},{"className":134,"code":654,"filename":438,"language":137,"meta":7,"style":7},"playwright-ct-core/\nplaywright-ct-react/\nplaywright-ct-react17/\nplaywright-ct-solid/\nplaywright-ct-svelte/\nplaywright-ct-vue/\nplaywright-ct-vue2/\n",[656],{"type":28,"tag":63,"props":657,"children":658},{"__ignoreMap":7},[659,667,675,683,691,699,707],{"type":28,"tag":83,"props":660,"children":661},{"class":85,"line":86},[662],{"type":28,"tag":83,"props":663,"children":664},{},[665],{"type":44,"value":666},"playwright-ct-core/\n",{"type":28,"tag":83,"props":668,"children":669},{"class":85,"line":152},[670],{"type":28,"tag":83,"props":671,"children":672},{},[673],{"type":44,"value":674},"playwright-ct-react/\n",{"type":28,"tag":83,"props":676,"children":677},{"class":85,"line":161},[678],{"type":28,"tag":83,"props":679,"children":680},{},[681],{"type":44,"value":682},"playwright-ct-react17/\n",{"type":28,"tag":83,"props":684,"children":685},{"class":85,"line":170},[686],{"type":28,"tag":83,"props":687,"children":688},{},[689],{"type":44,"value":690},"playwright-ct-solid/\n",{"type":28,"tag":83,"props":692,"children":693},{"class":85,"line":179},[694],{"type":28,"tag":83,"props":695,"children":696},{},[697],{"type":44,"value":698},"playwright-ct-svelte/\n",{"type":28,"tag":83,"props":700,"children":701},{"class":85,"line":188},[702],{"type":28,"tag":83,"props":703,"children":704},{},[705],{"type":44,"value":706},"playwright-ct-vue/\n",{"type":28,"tag":83,"props":708,"children":710},{"class":85,"line":709},7,[711],{"type":28,"tag":83,"props":712,"children":713},{},[714],{"type":44,"value":715},"playwright-ct-vue2/\n",{"type":28,"tag":424,"props":717,"children":719},{"id":718},"core-functionality-packages",[720],{"type":44,"value":721},"Core functionality packages",{"type":28,"tag":29,"props":723,"children":724},{},[725],{"type":44,"value":726},"Finally, we reach the core packages provided in playwright, which contain all of the main functionality of the playwright project.",{"type":28,"tag":72,"props":728,"children":730},{"className":134,"code":729,"filename":438,"language":137,"meta":7,"style":7},"playwright-core/\nplaywright-test/\nplaywright/\nprotocol/\n",[731],{"type":28,"tag":63,"props":732,"children":733},{"__ignoreMap":7},[734,742,750,758],{"type":28,"tag":83,"props":735,"children":736},{"class":85,"line":86},[737],{"type":28,"tag":83,"props":738,"children":739},{},[740],{"type":44,"value":741},"playwright-core/\n",{"type":28,"tag":83,"props":743,"children":744},{"class":85,"line":152},[745],{"type":28,"tag":83,"props":746,"children":747},{},[748],{"type":44,"value":749},"playwright-test/\n",{"type":28,"tag":83,"props":751,"children":752},{"class":85,"line":161},[753],{"type":28,"tag":83,"props":754,"children":755},{},[756],{"type":44,"value":757},"playwright/\n",{"type":28,"tag":83,"props":759,"children":760},{"class":85,"line":170},[761],{"type":28,"tag":83,"props":762,"children":763},{},[764],{"type":44,"value":765},"protocol/\n",{"type":28,"tag":29,"props":767,"children":768},{},[769,771,777,779,784,786,791,793,799,801,807,809,815,817,822],{"type":44,"value":770},"Note the ",{"type":28,"tag":63,"props":772,"children":774},{"className":773},[],[775],{"type":44,"value":776},"playwright-test",{"type":44,"value":778}," folder is simply a wrapper for binding ",{"type":28,"tag":63,"props":780,"children":782},{"className":781},[],[783],{"type":44,"value":530},{"type":44,"value":785}," and ",{"type":28,"tag":63,"props":787,"children":789},{"className":788},[],[790],{"type":44,"value":5},{"type":44,"value":792}," together in the ",{"type":28,"tag":63,"props":794,"children":796},{"className":795},[],[797],{"type":44,"value":798},"@playwright/test",{"type":44,"value":800}," package installable through npm. If you look in the ",{"type":28,"tag":63,"props":802,"children":804},{"className":803},[],[805],{"type":44,"value":806},"index.js",{"type":44,"value":808}," file, all you'll see is an export of ",{"type":28,"tag":63,"props":810,"children":812},{"className":811},[],[813],{"type":44,"value":814},"playwright/test",{"type":44,"value":816},", which lives in the ",{"type":28,"tag":63,"props":818,"children":820},{"className":819},[],[821],{"type":44,"value":5},{"type":44,"value":823}," package.",{"type":28,"tag":29,"props":825,"children":826},{},[827,829,835,837,842,844,850],{"type":44,"value":828},"Another package to look at briefly is the ",{"type":28,"tag":63,"props":830,"children":832},{"className":831},[],[833],{"type":44,"value":834},"protocol",{"type":44,"value":836}," package which has automatically generated code through some of the build scripts in the ",{"type":28,"tag":63,"props":838,"children":840},{"className":839},[],[841],{"type":44,"value":409},{"type":44,"value":843}," directory of the root directory of the playwright project. This simply contains a YAML file, ",{"type":28,"tag":63,"props":845,"children":847},{"className":846},[],[848],{"type":44,"value":849},"protocol.yml",{"type":44,"value":851},", which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library.",{"type":28,"tag":29,"props":853,"children":854},{},[855,857,862,863,869,871,876,878,884],{"type":44,"value":856},"Now, the two main packages of the entire playwright library are the ",{"type":28,"tag":63,"props":858,"children":860},{"className":859},[],[861],{"type":44,"value":5},{"type":44,"value":785},{"type":28,"tag":63,"props":864,"children":866},{"className":865},[],[867],{"type":44,"value":868},"playwrite-core",{"type":44,"value":870}," packages. The first of which is a wrapper around ",{"type":28,"tag":63,"props":872,"children":874},{"className":873},[],[875],{"type":44,"value":530},{"type":44,"value":877}," and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the ",{"type":28,"tag":63,"props":879,"children":881},{"className":880},[],[882],{"type":44,"value":883},"playwright.config.ts",{"type":44,"value":885}," file, or any of the associated test running code, such as",{"type":28,"tag":72,"props":887,"children":890},{"className":74,"code":888,"filename":889,"language":77,"meta":7,"style":7},"import { test } from \"@playwright/test\";\n","my-test.spec.ts",[891],{"type":28,"tag":63,"props":892,"children":893},{"__ignoreMap":7},[894],{"type":28,"tag":83,"props":895,"children":896},{"class":85,"line":86},[897,901,906,910,914],{"type":28,"tag":83,"props":898,"children":899},{"style":90},[900],{"type":44,"value":93},{"type":28,"tag":83,"props":902,"children":903},{"style":96},[904],{"type":44,"value":905}," { test } ",{"type":28,"tag":83,"props":907,"children":908},{"style":90},[909],{"type":44,"value":104},{"type":28,"tag":83,"props":911,"children":912},{"style":107},[913],{"type":44,"value":110},{"type":28,"tag":83,"props":915,"children":916},{"style":96},[917],{"type":44,"value":115},{"type":28,"tag":29,"props":919,"children":920},{},[921,923,928],{"type":44,"value":922},"then you are likely importing code from the ",{"type":28,"tag":63,"props":924,"children":926},{"className":925},[],[927],{"type":44,"value":5},{"type":44,"value":823},{"type":28,"tag":29,"props":930,"children":931},{},[932,934,939,941,947,949,955,957,962,964,970,972,979,981,987,989,994],{"type":44,"value":933},"The other main package is ",{"type":28,"tag":63,"props":935,"children":937},{"className":936},[],[938],{"type":44,"value":530},{"type":44,"value":940}," which contains all of the browser automation functionality. This functionality is split up into two main components, the ",{"type":28,"tag":63,"props":942,"children":944},{"className":943},[],[945],{"type":44,"value":946},"client",{"type":44,"value":948}," library and the ",{"type":28,"tag":63,"props":950,"children":952},{"className":951},[],[953],{"type":44,"value":954},"server",{"type":44,"value":956}," library. The ",{"type":28,"tag":63,"props":958,"children":960},{"className":959},[],[961],{"type":44,"value":954},{"type":44,"value":963}," library, found in ",{"type":28,"tag":63,"props":965,"children":967},{"className":966},[],[968],{"type":44,"value":969},"packages/playwright-core/src/server",{"type":44,"value":971},", contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the ",{"type":28,"tag":52,"props":973,"children":976},{"href":974,"rel":975},"https://chromedevtools.github.io/devtools-protocol/",[56],[977],{"type":44,"value":978},"Chrome Devtools Protocol",{"type":44,"value":980}," (CDP), or something similar to it, which tells the browser to perform actions like \"click the login button\", \"input 'Hello' into the text form\", or \"navigate to '",{"type":28,"tag":52,"props":982,"children":985},{"href":983,"rel":984},"https://news.ycombinator.com",[56],[986],{"type":44,"value":983},{"type":44,"value":988},"'\". The ",{"type":28,"tag":63,"props":990,"children":992},{"className":991},[],[993],{"type":44,"value":954},{"type":44,"value":995}," library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality.",{"type":28,"tag":29,"props":997,"children":998},{},[999,1001,1006],{"type":44,"value":1000},"On the other hand, the ",{"type":28,"tag":63,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":44,"value":946},{"type":44,"value":1007}," library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like",{"type":28,"tag":72,"props":1009,"children":1012},{"className":74,"code":1010,"filename":1011,"language":77,"meta":7,"style":7},"import { chromium } from \"@playwright/test\";\n\n(async function () {\n const browser = await chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n})();\n","my-automation-script.ts",[1013],{"type":28,"tag":63,"props":1014,"children":1015},{"__ignoreMap":7},[1016,1040,1049,1072,1121,1156,1188],{"type":28,"tag":83,"props":1017,"children":1018},{"class":85,"line":86},[1019,1023,1028,1032,1036],{"type":28,"tag":83,"props":1020,"children":1021},{"style":90},[1022],{"type":44,"value":93},{"type":28,"tag":83,"props":1024,"children":1025},{"style":96},[1026],{"type":44,"value":1027}," { chromium } ",{"type":28,"tag":83,"props":1029,"children":1030},{"style":90},[1031],{"type":44,"value":104},{"type":28,"tag":83,"props":1033,"children":1034},{"style":107},[1035],{"type":44,"value":110},{"type":28,"tag":83,"props":1037,"children":1038},{"style":96},[1039],{"type":44,"value":115},{"type":28,"tag":83,"props":1041,"children":1042},{"class":85,"line":152},[1043],{"type":28,"tag":83,"props":1044,"children":1046},{"emptyLinePlaceholder":1045},true,[1047],{"type":44,"value":1048},"\n",{"type":28,"tag":83,"props":1050,"children":1051},{"class":85,"line":161},[1052,1057,1062,1067],{"type":28,"tag":83,"props":1053,"children":1054},{"style":96},[1055],{"type":44,"value":1056},"(",{"type":28,"tag":83,"props":1058,"children":1059},{"style":90},[1060],{"type":44,"value":1061},"async",{"type":28,"tag":83,"props":1063,"children":1064},{"style":90},[1065],{"type":44,"value":1066}," function",{"type":28,"tag":83,"props":1068,"children":1069},{"style":96},[1070],{"type":44,"value":1071}," () {\n",{"type":28,"tag":83,"props":1073,"children":1074},{"class":85,"line":170},[1075,1080,1085,1090,1095,1100,1106,1111,1116],{"type":28,"tag":83,"props":1076,"children":1077},{"style":90},[1078],{"type":44,"value":1079}," const",{"type":28,"tag":83,"props":1081,"children":1082},{"style":230},[1083],{"type":44,"value":1084}," browser",{"type":28,"tag":83,"props":1086,"children":1087},{"style":90},[1088],{"type":44,"value":1089}," =",{"type":28,"tag":83,"props":1091,"children":1092},{"style":90},[1093],{"type":44,"value":1094}," await",{"type":28,"tag":83,"props":1096,"children":1097},{"style":96},[1098],{"type":44,"value":1099}," chromium.",{"type":28,"tag":83,"props":1101,"children":1103},{"style":1102},"--shiki-default:#B392F0",[1104],{"type":44,"value":1105},"launch",{"type":28,"tag":83,"props":1107,"children":1108},{"style":96},[1109],{"type":44,"value":1110},"({ headless: ",{"type":28,"tag":83,"props":1112,"children":1113},{"style":230},[1114],{"type":44,"value":1115},"false",{"type":28,"tag":83,"props":1117,"children":1118},{"style":96},[1119],{"type":44,"value":1120}," });\n",{"type":28,"tag":83,"props":1122,"children":1123},{"class":85,"line":179},[1124,1128,1133,1137,1141,1146,1151],{"type":28,"tag":83,"props":1125,"children":1126},{"style":90},[1127],{"type":44,"value":1079},{"type":28,"tag":83,"props":1129,"children":1130},{"style":230},[1131],{"type":44,"value":1132}," page",{"type":28,"tag":83,"props":1134,"children":1135},{"style":90},[1136],{"type":44,"value":1089},{"type":28,"tag":83,"props":1138,"children":1139},{"style":90},[1140],{"type":44,"value":1094},{"type":28,"tag":83,"props":1142,"children":1143},{"style":96},[1144],{"type":44,"value":1145}," browser.",{"type":28,"tag":83,"props":1147,"children":1148},{"style":1102},[1149],{"type":44,"value":1150},"newPage",{"type":28,"tag":83,"props":1152,"children":1153},{"style":96},[1154],{"type":44,"value":1155},"();\n",{"type":28,"tag":83,"props":1157,"children":1158},{"class":85,"line":188},[1159,1164,1169,1174,1178,1183],{"type":28,"tag":83,"props":1160,"children":1161},{"style":90},[1162],{"type":44,"value":1163}," await",{"type":28,"tag":83,"props":1165,"children":1166},{"style":96},[1167],{"type":44,"value":1168}," page.",{"type":28,"tag":83,"props":1170,"children":1171},{"style":1102},[1172],{"type":44,"value":1173},"goto",{"type":28,"tag":83,"props":1175,"children":1176},{"style":96},[1177],{"type":44,"value":1056},{"type":28,"tag":83,"props":1179,"children":1180},{"style":107},[1181],{"type":44,"value":1182},"\"https://playwright.dev\"",{"type":28,"tag":83,"props":1184,"children":1185},{"style":96},[1186],{"type":44,"value":1187},");\n",{"type":28,"tag":83,"props":1189,"children":1190},{"class":85,"line":709},[1191],{"type":28,"tag":83,"props":1192,"children":1193},{"style":96},[1194],{"type":44,"value":1195},"})();\n",{"type":28,"tag":29,"props":1197,"children":1198},{},[1199,1201,1207,1209,1215,1217,1223,1224,1230,1232,1237,1239,1244,1246,1251],{"type":44,"value":1200},"really you are importing ",{"type":28,"tag":63,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":44,"value":1206},"chromium",{"type":44,"value":1208}," from an instance of the class in ",{"type":28,"tag":63,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":44,"value":1214},"playwright-core/client/playwright",{"type":44,"value":1216},". Then, calling ",{"type":28,"tag":63,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":44,"value":1222},"browser.newPage",{"type":44,"value":785},{"type":28,"tag":63,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":44,"value":1229},"page.goto",{"type":44,"value":1231}," is making requests to interfaces in the ",{"type":28,"tag":63,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":44,"value":954},{"type":44,"value":1238}," library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the ",{"type":28,"tag":63,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":44,"value":954},{"type":44,"value":1245}," library in the ",{"type":28,"tag":63,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":44,"value":530},{"type":44,"value":1252}," package since it provides a comprehensive and battle tested API for this kind of functionality.",{"type":28,"tag":29,"props":1254,"children":1255},{},[1256,1258,1265,1267,1274,1275,1282,1284,1290,1292,1297,1299,1304],{"type":44,"value":1257},"This splitting of responsibility design pattern works well because it allows for ",{"type":28,"tag":52,"props":1259,"children":1262},{"href":1260,"rel":1261},"https://github.com/microsoft/playwright-python",[56],[1263],{"type":44,"value":1264},"supporting",{"type":44,"value":1266}," ",{"type":28,"tag":52,"props":1268,"children":1271},{"href":1269,"rel":1270},"https://github.com/microsoft/playwright-java/",[56],[1272],{"type":44,"value":1273},"multiple",{"type":44,"value":1266},{"type":28,"tag":52,"props":1276,"children":1279},{"href":1277,"rel":1278},"https://github.com/microsoft/playwright-dotnet",[56],[1280],{"type":44,"value":1281},"languages",{"type":44,"value":1283}," which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ",{"type":28,"tag":63,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":44,"value":1289},"ChannelOwner",{"type":44,"value":1291},") as you would in the the ",{"type":28,"tag":63,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":44,"value":946},{"type":44,"value":1298}," library found in ",{"type":28,"tag":63,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":44,"value":530},{"type":44,"value":378},{"type":28,"tag":39,"props":1306,"children":1308},{"id":1307},"looking-beyond",[1309],{"type":44,"value":1310},"Looking beyond",{"type":28,"tag":29,"props":1312,"children":1313},{},[1314],{"type":44,"value":1315},"Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.",{"type":28,"tag":29,"props":1317,"children":1318},{},[1319],{"type":44,"value":1320},"In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.",{"type":28,"tag":1322,"props":1323,"children":1324},"style",{},[1325],{"type":44,"value":1326},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":152,"depth":152,"links":1328},[1329,1330,1331,1338],{"id":41,"depth":152,"text":45},{"id":123,"depth":152,"text":126},{"id":414,"depth":152,"text":417,"children":1332},[1333,1334,1335,1336,1337],{"id":426,"depth":161,"text":429},{"id":516,"depth":161,"text":519},{"id":575,"depth":161,"text":578},{"id":634,"depth":161,"text":637},{"id":718,"depth":161,"text":721},{"id":1307,"depth":152,"text":1310},"markdown","content:playwright:architecture.md","content","playwright/architecture.md","md",1714069929572] \ No newline at end of file +[{"data":1,"prerenderedAt":1344},["Reactive",2],{"blog-post-playwright/architecture":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"link":4,"created":17,"shortDescription":23,"body":24,"_type":1339,"_id":1340,"_source":1341,"_file":1342,"_extension":1343},"/playwright/architecture","playwright",false,"","Architecture of Playwright","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"Architecture","/playwright/architecture/",{"string":18,"number":19,"month":20,"day":21,"year":22},"March 11, 2024",1710136800000,"Mar",11,2024,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",{"type":25,"children":26,"toc":1327},"root",[27,38,46,71,116,121,127,132,195,208,301,343,412,418,423,430,435,483,514,520,542,573,579,601,632,638,652,716,722,727,766,824,852,886,918,929,996,1008,1196,1253,1305,1311,1316,1321],{"type":28,"tag":29,"props":30,"children":31},"element","p",{},[32],{"type":28,"tag":33,"props":34,"children":37},"img",{"alt":35,"src":36},"Diagram of Playwright's architecture","/img/playwright/architecture_diagram.jpg",[],{"type":28,"tag":39,"props":40,"children":42},"h2",{"id":41},"intro",[43],{"type":44,"value":45},"text","Intro",{"type":28,"tag":29,"props":47,"children":48},{},[49,51,60,62,69],{"type":44,"value":50},"When you load up the ",{"type":28,"tag":52,"props":53,"children":57},"a",{"href":54,"rel":55},"https://github.com/microsoft/playwright",[56],"nofollow",[58],{"type":44,"value":59},"repository",{"type":44,"value":61}," for the Playwright library, you may be overwhelmed by the numerous packages living both inside the ",{"type":28,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":44,"value":68},"packages",{"type":44,"value":70}," folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import",{"type":28,"tag":72,"props":73,"children":78},"pre",{"className":74,"code":75,"filename":76,"language":77,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { test, chromium } from \"@playwright/test\";\n","example-script.ts","ts",[79],{"type":28,"tag":63,"props":80,"children":81},{"__ignoreMap":7},[82],{"type":28,"tag":83,"props":84,"children":87},"span",{"class":85,"line":86},"line",1,[88,94,100,105,111],{"type":28,"tag":83,"props":89,"children":91},{"style":90},"--shiki-default:#F97583",[92],{"type":44,"value":93},"import",{"type":28,"tag":83,"props":95,"children":97},{"style":96},"--shiki-default:#E1E4E8",[98],{"type":44,"value":99}," { test, chromium } ",{"type":28,"tag":83,"props":101,"children":102},{"style":90},[103],{"type":44,"value":104},"from",{"type":28,"tag":83,"props":106,"children":108},{"style":107},"--shiki-default:#9ECBFF",[109],{"type":44,"value":110}," \"@playwright/test\"",{"type":28,"tag":83,"props":112,"children":113},{"style":96},[114],{"type":44,"value":115},";\n",{"type":28,"tag":29,"props":117,"children":118},{},[119],{"type":44,"value":120},"making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project.",{"type":28,"tag":39,"props":122,"children":124},{"id":123},"root-directory",[125],{"type":44,"value":126},"Root directory",{"type":28,"tag":29,"props":128,"children":129},{},[130],{"type":44,"value":131},"In the root directory we find the following folders",{"type":28,"tag":72,"props":133,"children":138},{"className":134,"code":135,"filename":136,"language":137,"meta":7,"style":7},"language-console shiki shiki-themes github-dark","browser_patches/\ndocs/\nexamples/\npackages/\ntests/\nutils/\n","playwright/","console",[139],{"type":28,"tag":63,"props":140,"children":141},{"__ignoreMap":7},[142,150,159,168,177,186],{"type":28,"tag":83,"props":143,"children":144},{"class":85,"line":86},[145],{"type":28,"tag":83,"props":146,"children":147},{},[148],{"type":44,"value":149},"browser_patches/\n",{"type":28,"tag":83,"props":151,"children":153},{"class":85,"line":152},2,[154],{"type":28,"tag":83,"props":155,"children":156},{},[157],{"type":44,"value":158},"docs/\n",{"type":28,"tag":83,"props":160,"children":162},{"class":85,"line":161},3,[163],{"type":28,"tag":83,"props":164,"children":165},{},[166],{"type":44,"value":167},"examples/\n",{"type":28,"tag":83,"props":169,"children":171},{"class":85,"line":170},4,[172],{"type":28,"tag":83,"props":173,"children":174},{},[175],{"type":44,"value":176},"packages/\n",{"type":28,"tag":83,"props":178,"children":180},{"class":85,"line":179},5,[181],{"type":28,"tag":83,"props":182,"children":183},{},[184],{"type":44,"value":185},"tests/\n",{"type":28,"tag":83,"props":187,"children":189},{"class":85,"line":188},6,[190],{"type":28,"tag":83,"props":191,"children":192},{},[193],{"type":44,"value":194},"utils/\n",{"type":28,"tag":29,"props":196,"children":197},{},[198,200,206],{"type":44,"value":199},"along with the ",{"type":28,"tag":63,"props":201,"children":203},{"className":202},[],[204],{"type":44,"value":205},"package.json",{"type":44,"value":207}," which includes the following keys",{"type":28,"tag":72,"props":209,"children":213},{"className":210,"code":211,"filename":205,"language":212,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n \"name\": \"playwright-internal\",\n \"private\": true,\n \"workspaces\": [\"packages/*\"]\n}\n","json",[214],{"type":28,"tag":63,"props":215,"children":216},{"__ignoreMap":7},[217,225,249,270,293],{"type":28,"tag":83,"props":218,"children":219},{"class":85,"line":86},[220],{"type":28,"tag":83,"props":221,"children":222},{"style":96},[223],{"type":44,"value":224},"{\n",{"type":28,"tag":83,"props":226,"children":227},{"class":85,"line":152},[228,234,239,244],{"type":28,"tag":83,"props":229,"children":231},{"style":230},"--shiki-default:#79B8FF",[232],{"type":44,"value":233}," \"name\"",{"type":28,"tag":83,"props":235,"children":236},{"style":96},[237],{"type":44,"value":238},": ",{"type":28,"tag":83,"props":240,"children":241},{"style":107},[242],{"type":44,"value":243},"\"playwright-internal\"",{"type":28,"tag":83,"props":245,"children":246},{"style":96},[247],{"type":44,"value":248},",\n",{"type":28,"tag":83,"props":250,"children":251},{"class":85,"line":161},[252,257,261,266],{"type":28,"tag":83,"props":253,"children":254},{"style":230},[255],{"type":44,"value":256}," \"private\"",{"type":28,"tag":83,"props":258,"children":259},{"style":96},[260],{"type":44,"value":238},{"type":28,"tag":83,"props":262,"children":263},{"style":230},[264],{"type":44,"value":265},"true",{"type":28,"tag":83,"props":267,"children":268},{"style":96},[269],{"type":44,"value":248},{"type":28,"tag":83,"props":271,"children":272},{"class":85,"line":170},[273,278,283,288],{"type":28,"tag":83,"props":274,"children":275},{"style":230},[276],{"type":44,"value":277}," \"workspaces\"",{"type":28,"tag":83,"props":279,"children":280},{"style":96},[281],{"type":44,"value":282},": [",{"type":28,"tag":83,"props":284,"children":285},{"style":107},[286],{"type":44,"value":287},"\"packages/*\"",{"type":28,"tag":83,"props":289,"children":290},{"style":96},[291],{"type":44,"value":292},"]\n",{"type":28,"tag":83,"props":294,"children":295},{"class":85,"line":179},[296],{"type":28,"tag":83,"props":297,"children":298},{"style":96},[299],{"type":44,"value":300},"}\n",{"type":28,"tag":29,"props":302,"children":303},{},[304,306,311,313,319,321,326,328,334,336,341],{"type":44,"value":305},"The ",{"type":28,"tag":63,"props":307,"children":309},{"className":308},[],[310],{"type":44,"value":205},{"type":44,"value":312}," gives us the hint the core functionality is within the ",{"type":28,"tag":63,"props":314,"children":316},{"className":315},[],[317],{"type":44,"value":318},"packages/",{"type":44,"value":320}," directory since the root ",{"type":28,"tag":63,"props":322,"children":324},{"className":323},[],[325],{"type":44,"value":205},{"type":44,"value":327}," file is labelled private, has \"internal\" in its name, and uses the ",{"type":28,"tag":63,"props":329,"children":331},{"className":330},[],[332],{"type":44,"value":333},"\"workspaces\"",{"type":44,"value":335}," key, which tells node this project has multiple packages. Let's go over the other top-level directories real quick before diving into the ",{"type":28,"tag":63,"props":337,"children":339},{"className":338},[],[340],{"type":44,"value":318},{"type":44,"value":342}," folder",{"type":28,"tag":344,"props":345,"children":346},"ul",{},[347,359,379,390,401],{"type":28,"tag":348,"props":349,"children":350},"li",{},[351,357],{"type":28,"tag":63,"props":352,"children":354},{"className":353},[],[355],{"type":44,"value":356},"browser_patches",{"type":44,"value":358}," - This folder contains browser patches improving adding additional controls and features to some of the browser engines used within this project. Interestingly, this give a patch to webkit so it can run within Windows.",{"type":28,"tag":348,"props":360,"children":361},{},[362,368,370,377],{"type":28,"tag":63,"props":363,"children":365},{"className":364},[],[366],{"type":44,"value":367},"docs",{"type":44,"value":369}," - The docs folder contains markdown files which compile to the documentation found on ",{"type":28,"tag":52,"props":371,"children":374},{"href":372,"rel":373},"https://playwright.dev/docs/intro",[56],[375],{"type":44,"value":376},"the Playwright docs",{"type":44,"value":378},".",{"type":28,"tag":348,"props":380,"children":381},{},[382,388],{"type":28,"tag":63,"props":383,"children":385},{"className":384},[],[386],{"type":44,"value":387},"examples",{"type":44,"value":389}," - Here are examples of test scripts to refer to, while getting started with using the Playwright project.",{"type":28,"tag":348,"props":391,"children":392},{},[393,399],{"type":28,"tag":63,"props":394,"children":396},{"className":395},[],[397],{"type":44,"value":398},"tests",{"type":44,"value":400}," - Even testing libraries should have automated tests, which are written in Playwright.",{"type":28,"tag":348,"props":402,"children":403},{},[404,410],{"type":28,"tag":63,"props":405,"children":407},{"className":406},[],[408],{"type":44,"value":409},"utils",{"type":44,"value":411}," - The utils directory contains miscellaneous tools used during build time, docker images, functionality for Azure, a types file generator, and more.",{"type":28,"tag":39,"props":413,"children":415},{"id":414},"packages-directory",[416],{"type":44,"value":417},"Packages directory",{"type":28,"tag":29,"props":419,"children":420},{},[421],{"type":44,"value":422},"The packages directory contains over 20 separate packages, making it more difficult to understand. We will split up this list into easy-to-understand partitions.",{"type":28,"tag":424,"props":425,"children":427},"h3",{"id":426},"test-reportinggeneration-packages",[428],{"type":44,"value":429},"Test reporting/generation packages",{"type":28,"tag":29,"props":431,"children":432},{},[433],{"type":44,"value":434},"Playwright contains many different test reporting packages each with their own set of functionalities. Briefly, the list of packages in this category is",{"type":28,"tag":72,"props":436,"children":439},{"className":134,"code":437,"filename":438,"language":137,"meta":7,"style":7},"html-reporter/\nrecorder/\ntrace-viewer/\ntrace/\nweb/\n","playwright/packages",[440],{"type":28,"tag":63,"props":441,"children":442},{"__ignoreMap":7},[443,451,459,467,475],{"type":28,"tag":83,"props":444,"children":445},{"class":85,"line":86},[446],{"type":28,"tag":83,"props":447,"children":448},{},[449],{"type":44,"value":450},"html-reporter/\n",{"type":28,"tag":83,"props":452,"children":453},{"class":85,"line":152},[454],{"type":28,"tag":83,"props":455,"children":456},{},[457],{"type":44,"value":458},"recorder/\n",{"type":28,"tag":83,"props":460,"children":461},{"class":85,"line":161},[462],{"type":28,"tag":83,"props":463,"children":464},{},[465],{"type":44,"value":466},"trace-viewer/\n",{"type":28,"tag":83,"props":468,"children":469},{"class":85,"line":170},[470],{"type":28,"tag":83,"props":471,"children":472},{},[473],{"type":44,"value":474},"trace/\n",{"type":28,"tag":83,"props":476,"children":477},{"class":85,"line":179},[478],{"type":28,"tag":83,"props":479,"children":480},{},[481],{"type":44,"value":482},"web/\n",{"type":28,"tag":29,"props":484,"children":485},{},[486,488,495,497,504,506,512],{"type":44,"value":487},"which contains the code associated with either handling test reports or ",{"type":28,"tag":52,"props":489,"children":492},{"href":490,"rel":491},"https://playwright.dev/docs/codegen-intro",[56],[493],{"type":44,"value":494},"generating",{"type":44,"value":496}," them with the recorder package. In addition, there is the ",{"type":28,"tag":52,"props":498,"children":501},{"href":499,"rel":500},"https://playwright.dev/docs/trace-viewer",[56],[502],{"type":44,"value":503},"trace and trace viewer",{"type":44,"value":505}," which can be recorded during playwright test runs. In addition, the ",{"type":28,"tag":63,"props":507,"children":509},{"className":508},[],[510],{"type":44,"value":511},"web/",{"type":44,"value":513}," package provides utilities shared across the various web-based tools listed here.",{"type":28,"tag":424,"props":515,"children":517},{"id":516},"browser-specialized-packages",[518],{"type":44,"value":519},"Browser specialized packages",{"type":28,"tag":29,"props":521,"children":522},{},[523,525,531,533,540],{"type":44,"value":524},"Each of the packages here are simply exports of the ",{"type":28,"tag":63,"props":526,"children":528},{"className":527},[],[529],{"type":44,"value":530},"playwright-core",{"type":44,"value":532}," package along with an install script for the associated browser only. You can find them on npmjs, for example, ",{"type":28,"tag":52,"props":534,"children":537},{"href":535,"rel":536},"https://www.npmjs.com/package/playwright-chromium",[56],[538],{"type":44,"value":539},"playwright-chromium",{"type":44,"value":541}," is its own package which has playwright specialized for only automating chromium.",{"type":28,"tag":72,"props":543,"children":545},{"className":134,"code":544,"filename":438,"language":137,"meta":7,"style":7},"playwright-chromium/\nplaywright-firefox/\nplaywright-webkit/\n",[546],{"type":28,"tag":63,"props":547,"children":548},{"__ignoreMap":7},[549,557,565],{"type":28,"tag":83,"props":550,"children":551},{"class":85,"line":86},[552],{"type":28,"tag":83,"props":553,"children":554},{},[555],{"type":44,"value":556},"playwright-chromium/\n",{"type":28,"tag":83,"props":558,"children":559},{"class":85,"line":152},[560],{"type":28,"tag":83,"props":561,"children":562},{},[563],{"type":44,"value":564},"playwright-firefox/\n",{"type":28,"tag":83,"props":566,"children":567},{"class":85,"line":161},[568],{"type":28,"tag":83,"props":569,"children":570},{},[571],{"type":44,"value":572},"playwright-webkit/\n",{"type":28,"tag":424,"props":574,"children":576},{"id":575},"browser-installation-packages",[577],{"type":44,"value":578},"Browser installation packages",{"type":28,"tag":29,"props":580,"children":581},{},[582,584,591,593,599],{"type":44,"value":583},"The packages listed here only include install scripts for each of the browsers. For example, ",{"type":28,"tag":52,"props":585,"children":588},{"href":586,"rel":587},"https://www.npmjs.com/package/@playwright/browser-chromium",[56],[589],{"type":44,"value":590},"playwright-browser-chromium",{"type":44,"value":592}," corresponds to the ",{"type":28,"tag":63,"props":594,"children":596},{"className":595},[],[597],{"type":44,"value":598},"@playwright/browser-chromium",{"type":44,"value":600}," package on npmjs.",{"type":28,"tag":72,"props":602,"children":604},{"className":134,"code":603,"filename":438,"language":137,"meta":7,"style":7},"playwright-browser-chromium/\nplaywright-browser-firefox/\nplaywright-browser-webkit/\n",[605],{"type":28,"tag":63,"props":606,"children":607},{"__ignoreMap":7},[608,616,624],{"type":28,"tag":83,"props":609,"children":610},{"class":85,"line":86},[611],{"type":28,"tag":83,"props":612,"children":613},{},[614],{"type":44,"value":615},"playwright-browser-chromium/\n",{"type":28,"tag":83,"props":617,"children":618},{"class":85,"line":152},[619],{"type":28,"tag":83,"props":620,"children":621},{},[622],{"type":44,"value":623},"playwright-browser-firefox/\n",{"type":28,"tag":83,"props":625,"children":626},{"class":85,"line":161},[627],{"type":28,"tag":83,"props":628,"children":629},{},[630],{"type":44,"value":631},"playwright-browser-webkit/\n",{"type":28,"tag":424,"props":633,"children":635},{"id":634},"component-testing-packages",[636],{"type":44,"value":637},"Component testing packages",{"type":28,"tag":29,"props":639,"children":640},{},[641,643,650],{"type":44,"value":642},"These packages are all associated to the ",{"type":28,"tag":52,"props":644,"children":647},{"href":645,"rel":646},"https://playwright.dev/docs/test-components",[56],[648],{"type":44,"value":649},"experimental component testing framework",{"type":44,"value":651}," in playwright. These give functionality to playwright similar to how Jest can render individual components for different libraries.",{"type":28,"tag":72,"props":653,"children":655},{"className":134,"code":654,"filename":438,"language":137,"meta":7,"style":7},"playwright-ct-core/\nplaywright-ct-react/\nplaywright-ct-react17/\nplaywright-ct-solid/\nplaywright-ct-svelte/\nplaywright-ct-vue/\nplaywright-ct-vue2/\n",[656],{"type":28,"tag":63,"props":657,"children":658},{"__ignoreMap":7},[659,667,675,683,691,699,707],{"type":28,"tag":83,"props":660,"children":661},{"class":85,"line":86},[662],{"type":28,"tag":83,"props":663,"children":664},{},[665],{"type":44,"value":666},"playwright-ct-core/\n",{"type":28,"tag":83,"props":668,"children":669},{"class":85,"line":152},[670],{"type":28,"tag":83,"props":671,"children":672},{},[673],{"type":44,"value":674},"playwright-ct-react/\n",{"type":28,"tag":83,"props":676,"children":677},{"class":85,"line":161},[678],{"type":28,"tag":83,"props":679,"children":680},{},[681],{"type":44,"value":682},"playwright-ct-react17/\n",{"type":28,"tag":83,"props":684,"children":685},{"class":85,"line":170},[686],{"type":28,"tag":83,"props":687,"children":688},{},[689],{"type":44,"value":690},"playwright-ct-solid/\n",{"type":28,"tag":83,"props":692,"children":693},{"class":85,"line":179},[694],{"type":28,"tag":83,"props":695,"children":696},{},[697],{"type":44,"value":698},"playwright-ct-svelte/\n",{"type":28,"tag":83,"props":700,"children":701},{"class":85,"line":188},[702],{"type":28,"tag":83,"props":703,"children":704},{},[705],{"type":44,"value":706},"playwright-ct-vue/\n",{"type":28,"tag":83,"props":708,"children":710},{"class":85,"line":709},7,[711],{"type":28,"tag":83,"props":712,"children":713},{},[714],{"type":44,"value":715},"playwright-ct-vue2/\n",{"type":28,"tag":424,"props":717,"children":719},{"id":718},"core-functionality-packages",[720],{"type":44,"value":721},"Core functionality packages",{"type":28,"tag":29,"props":723,"children":724},{},[725],{"type":44,"value":726},"Finally, we reach the core packages provided in playwright, which contain all of the main functionality of the playwright project.",{"type":28,"tag":72,"props":728,"children":730},{"className":134,"code":729,"filename":438,"language":137,"meta":7,"style":7},"playwright-core/\nplaywright-test/\nplaywright/\nprotocol/\n",[731],{"type":28,"tag":63,"props":732,"children":733},{"__ignoreMap":7},[734,742,750,758],{"type":28,"tag":83,"props":735,"children":736},{"class":85,"line":86},[737],{"type":28,"tag":83,"props":738,"children":739},{},[740],{"type":44,"value":741},"playwright-core/\n",{"type":28,"tag":83,"props":743,"children":744},{"class":85,"line":152},[745],{"type":28,"tag":83,"props":746,"children":747},{},[748],{"type":44,"value":749},"playwright-test/\n",{"type":28,"tag":83,"props":751,"children":752},{"class":85,"line":161},[753],{"type":28,"tag":83,"props":754,"children":755},{},[756],{"type":44,"value":757},"playwright/\n",{"type":28,"tag":83,"props":759,"children":760},{"class":85,"line":170},[761],{"type":28,"tag":83,"props":762,"children":763},{},[764],{"type":44,"value":765},"protocol/\n",{"type":28,"tag":29,"props":767,"children":768},{},[769,771,777,779,784,786,791,793,799,801,807,809,815,817,822],{"type":44,"value":770},"Note the ",{"type":28,"tag":63,"props":772,"children":774},{"className":773},[],[775],{"type":44,"value":776},"playwright-test",{"type":44,"value":778}," folder is simply a wrapper for binding ",{"type":28,"tag":63,"props":780,"children":782},{"className":781},[],[783],{"type":44,"value":530},{"type":44,"value":785}," and ",{"type":28,"tag":63,"props":787,"children":789},{"className":788},[],[790],{"type":44,"value":5},{"type":44,"value":792}," together in the ",{"type":28,"tag":63,"props":794,"children":796},{"className":795},[],[797],{"type":44,"value":798},"@playwright/test",{"type":44,"value":800}," package installable through npm. If you look in the ",{"type":28,"tag":63,"props":802,"children":804},{"className":803},[],[805],{"type":44,"value":806},"index.js",{"type":44,"value":808}," file, all you'll see is an export of ",{"type":28,"tag":63,"props":810,"children":812},{"className":811},[],[813],{"type":44,"value":814},"playwright/test",{"type":44,"value":816},", which lives in the ",{"type":28,"tag":63,"props":818,"children":820},{"className":819},[],[821],{"type":44,"value":5},{"type":44,"value":823}," package.",{"type":28,"tag":29,"props":825,"children":826},{},[827,829,835,837,842,844,850],{"type":44,"value":828},"Another package to look at briefly is the ",{"type":28,"tag":63,"props":830,"children":832},{"className":831},[],[833],{"type":44,"value":834},"protocol",{"type":44,"value":836}," package which has automatically generated code through some of the build scripts in the ",{"type":28,"tag":63,"props":838,"children":840},{"className":839},[],[841],{"type":44,"value":409},{"type":44,"value":843}," directory of the root directory of the playwright project. This simply contains a YAML file, ",{"type":28,"tag":63,"props":845,"children":847},{"className":846},[],[848],{"type":44,"value":849},"protocol.yml",{"type":44,"value":851},", which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library.",{"type":28,"tag":29,"props":853,"children":854},{},[855,857,862,863,869,871,876,878,884],{"type":44,"value":856},"Now, the two main packages of the entire playwright library are the ",{"type":28,"tag":63,"props":858,"children":860},{"className":859},[],[861],{"type":44,"value":5},{"type":44,"value":785},{"type":28,"tag":63,"props":864,"children":866},{"className":865},[],[867],{"type":44,"value":868},"playwrite-core",{"type":44,"value":870}," packages. The first of which is a wrapper around ",{"type":28,"tag":63,"props":872,"children":874},{"className":873},[],[875],{"type":44,"value":530},{"type":44,"value":877}," and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the ",{"type":28,"tag":63,"props":879,"children":881},{"className":880},[],[882],{"type":44,"value":883},"playwright.config.ts",{"type":44,"value":885}," file, or any of the associated test running code, such as",{"type":28,"tag":72,"props":887,"children":890},{"className":74,"code":888,"filename":889,"language":77,"meta":7,"style":7},"import { test } from \"@playwright/test\";\n","my-test.spec.ts",[891],{"type":28,"tag":63,"props":892,"children":893},{"__ignoreMap":7},[894],{"type":28,"tag":83,"props":895,"children":896},{"class":85,"line":86},[897,901,906,910,914],{"type":28,"tag":83,"props":898,"children":899},{"style":90},[900],{"type":44,"value":93},{"type":28,"tag":83,"props":902,"children":903},{"style":96},[904],{"type":44,"value":905}," { test } ",{"type":28,"tag":83,"props":907,"children":908},{"style":90},[909],{"type":44,"value":104},{"type":28,"tag":83,"props":911,"children":912},{"style":107},[913],{"type":44,"value":110},{"type":28,"tag":83,"props":915,"children":916},{"style":96},[917],{"type":44,"value":115},{"type":28,"tag":29,"props":919,"children":920},{},[921,923,928],{"type":44,"value":922},"then you are likely importing code from the ",{"type":28,"tag":63,"props":924,"children":926},{"className":925},[],[927],{"type":44,"value":5},{"type":44,"value":823},{"type":28,"tag":29,"props":930,"children":931},{},[932,934,939,941,947,949,955,957,962,964,970,972,979,981,987,989,994],{"type":44,"value":933},"The other main package is ",{"type":28,"tag":63,"props":935,"children":937},{"className":936},[],[938],{"type":44,"value":530},{"type":44,"value":940}," which contains all of the browser automation functionality. This functionality is split up into two main components, the ",{"type":28,"tag":63,"props":942,"children":944},{"className":943},[],[945],{"type":44,"value":946},"client",{"type":44,"value":948}," library and the ",{"type":28,"tag":63,"props":950,"children":952},{"className":951},[],[953],{"type":44,"value":954},"server",{"type":44,"value":956}," library. The ",{"type":28,"tag":63,"props":958,"children":960},{"className":959},[],[961],{"type":44,"value":954},{"type":44,"value":963}," library, found in ",{"type":28,"tag":63,"props":965,"children":967},{"className":966},[],[968],{"type":44,"value":969},"packages/playwright-core/src/server",{"type":44,"value":971},", contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the ",{"type":28,"tag":52,"props":973,"children":976},{"href":974,"rel":975},"https://chromedevtools.github.io/devtools-protocol/",[56],[977],{"type":44,"value":978},"Chrome Devtools Protocol",{"type":44,"value":980}," (CDP), or something similar to it, which tells the browser to perform actions like \"click the login button\", \"input 'Hello' into the text form\", or \"navigate to '",{"type":28,"tag":52,"props":982,"children":985},{"href":983,"rel":984},"https://news.ycombinator.com",[56],[986],{"type":44,"value":983},{"type":44,"value":988},"'\". The ",{"type":28,"tag":63,"props":990,"children":992},{"className":991},[],[993],{"type":44,"value":954},{"type":44,"value":995}," library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality.",{"type":28,"tag":29,"props":997,"children":998},{},[999,1001,1006],{"type":44,"value":1000},"On the other hand, the ",{"type":28,"tag":63,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":44,"value":946},{"type":44,"value":1007}," library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like",{"type":28,"tag":72,"props":1009,"children":1012},{"className":74,"code":1010,"filename":1011,"language":77,"meta":7,"style":7},"import { chromium } from \"@playwright/test\";\n\n(async function () {\n const browser = await chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n})();\n","my-automation-script.ts",[1013],{"type":28,"tag":63,"props":1014,"children":1015},{"__ignoreMap":7},[1016,1040,1049,1072,1121,1156,1188],{"type":28,"tag":83,"props":1017,"children":1018},{"class":85,"line":86},[1019,1023,1028,1032,1036],{"type":28,"tag":83,"props":1020,"children":1021},{"style":90},[1022],{"type":44,"value":93},{"type":28,"tag":83,"props":1024,"children":1025},{"style":96},[1026],{"type":44,"value":1027}," { chromium } ",{"type":28,"tag":83,"props":1029,"children":1030},{"style":90},[1031],{"type":44,"value":104},{"type":28,"tag":83,"props":1033,"children":1034},{"style":107},[1035],{"type":44,"value":110},{"type":28,"tag":83,"props":1037,"children":1038},{"style":96},[1039],{"type":44,"value":115},{"type":28,"tag":83,"props":1041,"children":1042},{"class":85,"line":152},[1043],{"type":28,"tag":83,"props":1044,"children":1046},{"emptyLinePlaceholder":1045},true,[1047],{"type":44,"value":1048},"\n",{"type":28,"tag":83,"props":1050,"children":1051},{"class":85,"line":161},[1052,1057,1062,1067],{"type":28,"tag":83,"props":1053,"children":1054},{"style":96},[1055],{"type":44,"value":1056},"(",{"type":28,"tag":83,"props":1058,"children":1059},{"style":90},[1060],{"type":44,"value":1061},"async",{"type":28,"tag":83,"props":1063,"children":1064},{"style":90},[1065],{"type":44,"value":1066}," function",{"type":28,"tag":83,"props":1068,"children":1069},{"style":96},[1070],{"type":44,"value":1071}," () {\n",{"type":28,"tag":83,"props":1073,"children":1074},{"class":85,"line":170},[1075,1080,1085,1090,1095,1100,1106,1111,1116],{"type":28,"tag":83,"props":1076,"children":1077},{"style":90},[1078],{"type":44,"value":1079}," const",{"type":28,"tag":83,"props":1081,"children":1082},{"style":230},[1083],{"type":44,"value":1084}," browser",{"type":28,"tag":83,"props":1086,"children":1087},{"style":90},[1088],{"type":44,"value":1089}," =",{"type":28,"tag":83,"props":1091,"children":1092},{"style":90},[1093],{"type":44,"value":1094}," await",{"type":28,"tag":83,"props":1096,"children":1097},{"style":96},[1098],{"type":44,"value":1099}," chromium.",{"type":28,"tag":83,"props":1101,"children":1103},{"style":1102},"--shiki-default:#B392F0",[1104],{"type":44,"value":1105},"launch",{"type":28,"tag":83,"props":1107,"children":1108},{"style":96},[1109],{"type":44,"value":1110},"({ headless: ",{"type":28,"tag":83,"props":1112,"children":1113},{"style":230},[1114],{"type":44,"value":1115},"false",{"type":28,"tag":83,"props":1117,"children":1118},{"style":96},[1119],{"type":44,"value":1120}," });\n",{"type":28,"tag":83,"props":1122,"children":1123},{"class":85,"line":179},[1124,1128,1133,1137,1141,1146,1151],{"type":28,"tag":83,"props":1125,"children":1126},{"style":90},[1127],{"type":44,"value":1079},{"type":28,"tag":83,"props":1129,"children":1130},{"style":230},[1131],{"type":44,"value":1132}," page",{"type":28,"tag":83,"props":1134,"children":1135},{"style":90},[1136],{"type":44,"value":1089},{"type":28,"tag":83,"props":1138,"children":1139},{"style":90},[1140],{"type":44,"value":1094},{"type":28,"tag":83,"props":1142,"children":1143},{"style":96},[1144],{"type":44,"value":1145}," browser.",{"type":28,"tag":83,"props":1147,"children":1148},{"style":1102},[1149],{"type":44,"value":1150},"newPage",{"type":28,"tag":83,"props":1152,"children":1153},{"style":96},[1154],{"type":44,"value":1155},"();\n",{"type":28,"tag":83,"props":1157,"children":1158},{"class":85,"line":188},[1159,1164,1169,1174,1178,1183],{"type":28,"tag":83,"props":1160,"children":1161},{"style":90},[1162],{"type":44,"value":1163}," await",{"type":28,"tag":83,"props":1165,"children":1166},{"style":96},[1167],{"type":44,"value":1168}," page.",{"type":28,"tag":83,"props":1170,"children":1171},{"style":1102},[1172],{"type":44,"value":1173},"goto",{"type":28,"tag":83,"props":1175,"children":1176},{"style":96},[1177],{"type":44,"value":1056},{"type":28,"tag":83,"props":1179,"children":1180},{"style":107},[1181],{"type":44,"value":1182},"\"https://playwright.dev\"",{"type":28,"tag":83,"props":1184,"children":1185},{"style":96},[1186],{"type":44,"value":1187},");\n",{"type":28,"tag":83,"props":1189,"children":1190},{"class":85,"line":709},[1191],{"type":28,"tag":83,"props":1192,"children":1193},{"style":96},[1194],{"type":44,"value":1195},"})();\n",{"type":28,"tag":29,"props":1197,"children":1198},{},[1199,1201,1207,1209,1215,1217,1223,1224,1230,1232,1237,1239,1244,1246,1251],{"type":44,"value":1200},"really you are importing ",{"type":28,"tag":63,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":44,"value":1206},"chromium",{"type":44,"value":1208}," from an instance of the class in ",{"type":28,"tag":63,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":44,"value":1214},"playwright-core/client/playwright",{"type":44,"value":1216},". Then, calling ",{"type":28,"tag":63,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":44,"value":1222},"browser.newPage",{"type":44,"value":785},{"type":28,"tag":63,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":44,"value":1229},"page.goto",{"type":44,"value":1231}," is making requests to interfaces in the ",{"type":28,"tag":63,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":44,"value":954},{"type":44,"value":1238}," library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the ",{"type":28,"tag":63,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":44,"value":954},{"type":44,"value":1245}," library in the ",{"type":28,"tag":63,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":44,"value":530},{"type":44,"value":1252}," package since it provides a comprehensive and battle tested API for this kind of functionality.",{"type":28,"tag":29,"props":1254,"children":1255},{},[1256,1258,1265,1267,1274,1275,1282,1284,1290,1292,1297,1299,1304],{"type":44,"value":1257},"This splitting of responsibility design pattern works well because it allows for ",{"type":28,"tag":52,"props":1259,"children":1262},{"href":1260,"rel":1261},"https://github.com/microsoft/playwright-python",[56],[1263],{"type":44,"value":1264},"supporting",{"type":44,"value":1266}," ",{"type":28,"tag":52,"props":1268,"children":1271},{"href":1269,"rel":1270},"https://github.com/microsoft/playwright-java/",[56],[1272],{"type":44,"value":1273},"multiple",{"type":44,"value":1266},{"type":28,"tag":52,"props":1276,"children":1279},{"href":1277,"rel":1278},"https://github.com/microsoft/playwright-dotnet",[56],[1280],{"type":44,"value":1281},"languages",{"type":44,"value":1283}," which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ",{"type":28,"tag":63,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":44,"value":1289},"ChannelOwner",{"type":44,"value":1291},") as you would in the the ",{"type":28,"tag":63,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":44,"value":946},{"type":44,"value":1298}," library found in ",{"type":28,"tag":63,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":44,"value":530},{"type":44,"value":378},{"type":28,"tag":39,"props":1306,"children":1308},{"id":1307},"looking-beyond",[1309],{"type":44,"value":1310},"Looking beyond",{"type":28,"tag":29,"props":1312,"children":1313},{},[1314],{"type":44,"value":1315},"Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.",{"type":28,"tag":29,"props":1317,"children":1318},{},[1319],{"type":44,"value":1320},"In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.",{"type":28,"tag":1322,"props":1323,"children":1324},"style",{},[1325],{"type":44,"value":1326},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":152,"depth":152,"links":1328},[1329,1330,1331,1338],{"id":41,"depth":152,"text":45},{"id":123,"depth":152,"text":126},{"id":414,"depth":152,"text":417,"children":1332},[1333,1334,1335,1336,1337],{"id":426,"depth":161,"text":429},{"id":516,"depth":161,"text":519},{"id":575,"depth":161,"text":578},{"id":634,"depth":161,"text":637},{"id":718,"depth":161,"text":721},{"id":1307,"depth":152,"text":1310},"markdown","content:playwright:architecture.md","content","playwright/architecture.md","md",1714258649810] \ No newline at end of file diff --git a/playwright/architecture/index.html b/playwright/architecture/index.html index 3692832..2d6907d 100644 --- a/playwright/architecture/index.html +++ b/playwright/architecture/index.html @@ -1,8 +1,8 @@ -Architecture of Playwright - - +QAComet | Architecture of Playwright + + @@ -21,43 +21,43 @@ - + - - + + - + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + -

Diagram of Playwright's architecture

Intro

When you load up the repository for the Playwright library, you may be overwhelmed by the numerous packages living both inside the packages folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import

example-script.ts
import { test, chromium } from "@playwright/test";
+

Diagram of Playwright's architecture

Intro

When you load up the repository for the Playwright library, you may be overwhelmed by the numerous packages living both inside the packages folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import

example-script.ts
import { test, chromium } from "@playwright/test";
 

making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project.

Root directory

In the root directory we find the following folders

playwright/
browser_patches/
 docs/
 examples/
@@ -99,5 +99,5 @@
   const page = await browser.newPage();
   await page.goto("https://playwright.dev");
 })();
-

really you are importing chromium from an instance of the class in playwright-core/client/playwright. Then, calling browser.newPage and page.goto is making requests to interfaces in the server library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the server library in the playwright-core package since it provides a comprehensive and battle tested API for this kind of functionality.

This splitting of responsibility design pattern works well because it allows for supporting multiple languages which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ChannelOwner) as you would in the the client library found in playwright-core.

Looking beyond

Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.

In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.

- \ No newline at end of file +

really you are importing chromium from an instance of the class in playwright-core/client/playwright. Then, calling browser.newPage and page.goto is making requests to interfaces in the server library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the server library in the playwright-core package since it provides a comprehensive and battle tested API for this kind of functionality.

This splitting of responsibility design pattern works well because it allows for supporting multiple languages which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ChannelOwner) as you would in the the client library found in playwright-core.

Looking beyond

Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.

In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.

+ \ No newline at end of file diff --git a/playwright/how-playwright-initializes/_payload.json b/playwright/how-playwright-initializes/_payload.json index 7feefbb..edf962f 100644 --- a/playwright/how-playwright-initializes/_payload.json +++ b/playwright/how-playwright-initializes/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":7009},["Reactive",2],{"blog-post-playwright/how-playwright-initializes":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"image":17,"shortDescription":18,"created":19,"link":4,"body":25,"_type":7004,"_id":7005,"_source":7006,"_file":7007,"_extension":7008},"/playwright/how-playwright-initializes","playwright",false,"","How importing from Playwright works","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"How Playwright Initializes","/playwright/how-playwright-initializes/","img","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":20,"number":21,"month":22,"day":23,"year":24},"March 13, 2024",1710309600000,"Mar",13,2024,{"type":26,"children":27,"toc":6988},"root",[28,38,46,51,258,263,268,288,359,379,430,530,560,566,697,702,708,727,1718,1752,1784,1804,1865,1870,1931,1943,2131,2166,2172,2221,2274,2469,2474,2574,2631,2637,2669,3353,3372,3378,3406,3471,3533,3545,4208,4298,4305,4317,4545,4624,4630,4649,4763,4804,4810,4851,5053,5101,5143,5163,5449,5504,5537,5571,5762,5781,6222,6306,6312,6332,6450,6485,6541,6554,6729,6741,6747,6752,6964,6982],{"type":29,"tag":30,"props":31,"children":32},"element","p",{},[33],{"type":29,"tag":17,"props":34,"children":37},{"alt":35,"src":36},"Diagram of playwright-core initialization process","/img/playwright/playwright-core_initialization_diagram.jpg",[],{"type":29,"tag":39,"props":40,"children":42},"h2",{"id":41},"peering-into-playwrights-import-process",[43],{"type":44,"value":45},"text","Peering into Playwright's import process",{"type":29,"tag":30,"props":47,"children":48},{},[49],{"type":44,"value":50},"Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet",{"type":29,"tag":52,"props":53,"children":57},"pre",{"className":54,"code":55,"language":56,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { chromium } from '@playwright/test'\n\nasync function main () => {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","ts",[58],{"type":29,"tag":59,"props":60,"children":61},"code",{"__ignoreMap":7},[62,91,101,136,176,211,249],{"type":29,"tag":63,"props":64,"children":67},"span",{"class":65,"line":66},"line",1,[68,74,80,85],{"type":29,"tag":63,"props":69,"children":71},{"style":70},"--shiki-default:#F97583",[72],{"type":44,"value":73},"import",{"type":29,"tag":63,"props":75,"children":77},{"style":76},"--shiki-default:#E1E4E8",[78],{"type":44,"value":79}," { chromium } ",{"type":29,"tag":63,"props":81,"children":82},{"style":70},[83],{"type":44,"value":84},"from",{"type":29,"tag":63,"props":86,"children":88},{"style":87},"--shiki-default:#9ECBFF",[89],{"type":44,"value":90}," '@playwright/test'\n",{"type":29,"tag":63,"props":92,"children":94},{"class":65,"line":93},2,[95],{"type":29,"tag":63,"props":96,"children":98},{"emptyLinePlaceholder":97},true,[99],{"type":44,"value":100},"\n",{"type":29,"tag":63,"props":102,"children":104},{"class":65,"line":103},3,[105,110,115,121,126,131],{"type":29,"tag":63,"props":106,"children":107},{"style":70},[108],{"type":44,"value":109},"async",{"type":29,"tag":63,"props":111,"children":112},{"style":70},[113],{"type":44,"value":114}," function",{"type":29,"tag":63,"props":116,"children":118},{"style":117},"--shiki-default:#B392F0",[119],{"type":44,"value":120}," main",{"type":29,"tag":63,"props":122,"children":123},{"style":76},[124],{"type":44,"value":125}," () ",{"type":29,"tag":63,"props":127,"children":128},{"style":70},[129],{"type":44,"value":130},"=>",{"type":29,"tag":63,"props":132,"children":133},{"style":76},[134],{"type":44,"value":135}," {\n",{"type":29,"tag":63,"props":137,"children":139},{"class":65,"line":138},4,[140,145,151,156,161,166,171],{"type":29,"tag":63,"props":141,"children":142},{"style":117},[143],{"type":44,"value":144}," const",{"type":29,"tag":63,"props":146,"children":148},{"style":147},"--shiki-default:#FFAB70",[149],{"type":44,"value":150}," browser",{"type":29,"tag":63,"props":152,"children":153},{"style":70},[154],{"type":44,"value":155}," =",{"type":29,"tag":63,"props":157,"children":158},{"style":70},[159],{"type":44,"value":160}," await",{"type":29,"tag":63,"props":162,"children":163},{"style":76},[164],{"type":44,"value":165}," chromium.",{"type":29,"tag":63,"props":167,"children":168},{"style":117},[169],{"type":44,"value":170},"launch",{"type":29,"tag":63,"props":172,"children":173},{"style":76},[174],{"type":44,"value":175},"()\n",{"type":29,"tag":63,"props":177,"children":179},{"class":65,"line":178},5,[180,184,189,193,197,202,207],{"type":29,"tag":63,"props":181,"children":182},{"style":117},[183],{"type":44,"value":144},{"type":29,"tag":63,"props":185,"children":186},{"style":147},[187],{"type":44,"value":188}," page",{"type":29,"tag":63,"props":190,"children":191},{"style":70},[192],{"type":44,"value":155},{"type":29,"tag":63,"props":194,"children":195},{"style":70},[196],{"type":44,"value":160},{"type":29,"tag":63,"props":198,"children":199},{"style":76},[200],{"type":44,"value":201}," browser.",{"type":29,"tag":63,"props":203,"children":204},{"style":117},[205],{"type":44,"value":206},"newPage",{"type":29,"tag":63,"props":208,"children":209},{"style":76},[210],{"type":44,"value":175},{"type":29,"tag":63,"props":212,"children":214},{"class":65,"line":213},6,[215,220,224,229,234,239,244],{"type":29,"tag":63,"props":216,"children":217},{"style":117},[218],{"type":44,"value":219}," await",{"type":29,"tag":63,"props":221,"children":222},{"style":117},[223],{"type":44,"value":188},{"type":29,"tag":63,"props":225,"children":226},{"style":76},[227],{"type":44,"value":228},".",{"type":29,"tag":63,"props":230,"children":231},{"style":117},[232],{"type":44,"value":233},"goto",{"type":29,"tag":63,"props":235,"children":236},{"style":76},[237],{"type":44,"value":238},"(",{"type":29,"tag":63,"props":240,"children":241},{"style":87},[242],{"type":44,"value":243},"\"https://qacomet.com\"",{"type":29,"tag":63,"props":245,"children":246},{"style":76},[247],{"type":44,"value":248},")\n",{"type":29,"tag":63,"props":250,"children":252},{"class":65,"line":251},7,[253],{"type":29,"tag":63,"props":254,"children":255},{"style":76},[256],{"type":44,"value":257},"}\n",{"type":29,"tag":30,"props":259,"children":260},{},[261],{"type":44,"value":262},"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces.",{"type":29,"tag":30,"props":264,"children":265},{},[266],{"type":44,"value":267},"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture.",{"type":29,"tag":269,"props":270,"children":272},"h3",{"id":271},"merging-playwright-and-playwright-core",[273,275,280,282],{"type":44,"value":274},"Merging ",{"type":29,"tag":59,"props":276,"children":278},{"className":277},[],[279],{"type":44,"value":5},{"type":44,"value":281}," and ",{"type":29,"tag":59,"props":283,"children":285},{"className":284},[],[286],{"type":44,"value":287},"playwright-core",{"type":29,"tag":30,"props":289,"children":290},{},[291,293,299,301,307,308,314,316,322,324,329,331,337,339,344,346,351,353,358],{"type":44,"value":292},"Internally, when you import from ",{"type":29,"tag":59,"props":294,"children":296},{"className":295},[],[297],{"type":44,"value":298},"@playwright/test",{"type":44,"value":300},", there is an underlying call to import from two merged packages, ",{"type":29,"tag":59,"props":302,"children":304},{"className":303},[],[305],{"type":44,"value":306},"packages/playwright-core",{"type":44,"value":281},{"type":29,"tag":59,"props":309,"children":311},{"className":310},[],[312],{"type":44,"value":313},"packages/playwright",{"type":44,"value":315},". This merge happens in ",{"type":29,"tag":59,"props":317,"children":319},{"className":318},[],[320],{"type":44,"value":321},"packages/playwright/test",{"type":44,"value":323},", since ",{"type":29,"tag":59,"props":325,"children":327},{"className":326},[],[328],{"type":44,"value":298},{"type":44,"value":330}," is just an outward facinging export of ",{"type":29,"tag":59,"props":332,"children":334},{"className":333},[],[335],{"type":44,"value":336},"require('playwright/test')",{"type":44,"value":338},", an alias for ",{"type":29,"tag":59,"props":340,"children":342},{"className":341},[],[343],{"type":44,"value":321},{"type":44,"value":345},". This is where the test execution API's from ",{"type":29,"tag":59,"props":347,"children":349},{"className":348},[],[350],{"type":44,"value":313},{"type":44,"value":352}," are combined with the browser automation API's from ",{"type":29,"tag":59,"props":354,"children":356},{"className":355},[],[357],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":30,"props":360,"children":361},{},[362,364,369,371,377],{"type":44,"value":363},"We will focus on the import from ",{"type":29,"tag":59,"props":365,"children":367},{"className":366},[],[368],{"type":44,"value":287},{"type":44,"value":370},", since it provides the core browser automation and is the code every other client library wraps. Looking at its ",{"type":29,"tag":59,"props":372,"children":374},{"className":373},[],[375],{"type":44,"value":376},"index.js",{"type":44,"value":378}," file",{"type":29,"tag":52,"props":380,"children":385},{"className":381,"code":382,"filename":383,"language":384,"meta":7,"style":7},"language-js shiki shiki-themes github-dark","module.exports = require(\"./lib/inprocess\");\n","packages/playwright-core/index.js","js",[386],{"type":29,"tag":59,"props":387,"children":388},{"__ignoreMap":7},[389],{"type":29,"tag":63,"props":390,"children":391},{"class":65,"line":66},[392,398,402,407,411,416,420,425],{"type":29,"tag":63,"props":393,"children":395},{"style":394},"--shiki-default:#79B8FF",[396],{"type":44,"value":397},"module",{"type":29,"tag":63,"props":399,"children":400},{"style":76},[401],{"type":44,"value":228},{"type":29,"tag":63,"props":403,"children":404},{"style":394},[405],{"type":44,"value":406},"exports",{"type":29,"tag":63,"props":408,"children":409},{"style":70},[410],{"type":44,"value":155},{"type":29,"tag":63,"props":412,"children":413},{"style":117},[414],{"type":44,"value":415}," require",{"type":29,"tag":63,"props":417,"children":418},{"style":76},[419],{"type":44,"value":238},{"type":29,"tag":63,"props":421,"children":422},{"style":87},[423],{"type":44,"value":424},"\"./lib/inprocess\"",{"type":29,"tag":63,"props":426,"children":427},{"style":76},[428],{"type":44,"value":429},");\n",{"type":29,"tag":30,"props":431,"children":432},{},[433,435,441,443,449,451,457,459,465,467,473,475,481,483,489,491,497,499,505,507,512,514,520,522,528],{"type":44,"value":434},"gives an export from its ",{"type":29,"tag":59,"props":436,"children":438},{"className":437},[],[439],{"type":44,"value":440},"lib/inprocess.ts",{"type":44,"value":442}," file (note the ",{"type":29,"tag":59,"props":444,"children":446},{"className":445},[],[447],{"type":44,"value":448},"src",{"type":44,"value":450}," directory is compiled to the ",{"type":29,"tag":59,"props":452,"children":454},{"className":453},[],[455],{"type":44,"value":456},"lib",{"type":44,"value":458}," directory after playwright runs its build script, and is what's found in ",{"type":29,"tag":59,"props":460,"children":462},{"className":461},[],[463],{"type":44,"value":464},"node_modules/playwright-core",{"type":44,"value":466},", hence the require imports from ",{"type":29,"tag":59,"props":468,"children":470},{"className":469},[],[471],{"type":44,"value":472},"./lib/",{"type":44,"value":474}," and not ",{"type":29,"tag":59,"props":476,"children":478},{"className":477},[],[479],{"type":44,"value":480},"./src/",{"type":44,"value":482},"). The ",{"type":29,"tag":59,"props":484,"children":486},{"className":485},[],[487],{"type":44,"value":488},"inprocess.ts",{"type":44,"value":490}," file just imports from the adjacent ",{"type":29,"tag":59,"props":492,"children":494},{"className":493},[],[495],{"type":44,"value":496},"inProcessFactory.ts",{"type":44,"value":498}," and executes the function from there, called ",{"type":29,"tag":59,"props":500,"children":502},{"className":501},[],[503],{"type":44,"value":504},"createInProcessPlaywright",{"type":44,"value":506},". We include the source below in its own section but note ",{"type":29,"tag":59,"props":508,"children":510},{"className":509},[],[511],{"type":44,"value":504},{"type":44,"value":513}," dynamically intiailizes the interface between the client library, defined in ",{"type":29,"tag":59,"props":515,"children":517},{"className":516},[],[518],{"type":44,"value":519},"src/client",{"type":44,"value":521},", and the server library, defined in ",{"type":29,"tag":59,"props":523,"children":525},{"className":524},[],[526],{"type":44,"value":527},"src/server",{"type":44,"value":529},". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library.",{"type":29,"tag":30,"props":531,"children":532},{},[533,535,544,546,551,553,558],{"type":44,"value":534},"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the ",{"type":29,"tag":536,"props":537,"children":541},"a",{"href":538,"rel":539},"https://github.com/microsoft/playwright-python",[540],"nofollow",[542],{"type":44,"value":543},"playwright-python",{"type":44,"value":545}," source code, you will find the same design patterns and classes defined in ",{"type":29,"tag":59,"props":547,"children":549},{"className":548},[],[550],{"type":44,"value":287},{"type":44,"value":552},"'s ",{"type":29,"tag":59,"props":554,"children":556},{"className":555},[],[557],{"type":44,"value":519},{"type":44,"value":559}," library.",{"type":29,"tag":269,"props":561,"children":563},{"id":562},"rapid-overview-of-the-client-and-server-libraries",[564],{"type":44,"value":565},"Rapid overview of the client and server libraries",{"type":29,"tag":30,"props":567,"children":568},{},[569,571,576,578,583,584,589,591,597,599,605,607,612,614,620,622,628,630,635,637,643,645,651,653,658,659,665,667,672,674,680,682,688,690,695],{"type":44,"value":570},"In ",{"type":29,"tag":59,"props":572,"children":574},{"className":573},[],[575],{"type":44,"value":287},{"type":44,"value":577}," the main functionality can be found in the ",{"type":29,"tag":59,"props":579,"children":581},{"className":580},[],[582],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":585,"children":587},{"className":586},[],[588],{"type":44,"value":527},{"type":44,"value":590}," folders. The ",{"type":29,"tag":59,"props":592,"children":594},{"className":593},[],[595],{"type":44,"value":596},"client",{"type":44,"value":598}," folder contains classes, many of which are subclasses of the ",{"type":29,"tag":59,"props":600,"children":602},{"className":601},[],[603],{"type":44,"value":604},"ChannelOwner",{"type":44,"value":606}," class. This ",{"type":29,"tag":59,"props":608,"children":610},{"className":609},[],[611],{"type":44,"value":604},{"type":44,"value":613}," class is a client-side representation of a corresponding server-side ",{"type":29,"tag":59,"props":615,"children":617},{"className":616},[],[618],{"type":44,"value":619},"Dispatcher",{"type":44,"value":621}," class in the ",{"type":29,"tag":59,"props":623,"children":625},{"className":624},[],[626],{"type":44,"value":627},"src/server/dispatchers",{"type":44,"value":629}," folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a ",{"type":29,"tag":59,"props":631,"children":633},{"className":632},[],[634],{"type":44,"value":604},{"type":44,"value":636}," subclass called ",{"type":29,"tag":59,"props":638,"children":640},{"className":639},[],[641],{"type":44,"value":642},"Page",{"type":44,"value":644},", containing the client side APIs (such as ",{"type":29,"tag":59,"props":646,"children":648},{"className":647},[],[649],{"type":44,"value":650},"page.goto",{"type":44,"value":652},"), there is a corresponding ",{"type":29,"tag":59,"props":654,"children":656},{"className":655},[],[657],{"type":44,"value":619},{"type":44,"value":636},{"type":29,"tag":59,"props":660,"children":662},{"className":661},[],[663],{"type":44,"value":664},"PageDispatcher",{"type":44,"value":666},". When we call ",{"type":29,"tag":59,"props":668,"children":670},{"className":669},[],[671],{"type":44,"value":650},{"type":44,"value":673}," a message is send over the unique client ",{"type":29,"tag":59,"props":675,"children":677},{"className":676},[],[678],{"type":44,"value":679},"Connection",{"type":44,"value":681}," instance to the unique ",{"type":29,"tag":59,"props":683,"children":685},{"className":684},[],[686],{"type":44,"value":687},"DispatcherConnection",{"type":44,"value":689}," instance, which calls the corresponding ",{"type":29,"tag":59,"props":691,"children":693},{"className":692},[],[694],{"type":44,"value":664},{"type":44,"value":696},", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright.",{"type":29,"tag":30,"props":698,"children":699},{},[700],{"type":44,"value":701},"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works.",{"type":29,"tag":39,"props":703,"children":705},{"id":704},"playwrights-core-api-factory-createinprocessplaywright",[706],{"type":44,"value":707},"Playwright's core API factory, createInProcessPlaywright",{"type":29,"tag":30,"props":709,"children":710},{},[711,713,718,720,725],{"type":44,"value":712},"This file, ",{"type":29,"tag":59,"props":714,"children":716},{"className":715},[],[717],{"type":44,"value":496},{"type":44,"value":719},", contains only one function called ",{"type":29,"tag":59,"props":721,"children":723},{"className":722},[],[724],{"type":44,"value":504},{"type":44,"value":726},". We include it here as a reference:",{"type":29,"tag":52,"props":728,"children":731},{"className":54,"code":729,"filename":730,"language":56,"meta":7,"style":7},"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","packages/playwright-core/src/inProcessFactory.ts",[732],{"type":29,"tag":59,"props":733,"children":734},{"__ignoreMap":7},[735,771,797,805,858,866,873,921,940,985,993,1002,1039,1057,1089,1106,1114,1145,1153,1162,1181,1213,1222,1245,1272,1281,1290,1315,1324,1332,1357,1366,1374,1400,1408,1417,1449,1480,1512,1541,1549,1592,1601,1635,1665,1696,1710],{"type":29,"tag":63,"props":736,"children":737},{"class":65,"line":66},[738,743,747,752,757,762,767],{"type":29,"tag":63,"props":739,"children":740},{"style":70},[741],{"type":44,"value":742},"export",{"type":29,"tag":63,"props":744,"children":745},{"style":70},[746],{"type":44,"value":114},{"type":29,"tag":63,"props":748,"children":749},{"style":117},[750],{"type":44,"value":751}," createInProcessPlaywright",{"type":29,"tag":63,"props":753,"children":754},{"style":76},[755],{"type":44,"value":756},"()",{"type":29,"tag":63,"props":758,"children":759},{"style":70},[760],{"type":44,"value":761},":",{"type":29,"tag":63,"props":763,"children":764},{"style":117},[765],{"type":44,"value":766}," PlaywrightAPI",{"type":29,"tag":63,"props":768,"children":769},{"style":76},[770],{"type":44,"value":135},{"type":29,"tag":63,"props":772,"children":773},{"class":65,"line":93},[774,778,783,787,792],{"type":29,"tag":63,"props":775,"children":776},{"style":70},[777],{"type":44,"value":144},{"type":29,"tag":63,"props":779,"children":780},{"style":394},[781],{"type":44,"value":782}," playwright",{"type":29,"tag":63,"props":784,"children":785},{"style":70},[786],{"type":44,"value":155},{"type":29,"tag":63,"props":788,"children":789},{"style":117},[790],{"type":44,"value":791}," createPlaywright",{"type":29,"tag":63,"props":793,"children":794},{"style":76},[795],{"type":44,"value":796},"({\n",{"type":29,"tag":63,"props":798,"children":799},{"class":65,"line":103},[800],{"type":29,"tag":63,"props":801,"children":802},{"style":76},[803],{"type":44,"value":804}," sdkLanguage:\n",{"type":29,"tag":63,"props":806,"children":807},{"class":65,"line":138},[808,813,818,823,828,833,838,843,848,853],{"type":29,"tag":63,"props":809,"children":810},{"style":76},[811],{"type":44,"value":812}," (process.env.",{"type":29,"tag":63,"props":814,"children":815},{"style":394},[816],{"type":44,"value":817},"PW_LANG_NAME",{"type":29,"tag":63,"props":819,"children":820},{"style":70},[821],{"type":44,"value":822}," as",{"type":29,"tag":63,"props":824,"children":825},{"style":117},[826],{"type":44,"value":827}," Language",{"type":29,"tag":63,"props":829,"children":830},{"style":70},[831],{"type":44,"value":832}," |",{"type":29,"tag":63,"props":834,"children":835},{"style":394},[836],{"type":44,"value":837}," undefined",{"type":29,"tag":63,"props":839,"children":840},{"style":76},[841],{"type":44,"value":842},") ",{"type":29,"tag":63,"props":844,"children":845},{"style":70},[846],{"type":44,"value":847},"||",{"type":29,"tag":63,"props":849,"children":850},{"style":87},[851],{"type":44,"value":852}," \"javascript\"",{"type":29,"tag":63,"props":854,"children":855},{"style":76},[856],{"type":44,"value":857},",\n",{"type":29,"tag":63,"props":859,"children":860},{"class":65,"line":178},[861],{"type":29,"tag":63,"props":862,"children":863},{"style":76},[864],{"type":44,"value":865}," });\n",{"type":29,"tag":63,"props":867,"children":868},{"class":65,"line":213},[869],{"type":29,"tag":63,"props":870,"children":871},{"emptyLinePlaceholder":97},[872],{"type":44,"value":100},{"type":29,"tag":63,"props":874,"children":875},{"class":65,"line":251},[876,880,885,889,894,899,903,908,913,917],{"type":29,"tag":63,"props":877,"children":878},{"style":70},[879],{"type":44,"value":144},{"type":29,"tag":63,"props":881,"children":882},{"style":394},[883],{"type":44,"value":884}," clientConnection",{"type":29,"tag":63,"props":886,"children":887},{"style":70},[888],{"type":44,"value":155},{"type":29,"tag":63,"props":890,"children":891},{"style":70},[892],{"type":44,"value":893}," new",{"type":29,"tag":63,"props":895,"children":896},{"style":117},[897],{"type":44,"value":898}," Connection",{"type":29,"tag":63,"props":900,"children":901},{"style":76},[902],{"type":44,"value":238},{"type":29,"tag":63,"props":904,"children":905},{"style":394},[906],{"type":44,"value":907},"undefined",{"type":29,"tag":63,"props":909,"children":910},{"style":76},[911],{"type":44,"value":912},", ",{"type":29,"tag":63,"props":914,"children":915},{"style":394},[916],{"type":44,"value":907},{"type":29,"tag":63,"props":918,"children":919},{"style":76},[920],{"type":44,"value":429},{"type":29,"tag":63,"props":922,"children":924},{"class":65,"line":923},8,[925,930,935],{"type":29,"tag":63,"props":926,"children":927},{"style":76},[928],{"type":44,"value":929}," clientConnection.",{"type":29,"tag":63,"props":931,"children":932},{"style":117},[933],{"type":44,"value":934},"useRawBuffers",{"type":29,"tag":63,"props":936,"children":937},{"style":76},[938],{"type":44,"value":939},"();\n",{"type":29,"tag":63,"props":941,"children":943},{"class":65,"line":942},9,[944,948,953,957,961,966,970,975,981],{"type":29,"tag":63,"props":945,"children":946},{"style":70},[947],{"type":44,"value":144},{"type":29,"tag":63,"props":949,"children":950},{"style":394},[951],{"type":44,"value":952}," dispatcherConnection",{"type":29,"tag":63,"props":954,"children":955},{"style":70},[956],{"type":44,"value":155},{"type":29,"tag":63,"props":958,"children":959},{"style":70},[960],{"type":44,"value":893},{"type":29,"tag":63,"props":962,"children":963},{"style":117},[964],{"type":44,"value":965}," DispatcherConnection",{"type":29,"tag":63,"props":967,"children":968},{"style":76},[969],{"type":44,"value":238},{"type":29,"tag":63,"props":971,"children":972},{"style":394},[973],{"type":44,"value":974},"true",{"type":29,"tag":63,"props":976,"children":978},{"style":977},"--shiki-default:#6A737D",[979],{"type":44,"value":980}," /* local */",{"type":29,"tag":63,"props":982,"children":983},{"style":76},[984],{"type":44,"value":429},{"type":29,"tag":63,"props":986,"children":988},{"class":65,"line":987},10,[989],{"type":29,"tag":63,"props":990,"children":991},{"emptyLinePlaceholder":97},[992],{"type":44,"value":100},{"type":29,"tag":63,"props":994,"children":996},{"class":65,"line":995},11,[997],{"type":29,"tag":63,"props":998,"children":999},{"style":977},[1000],{"type":44,"value":1001}," // Dispatch synchronously at first.\n",{"type":29,"tag":63,"props":1003,"children":1005},{"class":65,"line":1004},12,[1006,1011,1016,1020,1025,1030,1034],{"type":29,"tag":63,"props":1007,"children":1008},{"style":76},[1009],{"type":44,"value":1010}," dispatcherConnection.",{"type":29,"tag":63,"props":1012,"children":1013},{"style":117},[1014],{"type":44,"value":1015},"onmessage",{"type":29,"tag":63,"props":1017,"children":1018},{"style":70},[1019],{"type":44,"value":155},{"type":29,"tag":63,"props":1021,"children":1022},{"style":76},[1023],{"type":44,"value":1024}," (",{"type":29,"tag":63,"props":1026,"children":1027},{"style":147},[1028],{"type":44,"value":1029},"message",{"type":29,"tag":63,"props":1031,"children":1032},{"style":76},[1033],{"type":44,"value":842},{"type":29,"tag":63,"props":1035,"children":1036},{"style":70},[1037],{"type":44,"value":1038},"=>\n",{"type":29,"tag":63,"props":1040,"children":1041},{"class":65,"line":23},[1042,1047,1052],{"type":29,"tag":63,"props":1043,"children":1044},{"style":76},[1045],{"type":44,"value":1046}," clientConnection.",{"type":29,"tag":63,"props":1048,"children":1049},{"style":117},[1050],{"type":44,"value":1051},"dispatch",{"type":29,"tag":63,"props":1053,"children":1054},{"style":76},[1055],{"type":44,"value":1056},"(message);\n",{"type":29,"tag":63,"props":1058,"children":1060},{"class":65,"line":1059},14,[1061,1065,1069,1073,1077,1081,1085],{"type":29,"tag":63,"props":1062,"children":1063},{"style":76},[1064],{"type":44,"value":929},{"type":29,"tag":63,"props":1066,"children":1067},{"style":117},[1068],{"type":44,"value":1015},{"type":29,"tag":63,"props":1070,"children":1071},{"style":70},[1072],{"type":44,"value":155},{"type":29,"tag":63,"props":1074,"children":1075},{"style":76},[1076],{"type":44,"value":1024},{"type":29,"tag":63,"props":1078,"children":1079},{"style":147},[1080],{"type":44,"value":1029},{"type":29,"tag":63,"props":1082,"children":1083},{"style":76},[1084],{"type":44,"value":842},{"type":29,"tag":63,"props":1086,"children":1087},{"style":70},[1088],{"type":44,"value":1038},{"type":29,"tag":63,"props":1090,"children":1092},{"class":65,"line":1091},15,[1093,1098,1102],{"type":29,"tag":63,"props":1094,"children":1095},{"style":76},[1096],{"type":44,"value":1097}," dispatcherConnection.",{"type":29,"tag":63,"props":1099,"children":1100},{"style":117},[1101],{"type":44,"value":1051},{"type":29,"tag":63,"props":1103,"children":1104},{"style":76},[1105],{"type":44,"value":1056},{"type":29,"tag":63,"props":1107,"children":1109},{"class":65,"line":1108},16,[1110],{"type":29,"tag":63,"props":1111,"children":1112},{"emptyLinePlaceholder":97},[1113],{"type":44,"value":100},{"type":29,"tag":63,"props":1115,"children":1117},{"class":65,"line":1116},17,[1118,1122,1127,1131,1135,1140],{"type":29,"tag":63,"props":1119,"children":1120},{"style":70},[1121],{"type":44,"value":144},{"type":29,"tag":63,"props":1123,"children":1124},{"style":394},[1125],{"type":44,"value":1126}," rootScope",{"type":29,"tag":63,"props":1128,"children":1129},{"style":70},[1130],{"type":44,"value":155},{"type":29,"tag":63,"props":1132,"children":1133},{"style":70},[1134],{"type":44,"value":893},{"type":29,"tag":63,"props":1136,"children":1137},{"style":117},[1138],{"type":44,"value":1139}," RootDispatcher",{"type":29,"tag":63,"props":1141,"children":1142},{"style":76},[1143],{"type":44,"value":1144},"(dispatcherConnection);\n",{"type":29,"tag":63,"props":1146,"children":1148},{"class":65,"line":1147},18,[1149],{"type":29,"tag":63,"props":1150,"children":1151},{"emptyLinePlaceholder":97},[1152],{"type":44,"value":100},{"type":29,"tag":63,"props":1154,"children":1156},{"class":65,"line":1155},19,[1157],{"type":29,"tag":63,"props":1158,"children":1159},{"style":977},[1160],{"type":44,"value":1161}," // Initialize Playwright channel.\n",{"type":29,"tag":63,"props":1163,"children":1165},{"class":65,"line":1164},20,[1166,1171,1176],{"type":29,"tag":63,"props":1167,"children":1168},{"style":70},[1169],{"type":44,"value":1170}," new",{"type":29,"tag":63,"props":1172,"children":1173},{"style":117},[1174],{"type":44,"value":1175}," PlaywrightDispatcher",{"type":29,"tag":63,"props":1177,"children":1178},{"style":76},[1179],{"type":44,"value":1180},"(rootScope, playwright);\n",{"type":29,"tag":63,"props":1182,"children":1184},{"class":65,"line":1183},21,[1185,1189,1194,1198,1203,1208],{"type":29,"tag":63,"props":1186,"children":1187},{"style":70},[1188],{"type":44,"value":144},{"type":29,"tag":63,"props":1190,"children":1191},{"style":394},[1192],{"type":44,"value":1193}," playwrightAPI",{"type":29,"tag":63,"props":1195,"children":1196},{"style":70},[1197],{"type":44,"value":155},{"type":29,"tag":63,"props":1199,"children":1200},{"style":76},[1201],{"type":44,"value":1202}," clientConnection.",{"type":29,"tag":63,"props":1204,"children":1205},{"style":117},[1206],{"type":44,"value":1207},"getObjectWithKnownName",{"type":29,"tag":63,"props":1209,"children":1210},{"style":76},[1211],{"type":44,"value":1212},"(\n",{"type":29,"tag":63,"props":1214,"children":1216},{"class":65,"line":1215},22,[1217],{"type":29,"tag":63,"props":1218,"children":1219},{"style":87},[1220],{"type":44,"value":1221}," \"Playwright\"\n",{"type":29,"tag":63,"props":1223,"children":1225},{"class":65,"line":1224},23,[1226,1231,1236,1240],{"type":29,"tag":63,"props":1227,"children":1228},{"style":76},[1229],{"type":44,"value":1230}," ) ",{"type":29,"tag":63,"props":1232,"children":1233},{"style":70},[1234],{"type":44,"value":1235},"as",{"type":29,"tag":63,"props":1237,"children":1238},{"style":117},[1239],{"type":44,"value":766},{"type":29,"tag":63,"props":1241,"children":1242},{"style":76},[1243],{"type":44,"value":1244},";\n",{"type":29,"tag":63,"props":1246,"children":1248},{"class":65,"line":1247},24,[1249,1254,1259,1263,1268],{"type":29,"tag":63,"props":1250,"children":1251},{"style":76},[1252],{"type":44,"value":1253}," playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":1255,"children":1256},{"style":70},[1257],{"type":44,"value":1258},"=",{"type":29,"tag":63,"props":1260,"children":1261},{"style":70},[1262],{"type":44,"value":893},{"type":29,"tag":63,"props":1264,"children":1265},{"style":117},[1266],{"type":44,"value":1267}," BrowserServerLauncherImpl",{"type":29,"tag":63,"props":1269,"children":1270},{"style":76},[1271],{"type":44,"value":1212},{"type":29,"tag":63,"props":1273,"children":1275},{"class":65,"line":1274},25,[1276],{"type":29,"tag":63,"props":1277,"children":1278},{"style":87},[1279],{"type":44,"value":1280}," \"chromium\"\n",{"type":29,"tag":63,"props":1282,"children":1284},{"class":65,"line":1283},26,[1285],{"type":29,"tag":63,"props":1286,"children":1287},{"style":76},[1288],{"type":44,"value":1289}," );\n",{"type":29,"tag":63,"props":1291,"children":1293},{"class":65,"line":1292},27,[1294,1299,1303,1307,1311],{"type":29,"tag":63,"props":1295,"children":1296},{"style":76},[1297],{"type":44,"value":1298}," playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":1300,"children":1301},{"style":70},[1302],{"type":44,"value":1258},{"type":29,"tag":63,"props":1304,"children":1305},{"style":70},[1306],{"type":44,"value":893},{"type":29,"tag":63,"props":1308,"children":1309},{"style":117},[1310],{"type":44,"value":1267},{"type":29,"tag":63,"props":1312,"children":1313},{"style":76},[1314],{"type":44,"value":1212},{"type":29,"tag":63,"props":1316,"children":1318},{"class":65,"line":1317},28,[1319],{"type":29,"tag":63,"props":1320,"children":1321},{"style":87},[1322],{"type":44,"value":1323}," \"firefox\"\n",{"type":29,"tag":63,"props":1325,"children":1327},{"class":65,"line":1326},29,[1328],{"type":29,"tag":63,"props":1329,"children":1330},{"style":76},[1331],{"type":44,"value":1289},{"type":29,"tag":63,"props":1333,"children":1335},{"class":65,"line":1334},30,[1336,1341,1345,1349,1353],{"type":29,"tag":63,"props":1337,"children":1338},{"style":76},[1339],{"type":44,"value":1340}," playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":1342,"children":1343},{"style":70},[1344],{"type":44,"value":1258},{"type":29,"tag":63,"props":1346,"children":1347},{"style":70},[1348],{"type":44,"value":893},{"type":29,"tag":63,"props":1350,"children":1351},{"style":117},[1352],{"type":44,"value":1267},{"type":29,"tag":63,"props":1354,"children":1355},{"style":76},[1356],{"type":44,"value":1212},{"type":29,"tag":63,"props":1358,"children":1360},{"class":65,"line":1359},31,[1361],{"type":29,"tag":63,"props":1362,"children":1363},{"style":87},[1364],{"type":44,"value":1365}," \"webkit\"\n",{"type":29,"tag":63,"props":1367,"children":1369},{"class":65,"line":1368},32,[1370],{"type":29,"tag":63,"props":1371,"children":1372},{"style":76},[1373],{"type":44,"value":1289},{"type":29,"tag":63,"props":1375,"children":1377},{"class":65,"line":1376},33,[1378,1383,1387,1391,1396],{"type":29,"tag":63,"props":1379,"children":1380},{"style":76},[1381],{"type":44,"value":1382}," playwrightAPI._android._serverLauncher ",{"type":29,"tag":63,"props":1384,"children":1385},{"style":70},[1386],{"type":44,"value":1258},{"type":29,"tag":63,"props":1388,"children":1389},{"style":70},[1390],{"type":44,"value":893},{"type":29,"tag":63,"props":1392,"children":1393},{"style":117},[1394],{"type":44,"value":1395}," AndroidServerLauncherImpl",{"type":29,"tag":63,"props":1397,"children":1398},{"style":76},[1399],{"type":44,"value":939},{"type":29,"tag":63,"props":1401,"children":1403},{"class":65,"line":1402},34,[1404],{"type":29,"tag":63,"props":1405,"children":1406},{"emptyLinePlaceholder":97},[1407],{"type":44,"value":100},{"type":29,"tag":63,"props":1409,"children":1411},{"class":65,"line":1410},35,[1412],{"type":29,"tag":63,"props":1413,"children":1414},{"style":977},[1415],{"type":44,"value":1416}," // Switch to async dispatch after we got Playwright object.\n",{"type":29,"tag":63,"props":1418,"children":1420},{"class":65,"line":1419},36,[1421,1425,1429,1433,1437,1441,1445],{"type":29,"tag":63,"props":1422,"children":1423},{"style":76},[1424],{"type":44,"value":1010},{"type":29,"tag":63,"props":1426,"children":1427},{"style":117},[1428],{"type":44,"value":1015},{"type":29,"tag":63,"props":1430,"children":1431},{"style":70},[1432],{"type":44,"value":155},{"type":29,"tag":63,"props":1434,"children":1435},{"style":76},[1436],{"type":44,"value":1024},{"type":29,"tag":63,"props":1438,"children":1439},{"style":147},[1440],{"type":44,"value":1029},{"type":29,"tag":63,"props":1442,"children":1443},{"style":76},[1444],{"type":44,"value":842},{"type":29,"tag":63,"props":1446,"children":1447},{"style":70},[1448],{"type":44,"value":1038},{"type":29,"tag":63,"props":1450,"children":1452},{"class":65,"line":1451},37,[1453,1458,1463,1467,1471,1475],{"type":29,"tag":63,"props":1454,"children":1455},{"style":117},[1456],{"type":44,"value":1457}," setImmediate",{"type":29,"tag":63,"props":1459,"children":1460},{"style":76},[1461],{"type":44,"value":1462},"(() ",{"type":29,"tag":63,"props":1464,"children":1465},{"style":70},[1466],{"type":44,"value":130},{"type":29,"tag":63,"props":1468,"children":1469},{"style":76},[1470],{"type":44,"value":1202},{"type":29,"tag":63,"props":1472,"children":1473},{"style":117},[1474],{"type":44,"value":1051},{"type":29,"tag":63,"props":1476,"children":1477},{"style":76},[1478],{"type":44,"value":1479},"(message));\n",{"type":29,"tag":63,"props":1481,"children":1483},{"class":65,"line":1482},38,[1484,1488,1492,1496,1500,1504,1508],{"type":29,"tag":63,"props":1485,"children":1486},{"style":76},[1487],{"type":44,"value":929},{"type":29,"tag":63,"props":1489,"children":1490},{"style":117},[1491],{"type":44,"value":1015},{"type":29,"tag":63,"props":1493,"children":1494},{"style":70},[1495],{"type":44,"value":155},{"type":29,"tag":63,"props":1497,"children":1498},{"style":76},[1499],{"type":44,"value":1024},{"type":29,"tag":63,"props":1501,"children":1502},{"style":147},[1503],{"type":44,"value":1029},{"type":29,"tag":63,"props":1505,"children":1506},{"style":76},[1507],{"type":44,"value":842},{"type":29,"tag":63,"props":1509,"children":1510},{"style":70},[1511],{"type":44,"value":1038},{"type":29,"tag":63,"props":1513,"children":1515},{"class":65,"line":1514},39,[1516,1520,1524,1528,1533,1537],{"type":29,"tag":63,"props":1517,"children":1518},{"style":117},[1519],{"type":44,"value":1457},{"type":29,"tag":63,"props":1521,"children":1522},{"style":76},[1523],{"type":44,"value":1462},{"type":29,"tag":63,"props":1525,"children":1526},{"style":70},[1527],{"type":44,"value":130},{"type":29,"tag":63,"props":1529,"children":1530},{"style":76},[1531],{"type":44,"value":1532}," dispatcherConnection.",{"type":29,"tag":63,"props":1534,"children":1535},{"style":117},[1536],{"type":44,"value":1051},{"type":29,"tag":63,"props":1538,"children":1539},{"style":76},[1540],{"type":44,"value":1479},{"type":29,"tag":63,"props":1542,"children":1544},{"class":65,"line":1543},40,[1545],{"type":29,"tag":63,"props":1546,"children":1547},{"emptyLinePlaceholder":97},[1548],{"type":44,"value":100},{"type":29,"tag":63,"props":1550,"children":1552},{"class":65,"line":1551},41,[1553,1557,1562,1566,1570,1575,1579,1584,1588],{"type":29,"tag":63,"props":1554,"children":1555},{"style":76},[1556],{"type":44,"value":929},{"type":29,"tag":63,"props":1558,"children":1559},{"style":117},[1560],{"type":44,"value":1561},"toImpl",{"type":29,"tag":63,"props":1563,"children":1564},{"style":70},[1565],{"type":44,"value":155},{"type":29,"tag":63,"props":1567,"children":1568},{"style":76},[1569],{"type":44,"value":1024},{"type":29,"tag":63,"props":1571,"children":1572},{"style":147},[1573],{"type":44,"value":1574},"x",{"type":29,"tag":63,"props":1576,"children":1577},{"style":70},[1578],{"type":44,"value":761},{"type":29,"tag":63,"props":1580,"children":1581},{"style":394},[1582],{"type":44,"value":1583}," any",{"type":29,"tag":63,"props":1585,"children":1586},{"style":76},[1587],{"type":44,"value":842},{"type":29,"tag":63,"props":1589,"children":1590},{"style":70},[1591],{"type":44,"value":1038},{"type":29,"tag":63,"props":1593,"children":1595},{"class":65,"line":1594},42,[1596],{"type":29,"tag":63,"props":1597,"children":1598},{"style":76},[1599],{"type":44,"value":1600}," x\n",{"type":29,"tag":63,"props":1602,"children":1604},{"class":65,"line":1603},43,[1605,1610,1615,1620,1625,1630],{"type":29,"tag":63,"props":1606,"children":1607},{"style":70},[1608],{"type":44,"value":1609}," ?",{"type":29,"tag":63,"props":1611,"children":1612},{"style":76},[1613],{"type":44,"value":1614}," dispatcherConnection._dispatchers.",{"type":29,"tag":63,"props":1616,"children":1617},{"style":117},[1618],{"type":44,"value":1619},"get",{"type":29,"tag":63,"props":1621,"children":1622},{"style":76},[1623],{"type":44,"value":1624},"(x._guid)",{"type":29,"tag":63,"props":1626,"children":1627},{"style":70},[1628],{"type":44,"value":1629},"!",{"type":29,"tag":63,"props":1631,"children":1632},{"style":76},[1633],{"type":44,"value":1634},"._object\n",{"type":29,"tag":63,"props":1636,"children":1638},{"class":65,"line":1637},44,[1639,1644,1648,1652,1656,1661],{"type":29,"tag":63,"props":1640,"children":1641},{"style":70},[1642],{"type":44,"value":1643}," :",{"type":29,"tag":63,"props":1645,"children":1646},{"style":76},[1647],{"type":44,"value":1614},{"type":29,"tag":63,"props":1649,"children":1650},{"style":117},[1651],{"type":44,"value":1619},{"type":29,"tag":63,"props":1653,"children":1654},{"style":76},[1655],{"type":44,"value":238},{"type":29,"tag":63,"props":1657,"children":1658},{"style":87},[1659],{"type":44,"value":1660},"\"\"",{"type":29,"tag":63,"props":1662,"children":1663},{"style":76},[1664],{"type":44,"value":429},{"type":29,"tag":63,"props":1666,"children":1668},{"class":65,"line":1667},45,[1669,1674,1678,1682,1687,1691],{"type":29,"tag":63,"props":1670,"children":1671},{"style":76},[1672],{"type":44,"value":1673}," (playwrightAPI ",{"type":29,"tag":63,"props":1675,"children":1676},{"style":70},[1677],{"type":44,"value":1235},{"type":29,"tag":63,"props":1679,"children":1680},{"style":394},[1681],{"type":44,"value":1583},{"type":29,"tag":63,"props":1683,"children":1684},{"style":76},[1685],{"type":44,"value":1686},")._toImpl ",{"type":29,"tag":63,"props":1688,"children":1689},{"style":70},[1690],{"type":44,"value":1258},{"type":29,"tag":63,"props":1692,"children":1693},{"style":76},[1694],{"type":44,"value":1695}," clientConnection.toImpl;\n",{"type":29,"tag":63,"props":1697,"children":1699},{"class":65,"line":1698},46,[1700,1705],{"type":29,"tag":63,"props":1701,"children":1702},{"style":70},[1703],{"type":44,"value":1704}," return",{"type":29,"tag":63,"props":1706,"children":1707},{"style":76},[1708],{"type":44,"value":1709}," playwrightAPI;\n",{"type":29,"tag":63,"props":1711,"children":1713},{"class":65,"line":1712},47,[1714],{"type":29,"tag":63,"props":1715,"children":1716},{"style":76},[1717],{"type":44,"value":257},{"type":29,"tag":30,"props":1719,"children":1720},{},[1721,1723,1729,1731,1737,1739,1745,1747],{"type":44,"value":1722},"If you scan through the script and look at the return value, you'll see Playwright is returning the ",{"type":29,"tag":59,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":44,"value":1728},"PlaywrightAPI",{"type":44,"value":1730}," instance ",{"type":29,"tag":59,"props":1732,"children":1734},{"className":1733},[],[1735],{"type":44,"value":1736},"playwrightAPI",{"type":44,"value":1738},", which is defined somewhere within the client library ",{"type":29,"tag":59,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":44,"value":1744},"playwright-core/src/client/",{"type":44,"value":1746}," (which we find from our type hints). So when we write a script using ",{"type":29,"tag":59,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":44,"value":287},{"type":29,"tag":52,"props":1753,"children":1756},{"className":54,"code":1754,"filename":1755,"language":56,"meta":7,"style":7},"import { chromium } from \"playwright-core\";\n","my-automation-script.ts",[1757],{"type":29,"tag":59,"props":1758,"children":1759},{"__ignoreMap":7},[1760],{"type":29,"tag":63,"props":1761,"children":1762},{"class":65,"line":66},[1763,1767,1771,1775,1780],{"type":29,"tag":63,"props":1764,"children":1765},{"style":70},[1766],{"type":44,"value":73},{"type":29,"tag":63,"props":1768,"children":1769},{"style":76},[1770],{"type":44,"value":79},{"type":29,"tag":63,"props":1772,"children":1773},{"style":70},[1774],{"type":44,"value":84},{"type":29,"tag":63,"props":1776,"children":1777},{"style":87},[1778],{"type":44,"value":1779}," \"playwright-core\"",{"type":29,"tag":63,"props":1781,"children":1782},{"style":76},[1783],{"type":44,"value":1244},{"type":29,"tag":30,"props":1785,"children":1786},{},[1787,1789,1794,1796,1802],{"type":44,"value":1788},"really we are making an import of the ",{"type":29,"tag":59,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":44,"value":1736},{"type":44,"value":1795}," object and accessing its ",{"type":29,"tag":59,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":44,"value":1801},"chromium",{"type":44,"value":1803}," property, so our script is secretly",{"type":29,"tag":52,"props":1805,"children":1807},{"className":54,"code":1806,"filename":1755,"language":56,"meta":7,"style":7},"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n",[1808],{"type":29,"tag":59,"props":1809,"children":1810},{"__ignoreMap":7},[1811,1835],{"type":29,"tag":63,"props":1812,"children":1813},{"class":65,"line":66},[1814,1818,1823,1827,1831],{"type":29,"tag":63,"props":1815,"children":1816},{"style":70},[1817],{"type":44,"value":73},{"type":29,"tag":63,"props":1819,"children":1820},{"style":76},[1821],{"type":44,"value":1822}," playwrightAPI ",{"type":29,"tag":63,"props":1824,"children":1825},{"style":70},[1826],{"type":44,"value":84},{"type":29,"tag":63,"props":1828,"children":1829},{"style":87},[1830],{"type":44,"value":1779},{"type":29,"tag":63,"props":1832,"children":1833},{"style":76},[1834],{"type":44,"value":1244},{"type":29,"tag":63,"props":1836,"children":1837},{"class":65,"line":93},[1838,1843,1848,1852,1857,1861],{"type":29,"tag":63,"props":1839,"children":1840},{"style":70},[1841],{"type":44,"value":1842},"const",{"type":29,"tag":63,"props":1844,"children":1845},{"style":76},[1846],{"type":44,"value":1847}," { ",{"type":29,"tag":63,"props":1849,"children":1850},{"style":394},[1851],{"type":44,"value":1801},{"type":29,"tag":63,"props":1853,"children":1854},{"style":76},[1855],{"type":44,"value":1856}," } ",{"type":29,"tag":63,"props":1858,"children":1859},{"style":70},[1860],{"type":44,"value":1258},{"type":29,"tag":63,"props":1862,"children":1863},{"style":76},[1864],{"type":44,"value":1709},{"type":29,"tag":30,"props":1866,"children":1867},{},[1868],{"type":44,"value":1869},"Tracing where this object is instantiated, we find the call",{"type":29,"tag":52,"props":1871,"children":1873},{"className":54,"code":1872,"filename":730,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n",[1874],{"type":29,"tag":59,"props":1875,"children":1876},{"__ignoreMap":7},[1877,1904,1912],{"type":29,"tag":63,"props":1878,"children":1879},{"class":65,"line":66},[1880,1884,1888,1892,1896,1900],{"type":29,"tag":63,"props":1881,"children":1882},{"style":70},[1883],{"type":44,"value":1842},{"type":29,"tag":63,"props":1885,"children":1886},{"style":394},[1887],{"type":44,"value":1193},{"type":29,"tag":63,"props":1889,"children":1890},{"style":70},[1891],{"type":44,"value":155},{"type":29,"tag":63,"props":1893,"children":1894},{"style":76},[1895],{"type":44,"value":1202},{"type":29,"tag":63,"props":1897,"children":1898},{"style":117},[1899],{"type":44,"value":1207},{"type":29,"tag":63,"props":1901,"children":1902},{"style":76},[1903],{"type":44,"value":1212},{"type":29,"tag":63,"props":1905,"children":1906},{"class":65,"line":93},[1907],{"type":29,"tag":63,"props":1908,"children":1909},{"style":87},[1910],{"type":44,"value":1911}," \"Playwright\"\n",{"type":29,"tag":63,"props":1913,"children":1914},{"class":65,"line":103},[1915,1919,1923,1927],{"type":29,"tag":63,"props":1916,"children":1917},{"style":76},[1918],{"type":44,"value":842},{"type":29,"tag":63,"props":1920,"children":1921},{"style":70},[1922],{"type":44,"value":1235},{"type":29,"tag":63,"props":1924,"children":1925},{"style":117},[1926],{"type":44,"value":766},{"type":29,"tag":63,"props":1928,"children":1929},{"style":76},[1930],{"type":44,"value":1244},{"type":29,"tag":30,"props":1932,"children":1933},{},[1934,1936,1941],{"type":44,"value":1935},"which is not very descriptive. If you try looking in the ",{"type":29,"tag":59,"props":1937,"children":1939},{"className":1938},[],[1940],{"type":44,"value":679},{"type":44,"value":1942}," class definition, you won't get very far either, you'll just see",{"type":29,"tag":52,"props":1944,"children":1947},{"className":54,"code":1945,"filename":1946,"language":56,"meta":7,"style":7},"export class Connection extends EventEmitter {\n readonly _objects = new Map\u003Cstring, ChannelOwner>();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","packages/playwright-core/src/client/connection.ts",[1948],{"type":29,"tag":59,"props":1949,"children":1950},{"__ignoreMap":7},[1951,1981,2030,2038,2081,2116,2124],{"type":29,"tag":63,"props":1952,"children":1953},{"class":65,"line":66},[1954,1958,1963,1967,1972,1977],{"type":29,"tag":63,"props":1955,"children":1956},{"style":70},[1957],{"type":44,"value":742},{"type":29,"tag":63,"props":1959,"children":1960},{"style":70},[1961],{"type":44,"value":1962}," class",{"type":29,"tag":63,"props":1964,"children":1965},{"style":117},[1966],{"type":44,"value":898},{"type":29,"tag":63,"props":1968,"children":1969},{"style":70},[1970],{"type":44,"value":1971}," extends",{"type":29,"tag":63,"props":1973,"children":1974},{"style":117},[1975],{"type":44,"value":1976}," EventEmitter",{"type":29,"tag":63,"props":1978,"children":1979},{"style":76},[1980],{"type":44,"value":135},{"type":29,"tag":63,"props":1982,"children":1983},{"class":65,"line":93},[1984,1989,1994,1998,2002,2007,2012,2017,2021,2025],{"type":29,"tag":63,"props":1985,"children":1986},{"style":70},[1987],{"type":44,"value":1988}," readonly",{"type":29,"tag":63,"props":1990,"children":1991},{"style":147},[1992],{"type":44,"value":1993}," _objects",{"type":29,"tag":63,"props":1995,"children":1996},{"style":70},[1997],{"type":44,"value":155},{"type":29,"tag":63,"props":1999,"children":2000},{"style":70},[2001],{"type":44,"value":893},{"type":29,"tag":63,"props":2003,"children":2004},{"style":117},[2005],{"type":44,"value":2006}," Map",{"type":29,"tag":63,"props":2008,"children":2009},{"style":76},[2010],{"type":44,"value":2011},"\u003C",{"type":29,"tag":63,"props":2013,"children":2014},{"style":394},[2015],{"type":44,"value":2016},"string",{"type":29,"tag":63,"props":2018,"children":2019},{"style":76},[2020],{"type":44,"value":912},{"type":29,"tag":63,"props":2022,"children":2023},{"style":117},[2024],{"type":44,"value":604},{"type":29,"tag":63,"props":2026,"children":2027},{"style":76},[2028],{"type":44,"value":2029},">();\n",{"type":29,"tag":63,"props":2031,"children":2032},{"class":65,"line":103},[2033],{"type":29,"tag":63,"props":2034,"children":2035},{"style":977},[2036],{"type":44,"value":2037}," // ...\n",{"type":29,"tag":63,"props":2039,"children":2040},{"class":65,"line":138},[2041,2046,2050,2055,2059,2064,2069,2073,2077],{"type":29,"tag":63,"props":2042,"children":2043},{"style":117},[2044],{"type":44,"value":2045}," getObjectWithKnownName",{"type":29,"tag":63,"props":2047,"children":2048},{"style":76},[2049],{"type":44,"value":238},{"type":29,"tag":63,"props":2051,"children":2052},{"style":147},[2053],{"type":44,"value":2054},"guid",{"type":29,"tag":63,"props":2056,"children":2057},{"style":70},[2058],{"type":44,"value":761},{"type":29,"tag":63,"props":2060,"children":2061},{"style":394},[2062],{"type":44,"value":2063}," string",{"type":29,"tag":63,"props":2065,"children":2066},{"style":76},[2067],{"type":44,"value":2068},")",{"type":29,"tag":63,"props":2070,"children":2071},{"style":70},[2072],{"type":44,"value":761},{"type":29,"tag":63,"props":2074,"children":2075},{"style":394},[2076],{"type":44,"value":1583},{"type":29,"tag":63,"props":2078,"children":2079},{"style":76},[2080],{"type":44,"value":135},{"type":29,"tag":63,"props":2082,"children":2083},{"class":65,"line":178},[2084,2089,2094,2099,2103,2108,2112],{"type":29,"tag":63,"props":2085,"children":2086},{"style":70},[2087],{"type":44,"value":2088}," return",{"type":29,"tag":63,"props":2090,"children":2091},{"style":394},[2092],{"type":44,"value":2093}," this",{"type":29,"tag":63,"props":2095,"children":2096},{"style":76},[2097],{"type":44,"value":2098},"._objects.",{"type":29,"tag":63,"props":2100,"children":2101},{"style":117},[2102],{"type":44,"value":1619},{"type":29,"tag":63,"props":2104,"children":2105},{"style":76},[2106],{"type":44,"value":2107},"(guid)",{"type":29,"tag":63,"props":2109,"children":2110},{"style":70},[2111],{"type":44,"value":1629},{"type":29,"tag":63,"props":2113,"children":2114},{"style":76},[2115],{"type":44,"value":1244},{"type":29,"tag":63,"props":2117,"children":2118},{"class":65,"line":213},[2119],{"type":29,"tag":63,"props":2120,"children":2121},{"style":76},[2122],{"type":44,"value":2123}," }\n",{"type":29,"tag":63,"props":2125,"children":2126},{"class":65,"line":251},[2127],{"type":29,"tag":63,"props":2128,"children":2129},{"style":76},[2130],{"type":44,"value":257},{"type":29,"tag":30,"props":2132,"children":2133},{},[2134,2136,2141,2143,2149,2151,2156,2158,2164],{"type":44,"value":2135},"which is even more opaque. From this all we know is the ",{"type":29,"tag":59,"props":2137,"children":2139},{"className":2138},[],[2140],{"type":44,"value":679},{"type":44,"value":2142}," class keeps an ",{"type":29,"tag":59,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":44,"value":2148},"_objects",{"type":44,"value":2150}," map which at some point contains an instance of ",{"type":29,"tag":59,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":44,"value":1728},{"type":44,"value":2157},", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within ",{"type":29,"tag":59,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":44,"value":2163},"inProcessFactory",{"type":44,"value":2165}," will give us a clear picture of how this library is wrapped together.",{"type":29,"tag":39,"props":2167,"children":2169},{"id":2168},"cross-communication-between-client-and-server",[2170],{"type":44,"value":2171},"Cross communication between client and server",{"type":29,"tag":30,"props":2173,"children":2174},{},[2175,2177,2182,2184,2190,2192,2198,2200,2205,2207,2212,2214,2220],{"type":44,"value":2176},"If you look through the script's imports, anything with ",{"type":29,"tag":59,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":44,"value":619},{"type":44,"value":2183}," in its name, and ",{"type":29,"tag":59,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":44,"value":2189},"createPlaywright",{"type":44,"value":2191},", come from the ",{"type":29,"tag":59,"props":2193,"children":2195},{"className":2194},[],[2196],{"type":44,"value":2197},"server",{"type":44,"value":2199}," directroy. The ",{"type":29,"tag":59,"props":2201,"children":2203},{"className":2202},[],[2204],{"type":44,"value":2189},{"type":44,"value":2206}," function creates an instance of the ",{"type":29,"tag":59,"props":2208,"children":2210},{"className":2209},[],[2211],{"type":44,"value":12},{"type":44,"value":2213}," class defined in ",{"type":29,"tag":59,"props":2215,"children":2217},{"className":2216},[],[2218],{"type":44,"value":2219},"packages/playwright-core/server/playwright.ts",{"type":44,"value":228},{"type":29,"tag":30,"props":2222,"children":2223},{},[2224,2226,2231,2232,2237,2239,2244,2246,2251,2253,2258,2260,2266,2267,2272],{"type":44,"value":2225},"Similarly, the imports for ",{"type":29,"tag":59,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":44,"value":1728},{"type":44,"value":2238}," come from the ",{"type":29,"tag":59,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":44,"value":519},{"type":44,"value":2245}," directory. Looking through the first lines of ",{"type":29,"tag":59,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":44,"value":2163},{"type":44,"value":2252},", there is an instantiation of the server ",{"type":29,"tag":59,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":44,"value":12},{"type":44,"value":2259}," class and instantiation of objects for the ",{"type":29,"tag":59,"props":2261,"children":2263},{"className":2262},[],[2264],{"type":44,"value":2265},"ClientConnection",{"type":44,"value":281},{"type":29,"tag":59,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":44,"value":687},{"type":44,"value":2273}," classes",{"type":29,"tag":52,"props":2275,"children":2277},{"className":54,"code":2276,"filename":730,"language":56,"meta":7,"style":7},"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n",[2278],{"type":29,"tag":59,"props":2279,"children":2280},{"__ignoreMap":7},[2281,2304,2312,2356,2364,2371,2414,2430],{"type":29,"tag":63,"props":2282,"children":2283},{"class":65,"line":66},[2284,2288,2292,2296,2300],{"type":29,"tag":63,"props":2285,"children":2286},{"style":70},[2287],{"type":44,"value":1842},{"type":29,"tag":63,"props":2289,"children":2290},{"style":394},[2291],{"type":44,"value":782},{"type":29,"tag":63,"props":2293,"children":2294},{"style":70},[2295],{"type":44,"value":155},{"type":29,"tag":63,"props":2297,"children":2298},{"style":117},[2299],{"type":44,"value":791},{"type":29,"tag":63,"props":2301,"children":2302},{"style":76},[2303],{"type":44,"value":796},{"type":29,"tag":63,"props":2305,"children":2306},{"class":65,"line":93},[2307],{"type":29,"tag":63,"props":2308,"children":2309},{"style":76},[2310],{"type":44,"value":2311}," sdkLanguage:\n",{"type":29,"tag":63,"props":2313,"children":2314},{"class":65,"line":103},[2315,2320,2324,2328,2332,2336,2340,2344,2348,2352],{"type":29,"tag":63,"props":2316,"children":2317},{"style":76},[2318],{"type":44,"value":2319}," (process.env.",{"type":29,"tag":63,"props":2321,"children":2322},{"style":394},[2323],{"type":44,"value":817},{"type":29,"tag":63,"props":2325,"children":2326},{"style":70},[2327],{"type":44,"value":822},{"type":29,"tag":63,"props":2329,"children":2330},{"style":117},[2331],{"type":44,"value":827},{"type":29,"tag":63,"props":2333,"children":2334},{"style":70},[2335],{"type":44,"value":832},{"type":29,"tag":63,"props":2337,"children":2338},{"style":394},[2339],{"type":44,"value":837},{"type":29,"tag":63,"props":2341,"children":2342},{"style":76},[2343],{"type":44,"value":842},{"type":29,"tag":63,"props":2345,"children":2346},{"style":70},[2347],{"type":44,"value":847},{"type":29,"tag":63,"props":2349,"children":2350},{"style":87},[2351],{"type":44,"value":852},{"type":29,"tag":63,"props":2353,"children":2354},{"style":76},[2355],{"type":44,"value":857},{"type":29,"tag":63,"props":2357,"children":2358},{"class":65,"line":138},[2359],{"type":29,"tag":63,"props":2360,"children":2361},{"style":76},[2362],{"type":44,"value":2363},"});\n",{"type":29,"tag":63,"props":2365,"children":2366},{"class":65,"line":178},[2367],{"type":29,"tag":63,"props":2368,"children":2369},{"emptyLinePlaceholder":97},[2370],{"type":44,"value":100},{"type":29,"tag":63,"props":2372,"children":2373},{"class":65,"line":213},[2374,2378,2382,2386,2390,2394,2398,2402,2406,2410],{"type":29,"tag":63,"props":2375,"children":2376},{"style":70},[2377],{"type":44,"value":1842},{"type":29,"tag":63,"props":2379,"children":2380},{"style":394},[2381],{"type":44,"value":884},{"type":29,"tag":63,"props":2383,"children":2384},{"style":70},[2385],{"type":44,"value":155},{"type":29,"tag":63,"props":2387,"children":2388},{"style":70},[2389],{"type":44,"value":893},{"type":29,"tag":63,"props":2391,"children":2392},{"style":117},[2393],{"type":44,"value":898},{"type":29,"tag":63,"props":2395,"children":2396},{"style":76},[2397],{"type":44,"value":238},{"type":29,"tag":63,"props":2399,"children":2400},{"style":394},[2401],{"type":44,"value":907},{"type":29,"tag":63,"props":2403,"children":2404},{"style":76},[2405],{"type":44,"value":912},{"type":29,"tag":63,"props":2407,"children":2408},{"style":394},[2409],{"type":44,"value":907},{"type":29,"tag":63,"props":2411,"children":2412},{"style":76},[2413],{"type":44,"value":429},{"type":29,"tag":63,"props":2415,"children":2416},{"class":65,"line":251},[2417,2422,2426],{"type":29,"tag":63,"props":2418,"children":2419},{"style":76},[2420],{"type":44,"value":2421},"clientConnection.",{"type":29,"tag":63,"props":2423,"children":2424},{"style":117},[2425],{"type":44,"value":934},{"type":29,"tag":63,"props":2427,"children":2428},{"style":76},[2429],{"type":44,"value":939},{"type":29,"tag":63,"props":2431,"children":2432},{"class":65,"line":923},[2433,2437,2441,2445,2449,2453,2457,2461,2465],{"type":29,"tag":63,"props":2434,"children":2435},{"style":70},[2436],{"type":44,"value":1842},{"type":29,"tag":63,"props":2438,"children":2439},{"style":394},[2440],{"type":44,"value":952},{"type":29,"tag":63,"props":2442,"children":2443},{"style":70},[2444],{"type":44,"value":155},{"type":29,"tag":63,"props":2446,"children":2447},{"style":70},[2448],{"type":44,"value":893},{"type":29,"tag":63,"props":2450,"children":2451},{"style":117},[2452],{"type":44,"value":965},{"type":29,"tag":63,"props":2454,"children":2455},{"style":76},[2456],{"type":44,"value":238},{"type":29,"tag":63,"props":2458,"children":2459},{"style":394},[2460],{"type":44,"value":974},{"type":29,"tag":63,"props":2462,"children":2463},{"style":977},[2464],{"type":44,"value":980},{"type":29,"tag":63,"props":2466,"children":2467},{"style":76},[2468],{"type":44,"value":429},{"type":29,"tag":30,"props":2470,"children":2471},{},[2472],{"type":44,"value":2473},"The next lines of code are the bridge between the internal client and server libraries",{"type":29,"tag":52,"props":2475,"children":2477},{"className":54,"code":2476,"filename":730,"language":56,"meta":7,"style":7},"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n",[2478],{"type":29,"tag":59,"props":2479,"children":2480},{"__ignoreMap":7},[2481,2513,2528,2559],{"type":29,"tag":63,"props":2482,"children":2483},{"class":65,"line":66},[2484,2489,2493,2497,2501,2505,2509],{"type":29,"tag":63,"props":2485,"children":2486},{"style":76},[2487],{"type":44,"value":2488},"dispatcherConnection.",{"type":29,"tag":63,"props":2490,"children":2491},{"style":117},[2492],{"type":44,"value":1015},{"type":29,"tag":63,"props":2494,"children":2495},{"style":70},[2496],{"type":44,"value":155},{"type":29,"tag":63,"props":2498,"children":2499},{"style":76},[2500],{"type":44,"value":1024},{"type":29,"tag":63,"props":2502,"children":2503},{"style":147},[2504],{"type":44,"value":1029},{"type":29,"tag":63,"props":2506,"children":2507},{"style":76},[2508],{"type":44,"value":842},{"type":29,"tag":63,"props":2510,"children":2511},{"style":70},[2512],{"type":44,"value":1038},{"type":29,"tag":63,"props":2514,"children":2515},{"class":65,"line":93},[2516,2520,2524],{"type":29,"tag":63,"props":2517,"children":2518},{"style":76},[2519],{"type":44,"value":929},{"type":29,"tag":63,"props":2521,"children":2522},{"style":117},[2523],{"type":44,"value":1051},{"type":29,"tag":63,"props":2525,"children":2526},{"style":76},[2527],{"type":44,"value":1056},{"type":29,"tag":63,"props":2529,"children":2530},{"class":65,"line":103},[2531,2535,2539,2543,2547,2551,2555],{"type":29,"tag":63,"props":2532,"children":2533},{"style":76},[2534],{"type":44,"value":2421},{"type":29,"tag":63,"props":2536,"children":2537},{"style":117},[2538],{"type":44,"value":1015},{"type":29,"tag":63,"props":2540,"children":2541},{"style":70},[2542],{"type":44,"value":155},{"type":29,"tag":63,"props":2544,"children":2545},{"style":76},[2546],{"type":44,"value":1024},{"type":29,"tag":63,"props":2548,"children":2549},{"style":147},[2550],{"type":44,"value":1029},{"type":29,"tag":63,"props":2552,"children":2553},{"style":76},[2554],{"type":44,"value":842},{"type":29,"tag":63,"props":2556,"children":2557},{"style":70},[2558],{"type":44,"value":1038},{"type":29,"tag":63,"props":2560,"children":2561},{"class":65,"line":138},[2562,2566,2570],{"type":29,"tag":63,"props":2563,"children":2564},{"style":76},[2565],{"type":44,"value":1010},{"type":29,"tag":63,"props":2567,"children":2568},{"style":117},[2569],{"type":44,"value":1051},{"type":29,"tag":63,"props":2571,"children":2572},{"style":76},[2573],{"type":44,"value":1056},{"type":29,"tag":30,"props":2575,"children":2576},{},[2577,2579,2584,2586,2591,2593,2598,2600,2606,2608,2614,2616,2621,2623,2629],{"type":44,"value":2578},"given by setting the ",{"type":29,"tag":59,"props":2580,"children":2582},{"className":2581},[],[2583],{"type":44,"value":1015},{"type":44,"value":2585}," properties for each of these objects. Notice each ",{"type":29,"tag":59,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":44,"value":1015},{"type":44,"value":2592}," calls the other's ",{"type":29,"tag":59,"props":2594,"children":2596},{"className":2595},[],[2597],{"type":44,"value":1051},{"type":44,"value":2599}," method; i.e., ",{"type":29,"tag":59,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":44,"value":2605},"dispatcherConnection",{"type":44,"value":2607}," calls the ",{"type":29,"tag":59,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":44,"value":2613},"clientConnection.dispatch",{"type":44,"value":2615}," through ",{"type":29,"tag":59,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":44,"value":1015},{"type":44,"value":2622}," and vice versa. This gives us the hint somehow ",{"type":29,"tag":59,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":44,"value":2628},"dispatcherConnection.onmessage",{"type":44,"value":2630}," will be called somewhere in the codebase.",{"type":29,"tag":269,"props":2632,"children":2634},{"id":2633},"server-side-createplaywright",[2635],{"type":44,"value":2636},"Server-side createPlaywright",{"type":29,"tag":30,"props":2638,"children":2639},{},[2640,2642,2647,2649,2654,2656,2661,2662,2667],{"type":44,"value":2641},"Before we continue down the logic within ",{"type":29,"tag":59,"props":2643,"children":2645},{"className":2644},[],[2646],{"type":44,"value":504},{"type":44,"value":2648},", let's go over what the ",{"type":29,"tag":59,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":44,"value":2189},{"type":44,"value":2655}," function actually does. It is a simple function call which instantiates the ",{"type":29,"tag":59,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":44,"value":12},{"type":44,"value":2213},{"type":29,"tag":59,"props":2663,"children":2665},{"className":2664},[],[2666],{"type":44,"value":2219},{"type":44,"value":2668},". Below is a simplified version of it",{"type":29,"tag":52,"props":2670,"children":2672},{"className":54,"code":2671,"filename":2219,"language":56,"meta":7,"style":7},"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n",[2673],{"type":29,"tag":59,"props":2674,"children":2675},{"__ignoreMap":7},[2676,2701,2726,2751,2776,2801,2808,2837,2862,2887,2912,2937,2962,2987,3012,3037,3044,3074,3086,3116,3128,3136,3144,3166,3203,3239,3275,3303,3339,3346],{"type":29,"tag":63,"props":2677,"children":2678},{"class":65,"line":66},[2679,2683,2688,2692,2697],{"type":29,"tag":63,"props":2680,"children":2681},{"style":70},[2682],{"type":44,"value":73},{"type":29,"tag":63,"props":2684,"children":2685},{"style":76},[2686],{"type":44,"value":2687}," { Chromium } ",{"type":29,"tag":63,"props":2689,"children":2690},{"style":70},[2691],{"type":44,"value":84},{"type":29,"tag":63,"props":2693,"children":2694},{"style":87},[2695],{"type":44,"value":2696}," \"./chromium/chromium\"",{"type":29,"tag":63,"props":2698,"children":2699},{"style":76},[2700],{"type":44,"value":1244},{"type":29,"tag":63,"props":2702,"children":2703},{"class":65,"line":93},[2704,2708,2713,2717,2722],{"type":29,"tag":63,"props":2705,"children":2706},{"style":70},[2707],{"type":44,"value":73},{"type":29,"tag":63,"props":2709,"children":2710},{"style":76},[2711],{"type":44,"value":2712}," { Firefox } ",{"type":29,"tag":63,"props":2714,"children":2715},{"style":70},[2716],{"type":44,"value":84},{"type":29,"tag":63,"props":2718,"children":2719},{"style":87},[2720],{"type":44,"value":2721}," \"./firefox/firefox\"",{"type":29,"tag":63,"props":2723,"children":2724},{"style":76},[2725],{"type":44,"value":1244},{"type":29,"tag":63,"props":2727,"children":2728},{"class":65,"line":103},[2729,2733,2738,2742,2747],{"type":29,"tag":63,"props":2730,"children":2731},{"style":70},[2732],{"type":44,"value":73},{"type":29,"tag":63,"props":2734,"children":2735},{"style":76},[2736],{"type":44,"value":2737}," { Selectors } ",{"type":29,"tag":63,"props":2739,"children":2740},{"style":70},[2741],{"type":44,"value":84},{"type":29,"tag":63,"props":2743,"children":2744},{"style":87},[2745],{"type":44,"value":2746}," \"./selectors\"",{"type":29,"tag":63,"props":2748,"children":2749},{"style":76},[2750],{"type":44,"value":1244},{"type":29,"tag":63,"props":2752,"children":2753},{"class":65,"line":138},[2754,2758,2763,2767,2772],{"type":29,"tag":63,"props":2755,"children":2756},{"style":70},[2757],{"type":44,"value":73},{"type":29,"tag":63,"props":2759,"children":2760},{"style":76},[2761],{"type":44,"value":2762}," { WebKit } ",{"type":29,"tag":63,"props":2764,"children":2765},{"style":70},[2766],{"type":44,"value":84},{"type":29,"tag":63,"props":2768,"children":2769},{"style":87},[2770],{"type":44,"value":2771}," \"./webkit/webkit\"",{"type":29,"tag":63,"props":2773,"children":2774},{"style":76},[2775],{"type":44,"value":1244},{"type":29,"tag":63,"props":2777,"children":2778},{"class":65,"line":178},[2779,2783,2788,2792,2797],{"type":29,"tag":63,"props":2780,"children":2781},{"style":70},[2782],{"type":44,"value":73},{"type":29,"tag":63,"props":2784,"children":2785},{"style":76},[2786],{"type":44,"value":2787}," { createInstrumentation, SdkObject } ",{"type":29,"tag":63,"props":2789,"children":2790},{"style":70},[2791],{"type":44,"value":84},{"type":29,"tag":63,"props":2793,"children":2794},{"style":87},[2795],{"type":44,"value":2796}," \"./instrumentation\"",{"type":29,"tag":63,"props":2798,"children":2799},{"style":76},[2800],{"type":44,"value":1244},{"type":29,"tag":63,"props":2802,"children":2803},{"class":65,"line":213},[2804],{"type":29,"tag":63,"props":2805,"children":2806},{"emptyLinePlaceholder":97},[2807],{"type":44,"value":100},{"type":29,"tag":63,"props":2809,"children":2810},{"class":65,"line":251},[2811,2815,2819,2824,2828,2833],{"type":29,"tag":63,"props":2812,"children":2813},{"style":70},[2814],{"type":44,"value":742},{"type":29,"tag":63,"props":2816,"children":2817},{"style":70},[2818],{"type":44,"value":1962},{"type":29,"tag":63,"props":2820,"children":2821},{"style":117},[2822],{"type":44,"value":2823}," Playwright",{"type":29,"tag":63,"props":2825,"children":2826},{"style":70},[2827],{"type":44,"value":1971},{"type":29,"tag":63,"props":2829,"children":2830},{"style":117},[2831],{"type":44,"value":2832}," SdkObject",{"type":29,"tag":63,"props":2834,"children":2835},{"style":76},[2836],{"type":44,"value":135},{"type":29,"tag":63,"props":2838,"children":2839},{"class":65,"line":923},[2840,2844,2849,2853,2858],{"type":29,"tag":63,"props":2841,"children":2842},{"style":70},[2843],{"type":44,"value":1988},{"type":29,"tag":63,"props":2845,"children":2846},{"style":147},[2847],{"type":44,"value":2848}," selectors",{"type":29,"tag":63,"props":2850,"children":2851},{"style":70},[2852],{"type":44,"value":761},{"type":29,"tag":63,"props":2854,"children":2855},{"style":117},[2856],{"type":44,"value":2857}," Selectors",{"type":29,"tag":63,"props":2859,"children":2860},{"style":76},[2861],{"type":44,"value":1244},{"type":29,"tag":63,"props":2863,"children":2864},{"class":65,"line":942},[2865,2869,2874,2878,2883],{"type":29,"tag":63,"props":2866,"children":2867},{"style":70},[2868],{"type":44,"value":1988},{"type":29,"tag":63,"props":2870,"children":2871},{"style":147},[2872],{"type":44,"value":2873}," chromium",{"type":29,"tag":63,"props":2875,"children":2876},{"style":70},[2877],{"type":44,"value":761},{"type":29,"tag":63,"props":2879,"children":2880},{"style":117},[2881],{"type":44,"value":2882}," Chromium",{"type":29,"tag":63,"props":2884,"children":2885},{"style":76},[2886],{"type":44,"value":1244},{"type":29,"tag":63,"props":2888,"children":2889},{"class":65,"line":987},[2890,2894,2899,2903,2908],{"type":29,"tag":63,"props":2891,"children":2892},{"style":70},[2893],{"type":44,"value":1988},{"type":29,"tag":63,"props":2895,"children":2896},{"style":147},[2897],{"type":44,"value":2898}," android",{"type":29,"tag":63,"props":2900,"children":2901},{"style":70},[2902],{"type":44,"value":761},{"type":29,"tag":63,"props":2904,"children":2905},{"style":117},[2906],{"type":44,"value":2907}," Android",{"type":29,"tag":63,"props":2909,"children":2910},{"style":76},[2911],{"type":44,"value":1244},{"type":29,"tag":63,"props":2913,"children":2914},{"class":65,"line":995},[2915,2919,2924,2928,2933],{"type":29,"tag":63,"props":2916,"children":2917},{"style":70},[2918],{"type":44,"value":1988},{"type":29,"tag":63,"props":2920,"children":2921},{"style":147},[2922],{"type":44,"value":2923}," electron",{"type":29,"tag":63,"props":2925,"children":2926},{"style":70},[2927],{"type":44,"value":761},{"type":29,"tag":63,"props":2929,"children":2930},{"style":117},[2931],{"type":44,"value":2932}," Electron",{"type":29,"tag":63,"props":2934,"children":2935},{"style":76},[2936],{"type":44,"value":1244},{"type":29,"tag":63,"props":2938,"children":2939},{"class":65,"line":1004},[2940,2944,2949,2953,2958],{"type":29,"tag":63,"props":2941,"children":2942},{"style":70},[2943],{"type":44,"value":1988},{"type":29,"tag":63,"props":2945,"children":2946},{"style":147},[2947],{"type":44,"value":2948}," firefox",{"type":29,"tag":63,"props":2950,"children":2951},{"style":70},[2952],{"type":44,"value":761},{"type":29,"tag":63,"props":2954,"children":2955},{"style":117},[2956],{"type":44,"value":2957}," Firefox",{"type":29,"tag":63,"props":2959,"children":2960},{"style":76},[2961],{"type":44,"value":1244},{"type":29,"tag":63,"props":2963,"children":2964},{"class":65,"line":23},[2965,2969,2974,2978,2983],{"type":29,"tag":63,"props":2966,"children":2967},{"style":70},[2968],{"type":44,"value":1988},{"type":29,"tag":63,"props":2970,"children":2971},{"style":147},[2972],{"type":44,"value":2973}," webkit",{"type":29,"tag":63,"props":2975,"children":2976},{"style":70},[2977],{"type":44,"value":761},{"type":29,"tag":63,"props":2979,"children":2980},{"style":117},[2981],{"type":44,"value":2982}," WebKit",{"type":29,"tag":63,"props":2984,"children":2985},{"style":76},[2986],{"type":44,"value":1244},{"type":29,"tag":63,"props":2988,"children":2989},{"class":65,"line":1059},[2990,2994,2999,3003,3008],{"type":29,"tag":63,"props":2991,"children":2992},{"style":70},[2993],{"type":44,"value":1988},{"type":29,"tag":63,"props":2995,"children":2996},{"style":147},[2997],{"type":44,"value":2998}," options",{"type":29,"tag":63,"props":3000,"children":3001},{"style":70},[3002],{"type":44,"value":761},{"type":29,"tag":63,"props":3004,"children":3005},{"style":117},[3006],{"type":44,"value":3007}," PlaywrightOptions",{"type":29,"tag":63,"props":3009,"children":3010},{"style":76},[3011],{"type":44,"value":1244},{"type":29,"tag":63,"props":3013,"children":3014},{"class":65,"line":1091},[3015,3019,3024,3028,3033],{"type":29,"tag":63,"props":3016,"children":3017},{"style":70},[3018],{"type":44,"value":1988},{"type":29,"tag":63,"props":3020,"children":3021},{"style":147},[3022],{"type":44,"value":3023}," debugController",{"type":29,"tag":63,"props":3025,"children":3026},{"style":70},[3027],{"type":44,"value":761},{"type":29,"tag":63,"props":3029,"children":3030},{"style":117},[3031],{"type":44,"value":3032}," DebugController",{"type":29,"tag":63,"props":3034,"children":3035},{"style":76},[3036],{"type":44,"value":1244},{"type":29,"tag":63,"props":3038,"children":3039},{"class":65,"line":1108},[3040],{"type":29,"tag":63,"props":3041,"children":3042},{"emptyLinePlaceholder":97},[3043],{"type":44,"value":100},{"type":29,"tag":63,"props":3045,"children":3046},{"class":65,"line":1116},[3047,3052,3056,3061,3065,3069],{"type":29,"tag":63,"props":3048,"children":3049},{"style":70},[3050],{"type":44,"value":3051}," constructor",{"type":29,"tag":63,"props":3053,"children":3054},{"style":76},[3055],{"type":44,"value":238},{"type":29,"tag":63,"props":3057,"children":3058},{"style":147},[3059],{"type":44,"value":3060},"options",{"type":29,"tag":63,"props":3062,"children":3063},{"style":70},[3064],{"type":44,"value":761},{"type":29,"tag":63,"props":3066,"children":3067},{"style":117},[3068],{"type":44,"value":3007},{"type":29,"tag":63,"props":3070,"children":3071},{"style":76},[3072],{"type":44,"value":3073},") {\n",{"type":29,"tag":63,"props":3075,"children":3076},{"class":65,"line":1147},[3077,3082],{"type":29,"tag":63,"props":3078,"children":3079},{"style":394},[3080],{"type":44,"value":3081}," super",{"type":29,"tag":63,"props":3083,"children":3084},{"style":76},[3085],{"type":44,"value":1212},{"type":29,"tag":63,"props":3087,"children":3088},{"class":65,"line":1155},[3089,3094,3099,3104,3108,3112],{"type":29,"tag":63,"props":3090,"children":3091},{"style":76},[3092],{"type":44,"value":3093}," { attribution: {}, instrumentation: ",{"type":29,"tag":63,"props":3095,"children":3096},{"style":117},[3097],{"type":44,"value":3098},"createInstrumentation",{"type":29,"tag":63,"props":3100,"children":3101},{"style":76},[3102],{"type":44,"value":3103},"() } ",{"type":29,"tag":63,"props":3105,"children":3106},{"style":70},[3107],{"type":44,"value":1235},{"type":29,"tag":63,"props":3109,"children":3110},{"style":394},[3111],{"type":44,"value":1583},{"type":29,"tag":63,"props":3113,"children":3114},{"style":76},[3115],{"type":44,"value":857},{"type":29,"tag":63,"props":3117,"children":3118},{"class":65,"line":1164},[3119,3124],{"type":29,"tag":63,"props":3120,"children":3121},{"style":394},[3122],{"type":44,"value":3123}," undefined",{"type":29,"tag":63,"props":3125,"children":3126},{"style":76},[3127],{"type":44,"value":857},{"type":29,"tag":63,"props":3129,"children":3130},{"class":65,"line":1183},[3131],{"type":29,"tag":63,"props":3132,"children":3133},{"style":87},[3134],{"type":44,"value":3135}," \"Playwright\"\n",{"type":29,"tag":63,"props":3137,"children":3138},{"class":65,"line":1215},[3139],{"type":29,"tag":63,"props":3140,"children":3141},{"style":76},[3142],{"type":44,"value":3143}," );\n",{"type":29,"tag":63,"props":3145,"children":3146},{"class":65,"line":1224},[3147,3152,3157,3161],{"type":29,"tag":63,"props":3148,"children":3149},{"style":394},[3150],{"type":44,"value":3151}," this",{"type":29,"tag":63,"props":3153,"children":3154},{"style":76},[3155],{"type":44,"value":3156},".options ",{"type":29,"tag":63,"props":3158,"children":3159},{"style":70},[3160],{"type":44,"value":1258},{"type":29,"tag":63,"props":3162,"children":3163},{"style":76},[3164],{"type":44,"value":3165}," options;\n",{"type":29,"tag":63,"props":3167,"children":3168},{"class":65,"line":1247},[3169,3173,3178,3182,3186,3190,3194,3199],{"type":29,"tag":63,"props":3170,"children":3171},{"style":394},[3172],{"type":44,"value":3151},{"type":29,"tag":63,"props":3174,"children":3175},{"style":76},[3176],{"type":44,"value":3177},".chromium ",{"type":29,"tag":63,"props":3179,"children":3180},{"style":70},[3181],{"type":44,"value":1258},{"type":29,"tag":63,"props":3183,"children":3184},{"style":70},[3185],{"type":44,"value":893},{"type":29,"tag":63,"props":3187,"children":3188},{"style":117},[3189],{"type":44,"value":2882},{"type":29,"tag":63,"props":3191,"children":3192},{"style":76},[3193],{"type":44,"value":238},{"type":29,"tag":63,"props":3195,"children":3196},{"style":394},[3197],{"type":44,"value":3198},"this",{"type":29,"tag":63,"props":3200,"children":3201},{"style":76},[3202],{"type":44,"value":429},{"type":29,"tag":63,"props":3204,"children":3205},{"class":65,"line":1274},[3206,3210,3215,3219,3223,3227,3231,3235],{"type":29,"tag":63,"props":3207,"children":3208},{"style":394},[3209],{"type":44,"value":3151},{"type":29,"tag":63,"props":3211,"children":3212},{"style":76},[3213],{"type":44,"value":3214},".firefox ",{"type":29,"tag":63,"props":3216,"children":3217},{"style":70},[3218],{"type":44,"value":1258},{"type":29,"tag":63,"props":3220,"children":3221},{"style":70},[3222],{"type":44,"value":893},{"type":29,"tag":63,"props":3224,"children":3225},{"style":117},[3226],{"type":44,"value":2957},{"type":29,"tag":63,"props":3228,"children":3229},{"style":76},[3230],{"type":44,"value":238},{"type":29,"tag":63,"props":3232,"children":3233},{"style":394},[3234],{"type":44,"value":3198},{"type":29,"tag":63,"props":3236,"children":3237},{"style":76},[3238],{"type":44,"value":429},{"type":29,"tag":63,"props":3240,"children":3241},{"class":65,"line":1283},[3242,3246,3251,3255,3259,3263,3267,3271],{"type":29,"tag":63,"props":3243,"children":3244},{"style":394},[3245],{"type":44,"value":3151},{"type":29,"tag":63,"props":3247,"children":3248},{"style":76},[3249],{"type":44,"value":3250},".webkit ",{"type":29,"tag":63,"props":3252,"children":3253},{"style":70},[3254],{"type":44,"value":1258},{"type":29,"tag":63,"props":3256,"children":3257},{"style":70},[3258],{"type":44,"value":893},{"type":29,"tag":63,"props":3260,"children":3261},{"style":117},[3262],{"type":44,"value":2982},{"type":29,"tag":63,"props":3264,"children":3265},{"style":76},[3266],{"type":44,"value":238},{"type":29,"tag":63,"props":3268,"children":3269},{"style":394},[3270],{"type":44,"value":3198},{"type":29,"tag":63,"props":3272,"children":3273},{"style":76},[3274],{"type":44,"value":429},{"type":29,"tag":63,"props":3276,"children":3277},{"class":65,"line":1292},[3278,3282,3287,3291,3295,3299],{"type":29,"tag":63,"props":3279,"children":3280},{"style":394},[3281],{"type":44,"value":3151},{"type":29,"tag":63,"props":3283,"children":3284},{"style":76},[3285],{"type":44,"value":3286},".selectors ",{"type":29,"tag":63,"props":3288,"children":3289},{"style":70},[3290],{"type":44,"value":1258},{"type":29,"tag":63,"props":3292,"children":3293},{"style":70},[3294],{"type":44,"value":893},{"type":29,"tag":63,"props":3296,"children":3297},{"style":117},[3298],{"type":44,"value":2857},{"type":29,"tag":63,"props":3300,"children":3301},{"style":76},[3302],{"type":44,"value":939},{"type":29,"tag":63,"props":3304,"children":3305},{"class":65,"line":1317},[3306,3310,3315,3319,3323,3327,3331,3335],{"type":29,"tag":63,"props":3307,"children":3308},{"style":394},[3309],{"type":44,"value":3151},{"type":29,"tag":63,"props":3311,"children":3312},{"style":76},[3313],{"type":44,"value":3314},".debugController ",{"type":29,"tag":63,"props":3316,"children":3317},{"style":70},[3318],{"type":44,"value":1258},{"type":29,"tag":63,"props":3320,"children":3321},{"style":70},[3322],{"type":44,"value":893},{"type":29,"tag":63,"props":3324,"children":3325},{"style":117},[3326],{"type":44,"value":3032},{"type":29,"tag":63,"props":3328,"children":3329},{"style":76},[3330],{"type":44,"value":238},{"type":29,"tag":63,"props":3332,"children":3333},{"style":394},[3334],{"type":44,"value":3198},{"type":29,"tag":63,"props":3336,"children":3337},{"style":76},[3338],{"type":44,"value":429},{"type":29,"tag":63,"props":3340,"children":3341},{"class":65,"line":1326},[3342],{"type":29,"tag":63,"props":3343,"children":3344},{"style":76},[3345],{"type":44,"value":2123},{"type":29,"tag":63,"props":3347,"children":3348},{"class":65,"line":1334},[3349],{"type":29,"tag":63,"props":3350,"children":3351},{"style":76},[3352],{"type":44,"value":257},{"type":29,"tag":30,"props":3354,"children":3355},{},[3356,3358,3364,3366,3371],{"type":44,"value":3357},"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into ",{"type":29,"tag":59,"props":3359,"children":3361},{"className":3360},[],[3362],{"type":44,"value":3363},"packages/playwright-core/server/chromium/",{"type":44,"value":3365}," you will see all the functionality for automating a ",{"type":29,"tag":59,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":44,"value":1801},{"type":44,"value":201},{"type":29,"tag":269,"props":3373,"children":3375},{"id":3374},"rootdispatcher-and-server-side-playwright",[3376],{"type":44,"value":3377},"RootDispatcher and server-side Playwright",{"type":29,"tag":30,"props":3379,"children":3380},{},[3381,3383,3388,3390,3396,3398,3404],{"type":44,"value":3382},"Continuing down ",{"type":29,"tag":59,"props":3384,"children":3386},{"className":3385},[],[3387],{"type":44,"value":504},{"type":44,"value":3389},", we see there's the construction of a ",{"type":29,"tag":59,"props":3391,"children":3393},{"className":3392},[],[3394],{"type":44,"value":3395},"RootDispatcher",{"type":44,"value":3397}," instance, and a ",{"type":29,"tag":59,"props":3399,"children":3401},{"className":3400},[],[3402],{"type":44,"value":3403},"PlaywrightDispatcher",{"type":44,"value":3405}," instance.",{"type":29,"tag":52,"props":3407,"children":3409},{"className":54,"code":3408,"filename":730,"language":56,"meta":7,"style":7},"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n",[3410],{"type":29,"tag":59,"props":3411,"children":3412},{"__ignoreMap":7},[3413,3440,3447,3455],{"type":29,"tag":63,"props":3414,"children":3415},{"class":65,"line":66},[3416,3420,3424,3428,3432,3436],{"type":29,"tag":63,"props":3417,"children":3418},{"style":70},[3419],{"type":44,"value":1842},{"type":29,"tag":63,"props":3421,"children":3422},{"style":394},[3423],{"type":44,"value":1126},{"type":29,"tag":63,"props":3425,"children":3426},{"style":70},[3427],{"type":44,"value":155},{"type":29,"tag":63,"props":3429,"children":3430},{"style":70},[3431],{"type":44,"value":893},{"type":29,"tag":63,"props":3433,"children":3434},{"style":117},[3435],{"type":44,"value":1139},{"type":29,"tag":63,"props":3437,"children":3438},{"style":76},[3439],{"type":44,"value":1144},{"type":29,"tag":63,"props":3441,"children":3442},{"class":65,"line":93},[3443],{"type":29,"tag":63,"props":3444,"children":3445},{"emptyLinePlaceholder":97},[3446],{"type":44,"value":100},{"type":29,"tag":63,"props":3448,"children":3449},{"class":65,"line":103},[3450],{"type":29,"tag":63,"props":3451,"children":3452},{"style":977},[3453],{"type":44,"value":3454},"// Initialize Playwright channel.\n",{"type":29,"tag":63,"props":3456,"children":3457},{"class":65,"line":138},[3458,3463,3467],{"type":29,"tag":63,"props":3459,"children":3460},{"style":70},[3461],{"type":44,"value":3462},"new",{"type":29,"tag":63,"props":3464,"children":3465},{"style":117},[3466],{"type":44,"value":1175},{"type":29,"tag":63,"props":3468,"children":3469},{"style":76},[3470],{"type":44,"value":1180},{"type":29,"tag":30,"props":3472,"children":3473},{},[3474,3476,3482,3484,3489,3491,3496,3498,3503,3505,3510,3512,3517,3519,3524,3526,3531],{"type":44,"value":3475},"Note the ",{"type":29,"tag":59,"props":3477,"children":3479},{"className":3478},[],[3480],{"type":44,"value":3481},"rootScope",{"type":44,"value":3483}," object is referenced throughout the dispatcher classes, and acts as a wrapper around the ",{"type":29,"tag":59,"props":3485,"children":3487},{"className":3486},[],[3488],{"type":44,"value":2605},{"type":44,"value":3490}," object instantiated above, so that each of the child ",{"type":29,"tag":59,"props":3492,"children":3494},{"className":3493},[],[3495],{"type":44,"value":619},{"type":44,"value":3497}," classes will have access to the ",{"type":29,"tag":59,"props":3499,"children":3501},{"className":3500},[],[3502],{"type":44,"value":2605},{"type":44,"value":3504}," through the ",{"type":29,"tag":59,"props":3506,"children":3508},{"className":3507},[],[3509],{"type":44,"value":3481},{"type":44,"value":3511}," object. This wrapping functionality will become clearer when we dive into ",{"type":29,"tag":59,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":44,"value":3403},{"type":44,"value":3518},"'s constructor, where it passes the ",{"type":29,"tag":59,"props":3520,"children":3522},{"className":3521},[],[3523],{"type":44,"value":3481},{"type":44,"value":3525}," to all of the child ",{"type":29,"tag":59,"props":3527,"children":3529},{"className":3528},[],[3530],{"type":44,"value":619},{"type":44,"value":3532}," classes.",{"type":29,"tag":30,"props":3534,"children":3535},{},[3536,3538,3544],{"type":44,"value":3537},"Here's a simplified version of what's happening in the constructor for ",{"type":29,"tag":59,"props":3539,"children":3541},{"className":3540},[],[3542],{"type":44,"value":3543},"Rootscope",{"type":44,"value":761},{"type":29,"tag":52,"props":3546,"children":3549},{"className":54,"code":3547,"filename":3548,"language":56,"meta":7,"style":7},"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\u003CType>\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","playwright-core/src/server/dispatchers/dispatcher.ts",[3550],{"type":29,"tag":59,"props":3551,"children":3552},{"__ignoreMap":7},[3553,3578,3606,3637,3644,3651,3658,3681,3701,3729,3736,3747,3776,3797,3817,3857,3865,3876,3883,3900,3936,3982,3989,4010,4031,4052,4059,4088,4095,4116,4137,4150,4158,4166,4174,4186,4194,4201],{"type":29,"tag":63,"props":3554,"children":3555},{"class":65,"line":66},[3556,3561,3565,3569,3574],{"type":29,"tag":63,"props":3557,"children":3558},{"style":70},[3559],{"type":44,"value":3560},"class",{"type":29,"tag":63,"props":3562,"children":3563},{"style":117},[3564],{"type":44,"value":1139},{"type":29,"tag":63,"props":3566,"children":3567},{"style":70},[3568],{"type":44,"value":1971},{"type":29,"tag":63,"props":3570,"children":3571},{"style":117},[3572],{"type":44,"value":3573}," Dispatcher",{"type":29,"tag":63,"props":3575,"children":3576},{"style":76},[3577],{"type":44,"value":135},{"type":29,"tag":63,"props":3579,"children":3580},{"class":65,"line":93},[3581,3585,3589,3594,3598,3602],{"type":29,"tag":63,"props":3582,"children":3583},{"style":70},[3584],{"type":44,"value":3051},{"type":29,"tag":63,"props":3586,"children":3587},{"style":76},[3588],{"type":44,"value":238},{"type":29,"tag":63,"props":3590,"children":3591},{"style":147},[3592],{"type":44,"value":3593},"connection",{"type":29,"tag":63,"props":3595,"children":3596},{"style":70},[3597],{"type":44,"value":761},{"type":29,"tag":63,"props":3599,"children":3600},{"style":117},[3601],{"type":44,"value":965},{"type":29,"tag":63,"props":3603,"children":3604},{"style":76},[3605],{"type":44,"value":3073},{"type":29,"tag":63,"props":3607,"children":3608},{"class":65,"line":103},[3609,3613,3618,3622,3627,3632],{"type":29,"tag":63,"props":3610,"children":3611},{"style":394},[3612],{"type":44,"value":3081},{"type":29,"tag":63,"props":3614,"children":3615},{"style":76},[3616],{"type":44,"value":3617},"(connection, { guid: ",{"type":29,"tag":63,"props":3619,"children":3620},{"style":87},[3621],{"type":44,"value":1660},{"type":29,"tag":63,"props":3623,"children":3624},{"style":76},[3625],{"type":44,"value":3626}," }, ",{"type":29,"tag":63,"props":3628,"children":3629},{"style":87},[3630],{"type":44,"value":3631},"\"Root\"",{"type":29,"tag":63,"props":3633,"children":3634},{"style":76},[3635],{"type":44,"value":3636},", {});\n",{"type":29,"tag":63,"props":3638,"children":3639},{"class":65,"line":138},[3640],{"type":29,"tag":63,"props":3641,"children":3642},{"style":76},[3643],{"type":44,"value":2123},{"type":29,"tag":63,"props":3645,"children":3646},{"class":65,"line":178},[3647],{"type":29,"tag":63,"props":3648,"children":3649},{"style":76},[3650],{"type":44,"value":257},{"type":29,"tag":63,"props":3652,"children":3653},{"class":65,"line":213},[3654],{"type":29,"tag":63,"props":3655,"children":3656},{"emptyLinePlaceholder":97},[3657],{"type":44,"value":100},{"type":29,"tag":63,"props":3659,"children":3660},{"class":65,"line":251},[3661,3665,3669,3673,3677],{"type":29,"tag":63,"props":3662,"children":3663},{"style":70},[3664],{"type":44,"value":3560},{"type":29,"tag":63,"props":3666,"children":3667},{"style":117},[3668],{"type":44,"value":3573},{"type":29,"tag":63,"props":3670,"children":3671},{"style":70},[3672],{"type":44,"value":1971},{"type":29,"tag":63,"props":3674,"children":3675},{"style":117},[3676],{"type":44,"value":1976},{"type":29,"tag":63,"props":3678,"children":3679},{"style":76},[3680],{"type":44,"value":135},{"type":29,"tag":63,"props":3682,"children":3683},{"class":65,"line":923},[3684,3689,3693,3697],{"type":29,"tag":63,"props":3685,"children":3686},{"style":147},[3687],{"type":44,"value":3688}," _connection",{"type":29,"tag":63,"props":3690,"children":3691},{"style":70},[3692],{"type":44,"value":761},{"type":29,"tag":63,"props":3694,"children":3695},{"style":117},[3696],{"type":44,"value":965},{"type":29,"tag":63,"props":3698,"children":3699},{"style":76},[3700],{"type":44,"value":1244},{"type":29,"tag":63,"props":3702,"children":3703},{"class":65,"line":942},[3704,3709,3713,3717,3721,3725],{"type":29,"tag":63,"props":3705,"children":3706},{"style":147},[3707],{"type":44,"value":3708}," _parent",{"type":29,"tag":63,"props":3710,"children":3711},{"style":70},[3712],{"type":44,"value":761},{"type":29,"tag":63,"props":3714,"children":3715},{"style":117},[3716],{"type":44,"value":965},{"type":29,"tag":63,"props":3718,"children":3719},{"style":70},[3720],{"type":44,"value":832},{"type":29,"tag":63,"props":3722,"children":3723},{"style":394},[3724],{"type":44,"value":837},{"type":29,"tag":63,"props":3726,"children":3727},{"style":76},[3728],{"type":44,"value":1244},{"type":29,"tag":63,"props":3730,"children":3731},{"class":65,"line":987},[3732],{"type":29,"tag":63,"props":3733,"children":3734},{"emptyLinePlaceholder":97},[3735],{"type":44,"value":100},{"type":29,"tag":63,"props":3737,"children":3738},{"class":65,"line":995},[3739,3743],{"type":29,"tag":63,"props":3740,"children":3741},{"style":70},[3742],{"type":44,"value":3051},{"type":29,"tag":63,"props":3744,"children":3745},{"style":76},[3746],{"type":44,"value":1212},{"type":29,"tag":63,"props":3748,"children":3749},{"class":65,"line":1004},[3750,3755,3759,3764,3768,3772],{"type":29,"tag":63,"props":3751,"children":3752},{"style":147},[3753],{"type":44,"value":3754}," parent",{"type":29,"tag":63,"props":3756,"children":3757},{"style":70},[3758],{"type":44,"value":761},{"type":29,"tag":63,"props":3760,"children":3761},{"style":117},[3762],{"type":44,"value":3763}," ParentScopeType",{"type":29,"tag":63,"props":3765,"children":3766},{"style":70},[3767],{"type":44,"value":832},{"type":29,"tag":63,"props":3769,"children":3770},{"style":117},[3771],{"type":44,"value":965},{"type":29,"tag":63,"props":3773,"children":3774},{"style":76},[3775],{"type":44,"value":857},{"type":29,"tag":63,"props":3777,"children":3778},{"class":65,"line":23},[3779,3784,3788,3793],{"type":29,"tag":63,"props":3780,"children":3781},{"style":147},[3782],{"type":44,"value":3783}," object",{"type":29,"tag":63,"props":3785,"children":3786},{"style":70},[3787],{"type":44,"value":761},{"type":29,"tag":63,"props":3789,"children":3790},{"style":117},[3791],{"type":44,"value":3792}," Type",{"type":29,"tag":63,"props":3794,"children":3795},{"style":76},[3796],{"type":44,"value":857},{"type":29,"tag":63,"props":3798,"children":3799},{"class":65,"line":1059},[3800,3805,3809,3813],{"type":29,"tag":63,"props":3801,"children":3802},{"style":147},[3803],{"type":44,"value":3804}," type",{"type":29,"tag":63,"props":3806,"children":3807},{"style":70},[3808],{"type":44,"value":761},{"type":29,"tag":63,"props":3810,"children":3811},{"style":394},[3812],{"type":44,"value":2063},{"type":29,"tag":63,"props":3814,"children":3815},{"style":76},[3816],{"type":44,"value":857},{"type":29,"tag":63,"props":3818,"children":3819},{"class":65,"line":1091},[3820,3825,3829,3834,3838,3843,3847,3852],{"type":29,"tag":63,"props":3821,"children":3822},{"style":147},[3823],{"type":44,"value":3824}," initializer",{"type":29,"tag":63,"props":3826,"children":3827},{"style":70},[3828],{"type":44,"value":761},{"type":29,"tag":63,"props":3830,"children":3831},{"style":117},[3832],{"type":44,"value":3833}," channels",{"type":29,"tag":63,"props":3835,"children":3836},{"style":76},[3837],{"type":44,"value":228},{"type":29,"tag":63,"props":3839,"children":3840},{"style":117},[3841],{"type":44,"value":3842},"InitializerTraits",{"type":29,"tag":63,"props":3844,"children":3845},{"style":76},[3846],{"type":44,"value":2011},{"type":29,"tag":63,"props":3848,"children":3849},{"style":117},[3850],{"type":44,"value":3851},"Type",{"type":29,"tag":63,"props":3853,"children":3854},{"style":76},[3855],{"type":44,"value":3856},">\n",{"type":29,"tag":63,"props":3858,"children":3859},{"class":65,"line":1108},[3860],{"type":29,"tag":63,"props":3861,"children":3862},{"style":76},[3863],{"type":44,"value":3864}," ) {\n",{"type":29,"tag":63,"props":3866,"children":3867},{"class":65,"line":1116},[3868,3872],{"type":29,"tag":63,"props":3869,"children":3870},{"style":394},[3871],{"type":44,"value":3081},{"type":29,"tag":63,"props":3873,"children":3874},{"style":76},[3875],{"type":44,"value":939},{"type":29,"tag":63,"props":3877,"children":3878},{"class":65,"line":1147},[3879],{"type":29,"tag":63,"props":3880,"children":3881},{"emptyLinePlaceholder":97},[3882],{"type":44,"value":100},{"type":29,"tag":63,"props":3884,"children":3885},{"class":65,"line":1155},[3886,3890,3895],{"type":29,"tag":63,"props":3887,"children":3888},{"style":394},[3889],{"type":44,"value":3151},{"type":29,"tag":63,"props":3891,"children":3892},{"style":76},[3893],{"type":44,"value":3894},"._connection ",{"type":29,"tag":63,"props":3896,"children":3897},{"style":70},[3898],{"type":44,"value":3899},"=\n",{"type":29,"tag":63,"props":3901,"children":3902},{"class":65,"line":1164},[3903,3908,3913,3917,3922,3927,3931],{"type":29,"tag":63,"props":3904,"children":3905},{"style":76},[3906],{"type":44,"value":3907}," parent ",{"type":29,"tag":63,"props":3909,"children":3910},{"style":70},[3911],{"type":44,"value":3912},"instanceof",{"type":29,"tag":63,"props":3914,"children":3915},{"style":117},[3916],{"type":44,"value":965},{"type":29,"tag":63,"props":3918,"children":3919},{"style":70},[3920],{"type":44,"value":3921}," ?",{"type":29,"tag":63,"props":3923,"children":3924},{"style":76},[3925],{"type":44,"value":3926}," parent ",{"type":29,"tag":63,"props":3928,"children":3929},{"style":70},[3930],{"type":44,"value":761},{"type":29,"tag":63,"props":3932,"children":3933},{"style":76},[3934],{"type":44,"value":3935}," parent._connection;\n",{"type":29,"tag":63,"props":3937,"children":3938},{"class":65,"line":1183},[3939,3943,3948,3952,3956,3960,3964,3968,3972,3977],{"type":29,"tag":63,"props":3940,"children":3941},{"style":394},[3942],{"type":44,"value":3151},{"type":29,"tag":63,"props":3944,"children":3945},{"style":76},[3946],{"type":44,"value":3947},"._parent ",{"type":29,"tag":63,"props":3949,"children":3950},{"style":70},[3951],{"type":44,"value":1258},{"type":29,"tag":63,"props":3953,"children":3954},{"style":76},[3955],{"type":44,"value":3926},{"type":29,"tag":63,"props":3957,"children":3958},{"style":70},[3959],{"type":44,"value":3912},{"type":29,"tag":63,"props":3961,"children":3962},{"style":117},[3963],{"type":44,"value":965},{"type":29,"tag":63,"props":3965,"children":3966},{"style":70},[3967],{"type":44,"value":3921},{"type":29,"tag":63,"props":3969,"children":3970},{"style":394},[3971],{"type":44,"value":837},{"type":29,"tag":63,"props":3973,"children":3974},{"style":70},[3975],{"type":44,"value":3976}," :",{"type":29,"tag":63,"props":3978,"children":3979},{"style":76},[3980],{"type":44,"value":3981}," parent;\n",{"type":29,"tag":63,"props":3983,"children":3984},{"class":65,"line":1215},[3985],{"type":29,"tag":63,"props":3986,"children":3987},{"emptyLinePlaceholder":97},[3988],{"type":44,"value":100},{"type":29,"tag":63,"props":3990,"children":3991},{"class":65,"line":1224},[3992,3996,4001,4005],{"type":29,"tag":63,"props":3993,"children":3994},{"style":394},[3995],{"type":44,"value":3151},{"type":29,"tag":63,"props":3997,"children":3998},{"style":76},[3999],{"type":44,"value":4000},"._guid ",{"type":29,"tag":63,"props":4002,"children":4003},{"style":70},[4004],{"type":44,"value":1258},{"type":29,"tag":63,"props":4006,"children":4007},{"style":76},[4008],{"type":44,"value":4009}," object.guid;\n",{"type":29,"tag":63,"props":4011,"children":4012},{"class":65,"line":1247},[4013,4017,4022,4026],{"type":29,"tag":63,"props":4014,"children":4015},{"style":394},[4016],{"type":44,"value":3151},{"type":29,"tag":63,"props":4018,"children":4019},{"style":76},[4020],{"type":44,"value":4021},"._type ",{"type":29,"tag":63,"props":4023,"children":4024},{"style":70},[4025],{"type":44,"value":1258},{"type":29,"tag":63,"props":4027,"children":4028},{"style":76},[4029],{"type":44,"value":4030}," type;\n",{"type":29,"tag":63,"props":4032,"children":4033},{"class":65,"line":1274},[4034,4038,4043,4047],{"type":29,"tag":63,"props":4035,"children":4036},{"style":394},[4037],{"type":44,"value":3151},{"type":29,"tag":63,"props":4039,"children":4040},{"style":76},[4041],{"type":44,"value":4042},"._object ",{"type":29,"tag":63,"props":4044,"children":4045},{"style":70},[4046],{"type":44,"value":1258},{"type":29,"tag":63,"props":4048,"children":4049},{"style":76},[4050],{"type":44,"value":4051}," object;\n",{"type":29,"tag":63,"props":4053,"children":4054},{"class":65,"line":1283},[4055],{"type":29,"tag":63,"props":4056,"children":4057},{"emptyLinePlaceholder":97},[4058],{"type":44,"value":100},{"type":29,"tag":63,"props":4060,"children":4061},{"class":65,"line":1292},[4062,4066,4071,4076,4080,4084],{"type":29,"tag":63,"props":4063,"children":4064},{"style":394},[4065],{"type":44,"value":3151},{"type":29,"tag":63,"props":4067,"children":4068},{"style":76},[4069],{"type":44,"value":4070},"._connection.",{"type":29,"tag":63,"props":4072,"children":4073},{"style":117},[4074],{"type":44,"value":4075},"registerDispatcher",{"type":29,"tag":63,"props":4077,"children":4078},{"style":76},[4079],{"type":44,"value":238},{"type":29,"tag":63,"props":4081,"children":4082},{"style":394},[4083],{"type":44,"value":3198},{"type":29,"tag":63,"props":4085,"children":4086},{"style":76},[4087],{"type":44,"value":429},{"type":29,"tag":63,"props":4089,"children":4090},{"class":65,"line":1317},[4091],{"type":29,"tag":63,"props":4092,"children":4093},{"emptyLinePlaceholder":97},[4094],{"type":44,"value":100},{"type":29,"tag":63,"props":4096,"children":4097},{"class":65,"line":1326},[4098,4103,4107,4111],{"type":29,"tag":63,"props":4099,"children":4100},{"style":70},[4101],{"type":44,"value":4102}," if",{"type":29,"tag":63,"props":4104,"children":4105},{"style":76},[4106],{"type":44,"value":1024},{"type":29,"tag":63,"props":4108,"children":4109},{"style":394},[4110],{"type":44,"value":3198},{"type":29,"tag":63,"props":4112,"children":4113},{"style":76},[4114],{"type":44,"value":4115},"._parent)\n",{"type":29,"tag":63,"props":4117,"children":4118},{"class":65,"line":1334},[4119,4124,4128,4133],{"type":29,"tag":63,"props":4120,"children":4121},{"style":394},[4122],{"type":44,"value":4123}," this",{"type":29,"tag":63,"props":4125,"children":4126},{"style":76},[4127],{"type":44,"value":4070},{"type":29,"tag":63,"props":4129,"children":4130},{"style":117},[4131],{"type":44,"value":4132},"sendCreate",{"type":29,"tag":63,"props":4134,"children":4135},{"style":76},[4136],{"type":44,"value":1212},{"type":29,"tag":63,"props":4138,"children":4139},{"class":65,"line":1359},[4140,4145],{"type":29,"tag":63,"props":4141,"children":4142},{"style":394},[4143],{"type":44,"value":4144}," this",{"type":29,"tag":63,"props":4146,"children":4147},{"style":76},[4148],{"type":44,"value":4149},"._parent,\n",{"type":29,"tag":63,"props":4151,"children":4152},{"class":65,"line":1368},[4153],{"type":29,"tag":63,"props":4154,"children":4155},{"style":76},[4156],{"type":44,"value":4157}," type,\n",{"type":29,"tag":63,"props":4159,"children":4160},{"class":65,"line":1376},[4161],{"type":29,"tag":63,"props":4162,"children":4163},{"style":76},[4164],{"type":44,"value":4165}," guid,\n",{"type":29,"tag":63,"props":4167,"children":4168},{"class":65,"line":1402},[4169],{"type":29,"tag":63,"props":4170,"children":4171},{"style":76},[4172],{"type":44,"value":4173}," initializer,\n",{"type":29,"tag":63,"props":4175,"children":4176},{"class":65,"line":1410},[4177,4181],{"type":29,"tag":63,"props":4178,"children":4179},{"style":394},[4180],{"type":44,"value":4144},{"type":29,"tag":63,"props":4182,"children":4183},{"style":76},[4184],{"type":44,"value":4185},"._parent._object\n",{"type":29,"tag":63,"props":4187,"children":4188},{"class":65,"line":1419},[4189],{"type":29,"tag":63,"props":4190,"children":4191},{"style":76},[4192],{"type":44,"value":4193}," );\n",{"type":29,"tag":63,"props":4195,"children":4196},{"class":65,"line":1451},[4197],{"type":29,"tag":63,"props":4198,"children":4199},{"style":76},[4200],{"type":44,"value":2123},{"type":29,"tag":63,"props":4202,"children":4203},{"class":65,"line":1482},[4204],{"type":29,"tag":63,"props":4205,"children":4206},{"style":76},[4207],{"type":44,"value":257},{"type":29,"tag":30,"props":4209,"children":4210},{},[4211,4213,4218,4220,4225,4227,4232,4234,4240,4242,4247,4249,4254,4256,4261,4263,4268,4270,4275,4277,4282,4284,4289,4291,4296],{"type":44,"value":4212},"In the ",{"type":29,"tag":59,"props":4214,"children":4216},{"className":4215},[],[4217],{"type":44,"value":619},{"type":44,"value":4219}," constructor we see the connection always comes from either the inherited parent ",{"type":29,"tag":59,"props":4221,"children":4223},{"className":4222},[],[4224],{"type":44,"value":619},{"type":44,"value":4226},", or from the ",{"type":29,"tag":59,"props":4228,"children":4230},{"className":4229},[],[4231],{"type":44,"value":687},{"type":44,"value":4233}," passed into the ",{"type":29,"tag":59,"props":4235,"children":4237},{"className":4236},[],[4238],{"type":44,"value":4239},"parent",{"type":44,"value":4241}," parameter. This, coupled with ",{"type":29,"tag":59,"props":4243,"children":4245},{"className":4244},[],[4246],{"type":44,"value":3481},{"type":44,"value":4248}," having the name ",{"type":29,"tag":59,"props":4250,"children":4252},{"className":4251},[],[4253],{"type":44,"value":26},{"type":44,"value":4255},", gives us the hint that every dispatcher in the server library will have access to the ",{"type":29,"tag":59,"props":4257,"children":4259},{"className":4258},[],[4260],{"type":44,"value":2605},{"type":44,"value":4262}," instance (from ",{"type":29,"tag":59,"props":4264,"children":4266},{"className":4265},[],[4267],{"type":44,"value":504},{"type":44,"value":4269},"). Furthermore, the ",{"type":29,"tag":59,"props":4271,"children":4273},{"className":4272},[],[4274],{"type":44,"value":2605},{"type":44,"value":4276}," will register every instance of a subclass of ",{"type":29,"tag":59,"props":4278,"children":4280},{"className":4279},[],[4281],{"type":44,"value":619},{"type":44,"value":4283},", hinting that it will communicate with each of the ",{"type":29,"tag":59,"props":4285,"children":4287},{"className":4286},[],[4288],{"type":44,"value":619},{"type":44,"value":4290}," objects. These points will become more clear after looking at the ",{"type":29,"tag":59,"props":4292,"children":4294},{"className":4293},[],[4295],{"type":44,"value":3403},{"type":44,"value":4297},"'s constructor.",{"type":29,"tag":4299,"props":4300,"children":4302},"h4",{"id":4301},"playwrightdispatcher-and-its-constructor",[4303],{"type":44,"value":4304},"PlaywrightDispatcher and its constructor",{"type":29,"tag":30,"props":4306,"children":4307},{},[4308,4310,4315],{"type":44,"value":4309},"Let's look closer at a slightly simplified version of ",{"type":29,"tag":59,"props":4311,"children":4313},{"className":4312},[],[4314],{"type":44,"value":3403},{"type":44,"value":4316},"'s constructor",{"type":29,"tag":52,"props":4318,"children":4321},{"className":54,"code":4319,"filename":4320,"language":56,"meta":7,"style":7},"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts",[4322],{"type":29,"tag":59,"props":4323,"children":4324},{"__ignoreMap":7},[4325,4355,4362,4385,4429,4451,4473,4494,4515,4523,4531,4538],{"type":29,"tag":63,"props":4326,"children":4327},{"class":65,"line":66},[4328,4332,4337,4342,4346,4351],{"type":29,"tag":63,"props":4329,"children":4330},{"style":70},[4331],{"type":44,"value":73},{"type":29,"tag":63,"props":4333,"children":4334},{"style":70},[4335],{"type":44,"value":4336}," type",{"type":29,"tag":63,"props":4338,"children":4339},{"style":76},[4340],{"type":44,"value":4341}," { Playwright } ",{"type":29,"tag":63,"props":4343,"children":4344},{"style":70},[4345],{"type":44,"value":84},{"type":29,"tag":63,"props":4347,"children":4348},{"style":87},[4349],{"type":44,"value":4350}," \"playwright-core/src/server/playwright\"",{"type":29,"tag":63,"props":4352,"children":4353},{"style":76},[4354],{"type":44,"value":1244},{"type":29,"tag":63,"props":4356,"children":4357},{"class":65,"line":93},[4358],{"type":29,"tag":63,"props":4359,"children":4360},{"emptyLinePlaceholder":97},[4361],{"type":44,"value":100},{"type":29,"tag":63,"props":4363,"children":4364},{"class":65,"line":103},[4365,4369,4373,4377,4381],{"type":29,"tag":63,"props":4366,"children":4367},{"style":70},[4368],{"type":44,"value":3560},{"type":29,"tag":63,"props":4370,"children":4371},{"style":117},[4372],{"type":44,"value":1175},{"type":29,"tag":63,"props":4374,"children":4375},{"style":70},[4376],{"type":44,"value":1971},{"type":29,"tag":63,"props":4378,"children":4379},{"style":117},[4380],{"type":44,"value":3573},{"type":29,"tag":63,"props":4382,"children":4383},{"style":76},[4384],{"type":44,"value":135},{"type":29,"tag":63,"props":4386,"children":4387},{"class":65,"line":138},[4388,4392,4396,4401,4405,4409,4413,4417,4421,4425],{"type":29,"tag":63,"props":4389,"children":4390},{"style":70},[4391],{"type":44,"value":3051},{"type":29,"tag":63,"props":4393,"children":4394},{"style":76},[4395],{"type":44,"value":238},{"type":29,"tag":63,"props":4397,"children":4398},{"style":147},[4399],{"type":44,"value":4400},"scope",{"type":29,"tag":63,"props":4402,"children":4403},{"style":70},[4404],{"type":44,"value":761},{"type":29,"tag":63,"props":4406,"children":4407},{"style":117},[4408],{"type":44,"value":1139},{"type":29,"tag":63,"props":4410,"children":4411},{"style":76},[4412],{"type":44,"value":912},{"type":29,"tag":63,"props":4414,"children":4415},{"style":147},[4416],{"type":44,"value":5},{"type":29,"tag":63,"props":4418,"children":4419},{"style":70},[4420],{"type":44,"value":761},{"type":29,"tag":63,"props":4422,"children":4423},{"style":117},[4424],{"type":44,"value":2823},{"type":29,"tag":63,"props":4426,"children":4427},{"style":76},[4428],{"type":44,"value":3073},{"type":29,"tag":63,"props":4430,"children":4431},{"class":65,"line":178},[4432,4436,4441,4446],{"type":29,"tag":63,"props":4433,"children":4434},{"style":394},[4435],{"type":44,"value":3081},{"type":29,"tag":63,"props":4437,"children":4438},{"style":76},[4439],{"type":44,"value":4440},"(scope, playwright, ",{"type":29,"tag":63,"props":4442,"children":4443},{"style":87},[4444],{"type":44,"value":4445},"\"Playwright\"",{"type":29,"tag":63,"props":4447,"children":4448},{"style":76},[4449],{"type":44,"value":4450},", {\n",{"type":29,"tag":63,"props":4452,"children":4453},{"class":65,"line":213},[4454,4459,4463,4468],{"type":29,"tag":63,"props":4455,"children":4456},{"style":76},[4457],{"type":44,"value":4458}," chromium: ",{"type":29,"tag":63,"props":4460,"children":4461},{"style":70},[4462],{"type":44,"value":3462},{"type":29,"tag":63,"props":4464,"children":4465},{"style":117},[4466],{"type":44,"value":4467}," BrowserTypeDispatcher",{"type":29,"tag":63,"props":4469,"children":4470},{"style":76},[4471],{"type":44,"value":4472},"(scope, playwright.chromium),\n",{"type":29,"tag":63,"props":4474,"children":4475},{"class":65,"line":251},[4476,4481,4485,4489],{"type":29,"tag":63,"props":4477,"children":4478},{"style":76},[4479],{"type":44,"value":4480}," firefox: ",{"type":29,"tag":63,"props":4482,"children":4483},{"style":70},[4484],{"type":44,"value":3462},{"type":29,"tag":63,"props":4486,"children":4487},{"style":117},[4488],{"type":44,"value":4467},{"type":29,"tag":63,"props":4490,"children":4491},{"style":76},[4492],{"type":44,"value":4493},"(scope, playwright.firefox),\n",{"type":29,"tag":63,"props":4495,"children":4496},{"class":65,"line":923},[4497,4502,4506,4510],{"type":29,"tag":63,"props":4498,"children":4499},{"style":76},[4500],{"type":44,"value":4501}," webkit: ",{"type":29,"tag":63,"props":4503,"children":4504},{"style":70},[4505],{"type":44,"value":3462},{"type":29,"tag":63,"props":4507,"children":4508},{"style":117},[4509],{"type":44,"value":4467},{"type":29,"tag":63,"props":4511,"children":4512},{"style":76},[4513],{"type":44,"value":4514},"(scope, playwright.webkit),\n",{"type":29,"tag":63,"props":4516,"children":4517},{"class":65,"line":942},[4518],{"type":29,"tag":63,"props":4519,"children":4520},{"style":977},[4521],{"type":44,"value":4522}," // ...\n",{"type":29,"tag":63,"props":4524,"children":4525},{"class":65,"line":987},[4526],{"type":29,"tag":63,"props":4527,"children":4528},{"style":76},[4529],{"type":44,"value":4530}," });\n",{"type":29,"tag":63,"props":4532,"children":4533},{"class":65,"line":995},[4534],{"type":29,"tag":63,"props":4535,"children":4536},{"style":76},[4537],{"type":44,"value":2123},{"type":29,"tag":63,"props":4539,"children":4540},{"class":65,"line":1004},[4541],{"type":29,"tag":63,"props":4542,"children":4543},{"style":76},[4544],{"type":44,"value":257},{"type":29,"tag":30,"props":4546,"children":4547},{},[4548,4550,4556,4558,4563,4565,4570,4572,4577,4579,4584,4586,4592,4594,4600,4602,4608,4610,4615,4617,4622],{"type":44,"value":4549},"Notice the ",{"type":29,"tag":59,"props":4551,"children":4553},{"className":4552},[],[4554],{"type":44,"value":4555},"super",{"type":44,"value":4557}," call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the ",{"type":29,"tag":59,"props":4559,"children":4561},{"className":4560},[],[4562],{"type":44,"value":3481},{"type":44,"value":4564}," from ",{"type":29,"tag":59,"props":4566,"children":4568},{"className":4567},[],[4569],{"type":44,"value":504},{"type":44,"value":4571}," passed into it as the first parameter. Every call to the server will run through the ",{"type":29,"tag":59,"props":4573,"children":4575},{"className":4574},[],[4576],{"type":44,"value":2605},{"type":44,"value":4578}," in the ",{"type":29,"tag":59,"props":4580,"children":4582},{"className":4581},[],[4583],{"type":44,"value":3481},{"type":44,"value":4585},", which then can be traced through calls in each of the dispatcher classes. ",{"type":29,"tag":59,"props":4587,"children":4589},{"className":4588},[],[4590],{"type":44,"value":4591},"BrowserTypeDispatcher",{"type":44,"value":4593}," will launch a ",{"type":29,"tag":59,"props":4595,"children":4597},{"className":4596},[],[4598],{"type":44,"value":4599},"BrowserDispatcher",{"type":44,"value":4601},", which is responsible for creating a ",{"type":29,"tag":59,"props":4603,"children":4605},{"className":4604},[],[4606],{"type":44,"value":4607},"BrowserContextDispatcher",{"type":44,"value":4609},", which can create a ",{"type":29,"tag":59,"props":4611,"children":4613},{"className":4612},[],[4614],{"type":44,"value":664},{"type":44,"value":4616},", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original ",{"type":29,"tag":59,"props":4618,"children":4620},{"className":4619},[],[4621],{"type":44,"value":2605},{"type":44,"value":4623}," defined in the factory method with confidence!",{"type":29,"tag":269,"props":4625,"children":4627},{"id":4626},"tying-back-to-the-onmessage-communication",[4628],{"type":44,"value":4629},"Tying back to the onmessage communication",{"type":29,"tag":30,"props":4631,"children":4632},{},[4633,4635,4640,4641,4647],{"type":44,"value":4634},"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the ",{"type":29,"tag":59,"props":4636,"children":4638},{"className":4637},[],[4639],{"type":44,"value":2628},{"type":44,"value":281},{"type":29,"tag":59,"props":4642,"children":4644},{"className":4643},[],[4645],{"type":44,"value":4646},"clientConnect.onmessage",{"type":44,"value":4648}," functions.",{"type":29,"tag":30,"props":4650,"children":4651},{},[4652,4654,4659,4661,4666,4668,4673,4674,4680,4682,4687,4689,4695,4697,4703,4705,4710,4712,4718,4719,4724,4725,4731,4733,4739,4741,4746,4748,4754,4756,4761],{"type":44,"value":4653},"From within ",{"type":29,"tag":59,"props":4655,"children":4657},{"className":4656},[],[4658],{"type":44,"value":2605},{"type":44,"value":4660}," its ",{"type":29,"tag":59,"props":4662,"children":4664},{"className":4663},[],[4665],{"type":44,"value":2628},{"type":44,"value":4667}," function is called from two main methods. These are ",{"type":29,"tag":59,"props":4669,"children":4671},{"className":4670},[],[4672],{"type":44,"value":1051},{"type":44,"value":281},{"type":29,"tag":59,"props":4675,"children":4677},{"className":4676},[],[4678],{"type":44,"value":4679},"_sendMessageToClient",{"type":44,"value":4681},". The first, ",{"type":29,"tag":59,"props":4683,"children":4685},{"className":4684},[],[4686],{"type":44,"value":1051},{"type":44,"value":4688},", is called from within the ",{"type":29,"tag":59,"props":4690,"children":4692},{"className":4691},[],[4693],{"type":44,"value":4694},"clientConnection.onmessage",{"type":44,"value":4696},", so the ",{"type":29,"tag":59,"props":4698,"children":4700},{"className":4699},[],[4701],{"type":44,"value":4702},"dispatcher.onmessage",{"type":44,"value":4704}," call in that case acts as a response callback. The second, ",{"type":29,"tag":59,"props":4706,"children":4708},{"className":4707},[],[4709],{"type":44,"value":4679},{"type":44,"value":4711},", is called from the ",{"type":29,"tag":59,"props":4713,"children":4715},{"className":4714},[],[4716],{"type":44,"value":4717},"sendEvent",{"type":44,"value":912},{"type":29,"tag":59,"props":4720,"children":4722},{"className":4721},[],[4723],{"type":44,"value":4132},{"type":44,"value":912},{"type":29,"tag":59,"props":4726,"children":4728},{"className":4727},[],[4729],{"type":44,"value":4730},"sendAdopt",{"type":44,"value":4732},", and ",{"type":29,"tag":59,"props":4734,"children":4736},{"className":4735},[],[4737],{"type":44,"value":4738},"sendDestroy",{"type":44,"value":4740}," methods defined within the dispatcher. Calls to these functions are spread throughout the ",{"type":29,"tag":59,"props":4742,"children":4744},{"className":4743},[],[4745],{"type":44,"value":619},{"type":44,"value":4747}," subclasses which call these functions from their internal ",{"type":29,"tag":59,"props":4749,"children":4751},{"className":4750},[],[4752],{"type":44,"value":4753},"_connection",{"type":44,"value":4755}," variable. These will tell the client to construct, update, and destroy, their corresponding client side ",{"type":29,"tag":59,"props":4757,"children":4759},{"className":4758},[],[4760],{"type":44,"value":604},{"type":44,"value":4762}," objects.",{"type":29,"tag":30,"props":4764,"children":4765},{},[4766,4768,4773,4775,4781,4783,4788,4790,4795,4797,4802],{"type":44,"value":4767},"Separately on the client-side, ",{"type":29,"tag":59,"props":4769,"children":4771},{"className":4770},[],[4772],{"type":44,"value":4694},{"type":44,"value":4774}," is called from ",{"type":29,"tag":59,"props":4776,"children":4778},{"className":4777},[],[4779],{"type":44,"value":4780},"sendMessageToServer",{"type":44,"value":4782}," whenever you use a client-side API. This sends a message over to the ",{"type":29,"tag":59,"props":4784,"children":4786},{"className":4785},[],[4787],{"type":44,"value":2605},{"type":44,"value":4789},", which finds the corresponding ",{"type":29,"tag":59,"props":4791,"children":4793},{"className":4792},[],[4794],{"type":44,"value":619},{"type":44,"value":4796}," subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via ",{"type":29,"tag":59,"props":4798,"children":4800},{"className":4799},[],[4801],{"type":44,"value":4679},{"type":44,"value":4803},", as mentioned before.",{"type":29,"tag":269,"props":4805,"children":4807},{"id":4806},"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners",[4808],{"type":44,"value":4809},"Synchronizing objects between the Dispatchers and client-side ChannelOwners",{"type":29,"tag":30,"props":4811,"children":4812},{},[4813,4815,4820,4822,4827,4829,4834,4836,4841,4843,4849],{"type":44,"value":4814},"The ",{"type":29,"tag":59,"props":4816,"children":4818},{"className":4817},[],[4819],{"type":44,"value":4132},{"type":44,"value":4821}," function is special because it is only called from within the ",{"type":29,"tag":59,"props":4823,"children":4825},{"className":4824},[],[4826],{"type":44,"value":619},{"type":44,"value":4828}," constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the ",{"type":29,"tag":59,"props":4830,"children":4832},{"className":4831},[],[4833],{"type":44,"value":4132},{"type":44,"value":4835}," implementation, internally it calls ",{"type":29,"tag":59,"props":4837,"children":4839},{"className":4838},[],[4840],{"type":44,"value":4679},{"type":44,"value":4842}," with the ",{"type":29,"tag":59,"props":4844,"children":4846},{"className":4845},[],[4847],{"type":44,"value":4848},"__create__",{"type":44,"value":4850}," parameter:",{"type":29,"tag":52,"props":4852,"children":4855},{"className":54,"code":4853,"filename":4854,"language":56,"meta":7,"style":7},"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","packages/playwright-core/src/server/dispatchers/dispatcher.ts",[4856],{"type":29,"tag":59,"props":4857,"children":4858},{"__ignoreMap":7},[4859,4881,4925,5015,5046],{"type":29,"tag":63,"props":4860,"children":4861},{"class":65,"line":66},[4862,4866,4871,4876],{"type":29,"tag":63,"props":4863,"children":4864},{"style":117},[4865],{"type":44,"value":4132},{"type":29,"tag":63,"props":4867,"children":4868},{"style":76},[4869],{"type":44,"value":4870},"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject",{"type":29,"tag":63,"props":4872,"children":4873},{"style":70},[4874],{"type":44,"value":4875},"?:",{"type":29,"tag":63,"props":4877,"children":4878},{"style":76},[4879],{"type":44,"value":4880}," SdkObject) {\n",{"type":29,"tag":63,"props":4882,"children":4883},{"class":65,"line":93},[4884,4888,4893,4897,4902,4907,4912,4916,4921],{"type":29,"tag":63,"props":4885,"children":4886},{"style":70},[4887],{"type":44,"value":144},{"type":29,"tag":63,"props":4889,"children":4890},{"style":394},[4891],{"type":44,"value":4892}," validator",{"type":29,"tag":63,"props":4894,"children":4895},{"style":70},[4896],{"type":44,"value":155},{"type":29,"tag":63,"props":4898,"children":4899},{"style":117},[4900],{"type":44,"value":4901}," findValidator",{"type":29,"tag":63,"props":4903,"children":4904},{"style":76},[4905],{"type":44,"value":4906},"(type, ",{"type":29,"tag":63,"props":4908,"children":4909},{"style":87},[4910],{"type":44,"value":4911},"''",{"type":29,"tag":63,"props":4913,"children":4914},{"style":76},[4915],{"type":44,"value":912},{"type":29,"tag":63,"props":4917,"children":4918},{"style":87},[4919],{"type":44,"value":4920},"'Initializer'",{"type":29,"tag":63,"props":4922,"children":4923},{"style":76},[4924],{"type":44,"value":429},{"type":29,"tag":63,"props":4926,"children":4927},{"class":65,"line":103},[4928,4933,4937,4941,4946,4950,4955,4959,4964,4969,4973,4977,4982,4986,4991,4996,5001,5005,5010],{"type":29,"tag":63,"props":4929,"children":4930},{"style":76},[4931],{"type":44,"value":4932}," initializer ",{"type":29,"tag":63,"props":4934,"children":4935},{"style":70},[4936],{"type":44,"value":1258},{"type":29,"tag":63,"props":4938,"children":4939},{"style":117},[4940],{"type":44,"value":4892},{"type":29,"tag":63,"props":4942,"children":4943},{"style":76},[4944],{"type":44,"value":4945},"(initializer, ",{"type":29,"tag":63,"props":4947,"children":4948},{"style":87},[4949],{"type":44,"value":4911},{"type":29,"tag":63,"props":4951,"children":4952},{"style":76},[4953],{"type":44,"value":4954},", { tChannelImpl: ",{"type":29,"tag":63,"props":4956,"children":4957},{"style":394},[4958],{"type":44,"value":3198},{"type":29,"tag":63,"props":4960,"children":4961},{"style":76},[4962],{"type":44,"value":4963},"._tChannelImplToWire.",{"type":29,"tag":63,"props":4965,"children":4966},{"style":117},[4967],{"type":44,"value":4968},"bind",{"type":29,"tag":63,"props":4970,"children":4971},{"style":76},[4972],{"type":44,"value":238},{"type":29,"tag":63,"props":4974,"children":4975},{"style":394},[4976],{"type":44,"value":3198},{"type":29,"tag":63,"props":4978,"children":4979},{"style":76},[4980],{"type":44,"value":4981},"), binary: ",{"type":29,"tag":63,"props":4983,"children":4984},{"style":394},[4985],{"type":44,"value":3198},{"type":29,"tag":63,"props":4987,"children":4988},{"style":76},[4989],{"type":44,"value":4990},"._isLocal ",{"type":29,"tag":63,"props":4992,"children":4993},{"style":70},[4994],{"type":44,"value":4995},"?",{"type":29,"tag":63,"props":4997,"children":4998},{"style":87},[4999],{"type":44,"value":5000}," 'buffer'",{"type":29,"tag":63,"props":5002,"children":5003},{"style":70},[5004],{"type":44,"value":3976},{"type":29,"tag":63,"props":5006,"children":5007},{"style":87},[5008],{"type":44,"value":5009}," 'toBase64'",{"type":29,"tag":63,"props":5011,"children":5012},{"style":76},[5013],{"type":44,"value":5014}," });\n",{"type":29,"tag":63,"props":5016,"children":5017},{"class":65,"line":138},[5018,5023,5027,5031,5036,5041],{"type":29,"tag":63,"props":5019,"children":5020},{"style":394},[5021],{"type":44,"value":5022}," this",{"type":29,"tag":63,"props":5024,"children":5025},{"style":76},[5026],{"type":44,"value":228},{"type":29,"tag":63,"props":5028,"children":5029},{"style":117},[5030],{"type":44,"value":4679},{"type":29,"tag":63,"props":5032,"children":5033},{"style":76},[5034],{"type":44,"value":5035},"(parent._guid, type, ",{"type":29,"tag":63,"props":5037,"children":5038},{"style":87},[5039],{"type":44,"value":5040},"'__create__'",{"type":29,"tag":63,"props":5042,"children":5043},{"style":76},[5044],{"type":44,"value":5045},", { type, initializer, guid }, sdkObject);\n",{"type":29,"tag":63,"props":5047,"children":5048},{"class":65,"line":178},[5049],{"type":29,"tag":63,"props":5050,"children":5051},{"style":76},[5052],{"type":44,"value":257},{"type":29,"tag":30,"props":5054,"children":5055},{},[5056,5058,5063,5065,5070,5072,5078,5080,5085,5087,5092,5094,5099],{"type":44,"value":5057},"so if we search through the ",{"type":29,"tag":59,"props":5059,"children":5061},{"className":5060},[],[5062],{"type":44,"value":679},{"type":44,"value":5064}," class on the client side, sure enough in its ",{"type":29,"tag":59,"props":5066,"children":5068},{"className":5067},[],[5069],{"type":44,"value":1051},{"type":44,"value":5071}," function it has a call to ",{"type":29,"tag":59,"props":5073,"children":5075},{"className":5074},[],[5076],{"type":44,"value":5077},"_createRemoteObject",{"type":44,"value":5079}," for the associated method ",{"type":29,"tag":59,"props":5081,"children":5083},{"className":5082},[],[5084],{"type":44,"value":4848},{"type":44,"value":5086},". This ",{"type":29,"tag":59,"props":5088,"children":5090},{"className":5089},[],[5091],{"type":44,"value":5077},{"type":44,"value":5093}," is what initializes the client-side ",{"type":29,"tag":59,"props":5095,"children":5097},{"className":5096},[],[5098],{"type":44,"value":12},{"type":44,"value":5100}," instance, and is the reason why we call",{"type":29,"tag":52,"props":5102,"children":5104},{"className":54,"code":5103,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n",[5105],{"type":29,"tag":59,"props":5106,"children":5107},{"__ignoreMap":7},[5108],{"type":29,"tag":63,"props":5109,"children":5110},{"class":65,"line":66},[5111,5115,5119,5123,5127,5131,5135,5139],{"type":29,"tag":63,"props":5112,"children":5113},{"style":70},[5114],{"type":44,"value":1842},{"type":29,"tag":63,"props":5116,"children":5117},{"style":394},[5118],{"type":44,"value":1193},{"type":29,"tag":63,"props":5120,"children":5121},{"style":70},[5122],{"type":44,"value":155},{"type":29,"tag":63,"props":5124,"children":5125},{"style":76},[5126],{"type":44,"value":1202},{"type":29,"tag":63,"props":5128,"children":5129},{"style":117},[5130],{"type":44,"value":1207},{"type":29,"tag":63,"props":5132,"children":5133},{"style":76},[5134],{"type":44,"value":238},{"type":29,"tag":63,"props":5136,"children":5137},{"style":87},[5138],{"type":44,"value":4445},{"type":29,"tag":63,"props":5140,"children":5141},{"style":76},[5142],{"type":44,"value":429},{"type":29,"tag":30,"props":5144,"children":5145},{},[5146,5148,5153,5155,5161],{"type":44,"value":5147},"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the ",{"type":29,"tag":59,"props":5149,"children":5151},{"className":5150},[],[5152],{"type":44,"value":2605},{"type":44,"value":5154}," over to the ",{"type":29,"tag":59,"props":5156,"children":5158},{"className":5157},[],[5159],{"type":44,"value":5160},"clientConnection",{"type":44,"value":5162},". For the Playwright create message, the message looks something like",{"type":29,"tag":52,"props":5164,"children":5166},{"className":54,"code":5165,"language":56,"meta":7,"style":7},"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n",[5167],{"type":29,"tag":59,"props":5168,"children":5169},{"__ignoreMap":7},[5170,5178,5199,5219,5232,5252,5263,5294,5323,5352,5381,5410,5418,5435,5442],{"type":29,"tag":63,"props":5171,"children":5172},{"class":65,"line":66},[5173],{"type":29,"tag":63,"props":5174,"children":5175},{"style":76},[5176],{"type":44,"value":5177},"{\n",{"type":29,"tag":63,"props":5179,"children":5180},{"class":65,"line":93},[5181,5186,5191,5195],{"type":29,"tag":63,"props":5182,"children":5183},{"style":117},[5184],{"type":44,"value":5185}," guid",{"type":29,"tag":63,"props":5187,"children":5188},{"style":76},[5189],{"type":44,"value":5190},": ",{"type":29,"tag":63,"props":5192,"children":5193},{"style":87},[5194],{"type":44,"value":4911},{"type":29,"tag":63,"props":5196,"children":5197},{"style":76},[5198],{"type":44,"value":857},{"type":29,"tag":63,"props":5200,"children":5201},{"class":65,"line":103},[5202,5207,5211,5215],{"type":29,"tag":63,"props":5203,"children":5204},{"style":117},[5205],{"type":44,"value":5206}," method",{"type":29,"tag":63,"props":5208,"children":5209},{"style":76},[5210],{"type":44,"value":5190},{"type":29,"tag":63,"props":5212,"children":5213},{"style":87},[5214],{"type":44,"value":5040},{"type":29,"tag":63,"props":5216,"children":5217},{"style":76},[5218],{"type":44,"value":857},{"type":29,"tag":63,"props":5220,"children":5221},{"class":65,"line":138},[5222,5227],{"type":29,"tag":63,"props":5223,"children":5224},{"style":117},[5225],{"type":44,"value":5226}," params",{"type":29,"tag":63,"props":5228,"children":5229},{"style":76},[5230],{"type":44,"value":5231},": {\n",{"type":29,"tag":63,"props":5233,"children":5234},{"class":65,"line":178},[5235,5239,5243,5248],{"type":29,"tag":63,"props":5236,"children":5237},{"style":117},[5238],{"type":44,"value":3804},{"type":29,"tag":63,"props":5240,"children":5241},{"style":76},[5242],{"type":44,"value":5190},{"type":29,"tag":63,"props":5244,"children":5245},{"style":87},[5246],{"type":44,"value":5247},"'Playwright'",{"type":29,"tag":63,"props":5249,"children":5250},{"style":76},[5251],{"type":44,"value":857},{"type":29,"tag":63,"props":5253,"children":5254},{"class":65,"line":213},[5255,5259],{"type":29,"tag":63,"props":5256,"children":5257},{"style":117},[5258],{"type":44,"value":3824},{"type":29,"tag":63,"props":5260,"children":5261},{"style":76},[5262],{"type":44,"value":5231},{"type":29,"tag":63,"props":5264,"children":5265},{"class":65,"line":251},[5266,5271,5276,5280,5284,5289],{"type":29,"tag":63,"props":5267,"children":5268},{"style":117},[5269],{"type":44,"value":5270}," chromium",{"type":29,"tag":63,"props":5272,"children":5273},{"style":76},[5274],{"type":44,"value":5275},": { ",{"type":29,"tag":63,"props":5277,"children":5278},{"style":117},[5279],{"type":44,"value":2054},{"type":29,"tag":63,"props":5281,"children":5282},{"style":76},[5283],{"type":44,"value":5190},{"type":29,"tag":63,"props":5285,"children":5286},{"style":87},[5287],{"type":44,"value":5288},"'browser-type@024d5a494527ece580841844a9a933a6'",{"type":29,"tag":63,"props":5290,"children":5291},{"style":76},[5292],{"type":44,"value":5293}," },\n",{"type":29,"tag":63,"props":5295,"children":5296},{"class":65,"line":923},[5297,5302,5306,5310,5314,5319],{"type":29,"tag":63,"props":5298,"children":5299},{"style":117},[5300],{"type":44,"value":5301}," firefox",{"type":29,"tag":63,"props":5303,"children":5304},{"style":76},[5305],{"type":44,"value":5275},{"type":29,"tag":63,"props":5307,"children":5308},{"style":117},[5309],{"type":44,"value":2054},{"type":29,"tag":63,"props":5311,"children":5312},{"style":76},[5313],{"type":44,"value":5190},{"type":29,"tag":63,"props":5315,"children":5316},{"style":87},[5317],{"type":44,"value":5318},"'browser-type@fae8f48651c02682ad3b276f0a046d63'",{"type":29,"tag":63,"props":5320,"children":5321},{"style":76},[5322],{"type":44,"value":5293},{"type":29,"tag":63,"props":5324,"children":5325},{"class":65,"line":942},[5326,5331,5335,5339,5343,5348],{"type":29,"tag":63,"props":5327,"children":5328},{"style":117},[5329],{"type":44,"value":5330}," webkit",{"type":29,"tag":63,"props":5332,"children":5333},{"style":76},[5334],{"type":44,"value":5275},{"type":29,"tag":63,"props":5336,"children":5337},{"style":117},[5338],{"type":44,"value":2054},{"type":29,"tag":63,"props":5340,"children":5341},{"style":76},[5342],{"type":44,"value":5190},{"type":29,"tag":63,"props":5344,"children":5345},{"style":87},[5346],{"type":44,"value":5347},"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'",{"type":29,"tag":63,"props":5349,"children":5350},{"style":76},[5351],{"type":44,"value":5293},{"type":29,"tag":63,"props":5353,"children":5354},{"class":65,"line":987},[5355,5360,5364,5368,5372,5377],{"type":29,"tag":63,"props":5356,"children":5357},{"style":117},[5358],{"type":44,"value":5359}," android",{"type":29,"tag":63,"props":5361,"children":5362},{"style":76},[5363],{"type":44,"value":5275},{"type":29,"tag":63,"props":5365,"children":5366},{"style":117},[5367],{"type":44,"value":2054},{"type":29,"tag":63,"props":5369,"children":5370},{"style":76},[5371],{"type":44,"value":5190},{"type":29,"tag":63,"props":5373,"children":5374},{"style":87},[5375],{"type":44,"value":5376},"'android@832582c466c24c6933d3a5587059e1be'",{"type":29,"tag":63,"props":5378,"children":5379},{"style":76},[5380],{"type":44,"value":5293},{"type":29,"tag":63,"props":5382,"children":5383},{"class":65,"line":995},[5384,5389,5393,5397,5401,5406],{"type":29,"tag":63,"props":5385,"children":5386},{"style":117},[5387],{"type":44,"value":5388}," electron",{"type":29,"tag":63,"props":5390,"children":5391},{"style":76},[5392],{"type":44,"value":5275},{"type":29,"tag":63,"props":5394,"children":5395},{"style":117},[5396],{"type":44,"value":2054},{"type":29,"tag":63,"props":5398,"children":5399},{"style":76},[5400],{"type":44,"value":5190},{"type":29,"tag":63,"props":5402,"children":5403},{"style":87},[5404],{"type":44,"value":5405},"'electron@3829a7608477101154e15c1e25bca9ca'",{"type":29,"tag":63,"props":5407,"children":5408},{"style":76},[5409],{"type":44,"value":5293},{"type":29,"tag":63,"props":5411,"children":5412},{"class":65,"line":1004},[5413],{"type":29,"tag":63,"props":5414,"children":5415},{"style":76},[5416],{"type":44,"value":5417}," },\n",{"type":29,"tag":63,"props":5419,"children":5420},{"class":65,"line":23},[5421,5426,5430],{"type":29,"tag":63,"props":5422,"children":5423},{"style":117},[5424],{"type":44,"value":5425}," guid",{"type":29,"tag":63,"props":5427,"children":5428},{"style":76},[5429],{"type":44,"value":5190},{"type":29,"tag":63,"props":5431,"children":5432},{"style":87},[5433],{"type":44,"value":5434},"'Playwright'\n",{"type":29,"tag":63,"props":5436,"children":5437},{"class":65,"line":1059},[5438],{"type":29,"tag":63,"props":5439,"children":5440},{"style":76},[5441],{"type":44,"value":2123},{"type":29,"tag":63,"props":5443,"children":5444},{"class":65,"line":1091},[5445],{"type":29,"tag":63,"props":5446,"children":5447},{"style":76},[5448],{"type":44,"value":257},{"type":29,"tag":30,"props":5450,"children":5451},{},[5452,5454,5459,5461,5466,5468,5474,5476,5481,5482,5488,5490,5495,5497,5502],{"type":44,"value":5453},"Note before this ",{"type":29,"tag":59,"props":5455,"children":5457},{"className":5456},[],[5458],{"type":44,"value":4132},{"type":44,"value":5460}," message is passed to create the Playwright API on the client side, there were ",{"type":29,"tag":59,"props":5462,"children":5464},{"className":5463},[],[5465],{"type":44,"value":4132},{"type":44,"value":5467}," messages for each of the device types, meaning there already exists a client-side ",{"type":29,"tag":59,"props":5469,"children":5471},{"className":5470},[],[5472],{"type":44,"value":5473},"BrowserType",{"type":44,"value":5475}," for ",{"type":29,"tag":59,"props":5477,"children":5479},{"className":5478},[],[5480],{"type":44,"value":1801},{"type":44,"value":912},{"type":29,"tag":59,"props":5483,"children":5485},{"className":5484},[],[5486],{"type":44,"value":5487},"firefox",{"type":44,"value":5489},", etc. before the ",{"type":29,"tag":59,"props":5491,"children":5493},{"className":5492},[],[5494],{"type":44,"value":4848},{"type":44,"value":5496}," message for ",{"type":29,"tag":59,"props":5498,"children":5500},{"className":5499},[],[5501],{"type":44,"value":12},{"type":44,"value":5503}," is sent.",{"type":29,"tag":30,"props":5505,"children":5506},{},[5507,5508,5513,5515,5520,5522,5527,5529,5535],{"type":44,"value":4814},{"type":29,"tag":59,"props":5509,"children":5511},{"className":5510},[],[5512],{"type":44,"value":5160},{"type":44,"value":5514}," constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the ",{"type":29,"tag":59,"props":5516,"children":5518},{"className":5517},[],[5519],{"type":44,"value":604},{"type":44,"value":5521}," class, which is a concept for a later section. For now, let's trace what happens in the ",{"type":29,"tag":59,"props":5523,"children":5525},{"className":5524},[],[5526],{"type":44,"value":5160},{"type":44,"value":5528}," for the ",{"type":29,"tag":59,"props":5530,"children":5532},{"className":5531},[],[5533],{"type":44,"value":5534},"type: 'Playwright'",{"type":44,"value":5536}," message.",{"type":29,"tag":30,"props":5538,"children":5539},{},[5540,5541,5546,5548,5554,5556,5561,5563,5569],{"type":44,"value":4814},{"type":29,"tag":59,"props":5542,"children":5544},{"className":5543},[],[5545],{"type":44,"value":4132},{"type":44,"value":5547}," function calls ",{"type":29,"tag":59,"props":5549,"children":5551},{"className":5550},[],[5552],{"type":44,"value":5553},"dispatchConnection.onmessage",{"type":44,"value":5555},", which calls the ",{"type":29,"tag":59,"props":5557,"children":5559},{"className":5558},[],[5560],{"type":44,"value":2613},{"type":44,"value":5562}," function, which then calls the ",{"type":29,"tag":59,"props":5564,"children":5566},{"className":5565},[],[5567],{"type":44,"value":5568},"clientConnection._createRemoteObject",{"type":44,"value":5570}," function with the following parameters",{"type":29,"tag":52,"props":5572,"children":5574},{"className":54,"code":5573,"filename":1946,"language":56,"meta":7,"style":7},"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n",[5575],{"type":29,"tag":59,"props":5576,"children":5577},{"__ignoreMap":7},[5578,5597,5614,5631,5647,5655,5663,5680,5697,5714,5731,5748,5755],{"type":29,"tag":63,"props":5579,"children":5580},{"class":65,"line":66},[5581,5585,5589,5593],{"type":29,"tag":63,"props":5582,"children":5583},{"style":394},[5584],{"type":44,"value":3198},{"type":29,"tag":63,"props":5586,"children":5587},{"style":76},[5588],{"type":44,"value":228},{"type":29,"tag":63,"props":5590,"children":5591},{"style":117},[5592],{"type":44,"value":5077},{"type":29,"tag":63,"props":5594,"children":5595},{"style":76},[5596],{"type":44,"value":1212},{"type":29,"tag":63,"props":5598,"children":5599},{"class":65,"line":93},[5600,5605,5609],{"type":29,"tag":63,"props":5601,"children":5602},{"style":87},[5603],{"type":44,"value":5604}," \"\"",{"type":29,"tag":63,"props":5606,"children":5607},{"style":76},[5608],{"type":44,"value":912},{"type":29,"tag":63,"props":5610,"children":5611},{"style":977},[5612],{"type":44,"value":5613},"// parentGuid - corresponds to Root, the root ChannelOwner\n",{"type":29,"tag":63,"props":5615,"children":5616},{"class":65,"line":103},[5617,5622,5626],{"type":29,"tag":63,"props":5618,"children":5619},{"style":87},[5620],{"type":44,"value":5621}," \"Playwright\"",{"type":29,"tag":63,"props":5623,"children":5624},{"style":76},[5625],{"type":44,"value":912},{"type":29,"tag":63,"props":5627,"children":5628},{"style":977},[5629],{"type":44,"value":5630},"// type\n",{"type":29,"tag":63,"props":5632,"children":5633},{"class":65,"line":138},[5634,5638,5642],{"type":29,"tag":63,"props":5635,"children":5636},{"style":87},[5637],{"type":44,"value":5621},{"type":29,"tag":63,"props":5639,"children":5640},{"style":76},[5641],{"type":44,"value":912},{"type":29,"tag":63,"props":5643,"children":5644},{"style":977},[5645],{"type":44,"value":5646},"// guid\n",{"type":29,"tag":63,"props":5648,"children":5649},{"class":65,"line":178},[5650],{"type":29,"tag":63,"props":5651,"children":5652},{"style":76},[5653],{"type":44,"value":5654}," {\n",{"type":29,"tag":63,"props":5656,"children":5657},{"class":65,"line":213},[5658],{"type":29,"tag":63,"props":5659,"children":5660},{"style":977},[5661],{"type":44,"value":5662}," // initializer\n",{"type":29,"tag":63,"props":5664,"children":5665},{"class":65,"line":251},[5666,5671,5676],{"type":29,"tag":63,"props":5667,"children":5668},{"style":76},[5669],{"type":44,"value":5670}," chromium: { guid: ",{"type":29,"tag":63,"props":5672,"children":5673},{"style":87},[5674],{"type":44,"value":5675},"\"browser-type@024d5a494527ece580841844a9a933a6\"",{"type":29,"tag":63,"props":5677,"children":5678},{"style":76},[5679],{"type":44,"value":5293},{"type":29,"tag":63,"props":5681,"children":5682},{"class":65,"line":923},[5683,5688,5693],{"type":29,"tag":63,"props":5684,"children":5685},{"style":76},[5686],{"type":44,"value":5687}," firefox: { guid: ",{"type":29,"tag":63,"props":5689,"children":5690},{"style":87},[5691],{"type":44,"value":5692},"\"browser-type@fae8f48651c02682ad3b276f0a046d63\"",{"type":29,"tag":63,"props":5694,"children":5695},{"style":76},[5696],{"type":44,"value":5293},{"type":29,"tag":63,"props":5698,"children":5699},{"class":65,"line":942},[5700,5705,5710],{"type":29,"tag":63,"props":5701,"children":5702},{"style":76},[5703],{"type":44,"value":5704}," webkit: { guid: ",{"type":29,"tag":63,"props":5706,"children":5707},{"style":87},[5708],{"type":44,"value":5709},"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\"",{"type":29,"tag":63,"props":5711,"children":5712},{"style":76},[5713],{"type":44,"value":5293},{"type":29,"tag":63,"props":5715,"children":5716},{"class":65,"line":987},[5717,5722,5727],{"type":29,"tag":63,"props":5718,"children":5719},{"style":76},[5720],{"type":44,"value":5721}," android: { guid: ",{"type":29,"tag":63,"props":5723,"children":5724},{"style":87},[5725],{"type":44,"value":5726},"\"android@832582c466c24c6933d3a5587059e1be\"",{"type":29,"tag":63,"props":5728,"children":5729},{"style":76},[5730],{"type":44,"value":5293},{"type":29,"tag":63,"props":5732,"children":5733},{"class":65,"line":995},[5734,5739,5744],{"type":29,"tag":63,"props":5735,"children":5736},{"style":76},[5737],{"type":44,"value":5738}," electron: { guid: ",{"type":29,"tag":63,"props":5740,"children":5741},{"style":87},[5742],{"type":44,"value":5743},"\"electron@3829a7608477101154e15c1e25bca9ca\"",{"type":29,"tag":63,"props":5745,"children":5746},{"style":76},[5747],{"type":44,"value":5293},{"type":29,"tag":63,"props":5749,"children":5750},{"class":65,"line":1004},[5751],{"type":29,"tag":63,"props":5752,"children":5753},{"style":76},[5754],{"type":44,"value":2123},{"type":29,"tag":63,"props":5756,"children":5757},{"class":65,"line":23},[5758],{"type":29,"tag":63,"props":5759,"children":5760},{"style":76},[5761],{"type":44,"value":429},{"type":29,"tag":30,"props":5763,"children":5764},{},[5765,5766,5771,5773,5779],{"type":44,"value":4212},{"type":29,"tag":59,"props":5767,"children":5769},{"className":5768},[],[5770],{"type":44,"value":5568},{"type":44,"value":5772}," function there is a transformation of the data and then a large ",{"type":29,"tag":59,"props":5774,"children":5776},{"className":5775},[],[5777],{"type":44,"value":5778},"switch-case",{"type":44,"value":5780}," function instantiating the corresponding client class.",{"type":29,"tag":52,"props":5782,"children":5784},{"className":54,"code":5783,"filename":1946,"language":56,"meta":7,"style":7},"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner\u003Cany>;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n",[5785],{"type":29,"tag":59,"props":5786,"children":5787},{"__ignoreMap":7},[5788,5800,5838,5859,5908,5944,5983,6002,6010,6022,6030,6064,6098,6106,6113,6126,6134,6152,6177,6189,6196,6203,6215],{"type":29,"tag":63,"props":5789,"children":5790},{"class":65,"line":66},[5791,5795],{"type":29,"tag":63,"props":5792,"children":5793},{"style":117},[5794],{"type":44,"value":5077},{"type":29,"tag":63,"props":5796,"children":5797},{"style":76},[5798],{"type":44,"value":5799},"(parentGuid: string, type: string, guid: string, initializer: any) {\n",{"type":29,"tag":63,"props":5801,"children":5802},{"class":65,"line":93},[5803,5807,5812,5816,5820,5824,5828,5833],{"type":29,"tag":63,"props":5804,"children":5805},{"style":70},[5806],{"type":44,"value":144},{"type":29,"tag":63,"props":5808,"children":5809},{"style":394},[5810],{"type":44,"value":5811}," parent",{"type":29,"tag":63,"props":5813,"children":5814},{"style":70},[5815],{"type":44,"value":155},{"type":29,"tag":63,"props":5817,"children":5818},{"style":394},[5819],{"type":44,"value":2093},{"type":29,"tag":63,"props":5821,"children":5822},{"style":76},[5823],{"type":44,"value":2098},{"type":29,"tag":63,"props":5825,"children":5826},{"style":117},[5827],{"type":44,"value":1619},{"type":29,"tag":63,"props":5829,"children":5830},{"style":76},[5831],{"type":44,"value":5832},"(parentGuid); ",{"type":29,"tag":63,"props":5834,"children":5835},{"style":977},[5836],{"type":44,"value":5837},"// here the parentGuid is ''\n",{"type":29,"tag":63,"props":5839,"children":5840},{"class":65,"line":103},[5841,5846,5850,5854],{"type":29,"tag":63,"props":5842,"children":5843},{"style":70},[5844],{"type":44,"value":5845}," if",{"type":29,"tag":63,"props":5847,"children":5848},{"style":76},[5849],{"type":44,"value":1024},{"type":29,"tag":63,"props":5851,"children":5852},{"style":70},[5853],{"type":44,"value":1629},{"type":29,"tag":63,"props":5855,"children":5856},{"style":76},[5857],{"type":44,"value":5858},"parent)\n",{"type":29,"tag":63,"props":5860,"children":5861},{"class":65,"line":138},[5862,5867,5871,5876,5880,5885,5890,5895,5899,5904],{"type":29,"tag":63,"props":5863,"children":5864},{"style":70},[5865],{"type":44,"value":5866}," throw",{"type":29,"tag":63,"props":5868,"children":5869},{"style":70},[5870],{"type":44,"value":893},{"type":29,"tag":63,"props":5872,"children":5873},{"style":117},[5874],{"type":44,"value":5875}," Error",{"type":29,"tag":63,"props":5877,"children":5878},{"style":76},[5879],{"type":44,"value":238},{"type":29,"tag":63,"props":5881,"children":5882},{"style":87},[5883],{"type":44,"value":5884},"`Cannot find parent object ${",{"type":29,"tag":63,"props":5886,"children":5887},{"style":76},[5888],{"type":44,"value":5889},"parentGuid",{"type":29,"tag":63,"props":5891,"children":5892},{"style":87},[5893],{"type":44,"value":5894},"} to create ${",{"type":29,"tag":63,"props":5896,"children":5897},{"style":76},[5898],{"type":44,"value":2054},{"type":29,"tag":63,"props":5900,"children":5901},{"style":87},[5902],{"type":44,"value":5903},"}`",{"type":29,"tag":63,"props":5905,"children":5906},{"style":76},[5907],{"type":44,"value":429},{"type":29,"tag":63,"props":5909,"children":5910},{"class":65,"line":178},[5911,5916,5921,5925,5930,5934,5939],{"type":29,"tag":63,"props":5912,"children":5913},{"style":70},[5914],{"type":44,"value":5915}," let",{"type":29,"tag":63,"props":5917,"children":5918},{"style":76},[5919],{"type":44,"value":5920}," result",{"type":29,"tag":63,"props":5922,"children":5923},{"style":70},[5924],{"type":44,"value":761},{"type":29,"tag":63,"props":5926,"children":5927},{"style":117},[5928],{"type":44,"value":5929}," ChannelOwner",{"type":29,"tag":63,"props":5931,"children":5932},{"style":76},[5933],{"type":44,"value":2011},{"type":29,"tag":63,"props":5935,"children":5936},{"style":394},[5937],{"type":44,"value":5938},"any",{"type":29,"tag":63,"props":5940,"children":5941},{"style":76},[5942],{"type":44,"value":5943},">;\n",{"type":29,"tag":63,"props":5945,"children":5946},{"class":65,"line":213},[5947,5951,5955,5959,5963,5967,5971,5975,5979],{"type":29,"tag":63,"props":5948,"children":5949},{"style":70},[5950],{"type":44,"value":144},{"type":29,"tag":63,"props":5952,"children":5953},{"style":394},[5954],{"type":44,"value":4892},{"type":29,"tag":63,"props":5956,"children":5957},{"style":70},[5958],{"type":44,"value":155},{"type":29,"tag":63,"props":5960,"children":5961},{"style":117},[5962],{"type":44,"value":4901},{"type":29,"tag":63,"props":5964,"children":5965},{"style":76},[5966],{"type":44,"value":4906},{"type":29,"tag":63,"props":5968,"children":5969},{"style":87},[5970],{"type":44,"value":4911},{"type":29,"tag":63,"props":5972,"children":5973},{"style":76},[5974],{"type":44,"value":912},{"type":29,"tag":63,"props":5976,"children":5977},{"style":87},[5978],{"type":44,"value":4920},{"type":29,"tag":63,"props":5980,"children":5981},{"style":76},[5982],{"type":44,"value":429},{"type":29,"tag":63,"props":5984,"children":5985},{"class":65,"line":251},[5986,5990,5994,5998],{"type":29,"tag":63,"props":5987,"children":5988},{"style":76},[5989],{"type":44,"value":4932},{"type":29,"tag":63,"props":5991,"children":5992},{"style":70},[5993],{"type":44,"value":1258},{"type":29,"tag":63,"props":5995,"children":5996},{"style":117},[5997],{"type":44,"value":4892},{"type":29,"tag":63,"props":5999,"children":6000},{"style":76},[6001],{"type":44,"value":1212},{"type":29,"tag":63,"props":6003,"children":6004},{"class":65,"line":923},[6005],{"type":29,"tag":63,"props":6006,"children":6007},{"style":76},[6008],{"type":44,"value":6009}," initializer,\n",{"type":29,"tag":63,"props":6011,"children":6012},{"class":65,"line":942},[6013,6018],{"type":29,"tag":63,"props":6014,"children":6015},{"style":87},[6016],{"type":44,"value":6017}," ''",{"type":29,"tag":63,"props":6019,"children":6020},{"style":76},[6021],{"type":44,"value":857},{"type":29,"tag":63,"props":6023,"children":6024},{"class":65,"line":987},[6025],{"type":29,"tag":63,"props":6026,"children":6027},{"style":76},[6028],{"type":44,"value":6029}," {\n",{"type":29,"tag":63,"props":6031,"children":6032},{"class":65,"line":995},[6033,6038,6042,6047,6051,6055,6059],{"type":29,"tag":63,"props":6034,"children":6035},{"style":76},[6036],{"type":44,"value":6037}," tChannelImpl: ",{"type":29,"tag":63,"props":6039,"children":6040},{"style":394},[6041],{"type":44,"value":3198},{"type":29,"tag":63,"props":6043,"children":6044},{"style":76},[6045],{"type":44,"value":6046},"._tChannelImplFromWire.",{"type":29,"tag":63,"props":6048,"children":6049},{"style":117},[6050],{"type":44,"value":4968},{"type":29,"tag":63,"props":6052,"children":6053},{"style":76},[6054],{"type":44,"value":238},{"type":29,"tag":63,"props":6056,"children":6057},{"style":394},[6058],{"type":44,"value":3198},{"type":29,"tag":63,"props":6060,"children":6061},{"style":76},[6062],{"type":44,"value":6063},"),\n",{"type":29,"tag":63,"props":6065,"children":6066},{"class":65,"line":1004},[6067,6072,6076,6081,6085,6089,6093],{"type":29,"tag":63,"props":6068,"children":6069},{"style":76},[6070],{"type":44,"value":6071}," binary: ",{"type":29,"tag":63,"props":6073,"children":6074},{"style":394},[6075],{"type":44,"value":3198},{"type":29,"tag":63,"props":6077,"children":6078},{"style":76},[6079],{"type":44,"value":6080},"._rawBuffers ",{"type":29,"tag":63,"props":6082,"children":6083},{"style":70},[6084],{"type":44,"value":4995},{"type":29,"tag":63,"props":6086,"children":6087},{"style":87},[6088],{"type":44,"value":5000},{"type":29,"tag":63,"props":6090,"children":6091},{"style":70},[6092],{"type":44,"value":3976},{"type":29,"tag":63,"props":6094,"children":6095},{"style":87},[6096],{"type":44,"value":6097}," 'fromBase64'\n",{"type":29,"tag":63,"props":6099,"children":6100},{"class":65,"line":23},[6101],{"type":29,"tag":63,"props":6102,"children":6103},{"style":76},[6104],{"type":44,"value":6105}," }\n",{"type":29,"tag":63,"props":6107,"children":6108},{"class":65,"line":1059},[6109],{"type":29,"tag":63,"props":6110,"children":6111},{"style":76},[6112],{"type":44,"value":1289},{"type":29,"tag":63,"props":6114,"children":6115},{"class":65,"line":1091},[6116,6121],{"type":29,"tag":63,"props":6117,"children":6118},{"style":70},[6119],{"type":44,"value":6120}," switch",{"type":29,"tag":63,"props":6122,"children":6123},{"style":76},[6124],{"type":44,"value":6125}," (type) {\n",{"type":29,"tag":63,"props":6127,"children":6128},{"class":65,"line":1108},[6129],{"type":29,"tag":63,"props":6130,"children":6131},{"style":977},[6132],{"type":44,"value":6133}," // ...\n",{"type":29,"tag":63,"props":6135,"children":6136},{"class":65,"line":1116},[6137,6142,6147],{"type":29,"tag":63,"props":6138,"children":6139},{"style":70},[6140],{"type":44,"value":6141}," case",{"type":29,"tag":63,"props":6143,"children":6144},{"style":87},[6145],{"type":44,"value":6146}," 'Playwright'",{"type":29,"tag":63,"props":6148,"children":6149},{"style":76},[6150],{"type":44,"value":6151},":\n",{"type":29,"tag":63,"props":6153,"children":6154},{"class":65,"line":1147},[6155,6160,6164,6168,6172],{"type":29,"tag":63,"props":6156,"children":6157},{"style":76},[6158],{"type":44,"value":6159}," result ",{"type":29,"tag":63,"props":6161,"children":6162},{"style":70},[6163],{"type":44,"value":1258},{"type":29,"tag":63,"props":6165,"children":6166},{"style":70},[6167],{"type":44,"value":893},{"type":29,"tag":63,"props":6169,"children":6170},{"style":117},[6171],{"type":44,"value":2823},{"type":29,"tag":63,"props":6173,"children":6174},{"style":76},[6175],{"type":44,"value":6176},"(parent, type, guid, initializer);\n",{"type":29,"tag":63,"props":6178,"children":6179},{"class":65,"line":1155},[6180,6185],{"type":29,"tag":63,"props":6181,"children":6182},{"style":70},[6183],{"type":44,"value":6184}," break",{"type":29,"tag":63,"props":6186,"children":6187},{"style":76},[6188],{"type":44,"value":1244},{"type":29,"tag":63,"props":6190,"children":6191},{"class":65,"line":1164},[6192],{"type":29,"tag":63,"props":6193,"children":6194},{"style":977},[6195],{"type":44,"value":6133},{"type":29,"tag":63,"props":6197,"children":6198},{"class":65,"line":1183},[6199],{"type":29,"tag":63,"props":6200,"children":6201},{"style":76},[6202],{"type":44,"value":2123},{"type":29,"tag":63,"props":6204,"children":6205},{"class":65,"line":1215},[6206,6210],{"type":29,"tag":63,"props":6207,"children":6208},{"style":70},[6209],{"type":44,"value":1704},{"type":29,"tag":63,"props":6211,"children":6212},{"style":76},[6213],{"type":44,"value":6214}," result;\n",{"type":29,"tag":63,"props":6216,"children":6217},{"class":65,"line":1224},[6218],{"type":29,"tag":63,"props":6219,"children":6220},{"style":76},[6221],{"type":44,"value":257},{"type":29,"tag":30,"props":6223,"children":6224},{},[6225,6227,6233,6234,6240,6242,6247,6249,6254,6256,6261,6263,6268,6270,6275,6277,6283,6285,6290,6292,6297,6299,6305],{"type":44,"value":6226},"The parameter ",{"type":29,"tag":59,"props":6228,"children":6230},{"className":6229},[],[6231],{"type":44,"value":6232},"tChannelImpl: _tChannelImplFromWire",{"type":44,"value":4578},{"type":29,"tag":59,"props":6235,"children":6237},{"className":6236},[],[6238],{"type":44,"value":6239},"validator",{"type":44,"value":6241}," function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the ",{"type":29,"tag":59,"props":6243,"children":6245},{"className":6244},[],[6246],{"type":44,"value":2148},{"type":44,"value":6248}," variable in the ",{"type":29,"tag":59,"props":6250,"children":6252},{"className":6251},[],[6253],{"type":44,"value":679},{"type":44,"value":6255}," class. If you look at the type definition in ",{"type":29,"tag":59,"props":6257,"children":6259},{"className":6258},[],[6260],{"type":44,"value":679},{"type":44,"value":6262}," the ",{"type":29,"tag":59,"props":6264,"children":6266},{"className":6265},[],[6267],{"type":44,"value":2148},{"type":44,"value":6269}," variable is a map returning one of the ",{"type":29,"tag":59,"props":6271,"children":6273},{"className":6272},[],[6274],{"type":44,"value":604},{"type":44,"value":6276}," subclasses. So in the result above for the ",{"type":29,"tag":59,"props":6278,"children":6280},{"className":6279},[],[6281],{"type":44,"value":6282},"case: 'Playwright'",{"type":44,"value":6284},", it returns a ",{"type":29,"tag":59,"props":6286,"children":6288},{"className":6287},[],[6289],{"type":44,"value":12},{"type":44,"value":6291}," instance, which is a subclass of ",{"type":29,"tag":59,"props":6293,"children":6295},{"className":6294},[],[6296],{"type":44,"value":604},{"type":44,"value":6298},", defined in ",{"type":29,"tag":59,"props":6300,"children":6302},{"className":6301},[],[6303],{"type":44,"value":6304},"client/playwright.ts",{"type":44,"value":228},{"type":29,"tag":39,"props":6307,"children":6309},{"id":6308},"launching-the-browser-instance",[6310],{"type":44,"value":6311},"Launching the browser instance",{"type":29,"tag":30,"props":6313,"children":6314},{},[6315,6317,6322,6324,6330],{"type":44,"value":6316},"The final bit of code in ",{"type":29,"tag":59,"props":6318,"children":6320},{"className":6319},[],[6321],{"type":44,"value":504},{"type":44,"value":6323}," to consider is the ",{"type":29,"tag":59,"props":6325,"children":6327},{"className":6326},[],[6328],{"type":44,"value":6329},"_serverLauncher",{"type":44,"value":6331}," variables being set in each of the drivers. This is written as",{"type":29,"tag":52,"props":6333,"children":6335},{"className":54,"code":6334,"filename":730,"language":56,"meta":7,"style":7},"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n",[6336],{"type":29,"tag":59,"props":6337,"children":6338},{"__ignoreMap":7},[6339,6363,6371,6378,6402,6410,6417],{"type":29,"tag":63,"props":6340,"children":6341},{"class":65,"line":66},[6342,6347,6351,6355,6359],{"type":29,"tag":63,"props":6343,"children":6344},{"style":76},[6345],{"type":44,"value":6346},"playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":6348,"children":6349},{"style":70},[6350],{"type":44,"value":1258},{"type":29,"tag":63,"props":6352,"children":6353},{"style":70},[6354],{"type":44,"value":893},{"type":29,"tag":63,"props":6356,"children":6357},{"style":117},[6358],{"type":44,"value":1267},{"type":29,"tag":63,"props":6360,"children":6361},{"style":76},[6362],{"type":44,"value":1212},{"type":29,"tag":63,"props":6364,"children":6365},{"class":65,"line":93},[6366],{"type":29,"tag":63,"props":6367,"children":6368},{"style":87},[6369],{"type":44,"value":6370}," \"chromium\"\n",{"type":29,"tag":63,"props":6372,"children":6373},{"class":65,"line":103},[6374],{"type":29,"tag":63,"props":6375,"children":6376},{"style":76},[6377],{"type":44,"value":429},{"type":29,"tag":63,"props":6379,"children":6380},{"class":65,"line":138},[6381,6386,6390,6394,6398],{"type":29,"tag":63,"props":6382,"children":6383},{"style":76},[6384],{"type":44,"value":6385},"playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":6387,"children":6388},{"style":70},[6389],{"type":44,"value":1258},{"type":29,"tag":63,"props":6391,"children":6392},{"style":70},[6393],{"type":44,"value":893},{"type":29,"tag":63,"props":6395,"children":6396},{"style":117},[6397],{"type":44,"value":1267},{"type":29,"tag":63,"props":6399,"children":6400},{"style":76},[6401],{"type":44,"value":1212},{"type":29,"tag":63,"props":6403,"children":6404},{"class":65,"line":178},[6405],{"type":29,"tag":63,"props":6406,"children":6407},{"style":87},[6408],{"type":44,"value":6409}," \"firefox\"\n",{"type":29,"tag":63,"props":6411,"children":6412},{"class":65,"line":213},[6413],{"type":29,"tag":63,"props":6414,"children":6415},{"style":76},[6416],{"type":44,"value":429},{"type":29,"tag":63,"props":6418,"children":6419},{"class":65,"line":251},[6420,6425,6429,6433,6437,6441,6446],{"type":29,"tag":63,"props":6421,"children":6422},{"style":76},[6423],{"type":44,"value":6424},"playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":6426,"children":6427},{"style":70},[6428],{"type":44,"value":1258},{"type":29,"tag":63,"props":6430,"children":6431},{"style":70},[6432],{"type":44,"value":893},{"type":29,"tag":63,"props":6434,"children":6435},{"style":117},[6436],{"type":44,"value":1267},{"type":29,"tag":63,"props":6438,"children":6439},{"style":76},[6440],{"type":44,"value":238},{"type":29,"tag":63,"props":6442,"children":6443},{"style":87},[6444],{"type":44,"value":6445},"\"webkit\"",{"type":29,"tag":63,"props":6447,"children":6448},{"style":76},[6449],{"type":44,"value":429},{"type":29,"tag":30,"props":6451,"children":6452},{},[6453,6454,6460,6462,6467,6469,6475,6477,6483],{"type":44,"value":3475},{"type":29,"tag":59,"props":6455,"children":6457},{"className":6456},[],[6458],{"type":44,"value":6459},"BrowserServerLauncherImpl",{"type":44,"value":6461}," class is defined next to the ",{"type":29,"tag":59,"props":6463,"children":6465},{"className":6464},[],[6466],{"type":44,"value":496},{"type":44,"value":6468}," file in ",{"type":29,"tag":59,"props":6470,"children":6472},{"className":6471},[],[6473],{"type":44,"value":6474},"browserServerLauncherImpl.ts",{"type":44,"value":6476},". The main functionality in this class lies in the ",{"type":29,"tag":59,"props":6478,"children":6480},{"className":6479},[],[6481],{"type":44,"value":6482},"launchServer",{"type":44,"value":6484}," function, and is only called when you use the",{"type":29,"tag":52,"props":6486,"children":6489},{"className":54,"code":6487,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","my-script.ts",[6490],{"type":29,"tag":59,"props":6491,"children":6492},{"__ignoreMap":7},[6493,6517,6524],{"type":29,"tag":63,"props":6494,"children":6495},{"class":65,"line":66},[6496,6500,6505,6509,6513],{"type":29,"tag":63,"props":6497,"children":6498},{"style":70},[6499],{"type":44,"value":73},{"type":29,"tag":63,"props":6501,"children":6502},{"style":76},[6503],{"type":44,"value":6504}," playwright ",{"type":29,"tag":63,"props":6506,"children":6507},{"style":70},[6508],{"type":44,"value":84},{"type":29,"tag":63,"props":6510,"children":6511},{"style":87},[6512],{"type":44,"value":1779},{"type":29,"tag":63,"props":6514,"children":6515},{"style":76},[6516],{"type":44,"value":1244},{"type":29,"tag":63,"props":6518,"children":6519},{"class":65,"line":93},[6520],{"type":29,"tag":63,"props":6521,"children":6522},{"emptyLinePlaceholder":97},[6523],{"type":44,"value":100},{"type":29,"tag":63,"props":6525,"children":6526},{"class":65,"line":103},[6527,6532,6536],{"type":29,"tag":63,"props":6528,"children":6529},{"style":76},[6530],{"type":44,"value":6531},"playwright.chromium.",{"type":29,"tag":63,"props":6533,"children":6534},{"style":117},[6535],{"type":44,"value":6482},{"type":29,"tag":63,"props":6537,"children":6538},{"style":76},[6539],{"type":44,"value":6540},"(serverOptions);\n",{"type":29,"tag":30,"props":6542,"children":6543},{},[6544,6546,6552],{"type":44,"value":6545},"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the ",{"type":29,"tag":59,"props":6547,"children":6549},{"className":6548},[],[6550],{"type":44,"value":6551},"'playwright-core'",{"type":44,"value":6553}," library, something like",{"type":29,"tag":52,"props":6555,"children":6557},{"className":54,"code":6556,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n",[6558],{"type":29,"tag":59,"props":6559,"children":6560},{"__ignoreMap":7},[6561,6584,6591,6611,6653,6684,6713,6721],{"type":29,"tag":63,"props":6562,"children":6563},{"class":65,"line":66},[6564,6568,6572,6576,6580],{"type":29,"tag":63,"props":6565,"children":6566},{"style":70},[6567],{"type":44,"value":73},{"type":29,"tag":63,"props":6569,"children":6570},{"style":76},[6571],{"type":44,"value":6504},{"type":29,"tag":63,"props":6573,"children":6574},{"style":70},[6575],{"type":44,"value":84},{"type":29,"tag":63,"props":6577,"children":6578},{"style":87},[6579],{"type":44,"value":1779},{"type":29,"tag":63,"props":6581,"children":6582},{"style":76},[6583],{"type":44,"value":1244},{"type":29,"tag":63,"props":6585,"children":6586},{"class":65,"line":93},[6587],{"type":29,"tag":63,"props":6588,"children":6589},{"emptyLinePlaceholder":97},[6590],{"type":44,"value":100},{"type":29,"tag":63,"props":6592,"children":6593},{"class":65,"line":103},[6594,6598,6602,6606],{"type":29,"tag":63,"props":6595,"children":6596},{"style":76},[6597],{"type":44,"value":238},{"type":29,"tag":63,"props":6599,"children":6600},{"style":70},[6601],{"type":44,"value":109},{"type":29,"tag":63,"props":6603,"children":6604},{"style":70},[6605],{"type":44,"value":114},{"type":29,"tag":63,"props":6607,"children":6608},{"style":76},[6609],{"type":44,"value":6610}," () {\n",{"type":29,"tag":63,"props":6612,"children":6613},{"class":65,"line":138},[6614,6618,6622,6626,6630,6635,6639,6644,6649],{"type":29,"tag":63,"props":6615,"children":6616},{"style":70},[6617],{"type":44,"value":144},{"type":29,"tag":63,"props":6619,"children":6620},{"style":394},[6621],{"type":44,"value":150},{"type":29,"tag":63,"props":6623,"children":6624},{"style":70},[6625],{"type":44,"value":155},{"type":29,"tag":63,"props":6627,"children":6628},{"style":70},[6629],{"type":44,"value":160},{"type":29,"tag":63,"props":6631,"children":6632},{"style":76},[6633],{"type":44,"value":6634}," playwright.chromium.",{"type":29,"tag":63,"props":6636,"children":6637},{"style":117},[6638],{"type":44,"value":170},{"type":29,"tag":63,"props":6640,"children":6641},{"style":76},[6642],{"type":44,"value":6643},"({ headless: ",{"type":29,"tag":63,"props":6645,"children":6646},{"style":394},[6647],{"type":44,"value":6648},"false",{"type":29,"tag":63,"props":6650,"children":6651},{"style":76},[6652],{"type":44,"value":5014},{"type":29,"tag":63,"props":6654,"children":6655},{"class":65,"line":178},[6656,6660,6664,6668,6672,6676,6680],{"type":29,"tag":63,"props":6657,"children":6658},{"style":70},[6659],{"type":44,"value":144},{"type":29,"tag":63,"props":6661,"children":6662},{"style":394},[6663],{"type":44,"value":188},{"type":29,"tag":63,"props":6665,"children":6666},{"style":70},[6667],{"type":44,"value":155},{"type":29,"tag":63,"props":6669,"children":6670},{"style":70},[6671],{"type":44,"value":160},{"type":29,"tag":63,"props":6673,"children":6674},{"style":76},[6675],{"type":44,"value":201},{"type":29,"tag":63,"props":6677,"children":6678},{"style":117},[6679],{"type":44,"value":206},{"type":29,"tag":63,"props":6681,"children":6682},{"style":76},[6683],{"type":44,"value":939},{"type":29,"tag":63,"props":6685,"children":6686},{"class":65,"line":213},[6687,6691,6696,6700,6704,6709],{"type":29,"tag":63,"props":6688,"children":6689},{"style":70},[6690],{"type":44,"value":219},{"type":29,"tag":63,"props":6692,"children":6693},{"style":76},[6694],{"type":44,"value":6695}," page.",{"type":29,"tag":63,"props":6697,"children":6698},{"style":117},[6699],{"type":44,"value":233},{"type":29,"tag":63,"props":6701,"children":6702},{"style":76},[6703],{"type":44,"value":238},{"type":29,"tag":63,"props":6705,"children":6706},{"style":87},[6707],{"type":44,"value":6708},"\"https://playwright.dev\"",{"type":29,"tag":63,"props":6710,"children":6711},{"style":76},[6712],{"type":44,"value":429},{"type":29,"tag":63,"props":6714,"children":6715},{"class":65,"line":251},[6716],{"type":29,"tag":63,"props":6717,"children":6718},{"style":977},[6719],{"type":44,"value":6720}," // ... automate page interactions here\n",{"type":29,"tag":63,"props":6722,"children":6723},{"class":65,"line":923},[6724],{"type":29,"tag":63,"props":6725,"children":6726},{"style":76},[6727],{"type":44,"value":6728},"})();\n",{"type":29,"tag":30,"props":6730,"children":6731},{},[6732,6734,6739],{"type":44,"value":6733},"so for now we skip giving an overview of the ",{"type":29,"tag":59,"props":6735,"children":6737},{"className":6736},[],[6738],{"type":44,"value":6459},{"type":44,"value":6740}," code and defer it to a later post.",{"type":29,"tag":39,"props":6742,"children":6744},{"id":6743},"recap",[6745],{"type":44,"value":6746},"Recap",{"type":29,"tag":30,"props":6748,"children":6749},{},[6750],{"type":44,"value":6751},"Whew! That was quite the journey, so let's recap the main points we covered in this post:",{"type":29,"tag":6753,"props":6754,"children":6755},"ul",{},[6756,6780,6798,6822,6833,6859,6882,6894,6939],{"type":29,"tag":6757,"props":6758,"children":6759},"li",{},[6760,6765,6767,6772,6774,6779],{"type":29,"tag":59,"props":6761,"children":6763},{"className":6762},[],[6764],{"type":44,"value":298},{"type":44,"value":6766}," is a wrapper around the test runner package ",{"type":29,"tag":59,"props":6768,"children":6770},{"className":6769},[],[6771],{"type":44,"value":313},{"type":44,"value":6773}," and the browser automation package ",{"type":29,"tag":59,"props":6775,"children":6777},{"className":6776},[],[6778],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":6757,"props":6781,"children":6782},{},[6783,6785,6790,6792,6797],{"type":44,"value":6784},"Importing from ",{"type":29,"tag":59,"props":6786,"children":6788},{"className":6787},[],[6789],{"type":44,"value":287},{"type":44,"value":6791}," is a dynamically generated process under the hood, which is done in ",{"type":29,"tag":59,"props":6793,"children":6795},{"className":6794},[],[6796],{"type":44,"value":730},{"type":44,"value":228},{"type":29,"tag":6757,"props":6799,"children":6800},{},[6801,6802,6807,6809,6814,6815,6820],{"type":44,"value":570},{"type":29,"tag":59,"props":6803,"children":6805},{"className":6804},[],[6806],{"type":44,"value":287},{"type":44,"value":6808}," there are two main libraries, the ",{"type":29,"tag":59,"props":6810,"children":6812},{"className":6811},[],[6813],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":6816,"children":6818},{"className":6817},[],[6819],{"type":44,"value":527},{"type":44,"value":6821}," libraries.",{"type":29,"tag":6757,"props":6823,"children":6824},{},[6825,6827,6832],{"type":44,"value":6826},"This separation exists so other programming languages can easily build a client library which communicates with the ",{"type":29,"tag":59,"props":6828,"children":6830},{"className":6829},[],[6831],{"type":44,"value":527},{"type":44,"value":559},{"type":29,"tag":6757,"props":6834,"children":6835},{},[6836,6838,6843,6845,6850,6852,6857],{"type":44,"value":6837},"The client-side API and server-side API communicate with each other over a client-side ",{"type":29,"tag":59,"props":6839,"children":6841},{"className":6840},[],[6842],{"type":44,"value":679},{"type":44,"value":6844}," object and a server-side ",{"type":29,"tag":59,"props":6846,"children":6848},{"className":6847},[],[6849],{"type":44,"value":687},{"type":44,"value":6851}," object. These pass messages with one another through their runtime-defined ",{"type":29,"tag":59,"props":6853,"children":6855},{"className":6854},[],[6856],{"type":44,"value":1015},{"type":44,"value":6858}," callback.",{"type":29,"tag":6757,"props":6860,"children":6861},{},[6862,6867,6869,6874,6875,6880],{"type":29,"tag":59,"props":6863,"children":6865},{"className":6864},[],[6866],{"type":44,"value":679},{"type":44,"value":6868}," is responsible for constructing client side API's, the API methods you import from ",{"type":29,"tag":59,"props":6870,"children":6872},{"className":6871},[],[6873],{"type":44,"value":287},{"type":44,"value":4732},{"type":29,"tag":59,"props":6876,"children":6878},{"className":6877},[],[6879],{"type":44,"value":687},{"type":44,"value":6881}," is responsible for keeping track of the dispatcher objects on the server side.",{"type":29,"tag":6757,"props":6883,"children":6884},{},[6885,6887,6892],{"type":44,"value":6886},"The instances of the ",{"type":29,"tag":59,"props":6888,"children":6890},{"className":6889},[],[6891],{"type":44,"value":619},{"type":44,"value":6893}," subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.",{"type":29,"tag":6757,"props":6895,"children":6896},{},[6897,6902,6904,6909,6911,6916,6918,6923,6925,6930,6932,6937],{"type":29,"tag":59,"props":6898,"children":6900},{"className":6899},[],[6901],{"type":44,"value":679},{"type":44,"value":6903}," is wrapped by ",{"type":29,"tag":59,"props":6905,"children":6907},{"className":6906},[],[6908],{"type":44,"value":604},{"type":44,"value":6910}," subclasses, which all point to the same instance of ",{"type":29,"tag":59,"props":6912,"children":6914},{"className":6913},[],[6915],{"type":44,"value":679},{"type":44,"value":6917}," and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. ",{"type":29,"tag":59,"props":6919,"children":6921},{"className":6920},[],[6922],{"type":44,"value":642},{"type":44,"value":6924},". Similarly, ",{"type":29,"tag":59,"props":6926,"children":6928},{"className":6927},[],[6929],{"type":44,"value":687},{"type":44,"value":6931}," is wrapped by a subclass of ",{"type":29,"tag":59,"props":6933,"children":6935},{"className":6934},[],[6936],{"type":44,"value":619},{"type":44,"value":6938}," which is responsible for a part of the automated browser.",{"type":29,"tag":6757,"props":6940,"children":6941},{},[6942,6944,6949,6950,6955,6957,6963],{"type":44,"value":6943},"Both the ",{"type":29,"tag":59,"props":6945,"children":6947},{"className":6946},[],[6948],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6951,"children":6953},{"className":6952},[],[6954],{"type":44,"value":687},{"type":44,"value":6956}," classes keep track of the same object on each side of the client/server side of the divide with a unique ",{"type":29,"tag":59,"props":6958,"children":6960},{"className":6959},[],[6961],{"type":44,"value":6962},"GUID",{"type":44,"value":228},{"type":29,"tag":30,"props":6965,"children":6966},{},[6967,6969,6974,6975,6980],{"type":44,"value":6968},"Once you have parsed the functionality of ",{"type":29,"tag":59,"props":6970,"children":6972},{"className":6971},[],[6973],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6976,"children":6978},{"className":6977},[],[6979],{"type":44,"value":687},{"type":44,"value":6981},", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.",{"type":29,"tag":6983,"props":6984,"children":6985},"style",{},[6986],{"type":44,"value":6987},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":93,"depth":93,"links":6989},[6990,6995,6996,7002,7003],{"id":41,"depth":93,"text":45,"children":6991},[6992,6994],{"id":271,"depth":103,"text":6993},"Merging playwright and playwright-core",{"id":562,"depth":103,"text":565},{"id":704,"depth":93,"text":707},{"id":2168,"depth":93,"text":2171,"children":6997},[6998,6999,7000,7001],{"id":2633,"depth":103,"text":2636},{"id":3374,"depth":103,"text":3377},{"id":4626,"depth":103,"text":4629},{"id":4806,"depth":103,"text":4809},{"id":6308,"depth":93,"text":6311},{"id":6743,"depth":93,"text":6746},"markdown","content:playwright:how-playwright-initializes.md","content","playwright/how-playwright-initializes.md","md",1714069929561] \ No newline at end of file +[{"data":1,"prerenderedAt":7009},["Reactive",2],{"blog-post-playwright/how-playwright-initializes":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"image":17,"shortDescription":18,"created":19,"link":4,"body":25,"_type":7004,"_id":7005,"_source":7006,"_file":7007,"_extension":7008},"/playwright/how-playwright-initializes","playwright",false,"","How importing from Playwright works","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"How Playwright Initializes","/playwright/how-playwright-initializes/","img","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":20,"number":21,"month":22,"day":23,"year":24},"March 13, 2024",1710309600000,"Mar",13,2024,{"type":26,"children":27,"toc":6988},"root",[28,38,46,51,258,263,268,288,359,379,430,530,560,566,697,702,708,727,1718,1752,1784,1804,1865,1870,1931,1943,2131,2166,2172,2221,2274,2469,2474,2574,2631,2637,2669,3353,3372,3378,3406,3471,3533,3545,4208,4298,4305,4317,4545,4624,4630,4649,4763,4804,4810,4851,5053,5101,5143,5163,5449,5504,5537,5571,5762,5781,6222,6306,6312,6332,6450,6485,6541,6554,6729,6741,6747,6752,6964,6982],{"type":29,"tag":30,"props":31,"children":32},"element","p",{},[33],{"type":29,"tag":17,"props":34,"children":37},{"alt":35,"src":36},"Diagram of playwright-core initialization process","/img/playwright/playwright-core_initialization_diagram.jpg",[],{"type":29,"tag":39,"props":40,"children":42},"h2",{"id":41},"peering-into-playwrights-import-process",[43],{"type":44,"value":45},"text","Peering into Playwright's import process",{"type":29,"tag":30,"props":47,"children":48},{},[49],{"type":44,"value":50},"Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet",{"type":29,"tag":52,"props":53,"children":57},"pre",{"className":54,"code":55,"language":56,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { chromium } from '@playwright/test'\n\nasync function main () => {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","ts",[58],{"type":29,"tag":59,"props":60,"children":61},"code",{"__ignoreMap":7},[62,91,101,136,176,211,249],{"type":29,"tag":63,"props":64,"children":67},"span",{"class":65,"line":66},"line",1,[68,74,80,85],{"type":29,"tag":63,"props":69,"children":71},{"style":70},"--shiki-default:#F97583",[72],{"type":44,"value":73},"import",{"type":29,"tag":63,"props":75,"children":77},{"style":76},"--shiki-default:#E1E4E8",[78],{"type":44,"value":79}," { chromium } ",{"type":29,"tag":63,"props":81,"children":82},{"style":70},[83],{"type":44,"value":84},"from",{"type":29,"tag":63,"props":86,"children":88},{"style":87},"--shiki-default:#9ECBFF",[89],{"type":44,"value":90}," '@playwright/test'\n",{"type":29,"tag":63,"props":92,"children":94},{"class":65,"line":93},2,[95],{"type":29,"tag":63,"props":96,"children":98},{"emptyLinePlaceholder":97},true,[99],{"type":44,"value":100},"\n",{"type":29,"tag":63,"props":102,"children":104},{"class":65,"line":103},3,[105,110,115,121,126,131],{"type":29,"tag":63,"props":106,"children":107},{"style":70},[108],{"type":44,"value":109},"async",{"type":29,"tag":63,"props":111,"children":112},{"style":70},[113],{"type":44,"value":114}," function",{"type":29,"tag":63,"props":116,"children":118},{"style":117},"--shiki-default:#B392F0",[119],{"type":44,"value":120}," main",{"type":29,"tag":63,"props":122,"children":123},{"style":76},[124],{"type":44,"value":125}," () ",{"type":29,"tag":63,"props":127,"children":128},{"style":70},[129],{"type":44,"value":130},"=>",{"type":29,"tag":63,"props":132,"children":133},{"style":76},[134],{"type":44,"value":135}," {\n",{"type":29,"tag":63,"props":137,"children":139},{"class":65,"line":138},4,[140,145,151,156,161,166,171],{"type":29,"tag":63,"props":141,"children":142},{"style":117},[143],{"type":44,"value":144}," const",{"type":29,"tag":63,"props":146,"children":148},{"style":147},"--shiki-default:#FFAB70",[149],{"type":44,"value":150}," browser",{"type":29,"tag":63,"props":152,"children":153},{"style":70},[154],{"type":44,"value":155}," =",{"type":29,"tag":63,"props":157,"children":158},{"style":70},[159],{"type":44,"value":160}," await",{"type":29,"tag":63,"props":162,"children":163},{"style":76},[164],{"type":44,"value":165}," chromium.",{"type":29,"tag":63,"props":167,"children":168},{"style":117},[169],{"type":44,"value":170},"launch",{"type":29,"tag":63,"props":172,"children":173},{"style":76},[174],{"type":44,"value":175},"()\n",{"type":29,"tag":63,"props":177,"children":179},{"class":65,"line":178},5,[180,184,189,193,197,202,207],{"type":29,"tag":63,"props":181,"children":182},{"style":117},[183],{"type":44,"value":144},{"type":29,"tag":63,"props":185,"children":186},{"style":147},[187],{"type":44,"value":188}," page",{"type":29,"tag":63,"props":190,"children":191},{"style":70},[192],{"type":44,"value":155},{"type":29,"tag":63,"props":194,"children":195},{"style":70},[196],{"type":44,"value":160},{"type":29,"tag":63,"props":198,"children":199},{"style":76},[200],{"type":44,"value":201}," browser.",{"type":29,"tag":63,"props":203,"children":204},{"style":117},[205],{"type":44,"value":206},"newPage",{"type":29,"tag":63,"props":208,"children":209},{"style":76},[210],{"type":44,"value":175},{"type":29,"tag":63,"props":212,"children":214},{"class":65,"line":213},6,[215,220,224,229,234,239,244],{"type":29,"tag":63,"props":216,"children":217},{"style":117},[218],{"type":44,"value":219}," await",{"type":29,"tag":63,"props":221,"children":222},{"style":117},[223],{"type":44,"value":188},{"type":29,"tag":63,"props":225,"children":226},{"style":76},[227],{"type":44,"value":228},".",{"type":29,"tag":63,"props":230,"children":231},{"style":117},[232],{"type":44,"value":233},"goto",{"type":29,"tag":63,"props":235,"children":236},{"style":76},[237],{"type":44,"value":238},"(",{"type":29,"tag":63,"props":240,"children":241},{"style":87},[242],{"type":44,"value":243},"\"https://qacomet.com\"",{"type":29,"tag":63,"props":245,"children":246},{"style":76},[247],{"type":44,"value":248},")\n",{"type":29,"tag":63,"props":250,"children":252},{"class":65,"line":251},7,[253],{"type":29,"tag":63,"props":254,"children":255},{"style":76},[256],{"type":44,"value":257},"}\n",{"type":29,"tag":30,"props":259,"children":260},{},[261],{"type":44,"value":262},"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces.",{"type":29,"tag":30,"props":264,"children":265},{},[266],{"type":44,"value":267},"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture.",{"type":29,"tag":269,"props":270,"children":272},"h3",{"id":271},"merging-playwright-and-playwright-core",[273,275,280,282],{"type":44,"value":274},"Merging ",{"type":29,"tag":59,"props":276,"children":278},{"className":277},[],[279],{"type":44,"value":5},{"type":44,"value":281}," and ",{"type":29,"tag":59,"props":283,"children":285},{"className":284},[],[286],{"type":44,"value":287},"playwright-core",{"type":29,"tag":30,"props":289,"children":290},{},[291,293,299,301,307,308,314,316,322,324,329,331,337,339,344,346,351,353,358],{"type":44,"value":292},"Internally, when you import from ",{"type":29,"tag":59,"props":294,"children":296},{"className":295},[],[297],{"type":44,"value":298},"@playwright/test",{"type":44,"value":300},", there is an underlying call to import from two merged packages, ",{"type":29,"tag":59,"props":302,"children":304},{"className":303},[],[305],{"type":44,"value":306},"packages/playwright-core",{"type":44,"value":281},{"type":29,"tag":59,"props":309,"children":311},{"className":310},[],[312],{"type":44,"value":313},"packages/playwright",{"type":44,"value":315},". This merge happens in ",{"type":29,"tag":59,"props":317,"children":319},{"className":318},[],[320],{"type":44,"value":321},"packages/playwright/test",{"type":44,"value":323},", since ",{"type":29,"tag":59,"props":325,"children":327},{"className":326},[],[328],{"type":44,"value":298},{"type":44,"value":330}," is just an outward facinging export of ",{"type":29,"tag":59,"props":332,"children":334},{"className":333},[],[335],{"type":44,"value":336},"require('playwright/test')",{"type":44,"value":338},", an alias for ",{"type":29,"tag":59,"props":340,"children":342},{"className":341},[],[343],{"type":44,"value":321},{"type":44,"value":345},". This is where the test execution API's from ",{"type":29,"tag":59,"props":347,"children":349},{"className":348},[],[350],{"type":44,"value":313},{"type":44,"value":352}," are combined with the browser automation API's from ",{"type":29,"tag":59,"props":354,"children":356},{"className":355},[],[357],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":30,"props":360,"children":361},{},[362,364,369,371,377],{"type":44,"value":363},"We will focus on the import from ",{"type":29,"tag":59,"props":365,"children":367},{"className":366},[],[368],{"type":44,"value":287},{"type":44,"value":370},", since it provides the core browser automation and is the code every other client library wraps. Looking at its ",{"type":29,"tag":59,"props":372,"children":374},{"className":373},[],[375],{"type":44,"value":376},"index.js",{"type":44,"value":378}," file",{"type":29,"tag":52,"props":380,"children":385},{"className":381,"code":382,"filename":383,"language":384,"meta":7,"style":7},"language-js shiki shiki-themes github-dark","module.exports = require(\"./lib/inprocess\");\n","packages/playwright-core/index.js","js",[386],{"type":29,"tag":59,"props":387,"children":388},{"__ignoreMap":7},[389],{"type":29,"tag":63,"props":390,"children":391},{"class":65,"line":66},[392,398,402,407,411,416,420,425],{"type":29,"tag":63,"props":393,"children":395},{"style":394},"--shiki-default:#79B8FF",[396],{"type":44,"value":397},"module",{"type":29,"tag":63,"props":399,"children":400},{"style":76},[401],{"type":44,"value":228},{"type":29,"tag":63,"props":403,"children":404},{"style":394},[405],{"type":44,"value":406},"exports",{"type":29,"tag":63,"props":408,"children":409},{"style":70},[410],{"type":44,"value":155},{"type":29,"tag":63,"props":412,"children":413},{"style":117},[414],{"type":44,"value":415}," require",{"type":29,"tag":63,"props":417,"children":418},{"style":76},[419],{"type":44,"value":238},{"type":29,"tag":63,"props":421,"children":422},{"style":87},[423],{"type":44,"value":424},"\"./lib/inprocess\"",{"type":29,"tag":63,"props":426,"children":427},{"style":76},[428],{"type":44,"value":429},");\n",{"type":29,"tag":30,"props":431,"children":432},{},[433,435,441,443,449,451,457,459,465,467,473,475,481,483,489,491,497,499,505,507,512,514,520,522,528],{"type":44,"value":434},"gives an export from its ",{"type":29,"tag":59,"props":436,"children":438},{"className":437},[],[439],{"type":44,"value":440},"lib/inprocess.ts",{"type":44,"value":442}," file (note the ",{"type":29,"tag":59,"props":444,"children":446},{"className":445},[],[447],{"type":44,"value":448},"src",{"type":44,"value":450}," directory is compiled to the ",{"type":29,"tag":59,"props":452,"children":454},{"className":453},[],[455],{"type":44,"value":456},"lib",{"type":44,"value":458}," directory after playwright runs its build script, and is what's found in ",{"type":29,"tag":59,"props":460,"children":462},{"className":461},[],[463],{"type":44,"value":464},"node_modules/playwright-core",{"type":44,"value":466},", hence the require imports from ",{"type":29,"tag":59,"props":468,"children":470},{"className":469},[],[471],{"type":44,"value":472},"./lib/",{"type":44,"value":474}," and not ",{"type":29,"tag":59,"props":476,"children":478},{"className":477},[],[479],{"type":44,"value":480},"./src/",{"type":44,"value":482},"). The ",{"type":29,"tag":59,"props":484,"children":486},{"className":485},[],[487],{"type":44,"value":488},"inprocess.ts",{"type":44,"value":490}," file just imports from the adjacent ",{"type":29,"tag":59,"props":492,"children":494},{"className":493},[],[495],{"type":44,"value":496},"inProcessFactory.ts",{"type":44,"value":498}," and executes the function from there, called ",{"type":29,"tag":59,"props":500,"children":502},{"className":501},[],[503],{"type":44,"value":504},"createInProcessPlaywright",{"type":44,"value":506},". We include the source below in its own section but note ",{"type":29,"tag":59,"props":508,"children":510},{"className":509},[],[511],{"type":44,"value":504},{"type":44,"value":513}," dynamically intiailizes the interface between the client library, defined in ",{"type":29,"tag":59,"props":515,"children":517},{"className":516},[],[518],{"type":44,"value":519},"src/client",{"type":44,"value":521},", and the server library, defined in ",{"type":29,"tag":59,"props":523,"children":525},{"className":524},[],[526],{"type":44,"value":527},"src/server",{"type":44,"value":529},". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library.",{"type":29,"tag":30,"props":531,"children":532},{},[533,535,544,546,551,553,558],{"type":44,"value":534},"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the ",{"type":29,"tag":536,"props":537,"children":541},"a",{"href":538,"rel":539},"https://github.com/microsoft/playwright-python",[540],"nofollow",[542],{"type":44,"value":543},"playwright-python",{"type":44,"value":545}," source code, you will find the same design patterns and classes defined in ",{"type":29,"tag":59,"props":547,"children":549},{"className":548},[],[550],{"type":44,"value":287},{"type":44,"value":552},"'s ",{"type":29,"tag":59,"props":554,"children":556},{"className":555},[],[557],{"type":44,"value":519},{"type":44,"value":559}," library.",{"type":29,"tag":269,"props":561,"children":563},{"id":562},"rapid-overview-of-the-client-and-server-libraries",[564],{"type":44,"value":565},"Rapid overview of the client and server libraries",{"type":29,"tag":30,"props":567,"children":568},{},[569,571,576,578,583,584,589,591,597,599,605,607,612,614,620,622,628,630,635,637,643,645,651,653,658,659,665,667,672,674,680,682,688,690,695],{"type":44,"value":570},"In ",{"type":29,"tag":59,"props":572,"children":574},{"className":573},[],[575],{"type":44,"value":287},{"type":44,"value":577}," the main functionality can be found in the ",{"type":29,"tag":59,"props":579,"children":581},{"className":580},[],[582],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":585,"children":587},{"className":586},[],[588],{"type":44,"value":527},{"type":44,"value":590}," folders. The ",{"type":29,"tag":59,"props":592,"children":594},{"className":593},[],[595],{"type":44,"value":596},"client",{"type":44,"value":598}," folder contains classes, many of which are subclasses of the ",{"type":29,"tag":59,"props":600,"children":602},{"className":601},[],[603],{"type":44,"value":604},"ChannelOwner",{"type":44,"value":606}," class. This ",{"type":29,"tag":59,"props":608,"children":610},{"className":609},[],[611],{"type":44,"value":604},{"type":44,"value":613}," class is a client-side representation of a corresponding server-side ",{"type":29,"tag":59,"props":615,"children":617},{"className":616},[],[618],{"type":44,"value":619},"Dispatcher",{"type":44,"value":621}," class in the ",{"type":29,"tag":59,"props":623,"children":625},{"className":624},[],[626],{"type":44,"value":627},"src/server/dispatchers",{"type":44,"value":629}," folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a ",{"type":29,"tag":59,"props":631,"children":633},{"className":632},[],[634],{"type":44,"value":604},{"type":44,"value":636}," subclass called ",{"type":29,"tag":59,"props":638,"children":640},{"className":639},[],[641],{"type":44,"value":642},"Page",{"type":44,"value":644},", containing the client side APIs (such as ",{"type":29,"tag":59,"props":646,"children":648},{"className":647},[],[649],{"type":44,"value":650},"page.goto",{"type":44,"value":652},"), there is a corresponding ",{"type":29,"tag":59,"props":654,"children":656},{"className":655},[],[657],{"type":44,"value":619},{"type":44,"value":636},{"type":29,"tag":59,"props":660,"children":662},{"className":661},[],[663],{"type":44,"value":664},"PageDispatcher",{"type":44,"value":666},". When we call ",{"type":29,"tag":59,"props":668,"children":670},{"className":669},[],[671],{"type":44,"value":650},{"type":44,"value":673}," a message is send over the unique client ",{"type":29,"tag":59,"props":675,"children":677},{"className":676},[],[678],{"type":44,"value":679},"Connection",{"type":44,"value":681}," instance to the unique ",{"type":29,"tag":59,"props":683,"children":685},{"className":684},[],[686],{"type":44,"value":687},"DispatcherConnection",{"type":44,"value":689}," instance, which calls the corresponding ",{"type":29,"tag":59,"props":691,"children":693},{"className":692},[],[694],{"type":44,"value":664},{"type":44,"value":696},", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright.",{"type":29,"tag":30,"props":698,"children":699},{},[700],{"type":44,"value":701},"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works.",{"type":29,"tag":39,"props":703,"children":705},{"id":704},"playwrights-core-api-factory-createinprocessplaywright",[706],{"type":44,"value":707},"Playwright's core API factory, createInProcessPlaywright",{"type":29,"tag":30,"props":709,"children":710},{},[711,713,718,720,725],{"type":44,"value":712},"This file, ",{"type":29,"tag":59,"props":714,"children":716},{"className":715},[],[717],{"type":44,"value":496},{"type":44,"value":719},", contains only one function called ",{"type":29,"tag":59,"props":721,"children":723},{"className":722},[],[724],{"type":44,"value":504},{"type":44,"value":726},". We include it here as a reference:",{"type":29,"tag":52,"props":728,"children":731},{"className":54,"code":729,"filename":730,"language":56,"meta":7,"style":7},"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","packages/playwright-core/src/inProcessFactory.ts",[732],{"type":29,"tag":59,"props":733,"children":734},{"__ignoreMap":7},[735,771,797,805,858,866,873,921,940,985,993,1002,1039,1057,1089,1106,1114,1145,1153,1162,1181,1213,1222,1245,1272,1281,1290,1315,1324,1332,1357,1366,1374,1400,1408,1417,1449,1480,1512,1541,1549,1592,1601,1635,1665,1696,1710],{"type":29,"tag":63,"props":736,"children":737},{"class":65,"line":66},[738,743,747,752,757,762,767],{"type":29,"tag":63,"props":739,"children":740},{"style":70},[741],{"type":44,"value":742},"export",{"type":29,"tag":63,"props":744,"children":745},{"style":70},[746],{"type":44,"value":114},{"type":29,"tag":63,"props":748,"children":749},{"style":117},[750],{"type":44,"value":751}," createInProcessPlaywright",{"type":29,"tag":63,"props":753,"children":754},{"style":76},[755],{"type":44,"value":756},"()",{"type":29,"tag":63,"props":758,"children":759},{"style":70},[760],{"type":44,"value":761},":",{"type":29,"tag":63,"props":763,"children":764},{"style":117},[765],{"type":44,"value":766}," PlaywrightAPI",{"type":29,"tag":63,"props":768,"children":769},{"style":76},[770],{"type":44,"value":135},{"type":29,"tag":63,"props":772,"children":773},{"class":65,"line":93},[774,778,783,787,792],{"type":29,"tag":63,"props":775,"children":776},{"style":70},[777],{"type":44,"value":144},{"type":29,"tag":63,"props":779,"children":780},{"style":394},[781],{"type":44,"value":782}," playwright",{"type":29,"tag":63,"props":784,"children":785},{"style":70},[786],{"type":44,"value":155},{"type":29,"tag":63,"props":788,"children":789},{"style":117},[790],{"type":44,"value":791}," createPlaywright",{"type":29,"tag":63,"props":793,"children":794},{"style":76},[795],{"type":44,"value":796},"({\n",{"type":29,"tag":63,"props":798,"children":799},{"class":65,"line":103},[800],{"type":29,"tag":63,"props":801,"children":802},{"style":76},[803],{"type":44,"value":804}," sdkLanguage:\n",{"type":29,"tag":63,"props":806,"children":807},{"class":65,"line":138},[808,813,818,823,828,833,838,843,848,853],{"type":29,"tag":63,"props":809,"children":810},{"style":76},[811],{"type":44,"value":812}," (process.env.",{"type":29,"tag":63,"props":814,"children":815},{"style":394},[816],{"type":44,"value":817},"PW_LANG_NAME",{"type":29,"tag":63,"props":819,"children":820},{"style":70},[821],{"type":44,"value":822}," as",{"type":29,"tag":63,"props":824,"children":825},{"style":117},[826],{"type":44,"value":827}," Language",{"type":29,"tag":63,"props":829,"children":830},{"style":70},[831],{"type":44,"value":832}," |",{"type":29,"tag":63,"props":834,"children":835},{"style":394},[836],{"type":44,"value":837}," undefined",{"type":29,"tag":63,"props":839,"children":840},{"style":76},[841],{"type":44,"value":842},") ",{"type":29,"tag":63,"props":844,"children":845},{"style":70},[846],{"type":44,"value":847},"||",{"type":29,"tag":63,"props":849,"children":850},{"style":87},[851],{"type":44,"value":852}," \"javascript\"",{"type":29,"tag":63,"props":854,"children":855},{"style":76},[856],{"type":44,"value":857},",\n",{"type":29,"tag":63,"props":859,"children":860},{"class":65,"line":178},[861],{"type":29,"tag":63,"props":862,"children":863},{"style":76},[864],{"type":44,"value":865}," });\n",{"type":29,"tag":63,"props":867,"children":868},{"class":65,"line":213},[869],{"type":29,"tag":63,"props":870,"children":871},{"emptyLinePlaceholder":97},[872],{"type":44,"value":100},{"type":29,"tag":63,"props":874,"children":875},{"class":65,"line":251},[876,880,885,889,894,899,903,908,913,917],{"type":29,"tag":63,"props":877,"children":878},{"style":70},[879],{"type":44,"value":144},{"type":29,"tag":63,"props":881,"children":882},{"style":394},[883],{"type":44,"value":884}," clientConnection",{"type":29,"tag":63,"props":886,"children":887},{"style":70},[888],{"type":44,"value":155},{"type":29,"tag":63,"props":890,"children":891},{"style":70},[892],{"type":44,"value":893}," new",{"type":29,"tag":63,"props":895,"children":896},{"style":117},[897],{"type":44,"value":898}," Connection",{"type":29,"tag":63,"props":900,"children":901},{"style":76},[902],{"type":44,"value":238},{"type":29,"tag":63,"props":904,"children":905},{"style":394},[906],{"type":44,"value":907},"undefined",{"type":29,"tag":63,"props":909,"children":910},{"style":76},[911],{"type":44,"value":912},", ",{"type":29,"tag":63,"props":914,"children":915},{"style":394},[916],{"type":44,"value":907},{"type":29,"tag":63,"props":918,"children":919},{"style":76},[920],{"type":44,"value":429},{"type":29,"tag":63,"props":922,"children":924},{"class":65,"line":923},8,[925,930,935],{"type":29,"tag":63,"props":926,"children":927},{"style":76},[928],{"type":44,"value":929}," clientConnection.",{"type":29,"tag":63,"props":931,"children":932},{"style":117},[933],{"type":44,"value":934},"useRawBuffers",{"type":29,"tag":63,"props":936,"children":937},{"style":76},[938],{"type":44,"value":939},"();\n",{"type":29,"tag":63,"props":941,"children":943},{"class":65,"line":942},9,[944,948,953,957,961,966,970,975,981],{"type":29,"tag":63,"props":945,"children":946},{"style":70},[947],{"type":44,"value":144},{"type":29,"tag":63,"props":949,"children":950},{"style":394},[951],{"type":44,"value":952}," dispatcherConnection",{"type":29,"tag":63,"props":954,"children":955},{"style":70},[956],{"type":44,"value":155},{"type":29,"tag":63,"props":958,"children":959},{"style":70},[960],{"type":44,"value":893},{"type":29,"tag":63,"props":962,"children":963},{"style":117},[964],{"type":44,"value":965}," DispatcherConnection",{"type":29,"tag":63,"props":967,"children":968},{"style":76},[969],{"type":44,"value":238},{"type":29,"tag":63,"props":971,"children":972},{"style":394},[973],{"type":44,"value":974},"true",{"type":29,"tag":63,"props":976,"children":978},{"style":977},"--shiki-default:#6A737D",[979],{"type":44,"value":980}," /* local */",{"type":29,"tag":63,"props":982,"children":983},{"style":76},[984],{"type":44,"value":429},{"type":29,"tag":63,"props":986,"children":988},{"class":65,"line":987},10,[989],{"type":29,"tag":63,"props":990,"children":991},{"emptyLinePlaceholder":97},[992],{"type":44,"value":100},{"type":29,"tag":63,"props":994,"children":996},{"class":65,"line":995},11,[997],{"type":29,"tag":63,"props":998,"children":999},{"style":977},[1000],{"type":44,"value":1001}," // Dispatch synchronously at first.\n",{"type":29,"tag":63,"props":1003,"children":1005},{"class":65,"line":1004},12,[1006,1011,1016,1020,1025,1030,1034],{"type":29,"tag":63,"props":1007,"children":1008},{"style":76},[1009],{"type":44,"value":1010}," dispatcherConnection.",{"type":29,"tag":63,"props":1012,"children":1013},{"style":117},[1014],{"type":44,"value":1015},"onmessage",{"type":29,"tag":63,"props":1017,"children":1018},{"style":70},[1019],{"type":44,"value":155},{"type":29,"tag":63,"props":1021,"children":1022},{"style":76},[1023],{"type":44,"value":1024}," (",{"type":29,"tag":63,"props":1026,"children":1027},{"style":147},[1028],{"type":44,"value":1029},"message",{"type":29,"tag":63,"props":1031,"children":1032},{"style":76},[1033],{"type":44,"value":842},{"type":29,"tag":63,"props":1035,"children":1036},{"style":70},[1037],{"type":44,"value":1038},"=>\n",{"type":29,"tag":63,"props":1040,"children":1041},{"class":65,"line":23},[1042,1047,1052],{"type":29,"tag":63,"props":1043,"children":1044},{"style":76},[1045],{"type":44,"value":1046}," clientConnection.",{"type":29,"tag":63,"props":1048,"children":1049},{"style":117},[1050],{"type":44,"value":1051},"dispatch",{"type":29,"tag":63,"props":1053,"children":1054},{"style":76},[1055],{"type":44,"value":1056},"(message);\n",{"type":29,"tag":63,"props":1058,"children":1060},{"class":65,"line":1059},14,[1061,1065,1069,1073,1077,1081,1085],{"type":29,"tag":63,"props":1062,"children":1063},{"style":76},[1064],{"type":44,"value":929},{"type":29,"tag":63,"props":1066,"children":1067},{"style":117},[1068],{"type":44,"value":1015},{"type":29,"tag":63,"props":1070,"children":1071},{"style":70},[1072],{"type":44,"value":155},{"type":29,"tag":63,"props":1074,"children":1075},{"style":76},[1076],{"type":44,"value":1024},{"type":29,"tag":63,"props":1078,"children":1079},{"style":147},[1080],{"type":44,"value":1029},{"type":29,"tag":63,"props":1082,"children":1083},{"style":76},[1084],{"type":44,"value":842},{"type":29,"tag":63,"props":1086,"children":1087},{"style":70},[1088],{"type":44,"value":1038},{"type":29,"tag":63,"props":1090,"children":1092},{"class":65,"line":1091},15,[1093,1098,1102],{"type":29,"tag":63,"props":1094,"children":1095},{"style":76},[1096],{"type":44,"value":1097}," dispatcherConnection.",{"type":29,"tag":63,"props":1099,"children":1100},{"style":117},[1101],{"type":44,"value":1051},{"type":29,"tag":63,"props":1103,"children":1104},{"style":76},[1105],{"type":44,"value":1056},{"type":29,"tag":63,"props":1107,"children":1109},{"class":65,"line":1108},16,[1110],{"type":29,"tag":63,"props":1111,"children":1112},{"emptyLinePlaceholder":97},[1113],{"type":44,"value":100},{"type":29,"tag":63,"props":1115,"children":1117},{"class":65,"line":1116},17,[1118,1122,1127,1131,1135,1140],{"type":29,"tag":63,"props":1119,"children":1120},{"style":70},[1121],{"type":44,"value":144},{"type":29,"tag":63,"props":1123,"children":1124},{"style":394},[1125],{"type":44,"value":1126}," rootScope",{"type":29,"tag":63,"props":1128,"children":1129},{"style":70},[1130],{"type":44,"value":155},{"type":29,"tag":63,"props":1132,"children":1133},{"style":70},[1134],{"type":44,"value":893},{"type":29,"tag":63,"props":1136,"children":1137},{"style":117},[1138],{"type":44,"value":1139}," RootDispatcher",{"type":29,"tag":63,"props":1141,"children":1142},{"style":76},[1143],{"type":44,"value":1144},"(dispatcherConnection);\n",{"type":29,"tag":63,"props":1146,"children":1148},{"class":65,"line":1147},18,[1149],{"type":29,"tag":63,"props":1150,"children":1151},{"emptyLinePlaceholder":97},[1152],{"type":44,"value":100},{"type":29,"tag":63,"props":1154,"children":1156},{"class":65,"line":1155},19,[1157],{"type":29,"tag":63,"props":1158,"children":1159},{"style":977},[1160],{"type":44,"value":1161}," // Initialize Playwright channel.\n",{"type":29,"tag":63,"props":1163,"children":1165},{"class":65,"line":1164},20,[1166,1171,1176],{"type":29,"tag":63,"props":1167,"children":1168},{"style":70},[1169],{"type":44,"value":1170}," new",{"type":29,"tag":63,"props":1172,"children":1173},{"style":117},[1174],{"type":44,"value":1175}," PlaywrightDispatcher",{"type":29,"tag":63,"props":1177,"children":1178},{"style":76},[1179],{"type":44,"value":1180},"(rootScope, playwright);\n",{"type":29,"tag":63,"props":1182,"children":1184},{"class":65,"line":1183},21,[1185,1189,1194,1198,1203,1208],{"type":29,"tag":63,"props":1186,"children":1187},{"style":70},[1188],{"type":44,"value":144},{"type":29,"tag":63,"props":1190,"children":1191},{"style":394},[1192],{"type":44,"value":1193}," playwrightAPI",{"type":29,"tag":63,"props":1195,"children":1196},{"style":70},[1197],{"type":44,"value":155},{"type":29,"tag":63,"props":1199,"children":1200},{"style":76},[1201],{"type":44,"value":1202}," clientConnection.",{"type":29,"tag":63,"props":1204,"children":1205},{"style":117},[1206],{"type":44,"value":1207},"getObjectWithKnownName",{"type":29,"tag":63,"props":1209,"children":1210},{"style":76},[1211],{"type":44,"value":1212},"(\n",{"type":29,"tag":63,"props":1214,"children":1216},{"class":65,"line":1215},22,[1217],{"type":29,"tag":63,"props":1218,"children":1219},{"style":87},[1220],{"type":44,"value":1221}," \"Playwright\"\n",{"type":29,"tag":63,"props":1223,"children":1225},{"class":65,"line":1224},23,[1226,1231,1236,1240],{"type":29,"tag":63,"props":1227,"children":1228},{"style":76},[1229],{"type":44,"value":1230}," ) ",{"type":29,"tag":63,"props":1232,"children":1233},{"style":70},[1234],{"type":44,"value":1235},"as",{"type":29,"tag":63,"props":1237,"children":1238},{"style":117},[1239],{"type":44,"value":766},{"type":29,"tag":63,"props":1241,"children":1242},{"style":76},[1243],{"type":44,"value":1244},";\n",{"type":29,"tag":63,"props":1246,"children":1248},{"class":65,"line":1247},24,[1249,1254,1259,1263,1268],{"type":29,"tag":63,"props":1250,"children":1251},{"style":76},[1252],{"type":44,"value":1253}," playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":1255,"children":1256},{"style":70},[1257],{"type":44,"value":1258},"=",{"type":29,"tag":63,"props":1260,"children":1261},{"style":70},[1262],{"type":44,"value":893},{"type":29,"tag":63,"props":1264,"children":1265},{"style":117},[1266],{"type":44,"value":1267}," BrowserServerLauncherImpl",{"type":29,"tag":63,"props":1269,"children":1270},{"style":76},[1271],{"type":44,"value":1212},{"type":29,"tag":63,"props":1273,"children":1275},{"class":65,"line":1274},25,[1276],{"type":29,"tag":63,"props":1277,"children":1278},{"style":87},[1279],{"type":44,"value":1280}," \"chromium\"\n",{"type":29,"tag":63,"props":1282,"children":1284},{"class":65,"line":1283},26,[1285],{"type":29,"tag":63,"props":1286,"children":1287},{"style":76},[1288],{"type":44,"value":1289}," );\n",{"type":29,"tag":63,"props":1291,"children":1293},{"class":65,"line":1292},27,[1294,1299,1303,1307,1311],{"type":29,"tag":63,"props":1295,"children":1296},{"style":76},[1297],{"type":44,"value":1298}," playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":1300,"children":1301},{"style":70},[1302],{"type":44,"value":1258},{"type":29,"tag":63,"props":1304,"children":1305},{"style":70},[1306],{"type":44,"value":893},{"type":29,"tag":63,"props":1308,"children":1309},{"style":117},[1310],{"type":44,"value":1267},{"type":29,"tag":63,"props":1312,"children":1313},{"style":76},[1314],{"type":44,"value":1212},{"type":29,"tag":63,"props":1316,"children":1318},{"class":65,"line":1317},28,[1319],{"type":29,"tag":63,"props":1320,"children":1321},{"style":87},[1322],{"type":44,"value":1323}," \"firefox\"\n",{"type":29,"tag":63,"props":1325,"children":1327},{"class":65,"line":1326},29,[1328],{"type":29,"tag":63,"props":1329,"children":1330},{"style":76},[1331],{"type":44,"value":1289},{"type":29,"tag":63,"props":1333,"children":1335},{"class":65,"line":1334},30,[1336,1341,1345,1349,1353],{"type":29,"tag":63,"props":1337,"children":1338},{"style":76},[1339],{"type":44,"value":1340}," playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":1342,"children":1343},{"style":70},[1344],{"type":44,"value":1258},{"type":29,"tag":63,"props":1346,"children":1347},{"style":70},[1348],{"type":44,"value":893},{"type":29,"tag":63,"props":1350,"children":1351},{"style":117},[1352],{"type":44,"value":1267},{"type":29,"tag":63,"props":1354,"children":1355},{"style":76},[1356],{"type":44,"value":1212},{"type":29,"tag":63,"props":1358,"children":1360},{"class":65,"line":1359},31,[1361],{"type":29,"tag":63,"props":1362,"children":1363},{"style":87},[1364],{"type":44,"value":1365}," \"webkit\"\n",{"type":29,"tag":63,"props":1367,"children":1369},{"class":65,"line":1368},32,[1370],{"type":29,"tag":63,"props":1371,"children":1372},{"style":76},[1373],{"type":44,"value":1289},{"type":29,"tag":63,"props":1375,"children":1377},{"class":65,"line":1376},33,[1378,1383,1387,1391,1396],{"type":29,"tag":63,"props":1379,"children":1380},{"style":76},[1381],{"type":44,"value":1382}," playwrightAPI._android._serverLauncher ",{"type":29,"tag":63,"props":1384,"children":1385},{"style":70},[1386],{"type":44,"value":1258},{"type":29,"tag":63,"props":1388,"children":1389},{"style":70},[1390],{"type":44,"value":893},{"type":29,"tag":63,"props":1392,"children":1393},{"style":117},[1394],{"type":44,"value":1395}," AndroidServerLauncherImpl",{"type":29,"tag":63,"props":1397,"children":1398},{"style":76},[1399],{"type":44,"value":939},{"type":29,"tag":63,"props":1401,"children":1403},{"class":65,"line":1402},34,[1404],{"type":29,"tag":63,"props":1405,"children":1406},{"emptyLinePlaceholder":97},[1407],{"type":44,"value":100},{"type":29,"tag":63,"props":1409,"children":1411},{"class":65,"line":1410},35,[1412],{"type":29,"tag":63,"props":1413,"children":1414},{"style":977},[1415],{"type":44,"value":1416}," // Switch to async dispatch after we got Playwright object.\n",{"type":29,"tag":63,"props":1418,"children":1420},{"class":65,"line":1419},36,[1421,1425,1429,1433,1437,1441,1445],{"type":29,"tag":63,"props":1422,"children":1423},{"style":76},[1424],{"type":44,"value":1010},{"type":29,"tag":63,"props":1426,"children":1427},{"style":117},[1428],{"type":44,"value":1015},{"type":29,"tag":63,"props":1430,"children":1431},{"style":70},[1432],{"type":44,"value":155},{"type":29,"tag":63,"props":1434,"children":1435},{"style":76},[1436],{"type":44,"value":1024},{"type":29,"tag":63,"props":1438,"children":1439},{"style":147},[1440],{"type":44,"value":1029},{"type":29,"tag":63,"props":1442,"children":1443},{"style":76},[1444],{"type":44,"value":842},{"type":29,"tag":63,"props":1446,"children":1447},{"style":70},[1448],{"type":44,"value":1038},{"type":29,"tag":63,"props":1450,"children":1452},{"class":65,"line":1451},37,[1453,1458,1463,1467,1471,1475],{"type":29,"tag":63,"props":1454,"children":1455},{"style":117},[1456],{"type":44,"value":1457}," setImmediate",{"type":29,"tag":63,"props":1459,"children":1460},{"style":76},[1461],{"type":44,"value":1462},"(() ",{"type":29,"tag":63,"props":1464,"children":1465},{"style":70},[1466],{"type":44,"value":130},{"type":29,"tag":63,"props":1468,"children":1469},{"style":76},[1470],{"type":44,"value":1202},{"type":29,"tag":63,"props":1472,"children":1473},{"style":117},[1474],{"type":44,"value":1051},{"type":29,"tag":63,"props":1476,"children":1477},{"style":76},[1478],{"type":44,"value":1479},"(message));\n",{"type":29,"tag":63,"props":1481,"children":1483},{"class":65,"line":1482},38,[1484,1488,1492,1496,1500,1504,1508],{"type":29,"tag":63,"props":1485,"children":1486},{"style":76},[1487],{"type":44,"value":929},{"type":29,"tag":63,"props":1489,"children":1490},{"style":117},[1491],{"type":44,"value":1015},{"type":29,"tag":63,"props":1493,"children":1494},{"style":70},[1495],{"type":44,"value":155},{"type":29,"tag":63,"props":1497,"children":1498},{"style":76},[1499],{"type":44,"value":1024},{"type":29,"tag":63,"props":1501,"children":1502},{"style":147},[1503],{"type":44,"value":1029},{"type":29,"tag":63,"props":1505,"children":1506},{"style":76},[1507],{"type":44,"value":842},{"type":29,"tag":63,"props":1509,"children":1510},{"style":70},[1511],{"type":44,"value":1038},{"type":29,"tag":63,"props":1513,"children":1515},{"class":65,"line":1514},39,[1516,1520,1524,1528,1533,1537],{"type":29,"tag":63,"props":1517,"children":1518},{"style":117},[1519],{"type":44,"value":1457},{"type":29,"tag":63,"props":1521,"children":1522},{"style":76},[1523],{"type":44,"value":1462},{"type":29,"tag":63,"props":1525,"children":1526},{"style":70},[1527],{"type":44,"value":130},{"type":29,"tag":63,"props":1529,"children":1530},{"style":76},[1531],{"type":44,"value":1532}," dispatcherConnection.",{"type":29,"tag":63,"props":1534,"children":1535},{"style":117},[1536],{"type":44,"value":1051},{"type":29,"tag":63,"props":1538,"children":1539},{"style":76},[1540],{"type":44,"value":1479},{"type":29,"tag":63,"props":1542,"children":1544},{"class":65,"line":1543},40,[1545],{"type":29,"tag":63,"props":1546,"children":1547},{"emptyLinePlaceholder":97},[1548],{"type":44,"value":100},{"type":29,"tag":63,"props":1550,"children":1552},{"class":65,"line":1551},41,[1553,1557,1562,1566,1570,1575,1579,1584,1588],{"type":29,"tag":63,"props":1554,"children":1555},{"style":76},[1556],{"type":44,"value":929},{"type":29,"tag":63,"props":1558,"children":1559},{"style":117},[1560],{"type":44,"value":1561},"toImpl",{"type":29,"tag":63,"props":1563,"children":1564},{"style":70},[1565],{"type":44,"value":155},{"type":29,"tag":63,"props":1567,"children":1568},{"style":76},[1569],{"type":44,"value":1024},{"type":29,"tag":63,"props":1571,"children":1572},{"style":147},[1573],{"type":44,"value":1574},"x",{"type":29,"tag":63,"props":1576,"children":1577},{"style":70},[1578],{"type":44,"value":761},{"type":29,"tag":63,"props":1580,"children":1581},{"style":394},[1582],{"type":44,"value":1583}," any",{"type":29,"tag":63,"props":1585,"children":1586},{"style":76},[1587],{"type":44,"value":842},{"type":29,"tag":63,"props":1589,"children":1590},{"style":70},[1591],{"type":44,"value":1038},{"type":29,"tag":63,"props":1593,"children":1595},{"class":65,"line":1594},42,[1596],{"type":29,"tag":63,"props":1597,"children":1598},{"style":76},[1599],{"type":44,"value":1600}," x\n",{"type":29,"tag":63,"props":1602,"children":1604},{"class":65,"line":1603},43,[1605,1610,1615,1620,1625,1630],{"type":29,"tag":63,"props":1606,"children":1607},{"style":70},[1608],{"type":44,"value":1609}," ?",{"type":29,"tag":63,"props":1611,"children":1612},{"style":76},[1613],{"type":44,"value":1614}," dispatcherConnection._dispatchers.",{"type":29,"tag":63,"props":1616,"children":1617},{"style":117},[1618],{"type":44,"value":1619},"get",{"type":29,"tag":63,"props":1621,"children":1622},{"style":76},[1623],{"type":44,"value":1624},"(x._guid)",{"type":29,"tag":63,"props":1626,"children":1627},{"style":70},[1628],{"type":44,"value":1629},"!",{"type":29,"tag":63,"props":1631,"children":1632},{"style":76},[1633],{"type":44,"value":1634},"._object\n",{"type":29,"tag":63,"props":1636,"children":1638},{"class":65,"line":1637},44,[1639,1644,1648,1652,1656,1661],{"type":29,"tag":63,"props":1640,"children":1641},{"style":70},[1642],{"type":44,"value":1643}," :",{"type":29,"tag":63,"props":1645,"children":1646},{"style":76},[1647],{"type":44,"value":1614},{"type":29,"tag":63,"props":1649,"children":1650},{"style":117},[1651],{"type":44,"value":1619},{"type":29,"tag":63,"props":1653,"children":1654},{"style":76},[1655],{"type":44,"value":238},{"type":29,"tag":63,"props":1657,"children":1658},{"style":87},[1659],{"type":44,"value":1660},"\"\"",{"type":29,"tag":63,"props":1662,"children":1663},{"style":76},[1664],{"type":44,"value":429},{"type":29,"tag":63,"props":1666,"children":1668},{"class":65,"line":1667},45,[1669,1674,1678,1682,1687,1691],{"type":29,"tag":63,"props":1670,"children":1671},{"style":76},[1672],{"type":44,"value":1673}," (playwrightAPI ",{"type":29,"tag":63,"props":1675,"children":1676},{"style":70},[1677],{"type":44,"value":1235},{"type":29,"tag":63,"props":1679,"children":1680},{"style":394},[1681],{"type":44,"value":1583},{"type":29,"tag":63,"props":1683,"children":1684},{"style":76},[1685],{"type":44,"value":1686},")._toImpl ",{"type":29,"tag":63,"props":1688,"children":1689},{"style":70},[1690],{"type":44,"value":1258},{"type":29,"tag":63,"props":1692,"children":1693},{"style":76},[1694],{"type":44,"value":1695}," clientConnection.toImpl;\n",{"type":29,"tag":63,"props":1697,"children":1699},{"class":65,"line":1698},46,[1700,1705],{"type":29,"tag":63,"props":1701,"children":1702},{"style":70},[1703],{"type":44,"value":1704}," return",{"type":29,"tag":63,"props":1706,"children":1707},{"style":76},[1708],{"type":44,"value":1709}," playwrightAPI;\n",{"type":29,"tag":63,"props":1711,"children":1713},{"class":65,"line":1712},47,[1714],{"type":29,"tag":63,"props":1715,"children":1716},{"style":76},[1717],{"type":44,"value":257},{"type":29,"tag":30,"props":1719,"children":1720},{},[1721,1723,1729,1731,1737,1739,1745,1747],{"type":44,"value":1722},"If you scan through the script and look at the return value, you'll see Playwright is returning the ",{"type":29,"tag":59,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":44,"value":1728},"PlaywrightAPI",{"type":44,"value":1730}," instance ",{"type":29,"tag":59,"props":1732,"children":1734},{"className":1733},[],[1735],{"type":44,"value":1736},"playwrightAPI",{"type":44,"value":1738},", which is defined somewhere within the client library ",{"type":29,"tag":59,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":44,"value":1744},"playwright-core/src/client/",{"type":44,"value":1746}," (which we find from our type hints). So when we write a script using ",{"type":29,"tag":59,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":44,"value":287},{"type":29,"tag":52,"props":1753,"children":1756},{"className":54,"code":1754,"filename":1755,"language":56,"meta":7,"style":7},"import { chromium } from \"playwright-core\";\n","my-automation-script.ts",[1757],{"type":29,"tag":59,"props":1758,"children":1759},{"__ignoreMap":7},[1760],{"type":29,"tag":63,"props":1761,"children":1762},{"class":65,"line":66},[1763,1767,1771,1775,1780],{"type":29,"tag":63,"props":1764,"children":1765},{"style":70},[1766],{"type":44,"value":73},{"type":29,"tag":63,"props":1768,"children":1769},{"style":76},[1770],{"type":44,"value":79},{"type":29,"tag":63,"props":1772,"children":1773},{"style":70},[1774],{"type":44,"value":84},{"type":29,"tag":63,"props":1776,"children":1777},{"style":87},[1778],{"type":44,"value":1779}," \"playwright-core\"",{"type":29,"tag":63,"props":1781,"children":1782},{"style":76},[1783],{"type":44,"value":1244},{"type":29,"tag":30,"props":1785,"children":1786},{},[1787,1789,1794,1796,1802],{"type":44,"value":1788},"really we are making an import of the ",{"type":29,"tag":59,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":44,"value":1736},{"type":44,"value":1795}," object and accessing its ",{"type":29,"tag":59,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":44,"value":1801},"chromium",{"type":44,"value":1803}," property, so our script is secretly",{"type":29,"tag":52,"props":1805,"children":1807},{"className":54,"code":1806,"filename":1755,"language":56,"meta":7,"style":7},"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n",[1808],{"type":29,"tag":59,"props":1809,"children":1810},{"__ignoreMap":7},[1811,1835],{"type":29,"tag":63,"props":1812,"children":1813},{"class":65,"line":66},[1814,1818,1823,1827,1831],{"type":29,"tag":63,"props":1815,"children":1816},{"style":70},[1817],{"type":44,"value":73},{"type":29,"tag":63,"props":1819,"children":1820},{"style":76},[1821],{"type":44,"value":1822}," playwrightAPI ",{"type":29,"tag":63,"props":1824,"children":1825},{"style":70},[1826],{"type":44,"value":84},{"type":29,"tag":63,"props":1828,"children":1829},{"style":87},[1830],{"type":44,"value":1779},{"type":29,"tag":63,"props":1832,"children":1833},{"style":76},[1834],{"type":44,"value":1244},{"type":29,"tag":63,"props":1836,"children":1837},{"class":65,"line":93},[1838,1843,1848,1852,1857,1861],{"type":29,"tag":63,"props":1839,"children":1840},{"style":70},[1841],{"type":44,"value":1842},"const",{"type":29,"tag":63,"props":1844,"children":1845},{"style":76},[1846],{"type":44,"value":1847}," { ",{"type":29,"tag":63,"props":1849,"children":1850},{"style":394},[1851],{"type":44,"value":1801},{"type":29,"tag":63,"props":1853,"children":1854},{"style":76},[1855],{"type":44,"value":1856}," } ",{"type":29,"tag":63,"props":1858,"children":1859},{"style":70},[1860],{"type":44,"value":1258},{"type":29,"tag":63,"props":1862,"children":1863},{"style":76},[1864],{"type":44,"value":1709},{"type":29,"tag":30,"props":1866,"children":1867},{},[1868],{"type":44,"value":1869},"Tracing where this object is instantiated, we find the call",{"type":29,"tag":52,"props":1871,"children":1873},{"className":54,"code":1872,"filename":730,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n",[1874],{"type":29,"tag":59,"props":1875,"children":1876},{"__ignoreMap":7},[1877,1904,1912],{"type":29,"tag":63,"props":1878,"children":1879},{"class":65,"line":66},[1880,1884,1888,1892,1896,1900],{"type":29,"tag":63,"props":1881,"children":1882},{"style":70},[1883],{"type":44,"value":1842},{"type":29,"tag":63,"props":1885,"children":1886},{"style":394},[1887],{"type":44,"value":1193},{"type":29,"tag":63,"props":1889,"children":1890},{"style":70},[1891],{"type":44,"value":155},{"type":29,"tag":63,"props":1893,"children":1894},{"style":76},[1895],{"type":44,"value":1202},{"type":29,"tag":63,"props":1897,"children":1898},{"style":117},[1899],{"type":44,"value":1207},{"type":29,"tag":63,"props":1901,"children":1902},{"style":76},[1903],{"type":44,"value":1212},{"type":29,"tag":63,"props":1905,"children":1906},{"class":65,"line":93},[1907],{"type":29,"tag":63,"props":1908,"children":1909},{"style":87},[1910],{"type":44,"value":1911}," \"Playwright\"\n",{"type":29,"tag":63,"props":1913,"children":1914},{"class":65,"line":103},[1915,1919,1923,1927],{"type":29,"tag":63,"props":1916,"children":1917},{"style":76},[1918],{"type":44,"value":842},{"type":29,"tag":63,"props":1920,"children":1921},{"style":70},[1922],{"type":44,"value":1235},{"type":29,"tag":63,"props":1924,"children":1925},{"style":117},[1926],{"type":44,"value":766},{"type":29,"tag":63,"props":1928,"children":1929},{"style":76},[1930],{"type":44,"value":1244},{"type":29,"tag":30,"props":1932,"children":1933},{},[1934,1936,1941],{"type":44,"value":1935},"which is not very descriptive. If you try looking in the ",{"type":29,"tag":59,"props":1937,"children":1939},{"className":1938},[],[1940],{"type":44,"value":679},{"type":44,"value":1942}," class definition, you won't get very far either, you'll just see",{"type":29,"tag":52,"props":1944,"children":1947},{"className":54,"code":1945,"filename":1946,"language":56,"meta":7,"style":7},"export class Connection extends EventEmitter {\n readonly _objects = new Map\u003Cstring, ChannelOwner>();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","packages/playwright-core/src/client/connection.ts",[1948],{"type":29,"tag":59,"props":1949,"children":1950},{"__ignoreMap":7},[1951,1981,2030,2038,2081,2116,2124],{"type":29,"tag":63,"props":1952,"children":1953},{"class":65,"line":66},[1954,1958,1963,1967,1972,1977],{"type":29,"tag":63,"props":1955,"children":1956},{"style":70},[1957],{"type":44,"value":742},{"type":29,"tag":63,"props":1959,"children":1960},{"style":70},[1961],{"type":44,"value":1962}," class",{"type":29,"tag":63,"props":1964,"children":1965},{"style":117},[1966],{"type":44,"value":898},{"type":29,"tag":63,"props":1968,"children":1969},{"style":70},[1970],{"type":44,"value":1971}," extends",{"type":29,"tag":63,"props":1973,"children":1974},{"style":117},[1975],{"type":44,"value":1976}," EventEmitter",{"type":29,"tag":63,"props":1978,"children":1979},{"style":76},[1980],{"type":44,"value":135},{"type":29,"tag":63,"props":1982,"children":1983},{"class":65,"line":93},[1984,1989,1994,1998,2002,2007,2012,2017,2021,2025],{"type":29,"tag":63,"props":1985,"children":1986},{"style":70},[1987],{"type":44,"value":1988}," readonly",{"type":29,"tag":63,"props":1990,"children":1991},{"style":147},[1992],{"type":44,"value":1993}," _objects",{"type":29,"tag":63,"props":1995,"children":1996},{"style":70},[1997],{"type":44,"value":155},{"type":29,"tag":63,"props":1999,"children":2000},{"style":70},[2001],{"type":44,"value":893},{"type":29,"tag":63,"props":2003,"children":2004},{"style":117},[2005],{"type":44,"value":2006}," Map",{"type":29,"tag":63,"props":2008,"children":2009},{"style":76},[2010],{"type":44,"value":2011},"\u003C",{"type":29,"tag":63,"props":2013,"children":2014},{"style":394},[2015],{"type":44,"value":2016},"string",{"type":29,"tag":63,"props":2018,"children":2019},{"style":76},[2020],{"type":44,"value":912},{"type":29,"tag":63,"props":2022,"children":2023},{"style":117},[2024],{"type":44,"value":604},{"type":29,"tag":63,"props":2026,"children":2027},{"style":76},[2028],{"type":44,"value":2029},">();\n",{"type":29,"tag":63,"props":2031,"children":2032},{"class":65,"line":103},[2033],{"type":29,"tag":63,"props":2034,"children":2035},{"style":977},[2036],{"type":44,"value":2037}," // ...\n",{"type":29,"tag":63,"props":2039,"children":2040},{"class":65,"line":138},[2041,2046,2050,2055,2059,2064,2069,2073,2077],{"type":29,"tag":63,"props":2042,"children":2043},{"style":117},[2044],{"type":44,"value":2045}," getObjectWithKnownName",{"type":29,"tag":63,"props":2047,"children":2048},{"style":76},[2049],{"type":44,"value":238},{"type":29,"tag":63,"props":2051,"children":2052},{"style":147},[2053],{"type":44,"value":2054},"guid",{"type":29,"tag":63,"props":2056,"children":2057},{"style":70},[2058],{"type":44,"value":761},{"type":29,"tag":63,"props":2060,"children":2061},{"style":394},[2062],{"type":44,"value":2063}," string",{"type":29,"tag":63,"props":2065,"children":2066},{"style":76},[2067],{"type":44,"value":2068},")",{"type":29,"tag":63,"props":2070,"children":2071},{"style":70},[2072],{"type":44,"value":761},{"type":29,"tag":63,"props":2074,"children":2075},{"style":394},[2076],{"type":44,"value":1583},{"type":29,"tag":63,"props":2078,"children":2079},{"style":76},[2080],{"type":44,"value":135},{"type":29,"tag":63,"props":2082,"children":2083},{"class":65,"line":178},[2084,2089,2094,2099,2103,2108,2112],{"type":29,"tag":63,"props":2085,"children":2086},{"style":70},[2087],{"type":44,"value":2088}," return",{"type":29,"tag":63,"props":2090,"children":2091},{"style":394},[2092],{"type":44,"value":2093}," this",{"type":29,"tag":63,"props":2095,"children":2096},{"style":76},[2097],{"type":44,"value":2098},"._objects.",{"type":29,"tag":63,"props":2100,"children":2101},{"style":117},[2102],{"type":44,"value":1619},{"type":29,"tag":63,"props":2104,"children":2105},{"style":76},[2106],{"type":44,"value":2107},"(guid)",{"type":29,"tag":63,"props":2109,"children":2110},{"style":70},[2111],{"type":44,"value":1629},{"type":29,"tag":63,"props":2113,"children":2114},{"style":76},[2115],{"type":44,"value":1244},{"type":29,"tag":63,"props":2117,"children":2118},{"class":65,"line":213},[2119],{"type":29,"tag":63,"props":2120,"children":2121},{"style":76},[2122],{"type":44,"value":2123}," }\n",{"type":29,"tag":63,"props":2125,"children":2126},{"class":65,"line":251},[2127],{"type":29,"tag":63,"props":2128,"children":2129},{"style":76},[2130],{"type":44,"value":257},{"type":29,"tag":30,"props":2132,"children":2133},{},[2134,2136,2141,2143,2149,2151,2156,2158,2164],{"type":44,"value":2135},"which is even more opaque. From this all we know is the ",{"type":29,"tag":59,"props":2137,"children":2139},{"className":2138},[],[2140],{"type":44,"value":679},{"type":44,"value":2142}," class keeps an ",{"type":29,"tag":59,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":44,"value":2148},"_objects",{"type":44,"value":2150}," map which at some point contains an instance of ",{"type":29,"tag":59,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":44,"value":1728},{"type":44,"value":2157},", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within ",{"type":29,"tag":59,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":44,"value":2163},"inProcessFactory",{"type":44,"value":2165}," will give us a clear picture of how this library is wrapped together.",{"type":29,"tag":39,"props":2167,"children":2169},{"id":2168},"cross-communication-between-client-and-server",[2170],{"type":44,"value":2171},"Cross communication between client and server",{"type":29,"tag":30,"props":2173,"children":2174},{},[2175,2177,2182,2184,2190,2192,2198,2200,2205,2207,2212,2214,2220],{"type":44,"value":2176},"If you look through the script's imports, anything with ",{"type":29,"tag":59,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":44,"value":619},{"type":44,"value":2183}," in its name, and ",{"type":29,"tag":59,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":44,"value":2189},"createPlaywright",{"type":44,"value":2191},", come from the ",{"type":29,"tag":59,"props":2193,"children":2195},{"className":2194},[],[2196],{"type":44,"value":2197},"server",{"type":44,"value":2199}," directroy. The ",{"type":29,"tag":59,"props":2201,"children":2203},{"className":2202},[],[2204],{"type":44,"value":2189},{"type":44,"value":2206}," function creates an instance of the ",{"type":29,"tag":59,"props":2208,"children":2210},{"className":2209},[],[2211],{"type":44,"value":12},{"type":44,"value":2213}," class defined in ",{"type":29,"tag":59,"props":2215,"children":2217},{"className":2216},[],[2218],{"type":44,"value":2219},"packages/playwright-core/server/playwright.ts",{"type":44,"value":228},{"type":29,"tag":30,"props":2222,"children":2223},{},[2224,2226,2231,2232,2237,2239,2244,2246,2251,2253,2258,2260,2266,2267,2272],{"type":44,"value":2225},"Similarly, the imports for ",{"type":29,"tag":59,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":44,"value":1728},{"type":44,"value":2238}," come from the ",{"type":29,"tag":59,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":44,"value":519},{"type":44,"value":2245}," directory. Looking through the first lines of ",{"type":29,"tag":59,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":44,"value":2163},{"type":44,"value":2252},", there is an instantiation of the server ",{"type":29,"tag":59,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":44,"value":12},{"type":44,"value":2259}," class and instantiation of objects for the ",{"type":29,"tag":59,"props":2261,"children":2263},{"className":2262},[],[2264],{"type":44,"value":2265},"ClientConnection",{"type":44,"value":281},{"type":29,"tag":59,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":44,"value":687},{"type":44,"value":2273}," classes",{"type":29,"tag":52,"props":2275,"children":2277},{"className":54,"code":2276,"filename":730,"language":56,"meta":7,"style":7},"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n",[2278],{"type":29,"tag":59,"props":2279,"children":2280},{"__ignoreMap":7},[2281,2304,2312,2356,2364,2371,2414,2430],{"type":29,"tag":63,"props":2282,"children":2283},{"class":65,"line":66},[2284,2288,2292,2296,2300],{"type":29,"tag":63,"props":2285,"children":2286},{"style":70},[2287],{"type":44,"value":1842},{"type":29,"tag":63,"props":2289,"children":2290},{"style":394},[2291],{"type":44,"value":782},{"type":29,"tag":63,"props":2293,"children":2294},{"style":70},[2295],{"type":44,"value":155},{"type":29,"tag":63,"props":2297,"children":2298},{"style":117},[2299],{"type":44,"value":791},{"type":29,"tag":63,"props":2301,"children":2302},{"style":76},[2303],{"type":44,"value":796},{"type":29,"tag":63,"props":2305,"children":2306},{"class":65,"line":93},[2307],{"type":29,"tag":63,"props":2308,"children":2309},{"style":76},[2310],{"type":44,"value":2311}," sdkLanguage:\n",{"type":29,"tag":63,"props":2313,"children":2314},{"class":65,"line":103},[2315,2320,2324,2328,2332,2336,2340,2344,2348,2352],{"type":29,"tag":63,"props":2316,"children":2317},{"style":76},[2318],{"type":44,"value":2319}," (process.env.",{"type":29,"tag":63,"props":2321,"children":2322},{"style":394},[2323],{"type":44,"value":817},{"type":29,"tag":63,"props":2325,"children":2326},{"style":70},[2327],{"type":44,"value":822},{"type":29,"tag":63,"props":2329,"children":2330},{"style":117},[2331],{"type":44,"value":827},{"type":29,"tag":63,"props":2333,"children":2334},{"style":70},[2335],{"type":44,"value":832},{"type":29,"tag":63,"props":2337,"children":2338},{"style":394},[2339],{"type":44,"value":837},{"type":29,"tag":63,"props":2341,"children":2342},{"style":76},[2343],{"type":44,"value":842},{"type":29,"tag":63,"props":2345,"children":2346},{"style":70},[2347],{"type":44,"value":847},{"type":29,"tag":63,"props":2349,"children":2350},{"style":87},[2351],{"type":44,"value":852},{"type":29,"tag":63,"props":2353,"children":2354},{"style":76},[2355],{"type":44,"value":857},{"type":29,"tag":63,"props":2357,"children":2358},{"class":65,"line":138},[2359],{"type":29,"tag":63,"props":2360,"children":2361},{"style":76},[2362],{"type":44,"value":2363},"});\n",{"type":29,"tag":63,"props":2365,"children":2366},{"class":65,"line":178},[2367],{"type":29,"tag":63,"props":2368,"children":2369},{"emptyLinePlaceholder":97},[2370],{"type":44,"value":100},{"type":29,"tag":63,"props":2372,"children":2373},{"class":65,"line":213},[2374,2378,2382,2386,2390,2394,2398,2402,2406,2410],{"type":29,"tag":63,"props":2375,"children":2376},{"style":70},[2377],{"type":44,"value":1842},{"type":29,"tag":63,"props":2379,"children":2380},{"style":394},[2381],{"type":44,"value":884},{"type":29,"tag":63,"props":2383,"children":2384},{"style":70},[2385],{"type":44,"value":155},{"type":29,"tag":63,"props":2387,"children":2388},{"style":70},[2389],{"type":44,"value":893},{"type":29,"tag":63,"props":2391,"children":2392},{"style":117},[2393],{"type":44,"value":898},{"type":29,"tag":63,"props":2395,"children":2396},{"style":76},[2397],{"type":44,"value":238},{"type":29,"tag":63,"props":2399,"children":2400},{"style":394},[2401],{"type":44,"value":907},{"type":29,"tag":63,"props":2403,"children":2404},{"style":76},[2405],{"type":44,"value":912},{"type":29,"tag":63,"props":2407,"children":2408},{"style":394},[2409],{"type":44,"value":907},{"type":29,"tag":63,"props":2411,"children":2412},{"style":76},[2413],{"type":44,"value":429},{"type":29,"tag":63,"props":2415,"children":2416},{"class":65,"line":251},[2417,2422,2426],{"type":29,"tag":63,"props":2418,"children":2419},{"style":76},[2420],{"type":44,"value":2421},"clientConnection.",{"type":29,"tag":63,"props":2423,"children":2424},{"style":117},[2425],{"type":44,"value":934},{"type":29,"tag":63,"props":2427,"children":2428},{"style":76},[2429],{"type":44,"value":939},{"type":29,"tag":63,"props":2431,"children":2432},{"class":65,"line":923},[2433,2437,2441,2445,2449,2453,2457,2461,2465],{"type":29,"tag":63,"props":2434,"children":2435},{"style":70},[2436],{"type":44,"value":1842},{"type":29,"tag":63,"props":2438,"children":2439},{"style":394},[2440],{"type":44,"value":952},{"type":29,"tag":63,"props":2442,"children":2443},{"style":70},[2444],{"type":44,"value":155},{"type":29,"tag":63,"props":2446,"children":2447},{"style":70},[2448],{"type":44,"value":893},{"type":29,"tag":63,"props":2450,"children":2451},{"style":117},[2452],{"type":44,"value":965},{"type":29,"tag":63,"props":2454,"children":2455},{"style":76},[2456],{"type":44,"value":238},{"type":29,"tag":63,"props":2458,"children":2459},{"style":394},[2460],{"type":44,"value":974},{"type":29,"tag":63,"props":2462,"children":2463},{"style":977},[2464],{"type":44,"value":980},{"type":29,"tag":63,"props":2466,"children":2467},{"style":76},[2468],{"type":44,"value":429},{"type":29,"tag":30,"props":2470,"children":2471},{},[2472],{"type":44,"value":2473},"The next lines of code are the bridge between the internal client and server libraries",{"type":29,"tag":52,"props":2475,"children":2477},{"className":54,"code":2476,"filename":730,"language":56,"meta":7,"style":7},"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n",[2478],{"type":29,"tag":59,"props":2479,"children":2480},{"__ignoreMap":7},[2481,2513,2528,2559],{"type":29,"tag":63,"props":2482,"children":2483},{"class":65,"line":66},[2484,2489,2493,2497,2501,2505,2509],{"type":29,"tag":63,"props":2485,"children":2486},{"style":76},[2487],{"type":44,"value":2488},"dispatcherConnection.",{"type":29,"tag":63,"props":2490,"children":2491},{"style":117},[2492],{"type":44,"value":1015},{"type":29,"tag":63,"props":2494,"children":2495},{"style":70},[2496],{"type":44,"value":155},{"type":29,"tag":63,"props":2498,"children":2499},{"style":76},[2500],{"type":44,"value":1024},{"type":29,"tag":63,"props":2502,"children":2503},{"style":147},[2504],{"type":44,"value":1029},{"type":29,"tag":63,"props":2506,"children":2507},{"style":76},[2508],{"type":44,"value":842},{"type":29,"tag":63,"props":2510,"children":2511},{"style":70},[2512],{"type":44,"value":1038},{"type":29,"tag":63,"props":2514,"children":2515},{"class":65,"line":93},[2516,2520,2524],{"type":29,"tag":63,"props":2517,"children":2518},{"style":76},[2519],{"type":44,"value":929},{"type":29,"tag":63,"props":2521,"children":2522},{"style":117},[2523],{"type":44,"value":1051},{"type":29,"tag":63,"props":2525,"children":2526},{"style":76},[2527],{"type":44,"value":1056},{"type":29,"tag":63,"props":2529,"children":2530},{"class":65,"line":103},[2531,2535,2539,2543,2547,2551,2555],{"type":29,"tag":63,"props":2532,"children":2533},{"style":76},[2534],{"type":44,"value":2421},{"type":29,"tag":63,"props":2536,"children":2537},{"style":117},[2538],{"type":44,"value":1015},{"type":29,"tag":63,"props":2540,"children":2541},{"style":70},[2542],{"type":44,"value":155},{"type":29,"tag":63,"props":2544,"children":2545},{"style":76},[2546],{"type":44,"value":1024},{"type":29,"tag":63,"props":2548,"children":2549},{"style":147},[2550],{"type":44,"value":1029},{"type":29,"tag":63,"props":2552,"children":2553},{"style":76},[2554],{"type":44,"value":842},{"type":29,"tag":63,"props":2556,"children":2557},{"style":70},[2558],{"type":44,"value":1038},{"type":29,"tag":63,"props":2560,"children":2561},{"class":65,"line":138},[2562,2566,2570],{"type":29,"tag":63,"props":2563,"children":2564},{"style":76},[2565],{"type":44,"value":1010},{"type":29,"tag":63,"props":2567,"children":2568},{"style":117},[2569],{"type":44,"value":1051},{"type":29,"tag":63,"props":2571,"children":2572},{"style":76},[2573],{"type":44,"value":1056},{"type":29,"tag":30,"props":2575,"children":2576},{},[2577,2579,2584,2586,2591,2593,2598,2600,2606,2608,2614,2616,2621,2623,2629],{"type":44,"value":2578},"given by setting the ",{"type":29,"tag":59,"props":2580,"children":2582},{"className":2581},[],[2583],{"type":44,"value":1015},{"type":44,"value":2585}," properties for each of these objects. Notice each ",{"type":29,"tag":59,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":44,"value":1015},{"type":44,"value":2592}," calls the other's ",{"type":29,"tag":59,"props":2594,"children":2596},{"className":2595},[],[2597],{"type":44,"value":1051},{"type":44,"value":2599}," method; i.e., ",{"type":29,"tag":59,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":44,"value":2605},"dispatcherConnection",{"type":44,"value":2607}," calls the ",{"type":29,"tag":59,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":44,"value":2613},"clientConnection.dispatch",{"type":44,"value":2615}," through ",{"type":29,"tag":59,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":44,"value":1015},{"type":44,"value":2622}," and vice versa. This gives us the hint somehow ",{"type":29,"tag":59,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":44,"value":2628},"dispatcherConnection.onmessage",{"type":44,"value":2630}," will be called somewhere in the codebase.",{"type":29,"tag":269,"props":2632,"children":2634},{"id":2633},"server-side-createplaywright",[2635],{"type":44,"value":2636},"Server-side createPlaywright",{"type":29,"tag":30,"props":2638,"children":2639},{},[2640,2642,2647,2649,2654,2656,2661,2662,2667],{"type":44,"value":2641},"Before we continue down the logic within ",{"type":29,"tag":59,"props":2643,"children":2645},{"className":2644},[],[2646],{"type":44,"value":504},{"type":44,"value":2648},", let's go over what the ",{"type":29,"tag":59,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":44,"value":2189},{"type":44,"value":2655}," function actually does. It is a simple function call which instantiates the ",{"type":29,"tag":59,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":44,"value":12},{"type":44,"value":2213},{"type":29,"tag":59,"props":2663,"children":2665},{"className":2664},[],[2666],{"type":44,"value":2219},{"type":44,"value":2668},". Below is a simplified version of it",{"type":29,"tag":52,"props":2670,"children":2672},{"className":54,"code":2671,"filename":2219,"language":56,"meta":7,"style":7},"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n",[2673],{"type":29,"tag":59,"props":2674,"children":2675},{"__ignoreMap":7},[2676,2701,2726,2751,2776,2801,2808,2837,2862,2887,2912,2937,2962,2987,3012,3037,3044,3074,3086,3116,3128,3136,3144,3166,3203,3239,3275,3303,3339,3346],{"type":29,"tag":63,"props":2677,"children":2678},{"class":65,"line":66},[2679,2683,2688,2692,2697],{"type":29,"tag":63,"props":2680,"children":2681},{"style":70},[2682],{"type":44,"value":73},{"type":29,"tag":63,"props":2684,"children":2685},{"style":76},[2686],{"type":44,"value":2687}," { Chromium } ",{"type":29,"tag":63,"props":2689,"children":2690},{"style":70},[2691],{"type":44,"value":84},{"type":29,"tag":63,"props":2693,"children":2694},{"style":87},[2695],{"type":44,"value":2696}," \"./chromium/chromium\"",{"type":29,"tag":63,"props":2698,"children":2699},{"style":76},[2700],{"type":44,"value":1244},{"type":29,"tag":63,"props":2702,"children":2703},{"class":65,"line":93},[2704,2708,2713,2717,2722],{"type":29,"tag":63,"props":2705,"children":2706},{"style":70},[2707],{"type":44,"value":73},{"type":29,"tag":63,"props":2709,"children":2710},{"style":76},[2711],{"type":44,"value":2712}," { Firefox } ",{"type":29,"tag":63,"props":2714,"children":2715},{"style":70},[2716],{"type":44,"value":84},{"type":29,"tag":63,"props":2718,"children":2719},{"style":87},[2720],{"type":44,"value":2721}," \"./firefox/firefox\"",{"type":29,"tag":63,"props":2723,"children":2724},{"style":76},[2725],{"type":44,"value":1244},{"type":29,"tag":63,"props":2727,"children":2728},{"class":65,"line":103},[2729,2733,2738,2742,2747],{"type":29,"tag":63,"props":2730,"children":2731},{"style":70},[2732],{"type":44,"value":73},{"type":29,"tag":63,"props":2734,"children":2735},{"style":76},[2736],{"type":44,"value":2737}," { Selectors } ",{"type":29,"tag":63,"props":2739,"children":2740},{"style":70},[2741],{"type":44,"value":84},{"type":29,"tag":63,"props":2743,"children":2744},{"style":87},[2745],{"type":44,"value":2746}," \"./selectors\"",{"type":29,"tag":63,"props":2748,"children":2749},{"style":76},[2750],{"type":44,"value":1244},{"type":29,"tag":63,"props":2752,"children":2753},{"class":65,"line":138},[2754,2758,2763,2767,2772],{"type":29,"tag":63,"props":2755,"children":2756},{"style":70},[2757],{"type":44,"value":73},{"type":29,"tag":63,"props":2759,"children":2760},{"style":76},[2761],{"type":44,"value":2762}," { WebKit } ",{"type":29,"tag":63,"props":2764,"children":2765},{"style":70},[2766],{"type":44,"value":84},{"type":29,"tag":63,"props":2768,"children":2769},{"style":87},[2770],{"type":44,"value":2771}," \"./webkit/webkit\"",{"type":29,"tag":63,"props":2773,"children":2774},{"style":76},[2775],{"type":44,"value":1244},{"type":29,"tag":63,"props":2777,"children":2778},{"class":65,"line":178},[2779,2783,2788,2792,2797],{"type":29,"tag":63,"props":2780,"children":2781},{"style":70},[2782],{"type":44,"value":73},{"type":29,"tag":63,"props":2784,"children":2785},{"style":76},[2786],{"type":44,"value":2787}," { createInstrumentation, SdkObject } ",{"type":29,"tag":63,"props":2789,"children":2790},{"style":70},[2791],{"type":44,"value":84},{"type":29,"tag":63,"props":2793,"children":2794},{"style":87},[2795],{"type":44,"value":2796}," \"./instrumentation\"",{"type":29,"tag":63,"props":2798,"children":2799},{"style":76},[2800],{"type":44,"value":1244},{"type":29,"tag":63,"props":2802,"children":2803},{"class":65,"line":213},[2804],{"type":29,"tag":63,"props":2805,"children":2806},{"emptyLinePlaceholder":97},[2807],{"type":44,"value":100},{"type":29,"tag":63,"props":2809,"children":2810},{"class":65,"line":251},[2811,2815,2819,2824,2828,2833],{"type":29,"tag":63,"props":2812,"children":2813},{"style":70},[2814],{"type":44,"value":742},{"type":29,"tag":63,"props":2816,"children":2817},{"style":70},[2818],{"type":44,"value":1962},{"type":29,"tag":63,"props":2820,"children":2821},{"style":117},[2822],{"type":44,"value":2823}," Playwright",{"type":29,"tag":63,"props":2825,"children":2826},{"style":70},[2827],{"type":44,"value":1971},{"type":29,"tag":63,"props":2829,"children":2830},{"style":117},[2831],{"type":44,"value":2832}," SdkObject",{"type":29,"tag":63,"props":2834,"children":2835},{"style":76},[2836],{"type":44,"value":135},{"type":29,"tag":63,"props":2838,"children":2839},{"class":65,"line":923},[2840,2844,2849,2853,2858],{"type":29,"tag":63,"props":2841,"children":2842},{"style":70},[2843],{"type":44,"value":1988},{"type":29,"tag":63,"props":2845,"children":2846},{"style":147},[2847],{"type":44,"value":2848}," selectors",{"type":29,"tag":63,"props":2850,"children":2851},{"style":70},[2852],{"type":44,"value":761},{"type":29,"tag":63,"props":2854,"children":2855},{"style":117},[2856],{"type":44,"value":2857}," Selectors",{"type":29,"tag":63,"props":2859,"children":2860},{"style":76},[2861],{"type":44,"value":1244},{"type":29,"tag":63,"props":2863,"children":2864},{"class":65,"line":942},[2865,2869,2874,2878,2883],{"type":29,"tag":63,"props":2866,"children":2867},{"style":70},[2868],{"type":44,"value":1988},{"type":29,"tag":63,"props":2870,"children":2871},{"style":147},[2872],{"type":44,"value":2873}," chromium",{"type":29,"tag":63,"props":2875,"children":2876},{"style":70},[2877],{"type":44,"value":761},{"type":29,"tag":63,"props":2879,"children":2880},{"style":117},[2881],{"type":44,"value":2882}," Chromium",{"type":29,"tag":63,"props":2884,"children":2885},{"style":76},[2886],{"type":44,"value":1244},{"type":29,"tag":63,"props":2888,"children":2889},{"class":65,"line":987},[2890,2894,2899,2903,2908],{"type":29,"tag":63,"props":2891,"children":2892},{"style":70},[2893],{"type":44,"value":1988},{"type":29,"tag":63,"props":2895,"children":2896},{"style":147},[2897],{"type":44,"value":2898}," android",{"type":29,"tag":63,"props":2900,"children":2901},{"style":70},[2902],{"type":44,"value":761},{"type":29,"tag":63,"props":2904,"children":2905},{"style":117},[2906],{"type":44,"value":2907}," Android",{"type":29,"tag":63,"props":2909,"children":2910},{"style":76},[2911],{"type":44,"value":1244},{"type":29,"tag":63,"props":2913,"children":2914},{"class":65,"line":995},[2915,2919,2924,2928,2933],{"type":29,"tag":63,"props":2916,"children":2917},{"style":70},[2918],{"type":44,"value":1988},{"type":29,"tag":63,"props":2920,"children":2921},{"style":147},[2922],{"type":44,"value":2923}," electron",{"type":29,"tag":63,"props":2925,"children":2926},{"style":70},[2927],{"type":44,"value":761},{"type":29,"tag":63,"props":2929,"children":2930},{"style":117},[2931],{"type":44,"value":2932}," Electron",{"type":29,"tag":63,"props":2934,"children":2935},{"style":76},[2936],{"type":44,"value":1244},{"type":29,"tag":63,"props":2938,"children":2939},{"class":65,"line":1004},[2940,2944,2949,2953,2958],{"type":29,"tag":63,"props":2941,"children":2942},{"style":70},[2943],{"type":44,"value":1988},{"type":29,"tag":63,"props":2945,"children":2946},{"style":147},[2947],{"type":44,"value":2948}," firefox",{"type":29,"tag":63,"props":2950,"children":2951},{"style":70},[2952],{"type":44,"value":761},{"type":29,"tag":63,"props":2954,"children":2955},{"style":117},[2956],{"type":44,"value":2957}," Firefox",{"type":29,"tag":63,"props":2959,"children":2960},{"style":76},[2961],{"type":44,"value":1244},{"type":29,"tag":63,"props":2963,"children":2964},{"class":65,"line":23},[2965,2969,2974,2978,2983],{"type":29,"tag":63,"props":2966,"children":2967},{"style":70},[2968],{"type":44,"value":1988},{"type":29,"tag":63,"props":2970,"children":2971},{"style":147},[2972],{"type":44,"value":2973}," webkit",{"type":29,"tag":63,"props":2975,"children":2976},{"style":70},[2977],{"type":44,"value":761},{"type":29,"tag":63,"props":2979,"children":2980},{"style":117},[2981],{"type":44,"value":2982}," WebKit",{"type":29,"tag":63,"props":2984,"children":2985},{"style":76},[2986],{"type":44,"value":1244},{"type":29,"tag":63,"props":2988,"children":2989},{"class":65,"line":1059},[2990,2994,2999,3003,3008],{"type":29,"tag":63,"props":2991,"children":2992},{"style":70},[2993],{"type":44,"value":1988},{"type":29,"tag":63,"props":2995,"children":2996},{"style":147},[2997],{"type":44,"value":2998}," options",{"type":29,"tag":63,"props":3000,"children":3001},{"style":70},[3002],{"type":44,"value":761},{"type":29,"tag":63,"props":3004,"children":3005},{"style":117},[3006],{"type":44,"value":3007}," PlaywrightOptions",{"type":29,"tag":63,"props":3009,"children":3010},{"style":76},[3011],{"type":44,"value":1244},{"type":29,"tag":63,"props":3013,"children":3014},{"class":65,"line":1091},[3015,3019,3024,3028,3033],{"type":29,"tag":63,"props":3016,"children":3017},{"style":70},[3018],{"type":44,"value":1988},{"type":29,"tag":63,"props":3020,"children":3021},{"style":147},[3022],{"type":44,"value":3023}," debugController",{"type":29,"tag":63,"props":3025,"children":3026},{"style":70},[3027],{"type":44,"value":761},{"type":29,"tag":63,"props":3029,"children":3030},{"style":117},[3031],{"type":44,"value":3032}," DebugController",{"type":29,"tag":63,"props":3034,"children":3035},{"style":76},[3036],{"type":44,"value":1244},{"type":29,"tag":63,"props":3038,"children":3039},{"class":65,"line":1108},[3040],{"type":29,"tag":63,"props":3041,"children":3042},{"emptyLinePlaceholder":97},[3043],{"type":44,"value":100},{"type":29,"tag":63,"props":3045,"children":3046},{"class":65,"line":1116},[3047,3052,3056,3061,3065,3069],{"type":29,"tag":63,"props":3048,"children":3049},{"style":70},[3050],{"type":44,"value":3051}," constructor",{"type":29,"tag":63,"props":3053,"children":3054},{"style":76},[3055],{"type":44,"value":238},{"type":29,"tag":63,"props":3057,"children":3058},{"style":147},[3059],{"type":44,"value":3060},"options",{"type":29,"tag":63,"props":3062,"children":3063},{"style":70},[3064],{"type":44,"value":761},{"type":29,"tag":63,"props":3066,"children":3067},{"style":117},[3068],{"type":44,"value":3007},{"type":29,"tag":63,"props":3070,"children":3071},{"style":76},[3072],{"type":44,"value":3073},") {\n",{"type":29,"tag":63,"props":3075,"children":3076},{"class":65,"line":1147},[3077,3082],{"type":29,"tag":63,"props":3078,"children":3079},{"style":394},[3080],{"type":44,"value":3081}," super",{"type":29,"tag":63,"props":3083,"children":3084},{"style":76},[3085],{"type":44,"value":1212},{"type":29,"tag":63,"props":3087,"children":3088},{"class":65,"line":1155},[3089,3094,3099,3104,3108,3112],{"type":29,"tag":63,"props":3090,"children":3091},{"style":76},[3092],{"type":44,"value":3093}," { attribution: {}, instrumentation: ",{"type":29,"tag":63,"props":3095,"children":3096},{"style":117},[3097],{"type":44,"value":3098},"createInstrumentation",{"type":29,"tag":63,"props":3100,"children":3101},{"style":76},[3102],{"type":44,"value":3103},"() } ",{"type":29,"tag":63,"props":3105,"children":3106},{"style":70},[3107],{"type":44,"value":1235},{"type":29,"tag":63,"props":3109,"children":3110},{"style":394},[3111],{"type":44,"value":1583},{"type":29,"tag":63,"props":3113,"children":3114},{"style":76},[3115],{"type":44,"value":857},{"type":29,"tag":63,"props":3117,"children":3118},{"class":65,"line":1164},[3119,3124],{"type":29,"tag":63,"props":3120,"children":3121},{"style":394},[3122],{"type":44,"value":3123}," undefined",{"type":29,"tag":63,"props":3125,"children":3126},{"style":76},[3127],{"type":44,"value":857},{"type":29,"tag":63,"props":3129,"children":3130},{"class":65,"line":1183},[3131],{"type":29,"tag":63,"props":3132,"children":3133},{"style":87},[3134],{"type":44,"value":3135}," \"Playwright\"\n",{"type":29,"tag":63,"props":3137,"children":3138},{"class":65,"line":1215},[3139],{"type":29,"tag":63,"props":3140,"children":3141},{"style":76},[3142],{"type":44,"value":3143}," );\n",{"type":29,"tag":63,"props":3145,"children":3146},{"class":65,"line":1224},[3147,3152,3157,3161],{"type":29,"tag":63,"props":3148,"children":3149},{"style":394},[3150],{"type":44,"value":3151}," this",{"type":29,"tag":63,"props":3153,"children":3154},{"style":76},[3155],{"type":44,"value":3156},".options ",{"type":29,"tag":63,"props":3158,"children":3159},{"style":70},[3160],{"type":44,"value":1258},{"type":29,"tag":63,"props":3162,"children":3163},{"style":76},[3164],{"type":44,"value":3165}," options;\n",{"type":29,"tag":63,"props":3167,"children":3168},{"class":65,"line":1247},[3169,3173,3178,3182,3186,3190,3194,3199],{"type":29,"tag":63,"props":3170,"children":3171},{"style":394},[3172],{"type":44,"value":3151},{"type":29,"tag":63,"props":3174,"children":3175},{"style":76},[3176],{"type":44,"value":3177},".chromium ",{"type":29,"tag":63,"props":3179,"children":3180},{"style":70},[3181],{"type":44,"value":1258},{"type":29,"tag":63,"props":3183,"children":3184},{"style":70},[3185],{"type":44,"value":893},{"type":29,"tag":63,"props":3187,"children":3188},{"style":117},[3189],{"type":44,"value":2882},{"type":29,"tag":63,"props":3191,"children":3192},{"style":76},[3193],{"type":44,"value":238},{"type":29,"tag":63,"props":3195,"children":3196},{"style":394},[3197],{"type":44,"value":3198},"this",{"type":29,"tag":63,"props":3200,"children":3201},{"style":76},[3202],{"type":44,"value":429},{"type":29,"tag":63,"props":3204,"children":3205},{"class":65,"line":1274},[3206,3210,3215,3219,3223,3227,3231,3235],{"type":29,"tag":63,"props":3207,"children":3208},{"style":394},[3209],{"type":44,"value":3151},{"type":29,"tag":63,"props":3211,"children":3212},{"style":76},[3213],{"type":44,"value":3214},".firefox ",{"type":29,"tag":63,"props":3216,"children":3217},{"style":70},[3218],{"type":44,"value":1258},{"type":29,"tag":63,"props":3220,"children":3221},{"style":70},[3222],{"type":44,"value":893},{"type":29,"tag":63,"props":3224,"children":3225},{"style":117},[3226],{"type":44,"value":2957},{"type":29,"tag":63,"props":3228,"children":3229},{"style":76},[3230],{"type":44,"value":238},{"type":29,"tag":63,"props":3232,"children":3233},{"style":394},[3234],{"type":44,"value":3198},{"type":29,"tag":63,"props":3236,"children":3237},{"style":76},[3238],{"type":44,"value":429},{"type":29,"tag":63,"props":3240,"children":3241},{"class":65,"line":1283},[3242,3246,3251,3255,3259,3263,3267,3271],{"type":29,"tag":63,"props":3243,"children":3244},{"style":394},[3245],{"type":44,"value":3151},{"type":29,"tag":63,"props":3247,"children":3248},{"style":76},[3249],{"type":44,"value":3250},".webkit ",{"type":29,"tag":63,"props":3252,"children":3253},{"style":70},[3254],{"type":44,"value":1258},{"type":29,"tag":63,"props":3256,"children":3257},{"style":70},[3258],{"type":44,"value":893},{"type":29,"tag":63,"props":3260,"children":3261},{"style":117},[3262],{"type":44,"value":2982},{"type":29,"tag":63,"props":3264,"children":3265},{"style":76},[3266],{"type":44,"value":238},{"type":29,"tag":63,"props":3268,"children":3269},{"style":394},[3270],{"type":44,"value":3198},{"type":29,"tag":63,"props":3272,"children":3273},{"style":76},[3274],{"type":44,"value":429},{"type":29,"tag":63,"props":3276,"children":3277},{"class":65,"line":1292},[3278,3282,3287,3291,3295,3299],{"type":29,"tag":63,"props":3279,"children":3280},{"style":394},[3281],{"type":44,"value":3151},{"type":29,"tag":63,"props":3283,"children":3284},{"style":76},[3285],{"type":44,"value":3286},".selectors ",{"type":29,"tag":63,"props":3288,"children":3289},{"style":70},[3290],{"type":44,"value":1258},{"type":29,"tag":63,"props":3292,"children":3293},{"style":70},[3294],{"type":44,"value":893},{"type":29,"tag":63,"props":3296,"children":3297},{"style":117},[3298],{"type":44,"value":2857},{"type":29,"tag":63,"props":3300,"children":3301},{"style":76},[3302],{"type":44,"value":939},{"type":29,"tag":63,"props":3304,"children":3305},{"class":65,"line":1317},[3306,3310,3315,3319,3323,3327,3331,3335],{"type":29,"tag":63,"props":3307,"children":3308},{"style":394},[3309],{"type":44,"value":3151},{"type":29,"tag":63,"props":3311,"children":3312},{"style":76},[3313],{"type":44,"value":3314},".debugController ",{"type":29,"tag":63,"props":3316,"children":3317},{"style":70},[3318],{"type":44,"value":1258},{"type":29,"tag":63,"props":3320,"children":3321},{"style":70},[3322],{"type":44,"value":893},{"type":29,"tag":63,"props":3324,"children":3325},{"style":117},[3326],{"type":44,"value":3032},{"type":29,"tag":63,"props":3328,"children":3329},{"style":76},[3330],{"type":44,"value":238},{"type":29,"tag":63,"props":3332,"children":3333},{"style":394},[3334],{"type":44,"value":3198},{"type":29,"tag":63,"props":3336,"children":3337},{"style":76},[3338],{"type":44,"value":429},{"type":29,"tag":63,"props":3340,"children":3341},{"class":65,"line":1326},[3342],{"type":29,"tag":63,"props":3343,"children":3344},{"style":76},[3345],{"type":44,"value":2123},{"type":29,"tag":63,"props":3347,"children":3348},{"class":65,"line":1334},[3349],{"type":29,"tag":63,"props":3350,"children":3351},{"style":76},[3352],{"type":44,"value":257},{"type":29,"tag":30,"props":3354,"children":3355},{},[3356,3358,3364,3366,3371],{"type":44,"value":3357},"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into ",{"type":29,"tag":59,"props":3359,"children":3361},{"className":3360},[],[3362],{"type":44,"value":3363},"packages/playwright-core/server/chromium/",{"type":44,"value":3365}," you will see all the functionality for automating a ",{"type":29,"tag":59,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":44,"value":1801},{"type":44,"value":201},{"type":29,"tag":269,"props":3373,"children":3375},{"id":3374},"rootdispatcher-and-server-side-playwright",[3376],{"type":44,"value":3377},"RootDispatcher and server-side Playwright",{"type":29,"tag":30,"props":3379,"children":3380},{},[3381,3383,3388,3390,3396,3398,3404],{"type":44,"value":3382},"Continuing down ",{"type":29,"tag":59,"props":3384,"children":3386},{"className":3385},[],[3387],{"type":44,"value":504},{"type":44,"value":3389},", we see there's the construction of a ",{"type":29,"tag":59,"props":3391,"children":3393},{"className":3392},[],[3394],{"type":44,"value":3395},"RootDispatcher",{"type":44,"value":3397}," instance, and a ",{"type":29,"tag":59,"props":3399,"children":3401},{"className":3400},[],[3402],{"type":44,"value":3403},"PlaywrightDispatcher",{"type":44,"value":3405}," instance.",{"type":29,"tag":52,"props":3407,"children":3409},{"className":54,"code":3408,"filename":730,"language":56,"meta":7,"style":7},"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n",[3410],{"type":29,"tag":59,"props":3411,"children":3412},{"__ignoreMap":7},[3413,3440,3447,3455],{"type":29,"tag":63,"props":3414,"children":3415},{"class":65,"line":66},[3416,3420,3424,3428,3432,3436],{"type":29,"tag":63,"props":3417,"children":3418},{"style":70},[3419],{"type":44,"value":1842},{"type":29,"tag":63,"props":3421,"children":3422},{"style":394},[3423],{"type":44,"value":1126},{"type":29,"tag":63,"props":3425,"children":3426},{"style":70},[3427],{"type":44,"value":155},{"type":29,"tag":63,"props":3429,"children":3430},{"style":70},[3431],{"type":44,"value":893},{"type":29,"tag":63,"props":3433,"children":3434},{"style":117},[3435],{"type":44,"value":1139},{"type":29,"tag":63,"props":3437,"children":3438},{"style":76},[3439],{"type":44,"value":1144},{"type":29,"tag":63,"props":3441,"children":3442},{"class":65,"line":93},[3443],{"type":29,"tag":63,"props":3444,"children":3445},{"emptyLinePlaceholder":97},[3446],{"type":44,"value":100},{"type":29,"tag":63,"props":3448,"children":3449},{"class":65,"line":103},[3450],{"type":29,"tag":63,"props":3451,"children":3452},{"style":977},[3453],{"type":44,"value":3454},"// Initialize Playwright channel.\n",{"type":29,"tag":63,"props":3456,"children":3457},{"class":65,"line":138},[3458,3463,3467],{"type":29,"tag":63,"props":3459,"children":3460},{"style":70},[3461],{"type":44,"value":3462},"new",{"type":29,"tag":63,"props":3464,"children":3465},{"style":117},[3466],{"type":44,"value":1175},{"type":29,"tag":63,"props":3468,"children":3469},{"style":76},[3470],{"type":44,"value":1180},{"type":29,"tag":30,"props":3472,"children":3473},{},[3474,3476,3482,3484,3489,3491,3496,3498,3503,3505,3510,3512,3517,3519,3524,3526,3531],{"type":44,"value":3475},"Note the ",{"type":29,"tag":59,"props":3477,"children":3479},{"className":3478},[],[3480],{"type":44,"value":3481},"rootScope",{"type":44,"value":3483}," object is referenced throughout the dispatcher classes, and acts as a wrapper around the ",{"type":29,"tag":59,"props":3485,"children":3487},{"className":3486},[],[3488],{"type":44,"value":2605},{"type":44,"value":3490}," object instantiated above, so that each of the child ",{"type":29,"tag":59,"props":3492,"children":3494},{"className":3493},[],[3495],{"type":44,"value":619},{"type":44,"value":3497}," classes will have access to the ",{"type":29,"tag":59,"props":3499,"children":3501},{"className":3500},[],[3502],{"type":44,"value":2605},{"type":44,"value":3504}," through the ",{"type":29,"tag":59,"props":3506,"children":3508},{"className":3507},[],[3509],{"type":44,"value":3481},{"type":44,"value":3511}," object. This wrapping functionality will become clearer when we dive into ",{"type":29,"tag":59,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":44,"value":3403},{"type":44,"value":3518},"'s constructor, where it passes the ",{"type":29,"tag":59,"props":3520,"children":3522},{"className":3521},[],[3523],{"type":44,"value":3481},{"type":44,"value":3525}," to all of the child ",{"type":29,"tag":59,"props":3527,"children":3529},{"className":3528},[],[3530],{"type":44,"value":619},{"type":44,"value":3532}," classes.",{"type":29,"tag":30,"props":3534,"children":3535},{},[3536,3538,3544],{"type":44,"value":3537},"Here's a simplified version of what's happening in the constructor for ",{"type":29,"tag":59,"props":3539,"children":3541},{"className":3540},[],[3542],{"type":44,"value":3543},"Rootscope",{"type":44,"value":761},{"type":29,"tag":52,"props":3546,"children":3549},{"className":54,"code":3547,"filename":3548,"language":56,"meta":7,"style":7},"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\u003CType>\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","playwright-core/src/server/dispatchers/dispatcher.ts",[3550],{"type":29,"tag":59,"props":3551,"children":3552},{"__ignoreMap":7},[3553,3578,3606,3637,3644,3651,3658,3681,3701,3729,3736,3747,3776,3797,3817,3857,3865,3876,3883,3900,3936,3982,3989,4010,4031,4052,4059,4088,4095,4116,4137,4150,4158,4166,4174,4186,4194,4201],{"type":29,"tag":63,"props":3554,"children":3555},{"class":65,"line":66},[3556,3561,3565,3569,3574],{"type":29,"tag":63,"props":3557,"children":3558},{"style":70},[3559],{"type":44,"value":3560},"class",{"type":29,"tag":63,"props":3562,"children":3563},{"style":117},[3564],{"type":44,"value":1139},{"type":29,"tag":63,"props":3566,"children":3567},{"style":70},[3568],{"type":44,"value":1971},{"type":29,"tag":63,"props":3570,"children":3571},{"style":117},[3572],{"type":44,"value":3573}," Dispatcher",{"type":29,"tag":63,"props":3575,"children":3576},{"style":76},[3577],{"type":44,"value":135},{"type":29,"tag":63,"props":3579,"children":3580},{"class":65,"line":93},[3581,3585,3589,3594,3598,3602],{"type":29,"tag":63,"props":3582,"children":3583},{"style":70},[3584],{"type":44,"value":3051},{"type":29,"tag":63,"props":3586,"children":3587},{"style":76},[3588],{"type":44,"value":238},{"type":29,"tag":63,"props":3590,"children":3591},{"style":147},[3592],{"type":44,"value":3593},"connection",{"type":29,"tag":63,"props":3595,"children":3596},{"style":70},[3597],{"type":44,"value":761},{"type":29,"tag":63,"props":3599,"children":3600},{"style":117},[3601],{"type":44,"value":965},{"type":29,"tag":63,"props":3603,"children":3604},{"style":76},[3605],{"type":44,"value":3073},{"type":29,"tag":63,"props":3607,"children":3608},{"class":65,"line":103},[3609,3613,3618,3622,3627,3632],{"type":29,"tag":63,"props":3610,"children":3611},{"style":394},[3612],{"type":44,"value":3081},{"type":29,"tag":63,"props":3614,"children":3615},{"style":76},[3616],{"type":44,"value":3617},"(connection, { guid: ",{"type":29,"tag":63,"props":3619,"children":3620},{"style":87},[3621],{"type":44,"value":1660},{"type":29,"tag":63,"props":3623,"children":3624},{"style":76},[3625],{"type":44,"value":3626}," }, ",{"type":29,"tag":63,"props":3628,"children":3629},{"style":87},[3630],{"type":44,"value":3631},"\"Root\"",{"type":29,"tag":63,"props":3633,"children":3634},{"style":76},[3635],{"type":44,"value":3636},", {});\n",{"type":29,"tag":63,"props":3638,"children":3639},{"class":65,"line":138},[3640],{"type":29,"tag":63,"props":3641,"children":3642},{"style":76},[3643],{"type":44,"value":2123},{"type":29,"tag":63,"props":3645,"children":3646},{"class":65,"line":178},[3647],{"type":29,"tag":63,"props":3648,"children":3649},{"style":76},[3650],{"type":44,"value":257},{"type":29,"tag":63,"props":3652,"children":3653},{"class":65,"line":213},[3654],{"type":29,"tag":63,"props":3655,"children":3656},{"emptyLinePlaceholder":97},[3657],{"type":44,"value":100},{"type":29,"tag":63,"props":3659,"children":3660},{"class":65,"line":251},[3661,3665,3669,3673,3677],{"type":29,"tag":63,"props":3662,"children":3663},{"style":70},[3664],{"type":44,"value":3560},{"type":29,"tag":63,"props":3666,"children":3667},{"style":117},[3668],{"type":44,"value":3573},{"type":29,"tag":63,"props":3670,"children":3671},{"style":70},[3672],{"type":44,"value":1971},{"type":29,"tag":63,"props":3674,"children":3675},{"style":117},[3676],{"type":44,"value":1976},{"type":29,"tag":63,"props":3678,"children":3679},{"style":76},[3680],{"type":44,"value":135},{"type":29,"tag":63,"props":3682,"children":3683},{"class":65,"line":923},[3684,3689,3693,3697],{"type":29,"tag":63,"props":3685,"children":3686},{"style":147},[3687],{"type":44,"value":3688}," _connection",{"type":29,"tag":63,"props":3690,"children":3691},{"style":70},[3692],{"type":44,"value":761},{"type":29,"tag":63,"props":3694,"children":3695},{"style":117},[3696],{"type":44,"value":965},{"type":29,"tag":63,"props":3698,"children":3699},{"style":76},[3700],{"type":44,"value":1244},{"type":29,"tag":63,"props":3702,"children":3703},{"class":65,"line":942},[3704,3709,3713,3717,3721,3725],{"type":29,"tag":63,"props":3705,"children":3706},{"style":147},[3707],{"type":44,"value":3708}," _parent",{"type":29,"tag":63,"props":3710,"children":3711},{"style":70},[3712],{"type":44,"value":761},{"type":29,"tag":63,"props":3714,"children":3715},{"style":117},[3716],{"type":44,"value":965},{"type":29,"tag":63,"props":3718,"children":3719},{"style":70},[3720],{"type":44,"value":832},{"type":29,"tag":63,"props":3722,"children":3723},{"style":394},[3724],{"type":44,"value":837},{"type":29,"tag":63,"props":3726,"children":3727},{"style":76},[3728],{"type":44,"value":1244},{"type":29,"tag":63,"props":3730,"children":3731},{"class":65,"line":987},[3732],{"type":29,"tag":63,"props":3733,"children":3734},{"emptyLinePlaceholder":97},[3735],{"type":44,"value":100},{"type":29,"tag":63,"props":3737,"children":3738},{"class":65,"line":995},[3739,3743],{"type":29,"tag":63,"props":3740,"children":3741},{"style":70},[3742],{"type":44,"value":3051},{"type":29,"tag":63,"props":3744,"children":3745},{"style":76},[3746],{"type":44,"value":1212},{"type":29,"tag":63,"props":3748,"children":3749},{"class":65,"line":1004},[3750,3755,3759,3764,3768,3772],{"type":29,"tag":63,"props":3751,"children":3752},{"style":147},[3753],{"type":44,"value":3754}," parent",{"type":29,"tag":63,"props":3756,"children":3757},{"style":70},[3758],{"type":44,"value":761},{"type":29,"tag":63,"props":3760,"children":3761},{"style":117},[3762],{"type":44,"value":3763}," ParentScopeType",{"type":29,"tag":63,"props":3765,"children":3766},{"style":70},[3767],{"type":44,"value":832},{"type":29,"tag":63,"props":3769,"children":3770},{"style":117},[3771],{"type":44,"value":965},{"type":29,"tag":63,"props":3773,"children":3774},{"style":76},[3775],{"type":44,"value":857},{"type":29,"tag":63,"props":3777,"children":3778},{"class":65,"line":23},[3779,3784,3788,3793],{"type":29,"tag":63,"props":3780,"children":3781},{"style":147},[3782],{"type":44,"value":3783}," object",{"type":29,"tag":63,"props":3785,"children":3786},{"style":70},[3787],{"type":44,"value":761},{"type":29,"tag":63,"props":3789,"children":3790},{"style":117},[3791],{"type":44,"value":3792}," Type",{"type":29,"tag":63,"props":3794,"children":3795},{"style":76},[3796],{"type":44,"value":857},{"type":29,"tag":63,"props":3798,"children":3799},{"class":65,"line":1059},[3800,3805,3809,3813],{"type":29,"tag":63,"props":3801,"children":3802},{"style":147},[3803],{"type":44,"value":3804}," type",{"type":29,"tag":63,"props":3806,"children":3807},{"style":70},[3808],{"type":44,"value":761},{"type":29,"tag":63,"props":3810,"children":3811},{"style":394},[3812],{"type":44,"value":2063},{"type":29,"tag":63,"props":3814,"children":3815},{"style":76},[3816],{"type":44,"value":857},{"type":29,"tag":63,"props":3818,"children":3819},{"class":65,"line":1091},[3820,3825,3829,3834,3838,3843,3847,3852],{"type":29,"tag":63,"props":3821,"children":3822},{"style":147},[3823],{"type":44,"value":3824}," initializer",{"type":29,"tag":63,"props":3826,"children":3827},{"style":70},[3828],{"type":44,"value":761},{"type":29,"tag":63,"props":3830,"children":3831},{"style":117},[3832],{"type":44,"value":3833}," channels",{"type":29,"tag":63,"props":3835,"children":3836},{"style":76},[3837],{"type":44,"value":228},{"type":29,"tag":63,"props":3839,"children":3840},{"style":117},[3841],{"type":44,"value":3842},"InitializerTraits",{"type":29,"tag":63,"props":3844,"children":3845},{"style":76},[3846],{"type":44,"value":2011},{"type":29,"tag":63,"props":3848,"children":3849},{"style":117},[3850],{"type":44,"value":3851},"Type",{"type":29,"tag":63,"props":3853,"children":3854},{"style":76},[3855],{"type":44,"value":3856},">\n",{"type":29,"tag":63,"props":3858,"children":3859},{"class":65,"line":1108},[3860],{"type":29,"tag":63,"props":3861,"children":3862},{"style":76},[3863],{"type":44,"value":3864}," ) {\n",{"type":29,"tag":63,"props":3866,"children":3867},{"class":65,"line":1116},[3868,3872],{"type":29,"tag":63,"props":3869,"children":3870},{"style":394},[3871],{"type":44,"value":3081},{"type":29,"tag":63,"props":3873,"children":3874},{"style":76},[3875],{"type":44,"value":939},{"type":29,"tag":63,"props":3877,"children":3878},{"class":65,"line":1147},[3879],{"type":29,"tag":63,"props":3880,"children":3881},{"emptyLinePlaceholder":97},[3882],{"type":44,"value":100},{"type":29,"tag":63,"props":3884,"children":3885},{"class":65,"line":1155},[3886,3890,3895],{"type":29,"tag":63,"props":3887,"children":3888},{"style":394},[3889],{"type":44,"value":3151},{"type":29,"tag":63,"props":3891,"children":3892},{"style":76},[3893],{"type":44,"value":3894},"._connection ",{"type":29,"tag":63,"props":3896,"children":3897},{"style":70},[3898],{"type":44,"value":3899},"=\n",{"type":29,"tag":63,"props":3901,"children":3902},{"class":65,"line":1164},[3903,3908,3913,3917,3922,3927,3931],{"type":29,"tag":63,"props":3904,"children":3905},{"style":76},[3906],{"type":44,"value":3907}," parent ",{"type":29,"tag":63,"props":3909,"children":3910},{"style":70},[3911],{"type":44,"value":3912},"instanceof",{"type":29,"tag":63,"props":3914,"children":3915},{"style":117},[3916],{"type":44,"value":965},{"type":29,"tag":63,"props":3918,"children":3919},{"style":70},[3920],{"type":44,"value":3921}," ?",{"type":29,"tag":63,"props":3923,"children":3924},{"style":76},[3925],{"type":44,"value":3926}," parent ",{"type":29,"tag":63,"props":3928,"children":3929},{"style":70},[3930],{"type":44,"value":761},{"type":29,"tag":63,"props":3932,"children":3933},{"style":76},[3934],{"type":44,"value":3935}," parent._connection;\n",{"type":29,"tag":63,"props":3937,"children":3938},{"class":65,"line":1183},[3939,3943,3948,3952,3956,3960,3964,3968,3972,3977],{"type":29,"tag":63,"props":3940,"children":3941},{"style":394},[3942],{"type":44,"value":3151},{"type":29,"tag":63,"props":3944,"children":3945},{"style":76},[3946],{"type":44,"value":3947},"._parent ",{"type":29,"tag":63,"props":3949,"children":3950},{"style":70},[3951],{"type":44,"value":1258},{"type":29,"tag":63,"props":3953,"children":3954},{"style":76},[3955],{"type":44,"value":3926},{"type":29,"tag":63,"props":3957,"children":3958},{"style":70},[3959],{"type":44,"value":3912},{"type":29,"tag":63,"props":3961,"children":3962},{"style":117},[3963],{"type":44,"value":965},{"type":29,"tag":63,"props":3965,"children":3966},{"style":70},[3967],{"type":44,"value":3921},{"type":29,"tag":63,"props":3969,"children":3970},{"style":394},[3971],{"type":44,"value":837},{"type":29,"tag":63,"props":3973,"children":3974},{"style":70},[3975],{"type":44,"value":3976}," :",{"type":29,"tag":63,"props":3978,"children":3979},{"style":76},[3980],{"type":44,"value":3981}," parent;\n",{"type":29,"tag":63,"props":3983,"children":3984},{"class":65,"line":1215},[3985],{"type":29,"tag":63,"props":3986,"children":3987},{"emptyLinePlaceholder":97},[3988],{"type":44,"value":100},{"type":29,"tag":63,"props":3990,"children":3991},{"class":65,"line":1224},[3992,3996,4001,4005],{"type":29,"tag":63,"props":3993,"children":3994},{"style":394},[3995],{"type":44,"value":3151},{"type":29,"tag":63,"props":3997,"children":3998},{"style":76},[3999],{"type":44,"value":4000},"._guid ",{"type":29,"tag":63,"props":4002,"children":4003},{"style":70},[4004],{"type":44,"value":1258},{"type":29,"tag":63,"props":4006,"children":4007},{"style":76},[4008],{"type":44,"value":4009}," object.guid;\n",{"type":29,"tag":63,"props":4011,"children":4012},{"class":65,"line":1247},[4013,4017,4022,4026],{"type":29,"tag":63,"props":4014,"children":4015},{"style":394},[4016],{"type":44,"value":3151},{"type":29,"tag":63,"props":4018,"children":4019},{"style":76},[4020],{"type":44,"value":4021},"._type ",{"type":29,"tag":63,"props":4023,"children":4024},{"style":70},[4025],{"type":44,"value":1258},{"type":29,"tag":63,"props":4027,"children":4028},{"style":76},[4029],{"type":44,"value":4030}," type;\n",{"type":29,"tag":63,"props":4032,"children":4033},{"class":65,"line":1274},[4034,4038,4043,4047],{"type":29,"tag":63,"props":4035,"children":4036},{"style":394},[4037],{"type":44,"value":3151},{"type":29,"tag":63,"props":4039,"children":4040},{"style":76},[4041],{"type":44,"value":4042},"._object ",{"type":29,"tag":63,"props":4044,"children":4045},{"style":70},[4046],{"type":44,"value":1258},{"type":29,"tag":63,"props":4048,"children":4049},{"style":76},[4050],{"type":44,"value":4051}," object;\n",{"type":29,"tag":63,"props":4053,"children":4054},{"class":65,"line":1283},[4055],{"type":29,"tag":63,"props":4056,"children":4057},{"emptyLinePlaceholder":97},[4058],{"type":44,"value":100},{"type":29,"tag":63,"props":4060,"children":4061},{"class":65,"line":1292},[4062,4066,4071,4076,4080,4084],{"type":29,"tag":63,"props":4063,"children":4064},{"style":394},[4065],{"type":44,"value":3151},{"type":29,"tag":63,"props":4067,"children":4068},{"style":76},[4069],{"type":44,"value":4070},"._connection.",{"type":29,"tag":63,"props":4072,"children":4073},{"style":117},[4074],{"type":44,"value":4075},"registerDispatcher",{"type":29,"tag":63,"props":4077,"children":4078},{"style":76},[4079],{"type":44,"value":238},{"type":29,"tag":63,"props":4081,"children":4082},{"style":394},[4083],{"type":44,"value":3198},{"type":29,"tag":63,"props":4085,"children":4086},{"style":76},[4087],{"type":44,"value":429},{"type":29,"tag":63,"props":4089,"children":4090},{"class":65,"line":1317},[4091],{"type":29,"tag":63,"props":4092,"children":4093},{"emptyLinePlaceholder":97},[4094],{"type":44,"value":100},{"type":29,"tag":63,"props":4096,"children":4097},{"class":65,"line":1326},[4098,4103,4107,4111],{"type":29,"tag":63,"props":4099,"children":4100},{"style":70},[4101],{"type":44,"value":4102}," if",{"type":29,"tag":63,"props":4104,"children":4105},{"style":76},[4106],{"type":44,"value":1024},{"type":29,"tag":63,"props":4108,"children":4109},{"style":394},[4110],{"type":44,"value":3198},{"type":29,"tag":63,"props":4112,"children":4113},{"style":76},[4114],{"type":44,"value":4115},"._parent)\n",{"type":29,"tag":63,"props":4117,"children":4118},{"class":65,"line":1334},[4119,4124,4128,4133],{"type":29,"tag":63,"props":4120,"children":4121},{"style":394},[4122],{"type":44,"value":4123}," this",{"type":29,"tag":63,"props":4125,"children":4126},{"style":76},[4127],{"type":44,"value":4070},{"type":29,"tag":63,"props":4129,"children":4130},{"style":117},[4131],{"type":44,"value":4132},"sendCreate",{"type":29,"tag":63,"props":4134,"children":4135},{"style":76},[4136],{"type":44,"value":1212},{"type":29,"tag":63,"props":4138,"children":4139},{"class":65,"line":1359},[4140,4145],{"type":29,"tag":63,"props":4141,"children":4142},{"style":394},[4143],{"type":44,"value":4144}," this",{"type":29,"tag":63,"props":4146,"children":4147},{"style":76},[4148],{"type":44,"value":4149},"._parent,\n",{"type":29,"tag":63,"props":4151,"children":4152},{"class":65,"line":1368},[4153],{"type":29,"tag":63,"props":4154,"children":4155},{"style":76},[4156],{"type":44,"value":4157}," type,\n",{"type":29,"tag":63,"props":4159,"children":4160},{"class":65,"line":1376},[4161],{"type":29,"tag":63,"props":4162,"children":4163},{"style":76},[4164],{"type":44,"value":4165}," guid,\n",{"type":29,"tag":63,"props":4167,"children":4168},{"class":65,"line":1402},[4169],{"type":29,"tag":63,"props":4170,"children":4171},{"style":76},[4172],{"type":44,"value":4173}," initializer,\n",{"type":29,"tag":63,"props":4175,"children":4176},{"class":65,"line":1410},[4177,4181],{"type":29,"tag":63,"props":4178,"children":4179},{"style":394},[4180],{"type":44,"value":4144},{"type":29,"tag":63,"props":4182,"children":4183},{"style":76},[4184],{"type":44,"value":4185},"._parent._object\n",{"type":29,"tag":63,"props":4187,"children":4188},{"class":65,"line":1419},[4189],{"type":29,"tag":63,"props":4190,"children":4191},{"style":76},[4192],{"type":44,"value":4193}," );\n",{"type":29,"tag":63,"props":4195,"children":4196},{"class":65,"line":1451},[4197],{"type":29,"tag":63,"props":4198,"children":4199},{"style":76},[4200],{"type":44,"value":2123},{"type":29,"tag":63,"props":4202,"children":4203},{"class":65,"line":1482},[4204],{"type":29,"tag":63,"props":4205,"children":4206},{"style":76},[4207],{"type":44,"value":257},{"type":29,"tag":30,"props":4209,"children":4210},{},[4211,4213,4218,4220,4225,4227,4232,4234,4240,4242,4247,4249,4254,4256,4261,4263,4268,4270,4275,4277,4282,4284,4289,4291,4296],{"type":44,"value":4212},"In the ",{"type":29,"tag":59,"props":4214,"children":4216},{"className":4215},[],[4217],{"type":44,"value":619},{"type":44,"value":4219}," constructor we see the connection always comes from either the inherited parent ",{"type":29,"tag":59,"props":4221,"children":4223},{"className":4222},[],[4224],{"type":44,"value":619},{"type":44,"value":4226},", or from the ",{"type":29,"tag":59,"props":4228,"children":4230},{"className":4229},[],[4231],{"type":44,"value":687},{"type":44,"value":4233}," passed into the ",{"type":29,"tag":59,"props":4235,"children":4237},{"className":4236},[],[4238],{"type":44,"value":4239},"parent",{"type":44,"value":4241}," parameter. This, coupled with ",{"type":29,"tag":59,"props":4243,"children":4245},{"className":4244},[],[4246],{"type":44,"value":3481},{"type":44,"value":4248}," having the name ",{"type":29,"tag":59,"props":4250,"children":4252},{"className":4251},[],[4253],{"type":44,"value":26},{"type":44,"value":4255},", gives us the hint that every dispatcher in the server library will have access to the ",{"type":29,"tag":59,"props":4257,"children":4259},{"className":4258},[],[4260],{"type":44,"value":2605},{"type":44,"value":4262}," instance (from ",{"type":29,"tag":59,"props":4264,"children":4266},{"className":4265},[],[4267],{"type":44,"value":504},{"type":44,"value":4269},"). Furthermore, the ",{"type":29,"tag":59,"props":4271,"children":4273},{"className":4272},[],[4274],{"type":44,"value":2605},{"type":44,"value":4276}," will register every instance of a subclass of ",{"type":29,"tag":59,"props":4278,"children":4280},{"className":4279},[],[4281],{"type":44,"value":619},{"type":44,"value":4283},", hinting that it will communicate with each of the ",{"type":29,"tag":59,"props":4285,"children":4287},{"className":4286},[],[4288],{"type":44,"value":619},{"type":44,"value":4290}," objects. These points will become more clear after looking at the ",{"type":29,"tag":59,"props":4292,"children":4294},{"className":4293},[],[4295],{"type":44,"value":3403},{"type":44,"value":4297},"'s constructor.",{"type":29,"tag":4299,"props":4300,"children":4302},"h4",{"id":4301},"playwrightdispatcher-and-its-constructor",[4303],{"type":44,"value":4304},"PlaywrightDispatcher and its constructor",{"type":29,"tag":30,"props":4306,"children":4307},{},[4308,4310,4315],{"type":44,"value":4309},"Let's look closer at a slightly simplified version of ",{"type":29,"tag":59,"props":4311,"children":4313},{"className":4312},[],[4314],{"type":44,"value":3403},{"type":44,"value":4316},"'s constructor",{"type":29,"tag":52,"props":4318,"children":4321},{"className":54,"code":4319,"filename":4320,"language":56,"meta":7,"style":7},"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts",[4322],{"type":29,"tag":59,"props":4323,"children":4324},{"__ignoreMap":7},[4325,4355,4362,4385,4429,4451,4473,4494,4515,4523,4531,4538],{"type":29,"tag":63,"props":4326,"children":4327},{"class":65,"line":66},[4328,4332,4337,4342,4346,4351],{"type":29,"tag":63,"props":4329,"children":4330},{"style":70},[4331],{"type":44,"value":73},{"type":29,"tag":63,"props":4333,"children":4334},{"style":70},[4335],{"type":44,"value":4336}," type",{"type":29,"tag":63,"props":4338,"children":4339},{"style":76},[4340],{"type":44,"value":4341}," { Playwright } ",{"type":29,"tag":63,"props":4343,"children":4344},{"style":70},[4345],{"type":44,"value":84},{"type":29,"tag":63,"props":4347,"children":4348},{"style":87},[4349],{"type":44,"value":4350}," \"playwright-core/src/server/playwright\"",{"type":29,"tag":63,"props":4352,"children":4353},{"style":76},[4354],{"type":44,"value":1244},{"type":29,"tag":63,"props":4356,"children":4357},{"class":65,"line":93},[4358],{"type":29,"tag":63,"props":4359,"children":4360},{"emptyLinePlaceholder":97},[4361],{"type":44,"value":100},{"type":29,"tag":63,"props":4363,"children":4364},{"class":65,"line":103},[4365,4369,4373,4377,4381],{"type":29,"tag":63,"props":4366,"children":4367},{"style":70},[4368],{"type":44,"value":3560},{"type":29,"tag":63,"props":4370,"children":4371},{"style":117},[4372],{"type":44,"value":1175},{"type":29,"tag":63,"props":4374,"children":4375},{"style":70},[4376],{"type":44,"value":1971},{"type":29,"tag":63,"props":4378,"children":4379},{"style":117},[4380],{"type":44,"value":3573},{"type":29,"tag":63,"props":4382,"children":4383},{"style":76},[4384],{"type":44,"value":135},{"type":29,"tag":63,"props":4386,"children":4387},{"class":65,"line":138},[4388,4392,4396,4401,4405,4409,4413,4417,4421,4425],{"type":29,"tag":63,"props":4389,"children":4390},{"style":70},[4391],{"type":44,"value":3051},{"type":29,"tag":63,"props":4393,"children":4394},{"style":76},[4395],{"type":44,"value":238},{"type":29,"tag":63,"props":4397,"children":4398},{"style":147},[4399],{"type":44,"value":4400},"scope",{"type":29,"tag":63,"props":4402,"children":4403},{"style":70},[4404],{"type":44,"value":761},{"type":29,"tag":63,"props":4406,"children":4407},{"style":117},[4408],{"type":44,"value":1139},{"type":29,"tag":63,"props":4410,"children":4411},{"style":76},[4412],{"type":44,"value":912},{"type":29,"tag":63,"props":4414,"children":4415},{"style":147},[4416],{"type":44,"value":5},{"type":29,"tag":63,"props":4418,"children":4419},{"style":70},[4420],{"type":44,"value":761},{"type":29,"tag":63,"props":4422,"children":4423},{"style":117},[4424],{"type":44,"value":2823},{"type":29,"tag":63,"props":4426,"children":4427},{"style":76},[4428],{"type":44,"value":3073},{"type":29,"tag":63,"props":4430,"children":4431},{"class":65,"line":178},[4432,4436,4441,4446],{"type":29,"tag":63,"props":4433,"children":4434},{"style":394},[4435],{"type":44,"value":3081},{"type":29,"tag":63,"props":4437,"children":4438},{"style":76},[4439],{"type":44,"value":4440},"(scope, playwright, ",{"type":29,"tag":63,"props":4442,"children":4443},{"style":87},[4444],{"type":44,"value":4445},"\"Playwright\"",{"type":29,"tag":63,"props":4447,"children":4448},{"style":76},[4449],{"type":44,"value":4450},", {\n",{"type":29,"tag":63,"props":4452,"children":4453},{"class":65,"line":213},[4454,4459,4463,4468],{"type":29,"tag":63,"props":4455,"children":4456},{"style":76},[4457],{"type":44,"value":4458}," chromium: ",{"type":29,"tag":63,"props":4460,"children":4461},{"style":70},[4462],{"type":44,"value":3462},{"type":29,"tag":63,"props":4464,"children":4465},{"style":117},[4466],{"type":44,"value":4467}," BrowserTypeDispatcher",{"type":29,"tag":63,"props":4469,"children":4470},{"style":76},[4471],{"type":44,"value":4472},"(scope, playwright.chromium),\n",{"type":29,"tag":63,"props":4474,"children":4475},{"class":65,"line":251},[4476,4481,4485,4489],{"type":29,"tag":63,"props":4477,"children":4478},{"style":76},[4479],{"type":44,"value":4480}," firefox: ",{"type":29,"tag":63,"props":4482,"children":4483},{"style":70},[4484],{"type":44,"value":3462},{"type":29,"tag":63,"props":4486,"children":4487},{"style":117},[4488],{"type":44,"value":4467},{"type":29,"tag":63,"props":4490,"children":4491},{"style":76},[4492],{"type":44,"value":4493},"(scope, playwright.firefox),\n",{"type":29,"tag":63,"props":4495,"children":4496},{"class":65,"line":923},[4497,4502,4506,4510],{"type":29,"tag":63,"props":4498,"children":4499},{"style":76},[4500],{"type":44,"value":4501}," webkit: ",{"type":29,"tag":63,"props":4503,"children":4504},{"style":70},[4505],{"type":44,"value":3462},{"type":29,"tag":63,"props":4507,"children":4508},{"style":117},[4509],{"type":44,"value":4467},{"type":29,"tag":63,"props":4511,"children":4512},{"style":76},[4513],{"type":44,"value":4514},"(scope, playwright.webkit),\n",{"type":29,"tag":63,"props":4516,"children":4517},{"class":65,"line":942},[4518],{"type":29,"tag":63,"props":4519,"children":4520},{"style":977},[4521],{"type":44,"value":4522}," // ...\n",{"type":29,"tag":63,"props":4524,"children":4525},{"class":65,"line":987},[4526],{"type":29,"tag":63,"props":4527,"children":4528},{"style":76},[4529],{"type":44,"value":4530}," });\n",{"type":29,"tag":63,"props":4532,"children":4533},{"class":65,"line":995},[4534],{"type":29,"tag":63,"props":4535,"children":4536},{"style":76},[4537],{"type":44,"value":2123},{"type":29,"tag":63,"props":4539,"children":4540},{"class":65,"line":1004},[4541],{"type":29,"tag":63,"props":4542,"children":4543},{"style":76},[4544],{"type":44,"value":257},{"type":29,"tag":30,"props":4546,"children":4547},{},[4548,4550,4556,4558,4563,4565,4570,4572,4577,4579,4584,4586,4592,4594,4600,4602,4608,4610,4615,4617,4622],{"type":44,"value":4549},"Notice the ",{"type":29,"tag":59,"props":4551,"children":4553},{"className":4552},[],[4554],{"type":44,"value":4555},"super",{"type":44,"value":4557}," call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the ",{"type":29,"tag":59,"props":4559,"children":4561},{"className":4560},[],[4562],{"type":44,"value":3481},{"type":44,"value":4564}," from ",{"type":29,"tag":59,"props":4566,"children":4568},{"className":4567},[],[4569],{"type":44,"value":504},{"type":44,"value":4571}," passed into it as the first parameter. Every call to the server will run through the ",{"type":29,"tag":59,"props":4573,"children":4575},{"className":4574},[],[4576],{"type":44,"value":2605},{"type":44,"value":4578}," in the ",{"type":29,"tag":59,"props":4580,"children":4582},{"className":4581},[],[4583],{"type":44,"value":3481},{"type":44,"value":4585},", which then can be traced through calls in each of the dispatcher classes. ",{"type":29,"tag":59,"props":4587,"children":4589},{"className":4588},[],[4590],{"type":44,"value":4591},"BrowserTypeDispatcher",{"type":44,"value":4593}," will launch a ",{"type":29,"tag":59,"props":4595,"children":4597},{"className":4596},[],[4598],{"type":44,"value":4599},"BrowserDispatcher",{"type":44,"value":4601},", which is responsible for creating a ",{"type":29,"tag":59,"props":4603,"children":4605},{"className":4604},[],[4606],{"type":44,"value":4607},"BrowserContextDispatcher",{"type":44,"value":4609},", which can create a ",{"type":29,"tag":59,"props":4611,"children":4613},{"className":4612},[],[4614],{"type":44,"value":664},{"type":44,"value":4616},", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original ",{"type":29,"tag":59,"props":4618,"children":4620},{"className":4619},[],[4621],{"type":44,"value":2605},{"type":44,"value":4623}," defined in the factory method with confidence!",{"type":29,"tag":269,"props":4625,"children":4627},{"id":4626},"tying-back-to-the-onmessage-communication",[4628],{"type":44,"value":4629},"Tying back to the onmessage communication",{"type":29,"tag":30,"props":4631,"children":4632},{},[4633,4635,4640,4641,4647],{"type":44,"value":4634},"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the ",{"type":29,"tag":59,"props":4636,"children":4638},{"className":4637},[],[4639],{"type":44,"value":2628},{"type":44,"value":281},{"type":29,"tag":59,"props":4642,"children":4644},{"className":4643},[],[4645],{"type":44,"value":4646},"clientConnect.onmessage",{"type":44,"value":4648}," functions.",{"type":29,"tag":30,"props":4650,"children":4651},{},[4652,4654,4659,4661,4666,4668,4673,4674,4680,4682,4687,4689,4695,4697,4703,4705,4710,4712,4718,4719,4724,4725,4731,4733,4739,4741,4746,4748,4754,4756,4761],{"type":44,"value":4653},"From within ",{"type":29,"tag":59,"props":4655,"children":4657},{"className":4656},[],[4658],{"type":44,"value":2605},{"type":44,"value":4660}," its ",{"type":29,"tag":59,"props":4662,"children":4664},{"className":4663},[],[4665],{"type":44,"value":2628},{"type":44,"value":4667}," function is called from two main methods. These are ",{"type":29,"tag":59,"props":4669,"children":4671},{"className":4670},[],[4672],{"type":44,"value":1051},{"type":44,"value":281},{"type":29,"tag":59,"props":4675,"children":4677},{"className":4676},[],[4678],{"type":44,"value":4679},"_sendMessageToClient",{"type":44,"value":4681},". The first, ",{"type":29,"tag":59,"props":4683,"children":4685},{"className":4684},[],[4686],{"type":44,"value":1051},{"type":44,"value":4688},", is called from within the ",{"type":29,"tag":59,"props":4690,"children":4692},{"className":4691},[],[4693],{"type":44,"value":4694},"clientConnection.onmessage",{"type":44,"value":4696},", so the ",{"type":29,"tag":59,"props":4698,"children":4700},{"className":4699},[],[4701],{"type":44,"value":4702},"dispatcher.onmessage",{"type":44,"value":4704}," call in that case acts as a response callback. The second, ",{"type":29,"tag":59,"props":4706,"children":4708},{"className":4707},[],[4709],{"type":44,"value":4679},{"type":44,"value":4711},", is called from the ",{"type":29,"tag":59,"props":4713,"children":4715},{"className":4714},[],[4716],{"type":44,"value":4717},"sendEvent",{"type":44,"value":912},{"type":29,"tag":59,"props":4720,"children":4722},{"className":4721},[],[4723],{"type":44,"value":4132},{"type":44,"value":912},{"type":29,"tag":59,"props":4726,"children":4728},{"className":4727},[],[4729],{"type":44,"value":4730},"sendAdopt",{"type":44,"value":4732},", and ",{"type":29,"tag":59,"props":4734,"children":4736},{"className":4735},[],[4737],{"type":44,"value":4738},"sendDestroy",{"type":44,"value":4740}," methods defined within the dispatcher. Calls to these functions are spread throughout the ",{"type":29,"tag":59,"props":4742,"children":4744},{"className":4743},[],[4745],{"type":44,"value":619},{"type":44,"value":4747}," subclasses which call these functions from their internal ",{"type":29,"tag":59,"props":4749,"children":4751},{"className":4750},[],[4752],{"type":44,"value":4753},"_connection",{"type":44,"value":4755}," variable. These will tell the client to construct, update, and destroy, their corresponding client side ",{"type":29,"tag":59,"props":4757,"children":4759},{"className":4758},[],[4760],{"type":44,"value":604},{"type":44,"value":4762}," objects.",{"type":29,"tag":30,"props":4764,"children":4765},{},[4766,4768,4773,4775,4781,4783,4788,4790,4795,4797,4802],{"type":44,"value":4767},"Separately on the client-side, ",{"type":29,"tag":59,"props":4769,"children":4771},{"className":4770},[],[4772],{"type":44,"value":4694},{"type":44,"value":4774}," is called from ",{"type":29,"tag":59,"props":4776,"children":4778},{"className":4777},[],[4779],{"type":44,"value":4780},"sendMessageToServer",{"type":44,"value":4782}," whenever you use a client-side API. This sends a message over to the ",{"type":29,"tag":59,"props":4784,"children":4786},{"className":4785},[],[4787],{"type":44,"value":2605},{"type":44,"value":4789},", which finds the corresponding ",{"type":29,"tag":59,"props":4791,"children":4793},{"className":4792},[],[4794],{"type":44,"value":619},{"type":44,"value":4796}," subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via ",{"type":29,"tag":59,"props":4798,"children":4800},{"className":4799},[],[4801],{"type":44,"value":4679},{"type":44,"value":4803},", as mentioned before.",{"type":29,"tag":269,"props":4805,"children":4807},{"id":4806},"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners",[4808],{"type":44,"value":4809},"Synchronizing objects between the Dispatchers and client-side ChannelOwners",{"type":29,"tag":30,"props":4811,"children":4812},{},[4813,4815,4820,4822,4827,4829,4834,4836,4841,4843,4849],{"type":44,"value":4814},"The ",{"type":29,"tag":59,"props":4816,"children":4818},{"className":4817},[],[4819],{"type":44,"value":4132},{"type":44,"value":4821}," function is special because it is only called from within the ",{"type":29,"tag":59,"props":4823,"children":4825},{"className":4824},[],[4826],{"type":44,"value":619},{"type":44,"value":4828}," constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the ",{"type":29,"tag":59,"props":4830,"children":4832},{"className":4831},[],[4833],{"type":44,"value":4132},{"type":44,"value":4835}," implementation, internally it calls ",{"type":29,"tag":59,"props":4837,"children":4839},{"className":4838},[],[4840],{"type":44,"value":4679},{"type":44,"value":4842}," with the ",{"type":29,"tag":59,"props":4844,"children":4846},{"className":4845},[],[4847],{"type":44,"value":4848},"__create__",{"type":44,"value":4850}," parameter:",{"type":29,"tag":52,"props":4852,"children":4855},{"className":54,"code":4853,"filename":4854,"language":56,"meta":7,"style":7},"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","packages/playwright-core/src/server/dispatchers/dispatcher.ts",[4856],{"type":29,"tag":59,"props":4857,"children":4858},{"__ignoreMap":7},[4859,4881,4925,5015,5046],{"type":29,"tag":63,"props":4860,"children":4861},{"class":65,"line":66},[4862,4866,4871,4876],{"type":29,"tag":63,"props":4863,"children":4864},{"style":117},[4865],{"type":44,"value":4132},{"type":29,"tag":63,"props":4867,"children":4868},{"style":76},[4869],{"type":44,"value":4870},"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject",{"type":29,"tag":63,"props":4872,"children":4873},{"style":70},[4874],{"type":44,"value":4875},"?:",{"type":29,"tag":63,"props":4877,"children":4878},{"style":76},[4879],{"type":44,"value":4880}," SdkObject) {\n",{"type":29,"tag":63,"props":4882,"children":4883},{"class":65,"line":93},[4884,4888,4893,4897,4902,4907,4912,4916,4921],{"type":29,"tag":63,"props":4885,"children":4886},{"style":70},[4887],{"type":44,"value":144},{"type":29,"tag":63,"props":4889,"children":4890},{"style":394},[4891],{"type":44,"value":4892}," validator",{"type":29,"tag":63,"props":4894,"children":4895},{"style":70},[4896],{"type":44,"value":155},{"type":29,"tag":63,"props":4898,"children":4899},{"style":117},[4900],{"type":44,"value":4901}," findValidator",{"type":29,"tag":63,"props":4903,"children":4904},{"style":76},[4905],{"type":44,"value":4906},"(type, ",{"type":29,"tag":63,"props":4908,"children":4909},{"style":87},[4910],{"type":44,"value":4911},"''",{"type":29,"tag":63,"props":4913,"children":4914},{"style":76},[4915],{"type":44,"value":912},{"type":29,"tag":63,"props":4917,"children":4918},{"style":87},[4919],{"type":44,"value":4920},"'Initializer'",{"type":29,"tag":63,"props":4922,"children":4923},{"style":76},[4924],{"type":44,"value":429},{"type":29,"tag":63,"props":4926,"children":4927},{"class":65,"line":103},[4928,4933,4937,4941,4946,4950,4955,4959,4964,4969,4973,4977,4982,4986,4991,4996,5001,5005,5010],{"type":29,"tag":63,"props":4929,"children":4930},{"style":76},[4931],{"type":44,"value":4932}," initializer ",{"type":29,"tag":63,"props":4934,"children":4935},{"style":70},[4936],{"type":44,"value":1258},{"type":29,"tag":63,"props":4938,"children":4939},{"style":117},[4940],{"type":44,"value":4892},{"type":29,"tag":63,"props":4942,"children":4943},{"style":76},[4944],{"type":44,"value":4945},"(initializer, ",{"type":29,"tag":63,"props":4947,"children":4948},{"style":87},[4949],{"type":44,"value":4911},{"type":29,"tag":63,"props":4951,"children":4952},{"style":76},[4953],{"type":44,"value":4954},", { tChannelImpl: ",{"type":29,"tag":63,"props":4956,"children":4957},{"style":394},[4958],{"type":44,"value":3198},{"type":29,"tag":63,"props":4960,"children":4961},{"style":76},[4962],{"type":44,"value":4963},"._tChannelImplToWire.",{"type":29,"tag":63,"props":4965,"children":4966},{"style":117},[4967],{"type":44,"value":4968},"bind",{"type":29,"tag":63,"props":4970,"children":4971},{"style":76},[4972],{"type":44,"value":238},{"type":29,"tag":63,"props":4974,"children":4975},{"style":394},[4976],{"type":44,"value":3198},{"type":29,"tag":63,"props":4978,"children":4979},{"style":76},[4980],{"type":44,"value":4981},"), binary: ",{"type":29,"tag":63,"props":4983,"children":4984},{"style":394},[4985],{"type":44,"value":3198},{"type":29,"tag":63,"props":4987,"children":4988},{"style":76},[4989],{"type":44,"value":4990},"._isLocal ",{"type":29,"tag":63,"props":4992,"children":4993},{"style":70},[4994],{"type":44,"value":4995},"?",{"type":29,"tag":63,"props":4997,"children":4998},{"style":87},[4999],{"type":44,"value":5000}," 'buffer'",{"type":29,"tag":63,"props":5002,"children":5003},{"style":70},[5004],{"type":44,"value":3976},{"type":29,"tag":63,"props":5006,"children":5007},{"style":87},[5008],{"type":44,"value":5009}," 'toBase64'",{"type":29,"tag":63,"props":5011,"children":5012},{"style":76},[5013],{"type":44,"value":5014}," });\n",{"type":29,"tag":63,"props":5016,"children":5017},{"class":65,"line":138},[5018,5023,5027,5031,5036,5041],{"type":29,"tag":63,"props":5019,"children":5020},{"style":394},[5021],{"type":44,"value":5022}," this",{"type":29,"tag":63,"props":5024,"children":5025},{"style":76},[5026],{"type":44,"value":228},{"type":29,"tag":63,"props":5028,"children":5029},{"style":117},[5030],{"type":44,"value":4679},{"type":29,"tag":63,"props":5032,"children":5033},{"style":76},[5034],{"type":44,"value":5035},"(parent._guid, type, ",{"type":29,"tag":63,"props":5037,"children":5038},{"style":87},[5039],{"type":44,"value":5040},"'__create__'",{"type":29,"tag":63,"props":5042,"children":5043},{"style":76},[5044],{"type":44,"value":5045},", { type, initializer, guid }, sdkObject);\n",{"type":29,"tag":63,"props":5047,"children":5048},{"class":65,"line":178},[5049],{"type":29,"tag":63,"props":5050,"children":5051},{"style":76},[5052],{"type":44,"value":257},{"type":29,"tag":30,"props":5054,"children":5055},{},[5056,5058,5063,5065,5070,5072,5078,5080,5085,5087,5092,5094,5099],{"type":44,"value":5057},"so if we search through the ",{"type":29,"tag":59,"props":5059,"children":5061},{"className":5060},[],[5062],{"type":44,"value":679},{"type":44,"value":5064}," class on the client side, sure enough in its ",{"type":29,"tag":59,"props":5066,"children":5068},{"className":5067},[],[5069],{"type":44,"value":1051},{"type":44,"value":5071}," function it has a call to ",{"type":29,"tag":59,"props":5073,"children":5075},{"className":5074},[],[5076],{"type":44,"value":5077},"_createRemoteObject",{"type":44,"value":5079}," for the associated method ",{"type":29,"tag":59,"props":5081,"children":5083},{"className":5082},[],[5084],{"type":44,"value":4848},{"type":44,"value":5086},". This ",{"type":29,"tag":59,"props":5088,"children":5090},{"className":5089},[],[5091],{"type":44,"value":5077},{"type":44,"value":5093}," is what initializes the client-side ",{"type":29,"tag":59,"props":5095,"children":5097},{"className":5096},[],[5098],{"type":44,"value":12},{"type":44,"value":5100}," instance, and is the reason why we call",{"type":29,"tag":52,"props":5102,"children":5104},{"className":54,"code":5103,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n",[5105],{"type":29,"tag":59,"props":5106,"children":5107},{"__ignoreMap":7},[5108],{"type":29,"tag":63,"props":5109,"children":5110},{"class":65,"line":66},[5111,5115,5119,5123,5127,5131,5135,5139],{"type":29,"tag":63,"props":5112,"children":5113},{"style":70},[5114],{"type":44,"value":1842},{"type":29,"tag":63,"props":5116,"children":5117},{"style":394},[5118],{"type":44,"value":1193},{"type":29,"tag":63,"props":5120,"children":5121},{"style":70},[5122],{"type":44,"value":155},{"type":29,"tag":63,"props":5124,"children":5125},{"style":76},[5126],{"type":44,"value":1202},{"type":29,"tag":63,"props":5128,"children":5129},{"style":117},[5130],{"type":44,"value":1207},{"type":29,"tag":63,"props":5132,"children":5133},{"style":76},[5134],{"type":44,"value":238},{"type":29,"tag":63,"props":5136,"children":5137},{"style":87},[5138],{"type":44,"value":4445},{"type":29,"tag":63,"props":5140,"children":5141},{"style":76},[5142],{"type":44,"value":429},{"type":29,"tag":30,"props":5144,"children":5145},{},[5146,5148,5153,5155,5161],{"type":44,"value":5147},"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the ",{"type":29,"tag":59,"props":5149,"children":5151},{"className":5150},[],[5152],{"type":44,"value":2605},{"type":44,"value":5154}," over to the ",{"type":29,"tag":59,"props":5156,"children":5158},{"className":5157},[],[5159],{"type":44,"value":5160},"clientConnection",{"type":44,"value":5162},". For the Playwright create message, the message looks something like",{"type":29,"tag":52,"props":5164,"children":5166},{"className":54,"code":5165,"language":56,"meta":7,"style":7},"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n",[5167],{"type":29,"tag":59,"props":5168,"children":5169},{"__ignoreMap":7},[5170,5178,5199,5219,5232,5252,5263,5294,5323,5352,5381,5410,5418,5435,5442],{"type":29,"tag":63,"props":5171,"children":5172},{"class":65,"line":66},[5173],{"type":29,"tag":63,"props":5174,"children":5175},{"style":76},[5176],{"type":44,"value":5177},"{\n",{"type":29,"tag":63,"props":5179,"children":5180},{"class":65,"line":93},[5181,5186,5191,5195],{"type":29,"tag":63,"props":5182,"children":5183},{"style":117},[5184],{"type":44,"value":5185}," guid",{"type":29,"tag":63,"props":5187,"children":5188},{"style":76},[5189],{"type":44,"value":5190},": ",{"type":29,"tag":63,"props":5192,"children":5193},{"style":87},[5194],{"type":44,"value":4911},{"type":29,"tag":63,"props":5196,"children":5197},{"style":76},[5198],{"type":44,"value":857},{"type":29,"tag":63,"props":5200,"children":5201},{"class":65,"line":103},[5202,5207,5211,5215],{"type":29,"tag":63,"props":5203,"children":5204},{"style":117},[5205],{"type":44,"value":5206}," method",{"type":29,"tag":63,"props":5208,"children":5209},{"style":76},[5210],{"type":44,"value":5190},{"type":29,"tag":63,"props":5212,"children":5213},{"style":87},[5214],{"type":44,"value":5040},{"type":29,"tag":63,"props":5216,"children":5217},{"style":76},[5218],{"type":44,"value":857},{"type":29,"tag":63,"props":5220,"children":5221},{"class":65,"line":138},[5222,5227],{"type":29,"tag":63,"props":5223,"children":5224},{"style":117},[5225],{"type":44,"value":5226}," params",{"type":29,"tag":63,"props":5228,"children":5229},{"style":76},[5230],{"type":44,"value":5231},": {\n",{"type":29,"tag":63,"props":5233,"children":5234},{"class":65,"line":178},[5235,5239,5243,5248],{"type":29,"tag":63,"props":5236,"children":5237},{"style":117},[5238],{"type":44,"value":3804},{"type":29,"tag":63,"props":5240,"children":5241},{"style":76},[5242],{"type":44,"value":5190},{"type":29,"tag":63,"props":5244,"children":5245},{"style":87},[5246],{"type":44,"value":5247},"'Playwright'",{"type":29,"tag":63,"props":5249,"children":5250},{"style":76},[5251],{"type":44,"value":857},{"type":29,"tag":63,"props":5253,"children":5254},{"class":65,"line":213},[5255,5259],{"type":29,"tag":63,"props":5256,"children":5257},{"style":117},[5258],{"type":44,"value":3824},{"type":29,"tag":63,"props":5260,"children":5261},{"style":76},[5262],{"type":44,"value":5231},{"type":29,"tag":63,"props":5264,"children":5265},{"class":65,"line":251},[5266,5271,5276,5280,5284,5289],{"type":29,"tag":63,"props":5267,"children":5268},{"style":117},[5269],{"type":44,"value":5270}," chromium",{"type":29,"tag":63,"props":5272,"children":5273},{"style":76},[5274],{"type":44,"value":5275},": { ",{"type":29,"tag":63,"props":5277,"children":5278},{"style":117},[5279],{"type":44,"value":2054},{"type":29,"tag":63,"props":5281,"children":5282},{"style":76},[5283],{"type":44,"value":5190},{"type":29,"tag":63,"props":5285,"children":5286},{"style":87},[5287],{"type":44,"value":5288},"'browser-type@024d5a494527ece580841844a9a933a6'",{"type":29,"tag":63,"props":5290,"children":5291},{"style":76},[5292],{"type":44,"value":5293}," },\n",{"type":29,"tag":63,"props":5295,"children":5296},{"class":65,"line":923},[5297,5302,5306,5310,5314,5319],{"type":29,"tag":63,"props":5298,"children":5299},{"style":117},[5300],{"type":44,"value":5301}," firefox",{"type":29,"tag":63,"props":5303,"children":5304},{"style":76},[5305],{"type":44,"value":5275},{"type":29,"tag":63,"props":5307,"children":5308},{"style":117},[5309],{"type":44,"value":2054},{"type":29,"tag":63,"props":5311,"children":5312},{"style":76},[5313],{"type":44,"value":5190},{"type":29,"tag":63,"props":5315,"children":5316},{"style":87},[5317],{"type":44,"value":5318},"'browser-type@fae8f48651c02682ad3b276f0a046d63'",{"type":29,"tag":63,"props":5320,"children":5321},{"style":76},[5322],{"type":44,"value":5293},{"type":29,"tag":63,"props":5324,"children":5325},{"class":65,"line":942},[5326,5331,5335,5339,5343,5348],{"type":29,"tag":63,"props":5327,"children":5328},{"style":117},[5329],{"type":44,"value":5330}," webkit",{"type":29,"tag":63,"props":5332,"children":5333},{"style":76},[5334],{"type":44,"value":5275},{"type":29,"tag":63,"props":5336,"children":5337},{"style":117},[5338],{"type":44,"value":2054},{"type":29,"tag":63,"props":5340,"children":5341},{"style":76},[5342],{"type":44,"value":5190},{"type":29,"tag":63,"props":5344,"children":5345},{"style":87},[5346],{"type":44,"value":5347},"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'",{"type":29,"tag":63,"props":5349,"children":5350},{"style":76},[5351],{"type":44,"value":5293},{"type":29,"tag":63,"props":5353,"children":5354},{"class":65,"line":987},[5355,5360,5364,5368,5372,5377],{"type":29,"tag":63,"props":5356,"children":5357},{"style":117},[5358],{"type":44,"value":5359}," android",{"type":29,"tag":63,"props":5361,"children":5362},{"style":76},[5363],{"type":44,"value":5275},{"type":29,"tag":63,"props":5365,"children":5366},{"style":117},[5367],{"type":44,"value":2054},{"type":29,"tag":63,"props":5369,"children":5370},{"style":76},[5371],{"type":44,"value":5190},{"type":29,"tag":63,"props":5373,"children":5374},{"style":87},[5375],{"type":44,"value":5376},"'android@832582c466c24c6933d3a5587059e1be'",{"type":29,"tag":63,"props":5378,"children":5379},{"style":76},[5380],{"type":44,"value":5293},{"type":29,"tag":63,"props":5382,"children":5383},{"class":65,"line":995},[5384,5389,5393,5397,5401,5406],{"type":29,"tag":63,"props":5385,"children":5386},{"style":117},[5387],{"type":44,"value":5388}," electron",{"type":29,"tag":63,"props":5390,"children":5391},{"style":76},[5392],{"type":44,"value":5275},{"type":29,"tag":63,"props":5394,"children":5395},{"style":117},[5396],{"type":44,"value":2054},{"type":29,"tag":63,"props":5398,"children":5399},{"style":76},[5400],{"type":44,"value":5190},{"type":29,"tag":63,"props":5402,"children":5403},{"style":87},[5404],{"type":44,"value":5405},"'electron@3829a7608477101154e15c1e25bca9ca'",{"type":29,"tag":63,"props":5407,"children":5408},{"style":76},[5409],{"type":44,"value":5293},{"type":29,"tag":63,"props":5411,"children":5412},{"class":65,"line":1004},[5413],{"type":29,"tag":63,"props":5414,"children":5415},{"style":76},[5416],{"type":44,"value":5417}," },\n",{"type":29,"tag":63,"props":5419,"children":5420},{"class":65,"line":23},[5421,5426,5430],{"type":29,"tag":63,"props":5422,"children":5423},{"style":117},[5424],{"type":44,"value":5425}," guid",{"type":29,"tag":63,"props":5427,"children":5428},{"style":76},[5429],{"type":44,"value":5190},{"type":29,"tag":63,"props":5431,"children":5432},{"style":87},[5433],{"type":44,"value":5434},"'Playwright'\n",{"type":29,"tag":63,"props":5436,"children":5437},{"class":65,"line":1059},[5438],{"type":29,"tag":63,"props":5439,"children":5440},{"style":76},[5441],{"type":44,"value":2123},{"type":29,"tag":63,"props":5443,"children":5444},{"class":65,"line":1091},[5445],{"type":29,"tag":63,"props":5446,"children":5447},{"style":76},[5448],{"type":44,"value":257},{"type":29,"tag":30,"props":5450,"children":5451},{},[5452,5454,5459,5461,5466,5468,5474,5476,5481,5482,5488,5490,5495,5497,5502],{"type":44,"value":5453},"Note before this ",{"type":29,"tag":59,"props":5455,"children":5457},{"className":5456},[],[5458],{"type":44,"value":4132},{"type":44,"value":5460}," message is passed to create the Playwright API on the client side, there were ",{"type":29,"tag":59,"props":5462,"children":5464},{"className":5463},[],[5465],{"type":44,"value":4132},{"type":44,"value":5467}," messages for each of the device types, meaning there already exists a client-side ",{"type":29,"tag":59,"props":5469,"children":5471},{"className":5470},[],[5472],{"type":44,"value":5473},"BrowserType",{"type":44,"value":5475}," for ",{"type":29,"tag":59,"props":5477,"children":5479},{"className":5478},[],[5480],{"type":44,"value":1801},{"type":44,"value":912},{"type":29,"tag":59,"props":5483,"children":5485},{"className":5484},[],[5486],{"type":44,"value":5487},"firefox",{"type":44,"value":5489},", etc. before the ",{"type":29,"tag":59,"props":5491,"children":5493},{"className":5492},[],[5494],{"type":44,"value":4848},{"type":44,"value":5496}," message for ",{"type":29,"tag":59,"props":5498,"children":5500},{"className":5499},[],[5501],{"type":44,"value":12},{"type":44,"value":5503}," is sent.",{"type":29,"tag":30,"props":5505,"children":5506},{},[5507,5508,5513,5515,5520,5522,5527,5529,5535],{"type":44,"value":4814},{"type":29,"tag":59,"props":5509,"children":5511},{"className":5510},[],[5512],{"type":44,"value":5160},{"type":44,"value":5514}," constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the ",{"type":29,"tag":59,"props":5516,"children":5518},{"className":5517},[],[5519],{"type":44,"value":604},{"type":44,"value":5521}," class, which is a concept for a later section. For now, let's trace what happens in the ",{"type":29,"tag":59,"props":5523,"children":5525},{"className":5524},[],[5526],{"type":44,"value":5160},{"type":44,"value":5528}," for the ",{"type":29,"tag":59,"props":5530,"children":5532},{"className":5531},[],[5533],{"type":44,"value":5534},"type: 'Playwright'",{"type":44,"value":5536}," message.",{"type":29,"tag":30,"props":5538,"children":5539},{},[5540,5541,5546,5548,5554,5556,5561,5563,5569],{"type":44,"value":4814},{"type":29,"tag":59,"props":5542,"children":5544},{"className":5543},[],[5545],{"type":44,"value":4132},{"type":44,"value":5547}," function calls ",{"type":29,"tag":59,"props":5549,"children":5551},{"className":5550},[],[5552],{"type":44,"value":5553},"dispatchConnection.onmessage",{"type":44,"value":5555},", which calls the ",{"type":29,"tag":59,"props":5557,"children":5559},{"className":5558},[],[5560],{"type":44,"value":2613},{"type":44,"value":5562}," function, which then calls the ",{"type":29,"tag":59,"props":5564,"children":5566},{"className":5565},[],[5567],{"type":44,"value":5568},"clientConnection._createRemoteObject",{"type":44,"value":5570}," function with the following parameters",{"type":29,"tag":52,"props":5572,"children":5574},{"className":54,"code":5573,"filename":1946,"language":56,"meta":7,"style":7},"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n",[5575],{"type":29,"tag":59,"props":5576,"children":5577},{"__ignoreMap":7},[5578,5597,5614,5631,5647,5655,5663,5680,5697,5714,5731,5748,5755],{"type":29,"tag":63,"props":5579,"children":5580},{"class":65,"line":66},[5581,5585,5589,5593],{"type":29,"tag":63,"props":5582,"children":5583},{"style":394},[5584],{"type":44,"value":3198},{"type":29,"tag":63,"props":5586,"children":5587},{"style":76},[5588],{"type":44,"value":228},{"type":29,"tag":63,"props":5590,"children":5591},{"style":117},[5592],{"type":44,"value":5077},{"type":29,"tag":63,"props":5594,"children":5595},{"style":76},[5596],{"type":44,"value":1212},{"type":29,"tag":63,"props":5598,"children":5599},{"class":65,"line":93},[5600,5605,5609],{"type":29,"tag":63,"props":5601,"children":5602},{"style":87},[5603],{"type":44,"value":5604}," \"\"",{"type":29,"tag":63,"props":5606,"children":5607},{"style":76},[5608],{"type":44,"value":912},{"type":29,"tag":63,"props":5610,"children":5611},{"style":977},[5612],{"type":44,"value":5613},"// parentGuid - corresponds to Root, the root ChannelOwner\n",{"type":29,"tag":63,"props":5615,"children":5616},{"class":65,"line":103},[5617,5622,5626],{"type":29,"tag":63,"props":5618,"children":5619},{"style":87},[5620],{"type":44,"value":5621}," \"Playwright\"",{"type":29,"tag":63,"props":5623,"children":5624},{"style":76},[5625],{"type":44,"value":912},{"type":29,"tag":63,"props":5627,"children":5628},{"style":977},[5629],{"type":44,"value":5630},"// type\n",{"type":29,"tag":63,"props":5632,"children":5633},{"class":65,"line":138},[5634,5638,5642],{"type":29,"tag":63,"props":5635,"children":5636},{"style":87},[5637],{"type":44,"value":5621},{"type":29,"tag":63,"props":5639,"children":5640},{"style":76},[5641],{"type":44,"value":912},{"type":29,"tag":63,"props":5643,"children":5644},{"style":977},[5645],{"type":44,"value":5646},"// guid\n",{"type":29,"tag":63,"props":5648,"children":5649},{"class":65,"line":178},[5650],{"type":29,"tag":63,"props":5651,"children":5652},{"style":76},[5653],{"type":44,"value":5654}," {\n",{"type":29,"tag":63,"props":5656,"children":5657},{"class":65,"line":213},[5658],{"type":29,"tag":63,"props":5659,"children":5660},{"style":977},[5661],{"type":44,"value":5662}," // initializer\n",{"type":29,"tag":63,"props":5664,"children":5665},{"class":65,"line":251},[5666,5671,5676],{"type":29,"tag":63,"props":5667,"children":5668},{"style":76},[5669],{"type":44,"value":5670}," chromium: { guid: ",{"type":29,"tag":63,"props":5672,"children":5673},{"style":87},[5674],{"type":44,"value":5675},"\"browser-type@024d5a494527ece580841844a9a933a6\"",{"type":29,"tag":63,"props":5677,"children":5678},{"style":76},[5679],{"type":44,"value":5293},{"type":29,"tag":63,"props":5681,"children":5682},{"class":65,"line":923},[5683,5688,5693],{"type":29,"tag":63,"props":5684,"children":5685},{"style":76},[5686],{"type":44,"value":5687}," firefox: { guid: ",{"type":29,"tag":63,"props":5689,"children":5690},{"style":87},[5691],{"type":44,"value":5692},"\"browser-type@fae8f48651c02682ad3b276f0a046d63\"",{"type":29,"tag":63,"props":5694,"children":5695},{"style":76},[5696],{"type":44,"value":5293},{"type":29,"tag":63,"props":5698,"children":5699},{"class":65,"line":942},[5700,5705,5710],{"type":29,"tag":63,"props":5701,"children":5702},{"style":76},[5703],{"type":44,"value":5704}," webkit: { guid: ",{"type":29,"tag":63,"props":5706,"children":5707},{"style":87},[5708],{"type":44,"value":5709},"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\"",{"type":29,"tag":63,"props":5711,"children":5712},{"style":76},[5713],{"type":44,"value":5293},{"type":29,"tag":63,"props":5715,"children":5716},{"class":65,"line":987},[5717,5722,5727],{"type":29,"tag":63,"props":5718,"children":5719},{"style":76},[5720],{"type":44,"value":5721}," android: { guid: ",{"type":29,"tag":63,"props":5723,"children":5724},{"style":87},[5725],{"type":44,"value":5726},"\"android@832582c466c24c6933d3a5587059e1be\"",{"type":29,"tag":63,"props":5728,"children":5729},{"style":76},[5730],{"type":44,"value":5293},{"type":29,"tag":63,"props":5732,"children":5733},{"class":65,"line":995},[5734,5739,5744],{"type":29,"tag":63,"props":5735,"children":5736},{"style":76},[5737],{"type":44,"value":5738}," electron: { guid: ",{"type":29,"tag":63,"props":5740,"children":5741},{"style":87},[5742],{"type":44,"value":5743},"\"electron@3829a7608477101154e15c1e25bca9ca\"",{"type":29,"tag":63,"props":5745,"children":5746},{"style":76},[5747],{"type":44,"value":5293},{"type":29,"tag":63,"props":5749,"children":5750},{"class":65,"line":1004},[5751],{"type":29,"tag":63,"props":5752,"children":5753},{"style":76},[5754],{"type":44,"value":2123},{"type":29,"tag":63,"props":5756,"children":5757},{"class":65,"line":23},[5758],{"type":29,"tag":63,"props":5759,"children":5760},{"style":76},[5761],{"type":44,"value":429},{"type":29,"tag":30,"props":5763,"children":5764},{},[5765,5766,5771,5773,5779],{"type":44,"value":4212},{"type":29,"tag":59,"props":5767,"children":5769},{"className":5768},[],[5770],{"type":44,"value":5568},{"type":44,"value":5772}," function there is a transformation of the data and then a large ",{"type":29,"tag":59,"props":5774,"children":5776},{"className":5775},[],[5777],{"type":44,"value":5778},"switch-case",{"type":44,"value":5780}," function instantiating the corresponding client class.",{"type":29,"tag":52,"props":5782,"children":5784},{"className":54,"code":5783,"filename":1946,"language":56,"meta":7,"style":7},"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner\u003Cany>;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n",[5785],{"type":29,"tag":59,"props":5786,"children":5787},{"__ignoreMap":7},[5788,5800,5838,5859,5908,5944,5983,6002,6010,6022,6030,6064,6098,6106,6113,6126,6134,6152,6177,6189,6196,6203,6215],{"type":29,"tag":63,"props":5789,"children":5790},{"class":65,"line":66},[5791,5795],{"type":29,"tag":63,"props":5792,"children":5793},{"style":117},[5794],{"type":44,"value":5077},{"type":29,"tag":63,"props":5796,"children":5797},{"style":76},[5798],{"type":44,"value":5799},"(parentGuid: string, type: string, guid: string, initializer: any) {\n",{"type":29,"tag":63,"props":5801,"children":5802},{"class":65,"line":93},[5803,5807,5812,5816,5820,5824,5828,5833],{"type":29,"tag":63,"props":5804,"children":5805},{"style":70},[5806],{"type":44,"value":144},{"type":29,"tag":63,"props":5808,"children":5809},{"style":394},[5810],{"type":44,"value":5811}," parent",{"type":29,"tag":63,"props":5813,"children":5814},{"style":70},[5815],{"type":44,"value":155},{"type":29,"tag":63,"props":5817,"children":5818},{"style":394},[5819],{"type":44,"value":2093},{"type":29,"tag":63,"props":5821,"children":5822},{"style":76},[5823],{"type":44,"value":2098},{"type":29,"tag":63,"props":5825,"children":5826},{"style":117},[5827],{"type":44,"value":1619},{"type":29,"tag":63,"props":5829,"children":5830},{"style":76},[5831],{"type":44,"value":5832},"(parentGuid); ",{"type":29,"tag":63,"props":5834,"children":5835},{"style":977},[5836],{"type":44,"value":5837},"// here the parentGuid is ''\n",{"type":29,"tag":63,"props":5839,"children":5840},{"class":65,"line":103},[5841,5846,5850,5854],{"type":29,"tag":63,"props":5842,"children":5843},{"style":70},[5844],{"type":44,"value":5845}," if",{"type":29,"tag":63,"props":5847,"children":5848},{"style":76},[5849],{"type":44,"value":1024},{"type":29,"tag":63,"props":5851,"children":5852},{"style":70},[5853],{"type":44,"value":1629},{"type":29,"tag":63,"props":5855,"children":5856},{"style":76},[5857],{"type":44,"value":5858},"parent)\n",{"type":29,"tag":63,"props":5860,"children":5861},{"class":65,"line":138},[5862,5867,5871,5876,5880,5885,5890,5895,5899,5904],{"type":29,"tag":63,"props":5863,"children":5864},{"style":70},[5865],{"type":44,"value":5866}," throw",{"type":29,"tag":63,"props":5868,"children":5869},{"style":70},[5870],{"type":44,"value":893},{"type":29,"tag":63,"props":5872,"children":5873},{"style":117},[5874],{"type":44,"value":5875}," Error",{"type":29,"tag":63,"props":5877,"children":5878},{"style":76},[5879],{"type":44,"value":238},{"type":29,"tag":63,"props":5881,"children":5882},{"style":87},[5883],{"type":44,"value":5884},"`Cannot find parent object ${",{"type":29,"tag":63,"props":5886,"children":5887},{"style":76},[5888],{"type":44,"value":5889},"parentGuid",{"type":29,"tag":63,"props":5891,"children":5892},{"style":87},[5893],{"type":44,"value":5894},"} to create ${",{"type":29,"tag":63,"props":5896,"children":5897},{"style":76},[5898],{"type":44,"value":2054},{"type":29,"tag":63,"props":5900,"children":5901},{"style":87},[5902],{"type":44,"value":5903},"}`",{"type":29,"tag":63,"props":5905,"children":5906},{"style":76},[5907],{"type":44,"value":429},{"type":29,"tag":63,"props":5909,"children":5910},{"class":65,"line":178},[5911,5916,5921,5925,5930,5934,5939],{"type":29,"tag":63,"props":5912,"children":5913},{"style":70},[5914],{"type":44,"value":5915}," let",{"type":29,"tag":63,"props":5917,"children":5918},{"style":76},[5919],{"type":44,"value":5920}," result",{"type":29,"tag":63,"props":5922,"children":5923},{"style":70},[5924],{"type":44,"value":761},{"type":29,"tag":63,"props":5926,"children":5927},{"style":117},[5928],{"type":44,"value":5929}," ChannelOwner",{"type":29,"tag":63,"props":5931,"children":5932},{"style":76},[5933],{"type":44,"value":2011},{"type":29,"tag":63,"props":5935,"children":5936},{"style":394},[5937],{"type":44,"value":5938},"any",{"type":29,"tag":63,"props":5940,"children":5941},{"style":76},[5942],{"type":44,"value":5943},">;\n",{"type":29,"tag":63,"props":5945,"children":5946},{"class":65,"line":213},[5947,5951,5955,5959,5963,5967,5971,5975,5979],{"type":29,"tag":63,"props":5948,"children":5949},{"style":70},[5950],{"type":44,"value":144},{"type":29,"tag":63,"props":5952,"children":5953},{"style":394},[5954],{"type":44,"value":4892},{"type":29,"tag":63,"props":5956,"children":5957},{"style":70},[5958],{"type":44,"value":155},{"type":29,"tag":63,"props":5960,"children":5961},{"style":117},[5962],{"type":44,"value":4901},{"type":29,"tag":63,"props":5964,"children":5965},{"style":76},[5966],{"type":44,"value":4906},{"type":29,"tag":63,"props":5968,"children":5969},{"style":87},[5970],{"type":44,"value":4911},{"type":29,"tag":63,"props":5972,"children":5973},{"style":76},[5974],{"type":44,"value":912},{"type":29,"tag":63,"props":5976,"children":5977},{"style":87},[5978],{"type":44,"value":4920},{"type":29,"tag":63,"props":5980,"children":5981},{"style":76},[5982],{"type":44,"value":429},{"type":29,"tag":63,"props":5984,"children":5985},{"class":65,"line":251},[5986,5990,5994,5998],{"type":29,"tag":63,"props":5987,"children":5988},{"style":76},[5989],{"type":44,"value":4932},{"type":29,"tag":63,"props":5991,"children":5992},{"style":70},[5993],{"type":44,"value":1258},{"type":29,"tag":63,"props":5995,"children":5996},{"style":117},[5997],{"type":44,"value":4892},{"type":29,"tag":63,"props":5999,"children":6000},{"style":76},[6001],{"type":44,"value":1212},{"type":29,"tag":63,"props":6003,"children":6004},{"class":65,"line":923},[6005],{"type":29,"tag":63,"props":6006,"children":6007},{"style":76},[6008],{"type":44,"value":6009}," initializer,\n",{"type":29,"tag":63,"props":6011,"children":6012},{"class":65,"line":942},[6013,6018],{"type":29,"tag":63,"props":6014,"children":6015},{"style":87},[6016],{"type":44,"value":6017}," ''",{"type":29,"tag":63,"props":6019,"children":6020},{"style":76},[6021],{"type":44,"value":857},{"type":29,"tag":63,"props":6023,"children":6024},{"class":65,"line":987},[6025],{"type":29,"tag":63,"props":6026,"children":6027},{"style":76},[6028],{"type":44,"value":6029}," {\n",{"type":29,"tag":63,"props":6031,"children":6032},{"class":65,"line":995},[6033,6038,6042,6047,6051,6055,6059],{"type":29,"tag":63,"props":6034,"children":6035},{"style":76},[6036],{"type":44,"value":6037}," tChannelImpl: ",{"type":29,"tag":63,"props":6039,"children":6040},{"style":394},[6041],{"type":44,"value":3198},{"type":29,"tag":63,"props":6043,"children":6044},{"style":76},[6045],{"type":44,"value":6046},"._tChannelImplFromWire.",{"type":29,"tag":63,"props":6048,"children":6049},{"style":117},[6050],{"type":44,"value":4968},{"type":29,"tag":63,"props":6052,"children":6053},{"style":76},[6054],{"type":44,"value":238},{"type":29,"tag":63,"props":6056,"children":6057},{"style":394},[6058],{"type":44,"value":3198},{"type":29,"tag":63,"props":6060,"children":6061},{"style":76},[6062],{"type":44,"value":6063},"),\n",{"type":29,"tag":63,"props":6065,"children":6066},{"class":65,"line":1004},[6067,6072,6076,6081,6085,6089,6093],{"type":29,"tag":63,"props":6068,"children":6069},{"style":76},[6070],{"type":44,"value":6071}," binary: ",{"type":29,"tag":63,"props":6073,"children":6074},{"style":394},[6075],{"type":44,"value":3198},{"type":29,"tag":63,"props":6077,"children":6078},{"style":76},[6079],{"type":44,"value":6080},"._rawBuffers ",{"type":29,"tag":63,"props":6082,"children":6083},{"style":70},[6084],{"type":44,"value":4995},{"type":29,"tag":63,"props":6086,"children":6087},{"style":87},[6088],{"type":44,"value":5000},{"type":29,"tag":63,"props":6090,"children":6091},{"style":70},[6092],{"type":44,"value":3976},{"type":29,"tag":63,"props":6094,"children":6095},{"style":87},[6096],{"type":44,"value":6097}," 'fromBase64'\n",{"type":29,"tag":63,"props":6099,"children":6100},{"class":65,"line":23},[6101],{"type":29,"tag":63,"props":6102,"children":6103},{"style":76},[6104],{"type":44,"value":6105}," }\n",{"type":29,"tag":63,"props":6107,"children":6108},{"class":65,"line":1059},[6109],{"type":29,"tag":63,"props":6110,"children":6111},{"style":76},[6112],{"type":44,"value":1289},{"type":29,"tag":63,"props":6114,"children":6115},{"class":65,"line":1091},[6116,6121],{"type":29,"tag":63,"props":6117,"children":6118},{"style":70},[6119],{"type":44,"value":6120}," switch",{"type":29,"tag":63,"props":6122,"children":6123},{"style":76},[6124],{"type":44,"value":6125}," (type) {\n",{"type":29,"tag":63,"props":6127,"children":6128},{"class":65,"line":1108},[6129],{"type":29,"tag":63,"props":6130,"children":6131},{"style":977},[6132],{"type":44,"value":6133}," // ...\n",{"type":29,"tag":63,"props":6135,"children":6136},{"class":65,"line":1116},[6137,6142,6147],{"type":29,"tag":63,"props":6138,"children":6139},{"style":70},[6140],{"type":44,"value":6141}," case",{"type":29,"tag":63,"props":6143,"children":6144},{"style":87},[6145],{"type":44,"value":6146}," 'Playwright'",{"type":29,"tag":63,"props":6148,"children":6149},{"style":76},[6150],{"type":44,"value":6151},":\n",{"type":29,"tag":63,"props":6153,"children":6154},{"class":65,"line":1147},[6155,6160,6164,6168,6172],{"type":29,"tag":63,"props":6156,"children":6157},{"style":76},[6158],{"type":44,"value":6159}," result ",{"type":29,"tag":63,"props":6161,"children":6162},{"style":70},[6163],{"type":44,"value":1258},{"type":29,"tag":63,"props":6165,"children":6166},{"style":70},[6167],{"type":44,"value":893},{"type":29,"tag":63,"props":6169,"children":6170},{"style":117},[6171],{"type":44,"value":2823},{"type":29,"tag":63,"props":6173,"children":6174},{"style":76},[6175],{"type":44,"value":6176},"(parent, type, guid, initializer);\n",{"type":29,"tag":63,"props":6178,"children":6179},{"class":65,"line":1155},[6180,6185],{"type":29,"tag":63,"props":6181,"children":6182},{"style":70},[6183],{"type":44,"value":6184}," break",{"type":29,"tag":63,"props":6186,"children":6187},{"style":76},[6188],{"type":44,"value":1244},{"type":29,"tag":63,"props":6190,"children":6191},{"class":65,"line":1164},[6192],{"type":29,"tag":63,"props":6193,"children":6194},{"style":977},[6195],{"type":44,"value":6133},{"type":29,"tag":63,"props":6197,"children":6198},{"class":65,"line":1183},[6199],{"type":29,"tag":63,"props":6200,"children":6201},{"style":76},[6202],{"type":44,"value":2123},{"type":29,"tag":63,"props":6204,"children":6205},{"class":65,"line":1215},[6206,6210],{"type":29,"tag":63,"props":6207,"children":6208},{"style":70},[6209],{"type":44,"value":1704},{"type":29,"tag":63,"props":6211,"children":6212},{"style":76},[6213],{"type":44,"value":6214}," result;\n",{"type":29,"tag":63,"props":6216,"children":6217},{"class":65,"line":1224},[6218],{"type":29,"tag":63,"props":6219,"children":6220},{"style":76},[6221],{"type":44,"value":257},{"type":29,"tag":30,"props":6223,"children":6224},{},[6225,6227,6233,6234,6240,6242,6247,6249,6254,6256,6261,6263,6268,6270,6275,6277,6283,6285,6290,6292,6297,6299,6305],{"type":44,"value":6226},"The parameter ",{"type":29,"tag":59,"props":6228,"children":6230},{"className":6229},[],[6231],{"type":44,"value":6232},"tChannelImpl: _tChannelImplFromWire",{"type":44,"value":4578},{"type":29,"tag":59,"props":6235,"children":6237},{"className":6236},[],[6238],{"type":44,"value":6239},"validator",{"type":44,"value":6241}," function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the ",{"type":29,"tag":59,"props":6243,"children":6245},{"className":6244},[],[6246],{"type":44,"value":2148},{"type":44,"value":6248}," variable in the ",{"type":29,"tag":59,"props":6250,"children":6252},{"className":6251},[],[6253],{"type":44,"value":679},{"type":44,"value":6255}," class. If you look at the type definition in ",{"type":29,"tag":59,"props":6257,"children":6259},{"className":6258},[],[6260],{"type":44,"value":679},{"type":44,"value":6262}," the ",{"type":29,"tag":59,"props":6264,"children":6266},{"className":6265},[],[6267],{"type":44,"value":2148},{"type":44,"value":6269}," variable is a map returning one of the ",{"type":29,"tag":59,"props":6271,"children":6273},{"className":6272},[],[6274],{"type":44,"value":604},{"type":44,"value":6276}," subclasses. So in the result above for the ",{"type":29,"tag":59,"props":6278,"children":6280},{"className":6279},[],[6281],{"type":44,"value":6282},"case: 'Playwright'",{"type":44,"value":6284},", it returns a ",{"type":29,"tag":59,"props":6286,"children":6288},{"className":6287},[],[6289],{"type":44,"value":12},{"type":44,"value":6291}," instance, which is a subclass of ",{"type":29,"tag":59,"props":6293,"children":6295},{"className":6294},[],[6296],{"type":44,"value":604},{"type":44,"value":6298},", defined in ",{"type":29,"tag":59,"props":6300,"children":6302},{"className":6301},[],[6303],{"type":44,"value":6304},"client/playwright.ts",{"type":44,"value":228},{"type":29,"tag":39,"props":6307,"children":6309},{"id":6308},"launching-the-browser-instance",[6310],{"type":44,"value":6311},"Launching the browser instance",{"type":29,"tag":30,"props":6313,"children":6314},{},[6315,6317,6322,6324,6330],{"type":44,"value":6316},"The final bit of code in ",{"type":29,"tag":59,"props":6318,"children":6320},{"className":6319},[],[6321],{"type":44,"value":504},{"type":44,"value":6323}," to consider is the ",{"type":29,"tag":59,"props":6325,"children":6327},{"className":6326},[],[6328],{"type":44,"value":6329},"_serverLauncher",{"type":44,"value":6331}," variables being set in each of the drivers. This is written as",{"type":29,"tag":52,"props":6333,"children":6335},{"className":54,"code":6334,"filename":730,"language":56,"meta":7,"style":7},"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n",[6336],{"type":29,"tag":59,"props":6337,"children":6338},{"__ignoreMap":7},[6339,6363,6371,6378,6402,6410,6417],{"type":29,"tag":63,"props":6340,"children":6341},{"class":65,"line":66},[6342,6347,6351,6355,6359],{"type":29,"tag":63,"props":6343,"children":6344},{"style":76},[6345],{"type":44,"value":6346},"playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":6348,"children":6349},{"style":70},[6350],{"type":44,"value":1258},{"type":29,"tag":63,"props":6352,"children":6353},{"style":70},[6354],{"type":44,"value":893},{"type":29,"tag":63,"props":6356,"children":6357},{"style":117},[6358],{"type":44,"value":1267},{"type":29,"tag":63,"props":6360,"children":6361},{"style":76},[6362],{"type":44,"value":1212},{"type":29,"tag":63,"props":6364,"children":6365},{"class":65,"line":93},[6366],{"type":29,"tag":63,"props":6367,"children":6368},{"style":87},[6369],{"type":44,"value":6370}," \"chromium\"\n",{"type":29,"tag":63,"props":6372,"children":6373},{"class":65,"line":103},[6374],{"type":29,"tag":63,"props":6375,"children":6376},{"style":76},[6377],{"type":44,"value":429},{"type":29,"tag":63,"props":6379,"children":6380},{"class":65,"line":138},[6381,6386,6390,6394,6398],{"type":29,"tag":63,"props":6382,"children":6383},{"style":76},[6384],{"type":44,"value":6385},"playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":6387,"children":6388},{"style":70},[6389],{"type":44,"value":1258},{"type":29,"tag":63,"props":6391,"children":6392},{"style":70},[6393],{"type":44,"value":893},{"type":29,"tag":63,"props":6395,"children":6396},{"style":117},[6397],{"type":44,"value":1267},{"type":29,"tag":63,"props":6399,"children":6400},{"style":76},[6401],{"type":44,"value":1212},{"type":29,"tag":63,"props":6403,"children":6404},{"class":65,"line":178},[6405],{"type":29,"tag":63,"props":6406,"children":6407},{"style":87},[6408],{"type":44,"value":6409}," \"firefox\"\n",{"type":29,"tag":63,"props":6411,"children":6412},{"class":65,"line":213},[6413],{"type":29,"tag":63,"props":6414,"children":6415},{"style":76},[6416],{"type":44,"value":429},{"type":29,"tag":63,"props":6418,"children":6419},{"class":65,"line":251},[6420,6425,6429,6433,6437,6441,6446],{"type":29,"tag":63,"props":6421,"children":6422},{"style":76},[6423],{"type":44,"value":6424},"playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":6426,"children":6427},{"style":70},[6428],{"type":44,"value":1258},{"type":29,"tag":63,"props":6430,"children":6431},{"style":70},[6432],{"type":44,"value":893},{"type":29,"tag":63,"props":6434,"children":6435},{"style":117},[6436],{"type":44,"value":1267},{"type":29,"tag":63,"props":6438,"children":6439},{"style":76},[6440],{"type":44,"value":238},{"type":29,"tag":63,"props":6442,"children":6443},{"style":87},[6444],{"type":44,"value":6445},"\"webkit\"",{"type":29,"tag":63,"props":6447,"children":6448},{"style":76},[6449],{"type":44,"value":429},{"type":29,"tag":30,"props":6451,"children":6452},{},[6453,6454,6460,6462,6467,6469,6475,6477,6483],{"type":44,"value":3475},{"type":29,"tag":59,"props":6455,"children":6457},{"className":6456},[],[6458],{"type":44,"value":6459},"BrowserServerLauncherImpl",{"type":44,"value":6461}," class is defined next to the ",{"type":29,"tag":59,"props":6463,"children":6465},{"className":6464},[],[6466],{"type":44,"value":496},{"type":44,"value":6468}," file in ",{"type":29,"tag":59,"props":6470,"children":6472},{"className":6471},[],[6473],{"type":44,"value":6474},"browserServerLauncherImpl.ts",{"type":44,"value":6476},". The main functionality in this class lies in the ",{"type":29,"tag":59,"props":6478,"children":6480},{"className":6479},[],[6481],{"type":44,"value":6482},"launchServer",{"type":44,"value":6484}," function, and is only called when you use the",{"type":29,"tag":52,"props":6486,"children":6489},{"className":54,"code":6487,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","my-script.ts",[6490],{"type":29,"tag":59,"props":6491,"children":6492},{"__ignoreMap":7},[6493,6517,6524],{"type":29,"tag":63,"props":6494,"children":6495},{"class":65,"line":66},[6496,6500,6505,6509,6513],{"type":29,"tag":63,"props":6497,"children":6498},{"style":70},[6499],{"type":44,"value":73},{"type":29,"tag":63,"props":6501,"children":6502},{"style":76},[6503],{"type":44,"value":6504}," playwright ",{"type":29,"tag":63,"props":6506,"children":6507},{"style":70},[6508],{"type":44,"value":84},{"type":29,"tag":63,"props":6510,"children":6511},{"style":87},[6512],{"type":44,"value":1779},{"type":29,"tag":63,"props":6514,"children":6515},{"style":76},[6516],{"type":44,"value":1244},{"type":29,"tag":63,"props":6518,"children":6519},{"class":65,"line":93},[6520],{"type":29,"tag":63,"props":6521,"children":6522},{"emptyLinePlaceholder":97},[6523],{"type":44,"value":100},{"type":29,"tag":63,"props":6525,"children":6526},{"class":65,"line":103},[6527,6532,6536],{"type":29,"tag":63,"props":6528,"children":6529},{"style":76},[6530],{"type":44,"value":6531},"playwright.chromium.",{"type":29,"tag":63,"props":6533,"children":6534},{"style":117},[6535],{"type":44,"value":6482},{"type":29,"tag":63,"props":6537,"children":6538},{"style":76},[6539],{"type":44,"value":6540},"(serverOptions);\n",{"type":29,"tag":30,"props":6542,"children":6543},{},[6544,6546,6552],{"type":44,"value":6545},"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the ",{"type":29,"tag":59,"props":6547,"children":6549},{"className":6548},[],[6550],{"type":44,"value":6551},"'playwright-core'",{"type":44,"value":6553}," library, something like",{"type":29,"tag":52,"props":6555,"children":6557},{"className":54,"code":6556,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n",[6558],{"type":29,"tag":59,"props":6559,"children":6560},{"__ignoreMap":7},[6561,6584,6591,6611,6653,6684,6713,6721],{"type":29,"tag":63,"props":6562,"children":6563},{"class":65,"line":66},[6564,6568,6572,6576,6580],{"type":29,"tag":63,"props":6565,"children":6566},{"style":70},[6567],{"type":44,"value":73},{"type":29,"tag":63,"props":6569,"children":6570},{"style":76},[6571],{"type":44,"value":6504},{"type":29,"tag":63,"props":6573,"children":6574},{"style":70},[6575],{"type":44,"value":84},{"type":29,"tag":63,"props":6577,"children":6578},{"style":87},[6579],{"type":44,"value":1779},{"type":29,"tag":63,"props":6581,"children":6582},{"style":76},[6583],{"type":44,"value":1244},{"type":29,"tag":63,"props":6585,"children":6586},{"class":65,"line":93},[6587],{"type":29,"tag":63,"props":6588,"children":6589},{"emptyLinePlaceholder":97},[6590],{"type":44,"value":100},{"type":29,"tag":63,"props":6592,"children":6593},{"class":65,"line":103},[6594,6598,6602,6606],{"type":29,"tag":63,"props":6595,"children":6596},{"style":76},[6597],{"type":44,"value":238},{"type":29,"tag":63,"props":6599,"children":6600},{"style":70},[6601],{"type":44,"value":109},{"type":29,"tag":63,"props":6603,"children":6604},{"style":70},[6605],{"type":44,"value":114},{"type":29,"tag":63,"props":6607,"children":6608},{"style":76},[6609],{"type":44,"value":6610}," () {\n",{"type":29,"tag":63,"props":6612,"children":6613},{"class":65,"line":138},[6614,6618,6622,6626,6630,6635,6639,6644,6649],{"type":29,"tag":63,"props":6615,"children":6616},{"style":70},[6617],{"type":44,"value":144},{"type":29,"tag":63,"props":6619,"children":6620},{"style":394},[6621],{"type":44,"value":150},{"type":29,"tag":63,"props":6623,"children":6624},{"style":70},[6625],{"type":44,"value":155},{"type":29,"tag":63,"props":6627,"children":6628},{"style":70},[6629],{"type":44,"value":160},{"type":29,"tag":63,"props":6631,"children":6632},{"style":76},[6633],{"type":44,"value":6634}," playwright.chromium.",{"type":29,"tag":63,"props":6636,"children":6637},{"style":117},[6638],{"type":44,"value":170},{"type":29,"tag":63,"props":6640,"children":6641},{"style":76},[6642],{"type":44,"value":6643},"({ headless: ",{"type":29,"tag":63,"props":6645,"children":6646},{"style":394},[6647],{"type":44,"value":6648},"false",{"type":29,"tag":63,"props":6650,"children":6651},{"style":76},[6652],{"type":44,"value":5014},{"type":29,"tag":63,"props":6654,"children":6655},{"class":65,"line":178},[6656,6660,6664,6668,6672,6676,6680],{"type":29,"tag":63,"props":6657,"children":6658},{"style":70},[6659],{"type":44,"value":144},{"type":29,"tag":63,"props":6661,"children":6662},{"style":394},[6663],{"type":44,"value":188},{"type":29,"tag":63,"props":6665,"children":6666},{"style":70},[6667],{"type":44,"value":155},{"type":29,"tag":63,"props":6669,"children":6670},{"style":70},[6671],{"type":44,"value":160},{"type":29,"tag":63,"props":6673,"children":6674},{"style":76},[6675],{"type":44,"value":201},{"type":29,"tag":63,"props":6677,"children":6678},{"style":117},[6679],{"type":44,"value":206},{"type":29,"tag":63,"props":6681,"children":6682},{"style":76},[6683],{"type":44,"value":939},{"type":29,"tag":63,"props":6685,"children":6686},{"class":65,"line":213},[6687,6691,6696,6700,6704,6709],{"type":29,"tag":63,"props":6688,"children":6689},{"style":70},[6690],{"type":44,"value":219},{"type":29,"tag":63,"props":6692,"children":6693},{"style":76},[6694],{"type":44,"value":6695}," page.",{"type":29,"tag":63,"props":6697,"children":6698},{"style":117},[6699],{"type":44,"value":233},{"type":29,"tag":63,"props":6701,"children":6702},{"style":76},[6703],{"type":44,"value":238},{"type":29,"tag":63,"props":6705,"children":6706},{"style":87},[6707],{"type":44,"value":6708},"\"https://playwright.dev\"",{"type":29,"tag":63,"props":6710,"children":6711},{"style":76},[6712],{"type":44,"value":429},{"type":29,"tag":63,"props":6714,"children":6715},{"class":65,"line":251},[6716],{"type":29,"tag":63,"props":6717,"children":6718},{"style":977},[6719],{"type":44,"value":6720}," // ... automate page interactions here\n",{"type":29,"tag":63,"props":6722,"children":6723},{"class":65,"line":923},[6724],{"type":29,"tag":63,"props":6725,"children":6726},{"style":76},[6727],{"type":44,"value":6728},"})();\n",{"type":29,"tag":30,"props":6730,"children":6731},{},[6732,6734,6739],{"type":44,"value":6733},"so for now we skip giving an overview of the ",{"type":29,"tag":59,"props":6735,"children":6737},{"className":6736},[],[6738],{"type":44,"value":6459},{"type":44,"value":6740}," code and defer it to a later post.",{"type":29,"tag":39,"props":6742,"children":6744},{"id":6743},"recap",[6745],{"type":44,"value":6746},"Recap",{"type":29,"tag":30,"props":6748,"children":6749},{},[6750],{"type":44,"value":6751},"Whew! That was quite the journey, so let's recap the main points we covered in this post:",{"type":29,"tag":6753,"props":6754,"children":6755},"ul",{},[6756,6780,6798,6822,6833,6859,6882,6894,6939],{"type":29,"tag":6757,"props":6758,"children":6759},"li",{},[6760,6765,6767,6772,6774,6779],{"type":29,"tag":59,"props":6761,"children":6763},{"className":6762},[],[6764],{"type":44,"value":298},{"type":44,"value":6766}," is a wrapper around the test runner package ",{"type":29,"tag":59,"props":6768,"children":6770},{"className":6769},[],[6771],{"type":44,"value":313},{"type":44,"value":6773}," and the browser automation package ",{"type":29,"tag":59,"props":6775,"children":6777},{"className":6776},[],[6778],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":6757,"props":6781,"children":6782},{},[6783,6785,6790,6792,6797],{"type":44,"value":6784},"Importing from ",{"type":29,"tag":59,"props":6786,"children":6788},{"className":6787},[],[6789],{"type":44,"value":287},{"type":44,"value":6791}," is a dynamically generated process under the hood, which is done in ",{"type":29,"tag":59,"props":6793,"children":6795},{"className":6794},[],[6796],{"type":44,"value":730},{"type":44,"value":228},{"type":29,"tag":6757,"props":6799,"children":6800},{},[6801,6802,6807,6809,6814,6815,6820],{"type":44,"value":570},{"type":29,"tag":59,"props":6803,"children":6805},{"className":6804},[],[6806],{"type":44,"value":287},{"type":44,"value":6808}," there are two main libraries, the ",{"type":29,"tag":59,"props":6810,"children":6812},{"className":6811},[],[6813],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":6816,"children":6818},{"className":6817},[],[6819],{"type":44,"value":527},{"type":44,"value":6821}," libraries.",{"type":29,"tag":6757,"props":6823,"children":6824},{},[6825,6827,6832],{"type":44,"value":6826},"This separation exists so other programming languages can easily build a client library which communicates with the ",{"type":29,"tag":59,"props":6828,"children":6830},{"className":6829},[],[6831],{"type":44,"value":527},{"type":44,"value":559},{"type":29,"tag":6757,"props":6834,"children":6835},{},[6836,6838,6843,6845,6850,6852,6857],{"type":44,"value":6837},"The client-side API and server-side API communicate with each other over a client-side ",{"type":29,"tag":59,"props":6839,"children":6841},{"className":6840},[],[6842],{"type":44,"value":679},{"type":44,"value":6844}," object and a server-side ",{"type":29,"tag":59,"props":6846,"children":6848},{"className":6847},[],[6849],{"type":44,"value":687},{"type":44,"value":6851}," object. These pass messages with one another through their runtime-defined ",{"type":29,"tag":59,"props":6853,"children":6855},{"className":6854},[],[6856],{"type":44,"value":1015},{"type":44,"value":6858}," callback.",{"type":29,"tag":6757,"props":6860,"children":6861},{},[6862,6867,6869,6874,6875,6880],{"type":29,"tag":59,"props":6863,"children":6865},{"className":6864},[],[6866],{"type":44,"value":679},{"type":44,"value":6868}," is responsible for constructing client side API's, the API methods you import from ",{"type":29,"tag":59,"props":6870,"children":6872},{"className":6871},[],[6873],{"type":44,"value":287},{"type":44,"value":4732},{"type":29,"tag":59,"props":6876,"children":6878},{"className":6877},[],[6879],{"type":44,"value":687},{"type":44,"value":6881}," is responsible for keeping track of the dispatcher objects on the server side.",{"type":29,"tag":6757,"props":6883,"children":6884},{},[6885,6887,6892],{"type":44,"value":6886},"The instances of the ",{"type":29,"tag":59,"props":6888,"children":6890},{"className":6889},[],[6891],{"type":44,"value":619},{"type":44,"value":6893}," subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.",{"type":29,"tag":6757,"props":6895,"children":6896},{},[6897,6902,6904,6909,6911,6916,6918,6923,6925,6930,6932,6937],{"type":29,"tag":59,"props":6898,"children":6900},{"className":6899},[],[6901],{"type":44,"value":679},{"type":44,"value":6903}," is wrapped by ",{"type":29,"tag":59,"props":6905,"children":6907},{"className":6906},[],[6908],{"type":44,"value":604},{"type":44,"value":6910}," subclasses, which all point to the same instance of ",{"type":29,"tag":59,"props":6912,"children":6914},{"className":6913},[],[6915],{"type":44,"value":679},{"type":44,"value":6917}," and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. ",{"type":29,"tag":59,"props":6919,"children":6921},{"className":6920},[],[6922],{"type":44,"value":642},{"type":44,"value":6924},". Similarly, ",{"type":29,"tag":59,"props":6926,"children":6928},{"className":6927},[],[6929],{"type":44,"value":687},{"type":44,"value":6931}," is wrapped by a subclass of ",{"type":29,"tag":59,"props":6933,"children":6935},{"className":6934},[],[6936],{"type":44,"value":619},{"type":44,"value":6938}," which is responsible for a part of the automated browser.",{"type":29,"tag":6757,"props":6940,"children":6941},{},[6942,6944,6949,6950,6955,6957,6963],{"type":44,"value":6943},"Both the ",{"type":29,"tag":59,"props":6945,"children":6947},{"className":6946},[],[6948],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6951,"children":6953},{"className":6952},[],[6954],{"type":44,"value":687},{"type":44,"value":6956}," classes keep track of the same object on each side of the client/server side of the divide with a unique ",{"type":29,"tag":59,"props":6958,"children":6960},{"className":6959},[],[6961],{"type":44,"value":6962},"GUID",{"type":44,"value":228},{"type":29,"tag":30,"props":6965,"children":6966},{},[6967,6969,6974,6975,6980],{"type":44,"value":6968},"Once you have parsed the functionality of ",{"type":29,"tag":59,"props":6970,"children":6972},{"className":6971},[],[6973],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6976,"children":6978},{"className":6977},[],[6979],{"type":44,"value":687},{"type":44,"value":6981},", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.",{"type":29,"tag":6983,"props":6984,"children":6985},"style",{},[6986],{"type":44,"value":6987},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":93,"depth":93,"links":6989},[6990,6995,6996,7002,7003],{"id":41,"depth":93,"text":45,"children":6991},[6992,6994],{"id":271,"depth":103,"text":6993},"Merging playwright and playwright-core",{"id":562,"depth":103,"text":565},{"id":704,"depth":93,"text":707},{"id":2168,"depth":93,"text":2171,"children":6997},[6998,6999,7000,7001],{"id":2633,"depth":103,"text":2636},{"id":3374,"depth":103,"text":3377},{"id":4626,"depth":103,"text":4629},{"id":4806,"depth":103,"text":4809},{"id":6308,"depth":93,"text":6311},{"id":6743,"depth":93,"text":6746},"markdown","content:playwright:how-playwright-initializes.md","content","playwright/how-playwright-initializes.md","md",1714258649789] \ No newline at end of file diff --git a/playwright/how-playwright-initializes/index.html b/playwright/how-playwright-initializes/index.html index 1cb5bf7..b682c24 100644 --- a/playwright/how-playwright-initializes/index.html +++ b/playwright/how-playwright-initializes/index.html @@ -1,8 +1,8 @@ QAComet | How importing from Playwright works - - + + @@ -22,44 +22,44 @@ - + - - + + - + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + -

Diagram of playwright-core initialization process

Peering into Playwright's import process

Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet

import { chromium } from '@playwright/test'
+

Diagram of playwright-core initialization process

Peering into Playwright's import process

Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet

import { chromium } from '@playwright/test'
 
 async function main () => {
   const browser = await chromium.launch()
@@ -298,5 +298,5 @@
   await page.goto("https://playwright.dev");
   // ... automate page interactions here
 })();
-

so for now we skip giving an overview of the BrowserServerLauncherImpl code and defer it to a later post.

Recap

Whew! That was quite the journey, so let's recap the main points we covered in this post:

  • @playwright/test is a wrapper around the test runner package packages/playwright and the browser automation package packages/playwright-core.
  • Importing from playwright-core is a dynamically generated process under the hood, which is done in packages/playwright-core/src/inProcessFactory.ts.
  • In playwright-core there are two main libraries, the src/client and src/server libraries.
  • This separation exists so other programming languages can easily build a client library which communicates with the src/server library.
  • The client-side API and server-side API communicate with each other over a client-side Connection object and a server-side DispatcherConnection object. These pass messages with one another through their runtime-defined onmessage callback.
  • Connection is responsible for constructing client side API's, the API methods you import from playwright-core, and DispatcherConnection is responsible for keeping track of the dispatcher objects on the server side.
  • The instances of the Dispatcher subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.
  • Connection is wrapped by ChannelOwner subclasses, which all point to the same instance of Connection and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. Page. Similarly, DispatcherConnection is wrapped by a subclass of Dispatcher which is responsible for a part of the automated browser.
  • Both the Connection and DispatcherConnection classes keep track of the same object on each side of the client/server side of the divide with a unique GUID.

Once you have parsed the functionality of Connection and DispatcherConnection, and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.

- \ No newline at end of file +

so for now we skip giving an overview of the BrowserServerLauncherImpl code and defer it to a later post.

Recap

Whew! That was quite the journey, so let's recap the main points we covered in this post:

  • @playwright/test is a wrapper around the test runner package packages/playwright and the browser automation package packages/playwright-core.
  • Importing from playwright-core is a dynamically generated process under the hood, which is done in packages/playwright-core/src/inProcessFactory.ts.
  • In playwright-core there are two main libraries, the src/client and src/server libraries.
  • This separation exists so other programming languages can easily build a client library which communicates with the src/server library.
  • The client-side API and server-side API communicate with each other over a client-side Connection object and a server-side DispatcherConnection object. These pass messages with one another through their runtime-defined onmessage callback.
  • Connection is responsible for constructing client side API's, the API methods you import from playwright-core, and DispatcherConnection is responsible for keeping track of the dispatcher objects on the server side.
  • The instances of the Dispatcher subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.
  • Connection is wrapped by ChannelOwner subclasses, which all point to the same instance of Connection and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. Page. Similarly, DispatcherConnection is wrapped by a subclass of Dispatcher which is responsible for a part of the automated browser.
  • Both the Connection and DispatcherConnection classes keep track of the same object on each side of the client/server side of the divide with a unique GUID.

Once you have parsed the functionality of Connection and DispatcherConnection, and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.

+ \ No newline at end of file diff --git a/playwright/index.html b/playwright/index.html index 01fc365..77321e3 100644 --- a/playwright/index.html +++ b/playwright/index.html @@ -1,8 +1,8 @@ QAComet | Internals of Playwright - - + + @@ -21,22 +21,22 @@ - + - - - - - - - - - - - - - + + + + + + + + + + + + + -

Playwright Internals

A series on the inner workings of Microsoft's Playwright framework

Mar
13
2024

How importing from Playwright works

Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured. Continue Reading

Mar
11
2024

Architecture of Playwright

Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components. Continue Reading

- \ No newline at end of file +

Playwright Internals

A series on the inner workings of Microsoft's Playwright framework

Mar
13
2024

How importing from Playwright works

Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured. Continue Reading

Mar
11
2024

Architecture of Playwright

Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components. Continue Reading

+ \ No newline at end of file diff --git a/privacy-policy/_payload.json b/privacy-policy/_payload.json index 14d4346..31b3dc7 100644 --- a/privacy-policy/_payload.json +++ b/privacy-policy/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":503},["Reactive",2],{"content-query-LjPlv9Sq1J":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":498,"_id":499,"_source":500,"_file":501,"_extension":502},"/privacy-policy","",false,"Privacy Policy","Effective Date: This Privacy Policy is effective as of February 16, 2024.",{"type":10,"children":11,"toc":481},"root",[12,31,36,43,48,60,71,82,93,104,115,126,131,137,142,149,164,170,188,194,222,227,233,238,267,272,278,283,311,317,322,327,343,356,361,367,372,377,382,387,392,398,403,438,443,449,454,459,464,470],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17,24,26],{"type":13,"tag":18,"props":19,"children":20},"strong",{},[21],{"type":22,"value":23},"text","Effective Date",{"type":22,"value":25},": ",{"type":13,"tag":18,"props":27,"children":28},{},[29],{"type":22,"value":30},"This Privacy Policy is effective as of February 16, 2024.",{"type":13,"tag":14,"props":32,"children":33},{},[34],{"type":22,"value":35},"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information.",{"type":13,"tag":37,"props":38,"children":40},"h2",{"id":39},"definitions",[41],{"type":22,"value":42},"DEFINITIONS:",{"type":13,"tag":14,"props":44,"children":45},{},[46],{"type":22,"value":47},"In this Privacy Policy, unless the context otherwise requires:",{"type":13,"tag":14,"props":49,"children":50},{},[51,53,58],{"type":22,"value":52},"\"",{"type":13,"tag":18,"props":54,"children":55},{},[56],{"type":22,"value":57},"QAComet",{"type":22,"value":59},"\" refers to the website operated by QAComet LLC accessible at QAComet.com",{"type":13,"tag":14,"props":61,"children":62},{},[63,64,69],{"type":22,"value":52},{"type":13,"tag":18,"props":65,"children":66},{},[67],{"type":22,"value":68},"Personal Information",{"type":22,"value":70},"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user.",{"type":13,"tag":14,"props":72,"children":73},{},[74,75,80],{"type":22,"value":52},{"type":13,"tag":18,"props":76,"children":77},{},[78],{"type":22,"value":79},"Non-Personal Information",{"type":22,"value":81},"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":14,"props":83,"children":84},{},[85,86,91],{"type":22,"value":52},{"type":13,"tag":18,"props":87,"children":88},{},[89],{"type":22,"value":90},"Cookies",{"type":22,"value":92},"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content.",{"type":13,"tag":14,"props":94,"children":95},{},[96,97,102],{"type":22,"value":52},{"type":13,"tag":18,"props":98,"children":99},{},[100],{"type":22,"value":101},"Google Analytics",{"type":22,"value":103},"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited.",{"type":13,"tag":14,"props":105,"children":106},{},[107,108,113],{"type":22,"value":52},{"type":13,"tag":18,"props":109,"children":110},{},[111],{"type":22,"value":112},"User",{"type":22,"value":114},"\" refers to any individual who accesses or uses the QAComet website.",{"type":13,"tag":14,"props":116,"children":117},{},[118,119,124],{"type":22,"value":52},{"type":13,"tag":18,"props":120,"children":121},{},[122],{"type":22,"value":123},"Owner",{"type":22,"value":125},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website.",{"type":13,"tag":14,"props":127,"children":128},{},[129],{"type":22,"value":130},"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein.",{"type":13,"tag":37,"props":132,"children":134},{"id":133},"_1-information-collection",[135],{"type":22,"value":136},"1. INFORMATION COLLECTION:",{"type":13,"tag":14,"props":138,"children":139},{},[140],{"type":22,"value":141},"We collect two types of information from users: personal information and non-personal information.",{"type":13,"tag":143,"props":144,"children":146},"h3",{"id":145},"personal-information",[147],{"type":22,"value":148},"Personal Information:",{"type":13,"tag":150,"props":151,"children":152},"ul",{},[153,159],{"type":13,"tag":154,"props":155,"children":156},"li",{},[157],{"type":22,"value":158},"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website.",{"type":13,"tag":154,"props":160,"children":161},{},[162],{"type":22,"value":163},"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website.",{"type":13,"tag":143,"props":165,"children":167},{"id":166},"non-personal-information",[168],{"type":22,"value":169},"Non-Personal Information:",{"type":13,"tag":150,"props":171,"children":172},{},[173,178,183],{"type":13,"tag":154,"props":174,"children":175},{},[176],{"type":22,"value":177},"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":154,"props":179,"children":180},{},[181],{"type":22,"value":182},"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience.",{"type":13,"tag":154,"props":184,"children":185},{},[186],{"type":22,"value":187},"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information.",{"type":13,"tag":143,"props":189,"children":191},{"id":190},"google-analytics",[192],{"type":22,"value":193},"Google Analytics:",{"type":13,"tag":150,"props":195,"children":196},{},[197,202,207,212,217],{"type":13,"tag":154,"props":198,"children":199},{},[200],{"type":22,"value":201},"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website.",{"type":13,"tag":154,"props":203,"children":204},{},[205],{"type":22,"value":206},"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited.",{"type":13,"tag":154,"props":208,"children":209},{},[210],{"type":22,"value":211},"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage.",{"type":13,"tag":154,"props":213,"children":214},{},[215],{"type":22,"value":216},"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google.",{"type":13,"tag":154,"props":218,"children":219},{},[220],{"type":22,"value":221},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy.",{"type":13,"tag":14,"props":223,"children":224},{},[225],{"type":22,"value":226},"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent.",{"type":13,"tag":37,"props":228,"children":230},{"id":229},"_2-use-of-information",[231],{"type":22,"value":232},"2. USE OF INFORMATION:",{"type":13,"tag":14,"props":234,"children":235},{},[236],{"type":22,"value":237},"We use the information collected from users for the following purposes:",{"type":13,"tag":239,"props":240,"children":241},"ol",{},[242,247,252,257,262],{"type":13,"tag":154,"props":243,"children":244},{},[245],{"type":22,"value":246},"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues.",{"type":13,"tag":154,"props":248,"children":249},{},[250],{"type":22,"value":251},"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services.",{"type":13,"tag":154,"props":253,"children":254},{},[255],{"type":22,"value":256},"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website.",{"type":13,"tag":154,"props":258,"children":259},{},[260],{"type":22,"value":261},"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity.",{"type":13,"tag":154,"props":263,"children":264},{},[265],{"type":22,"value":266},"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences.",{"type":13,"tag":14,"props":268,"children":269},{},[270],{"type":22,"value":271},"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies.",{"type":13,"tag":37,"props":273,"children":275},{"id":274},"_3-sharing-of-information",[276],{"type":22,"value":277},"3. SHARING OF INFORMATION:",{"type":13,"tag":14,"props":279,"children":280},{},[281],{"type":22,"value":282},"We may share both personal and non-personal information collected from users in the following circumstances:",{"type":13,"tag":239,"props":284,"children":285},{},[286,291,296,301,306],{"type":13,"tag":154,"props":287,"children":288},{},[289],{"type":22,"value":290},"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose.",{"type":13,"tag":154,"props":292,"children":293},{},[294],{"type":22,"value":295},"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others.",{"type":13,"tag":154,"props":297,"children":298},{},[299],{"type":22,"value":300},"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy.",{"type":13,"tag":154,"props":302,"children":303},{},[304],{"type":22,"value":305},"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications.",{"type":13,"tag":154,"props":307,"children":308},{},[309],{"type":22,"value":310},"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone.",{"type":13,"tag":37,"props":312,"children":314},{"id":313},"_4-google-analytics",[315],{"type":22,"value":316},"4. GOOGLE ANALYTICS:",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":22,"value":321},"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States.",{"type":13,"tag":14,"props":323,"children":324},{},[325],{"type":22,"value":326},"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience.",{"type":13,"tag":14,"props":328,"children":329},{},[330,332,341],{"type":22,"value":331},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: ",{"type":13,"tag":333,"props":334,"children":338},"a",{"href":335,"rel":336},"https://tools.google.com/dlpage/gaoptout",[337],"nofollow",[339],{"type":22,"value":340},"Google Analytics Opt-out Browser Add-on",{"type":22,"value":342},".",{"type":13,"tag":14,"props":344,"children":345},{},[346,348,355],{"type":22,"value":347},"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: ",{"type":13,"tag":333,"props":349,"children":352},{"href":350,"rel":351},"https://policies.google.com/privacy?hl=en-US",[337],[353],{"type":22,"value":354},"Google Privacy Policy",{"type":22,"value":342},{"type":13,"tag":14,"props":357,"children":358},{},[359],{"type":22,"value":360},"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website.",{"type":13,"tag":37,"props":362,"children":364},{"id":363},"_5-data-security",[365],{"type":22,"value":366},"5. DATA SECURITY:",{"type":13,"tag":14,"props":368,"children":369},{},[370],{"type":22,"value":371},"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information.",{"type":13,"tag":14,"props":373,"children":374},{},[375],{"type":22,"value":376},"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices.",{"type":13,"tag":14,"props":378,"children":379},{},[380],{"type":22,"value":381},"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security.",{"type":13,"tag":14,"props":383,"children":384},{},[385],{"type":22,"value":386},"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary.",{"type":13,"tag":14,"props":388,"children":389},{},[390],{"type":22,"value":391},"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels.",{"type":13,"tag":37,"props":393,"children":395},{"id":394},"_6-user-controls",[396],{"type":22,"value":397},"6. USER CONTROLS:",{"type":13,"tag":14,"props":399,"children":400},{},[401],{"type":22,"value":402},"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:",{"type":13,"tag":239,"props":404,"children":405},{},[406,411,416,428,433],{"type":13,"tag":154,"props":407,"children":408},{},[409],{"type":22,"value":410},"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website.",{"type":13,"tag":154,"props":412,"children":413},{},[414],{"type":22,"value":415},"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior.",{"type":13,"tag":154,"props":417,"children":418},{},[419,421,426],{"type":22,"value":420},"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at ",{"type":13,"tag":333,"props":422,"children":424},{"href":335,"rel":423},[337],[425],{"type":22,"value":340},{"type":22,"value":427},". This browser add-on allows users to prevent their data from being collected and used by Google Analytics.",{"type":13,"tag":154,"props":429,"children":430},{},[431],{"type":22,"value":432},"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services.",{"type":13,"tag":154,"props":434,"children":435},{},[436],{"type":22,"value":437},"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration.",{"type":13,"tag":14,"props":439,"children":440},{},[441],{"type":22,"value":442},"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights.",{"type":13,"tag":37,"props":444,"children":446},{"id":445},"_7-changes-to-the-privacy-policy",[447],{"type":22,"value":448},"7. CHANGES TO THE PRIVACY POLICY:",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":22,"value":453},"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":22,"value":458},"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":22,"value":463},"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law.",{"type":13,"tag":37,"props":465,"children":467},{"id":466},"_8-contact-information",[468],{"type":22,"value":469},"8. CONTACT INFORMATION:",{"type":13,"tag":14,"props":471,"children":472},{},[473,475],{"type":22,"value":474},"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please ",{"type":13,"tag":333,"props":476,"children":478},{"href":477},"mailto:contact@QAComet.com",[479],{"type":22,"value":480},"Contact Us",{"title":5,"searchDepth":482,"depth":482,"links":483},2,[484,485,491,492,493,494,495,496,497],{"id":39,"depth":482,"text":42},{"id":133,"depth":482,"text":136,"children":486},[487,489,490],{"id":145,"depth":488,"text":148},3,{"id":166,"depth":488,"text":169},{"id":190,"depth":488,"text":193},{"id":229,"depth":482,"text":232},{"id":274,"depth":482,"text":277},{"id":313,"depth":482,"text":316},{"id":363,"depth":482,"text":366},{"id":394,"depth":482,"text":397},{"id":445,"depth":482,"text":448},{"id":466,"depth":482,"text":469},"markdown","content:privacy-policy.md","content","privacy-policy.md","md",1714069923294] \ No newline at end of file +[{"data":1,"prerenderedAt":503},["Reactive",2],{"content-query-LjPlv9Sq1J":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":498,"_id":499,"_source":500,"_file":501,"_extension":502},"/privacy-policy","",false,"Privacy Policy","Effective Date: This Privacy Policy is effective as of February 16, 2024.",{"type":10,"children":11,"toc":481},"root",[12,31,36,43,48,60,71,82,93,104,115,126,131,137,142,149,164,170,188,194,222,227,233,238,267,272,278,283,311,317,322,327,343,356,361,367,372,377,382,387,392,398,403,438,443,449,454,459,464,470],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17,24,26],{"type":13,"tag":18,"props":19,"children":20},"strong",{},[21],{"type":22,"value":23},"text","Effective Date",{"type":22,"value":25},": ",{"type":13,"tag":18,"props":27,"children":28},{},[29],{"type":22,"value":30},"This Privacy Policy is effective as of February 16, 2024.",{"type":13,"tag":14,"props":32,"children":33},{},[34],{"type":22,"value":35},"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information.",{"type":13,"tag":37,"props":38,"children":40},"h2",{"id":39},"definitions",[41],{"type":22,"value":42},"DEFINITIONS:",{"type":13,"tag":14,"props":44,"children":45},{},[46],{"type":22,"value":47},"In this Privacy Policy, unless the context otherwise requires:",{"type":13,"tag":14,"props":49,"children":50},{},[51,53,58],{"type":22,"value":52},"\"",{"type":13,"tag":18,"props":54,"children":55},{},[56],{"type":22,"value":57},"QAComet",{"type":22,"value":59},"\" refers to the website operated by QAComet LLC accessible at QAComet.com",{"type":13,"tag":14,"props":61,"children":62},{},[63,64,69],{"type":22,"value":52},{"type":13,"tag":18,"props":65,"children":66},{},[67],{"type":22,"value":68},"Personal Information",{"type":22,"value":70},"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user.",{"type":13,"tag":14,"props":72,"children":73},{},[74,75,80],{"type":22,"value":52},{"type":13,"tag":18,"props":76,"children":77},{},[78],{"type":22,"value":79},"Non-Personal Information",{"type":22,"value":81},"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":14,"props":83,"children":84},{},[85,86,91],{"type":22,"value":52},{"type":13,"tag":18,"props":87,"children":88},{},[89],{"type":22,"value":90},"Cookies",{"type":22,"value":92},"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content.",{"type":13,"tag":14,"props":94,"children":95},{},[96,97,102],{"type":22,"value":52},{"type":13,"tag":18,"props":98,"children":99},{},[100],{"type":22,"value":101},"Google Analytics",{"type":22,"value":103},"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited.",{"type":13,"tag":14,"props":105,"children":106},{},[107,108,113],{"type":22,"value":52},{"type":13,"tag":18,"props":109,"children":110},{},[111],{"type":22,"value":112},"User",{"type":22,"value":114},"\" refers to any individual who accesses or uses the QAComet website.",{"type":13,"tag":14,"props":116,"children":117},{},[118,119,124],{"type":22,"value":52},{"type":13,"tag":18,"props":120,"children":121},{},[122],{"type":22,"value":123},"Owner",{"type":22,"value":125},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website.",{"type":13,"tag":14,"props":127,"children":128},{},[129],{"type":22,"value":130},"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein.",{"type":13,"tag":37,"props":132,"children":134},{"id":133},"_1-information-collection",[135],{"type":22,"value":136},"1. INFORMATION COLLECTION:",{"type":13,"tag":14,"props":138,"children":139},{},[140],{"type":22,"value":141},"We collect two types of information from users: personal information and non-personal information.",{"type":13,"tag":143,"props":144,"children":146},"h3",{"id":145},"personal-information",[147],{"type":22,"value":148},"Personal Information:",{"type":13,"tag":150,"props":151,"children":152},"ul",{},[153,159],{"type":13,"tag":154,"props":155,"children":156},"li",{},[157],{"type":22,"value":158},"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website.",{"type":13,"tag":154,"props":160,"children":161},{},[162],{"type":22,"value":163},"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website.",{"type":13,"tag":143,"props":165,"children":167},{"id":166},"non-personal-information",[168],{"type":22,"value":169},"Non-Personal Information:",{"type":13,"tag":150,"props":171,"children":172},{},[173,178,183],{"type":13,"tag":154,"props":174,"children":175},{},[176],{"type":22,"value":177},"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":154,"props":179,"children":180},{},[181],{"type":22,"value":182},"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience.",{"type":13,"tag":154,"props":184,"children":185},{},[186],{"type":22,"value":187},"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information.",{"type":13,"tag":143,"props":189,"children":191},{"id":190},"google-analytics",[192],{"type":22,"value":193},"Google Analytics:",{"type":13,"tag":150,"props":195,"children":196},{},[197,202,207,212,217],{"type":13,"tag":154,"props":198,"children":199},{},[200],{"type":22,"value":201},"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website.",{"type":13,"tag":154,"props":203,"children":204},{},[205],{"type":22,"value":206},"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited.",{"type":13,"tag":154,"props":208,"children":209},{},[210],{"type":22,"value":211},"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage.",{"type":13,"tag":154,"props":213,"children":214},{},[215],{"type":22,"value":216},"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google.",{"type":13,"tag":154,"props":218,"children":219},{},[220],{"type":22,"value":221},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy.",{"type":13,"tag":14,"props":223,"children":224},{},[225],{"type":22,"value":226},"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent.",{"type":13,"tag":37,"props":228,"children":230},{"id":229},"_2-use-of-information",[231],{"type":22,"value":232},"2. USE OF INFORMATION:",{"type":13,"tag":14,"props":234,"children":235},{},[236],{"type":22,"value":237},"We use the information collected from users for the following purposes:",{"type":13,"tag":239,"props":240,"children":241},"ol",{},[242,247,252,257,262],{"type":13,"tag":154,"props":243,"children":244},{},[245],{"type":22,"value":246},"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues.",{"type":13,"tag":154,"props":248,"children":249},{},[250],{"type":22,"value":251},"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services.",{"type":13,"tag":154,"props":253,"children":254},{},[255],{"type":22,"value":256},"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website.",{"type":13,"tag":154,"props":258,"children":259},{},[260],{"type":22,"value":261},"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity.",{"type":13,"tag":154,"props":263,"children":264},{},[265],{"type":22,"value":266},"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences.",{"type":13,"tag":14,"props":268,"children":269},{},[270],{"type":22,"value":271},"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies.",{"type":13,"tag":37,"props":273,"children":275},{"id":274},"_3-sharing-of-information",[276],{"type":22,"value":277},"3. SHARING OF INFORMATION:",{"type":13,"tag":14,"props":279,"children":280},{},[281],{"type":22,"value":282},"We may share both personal and non-personal information collected from users in the following circumstances:",{"type":13,"tag":239,"props":284,"children":285},{},[286,291,296,301,306],{"type":13,"tag":154,"props":287,"children":288},{},[289],{"type":22,"value":290},"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose.",{"type":13,"tag":154,"props":292,"children":293},{},[294],{"type":22,"value":295},"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others.",{"type":13,"tag":154,"props":297,"children":298},{},[299],{"type":22,"value":300},"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy.",{"type":13,"tag":154,"props":302,"children":303},{},[304],{"type":22,"value":305},"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications.",{"type":13,"tag":154,"props":307,"children":308},{},[309],{"type":22,"value":310},"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone.",{"type":13,"tag":37,"props":312,"children":314},{"id":313},"_4-google-analytics",[315],{"type":22,"value":316},"4. GOOGLE ANALYTICS:",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":22,"value":321},"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States.",{"type":13,"tag":14,"props":323,"children":324},{},[325],{"type":22,"value":326},"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience.",{"type":13,"tag":14,"props":328,"children":329},{},[330,332,341],{"type":22,"value":331},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: ",{"type":13,"tag":333,"props":334,"children":338},"a",{"href":335,"rel":336},"https://tools.google.com/dlpage/gaoptout",[337],"nofollow",[339],{"type":22,"value":340},"Google Analytics Opt-out Browser Add-on",{"type":22,"value":342},".",{"type":13,"tag":14,"props":344,"children":345},{},[346,348,355],{"type":22,"value":347},"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: ",{"type":13,"tag":333,"props":349,"children":352},{"href":350,"rel":351},"https://policies.google.com/privacy?hl=en-US",[337],[353],{"type":22,"value":354},"Google Privacy Policy",{"type":22,"value":342},{"type":13,"tag":14,"props":357,"children":358},{},[359],{"type":22,"value":360},"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website.",{"type":13,"tag":37,"props":362,"children":364},{"id":363},"_5-data-security",[365],{"type":22,"value":366},"5. DATA SECURITY:",{"type":13,"tag":14,"props":368,"children":369},{},[370],{"type":22,"value":371},"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information.",{"type":13,"tag":14,"props":373,"children":374},{},[375],{"type":22,"value":376},"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices.",{"type":13,"tag":14,"props":378,"children":379},{},[380],{"type":22,"value":381},"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security.",{"type":13,"tag":14,"props":383,"children":384},{},[385],{"type":22,"value":386},"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary.",{"type":13,"tag":14,"props":388,"children":389},{},[390],{"type":22,"value":391},"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels.",{"type":13,"tag":37,"props":393,"children":395},{"id":394},"_6-user-controls",[396],{"type":22,"value":397},"6. USER CONTROLS:",{"type":13,"tag":14,"props":399,"children":400},{},[401],{"type":22,"value":402},"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:",{"type":13,"tag":239,"props":404,"children":405},{},[406,411,416,428,433],{"type":13,"tag":154,"props":407,"children":408},{},[409],{"type":22,"value":410},"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website.",{"type":13,"tag":154,"props":412,"children":413},{},[414],{"type":22,"value":415},"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior.",{"type":13,"tag":154,"props":417,"children":418},{},[419,421,426],{"type":22,"value":420},"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at ",{"type":13,"tag":333,"props":422,"children":424},{"href":335,"rel":423},[337],[425],{"type":22,"value":340},{"type":22,"value":427},". This browser add-on allows users to prevent their data from being collected and used by Google Analytics.",{"type":13,"tag":154,"props":429,"children":430},{},[431],{"type":22,"value":432},"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services.",{"type":13,"tag":154,"props":434,"children":435},{},[436],{"type":22,"value":437},"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration.",{"type":13,"tag":14,"props":439,"children":440},{},[441],{"type":22,"value":442},"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights.",{"type":13,"tag":37,"props":444,"children":446},{"id":445},"_7-changes-to-the-privacy-policy",[447],{"type":22,"value":448},"7. CHANGES TO THE PRIVACY POLICY:",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":22,"value":453},"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":22,"value":458},"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":22,"value":463},"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law.",{"type":13,"tag":37,"props":465,"children":467},{"id":466},"_8-contact-information",[468],{"type":22,"value":469},"8. CONTACT INFORMATION:",{"type":13,"tag":14,"props":471,"children":472},{},[473,475],{"type":22,"value":474},"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please ",{"type":13,"tag":333,"props":476,"children":478},{"href":477},"mailto:contact@QAComet.com",[479],{"type":22,"value":480},"Contact Us",{"title":5,"searchDepth":482,"depth":482,"links":483},2,[484,485,491,492,493,494,495,496,497],{"id":39,"depth":482,"text":42},{"id":133,"depth":482,"text":136,"children":486},[487,489,490],{"id":145,"depth":488,"text":148},3,{"id":166,"depth":488,"text":169},{"id":190,"depth":488,"text":193},{"id":229,"depth":482,"text":232},{"id":274,"depth":482,"text":277},{"id":313,"depth":482,"text":316},{"id":363,"depth":482,"text":366},{"id":394,"depth":482,"text":397},{"id":445,"depth":482,"text":448},{"id":466,"depth":482,"text":469},"markdown","content:privacy-policy.md","content","privacy-policy.md","md",1714258649625] \ No newline at end of file diff --git a/privacy-policy/index.html b/privacy-policy/index.html index 527c66a..1bcd742 100644 --- a/privacy-policy/index.html +++ b/privacy-policy/index.html @@ -1,15 +1,15 @@ Privacy Policy - - + + - + @@ -21,38 +21,38 @@ - + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - -
- \ No newline at end of file + +
+ \ No newline at end of file diff --git a/terms-and-conditions/_payload.json b/terms-and-conditions/_payload.json index f63c411..1eac89d 100644 --- a/terms-and-conditions/_payload.json +++ b/terms-and-conditions/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":421},["Reactive",2],{"content-query-tsMkigp1TY":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":416,"_id":417,"_source":418,"_file":419,"_extension":420},"/terms-and-conditions","",false,"Terms And Conditions","Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").",{"type":10,"children":11,"toc":403},"root",[12,19,31,38,43,64,76,81,92,103,114,125,136,142,147,152,157,162,168,173,178,183,188,194,199,204,209,214,219,224,230,244,250,255,260,265,270,275,281,286,291,296,302,307,312,317,322,328,333,338,343,348,353,359,364,369,374,379,384,389,394],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22,24],{"type":18,"value":23},"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please ",{"type":13,"tag":25,"props":26,"children":28},"a",{"href":27},"mailto:contact@QAComet.com",[29],{"type":18,"value":30},"Contact Us",{"type":13,"tag":32,"props":33,"children":35},"h2",{"id":34},"definitions",[36],{"type":18,"value":37},"DEFINITIONS",{"type":13,"tag":14,"props":39,"children":40},{},[41],{"type":18,"value":42},"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:",{"type":13,"tag":14,"props":44,"children":45},{},[46,52,54,62],{"type":13,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":18,"value":51},"Website",{"type":18,"value":53},"\" refers to the QAComet website, accessible at ",{"type":13,"tag":25,"props":55,"children":59},{"href":56,"rel":57},"https://qacomet.com/",[58],"nofollow",[60],{"type":18,"value":61},"QAComet.com",{"type":18,"value":63},", including all associated web pages.",{"type":13,"tag":14,"props":65,"children":66},{},[67,69,74],{"type":18,"value":68},"\"",{"type":13,"tag":47,"props":70,"children":71},{},[72],{"type":18,"value":73},"Owner",{"type":18,"value":75},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website.",{"type":13,"tag":14,"props":77,"children":78},{},[79],{"type":18,"value":80},"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website.",{"type":13,"tag":14,"props":82,"children":83},{},[84,85,90],{"type":18,"value":68},{"type":13,"tag":47,"props":86,"children":87},{},[88],{"type":18,"value":89},"Services",{"type":18,"value":91},"\" refers to any products, features, or functionalities offered on the Website.",{"type":13,"tag":14,"props":93,"children":94},{},[95,96,101],{"type":18,"value":68},{"type":13,"tag":47,"props":97,"children":98},{},[99],{"type":18,"value":100},"Content",{"type":18,"value":102},"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website.",{"type":13,"tag":14,"props":104,"children":105},{},[106,107,112],{"type":18,"value":68},{"type":13,"tag":47,"props":108,"children":109},{},[110],{"type":18,"value":111},"Affiliates",{"type":18,"value":113},"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner.",{"type":13,"tag":14,"props":115,"children":116},{},[117,118,123],{"type":18,"value":68},{"type":13,"tag":47,"props":119,"children":120},{},[121],{"type":18,"value":122},"Terms",{"type":18,"value":124},"\" refers to these General Terms and Conditions governing the use of the Website.",{"type":13,"tag":14,"props":126,"children":127},{},[128,129,134],{"type":18,"value":68},{"type":13,"tag":47,"props":130,"children":131},{},[132],{"type":18,"value":133},"Modification",{"type":18,"value":135},"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion.",{"type":13,"tag":32,"props":137,"children":139},{"id":138},"_1-acceptance-of-terms",[140],{"type":18,"value":141},"1. ACCEPTANCE OF TERMS:",{"type":13,"tag":14,"props":143,"children":144},{},[145],{"type":18,"value":146},"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website.",{"type":13,"tag":14,"props":148,"children":149},{},[150],{"type":18,"value":151},"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet.",{"type":13,"tag":14,"props":153,"children":154},{},[155],{"type":18,"value":156},"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes.",{"type":13,"tag":14,"props":158,"children":159},{},[160],{"type":18,"value":161},"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website.",{"type":13,"tag":32,"props":163,"children":165},{"id":164},"_2-use-of-website",[166],{"type":18,"value":167},"2. USE OF WEBSITE",{"type":13,"tag":14,"props":169,"children":170},{},[171],{"type":18,"value":172},"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable.",{"type":13,"tag":14,"props":174,"children":175},{},[176],{"type":18,"value":177},"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection.",{"type":13,"tag":14,"props":179,"children":180},{},[181],{"type":18,"value":182},"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable.",{"type":13,"tag":14,"props":184,"children":185},{},[186],{"type":18,"value":187},"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities",{"type":13,"tag":32,"props":189,"children":191},{"id":190},"_3-intellectual-property",[192],{"type":18,"value":193},"3. INTELLECTUAL PROPERTY:",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties.",{"type":13,"tag":32,"props":225,"children":227},{"id":226},"_4-privacy-policy",[228],{"type":18,"value":229},"4. PRIVACY POLICY",{"type":13,"tag":14,"props":231,"children":232},{},[233,235,242],{"type":18,"value":234},"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our ",{"type":13,"tag":25,"props":236,"children":239},{"href":237,"rel":238},"https://qacomet.com/privacy-policy",[58],[240],{"type":18,"value":241},"Privacy Policy",{"type":18,"value":243},".",{"type":13,"tag":32,"props":245,"children":247},{"id":246},"_5-disclaimer-of-warranties",[248],{"type":18,"value":249},"5. DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":251,"children":252},{},[253],{"type":18,"value":254},"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content.",{"type":13,"tag":14,"props":256,"children":257},{},[258],{"type":18,"value":259},"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.",{"type":13,"tag":14,"props":261,"children":262},{},[263],{"type":18,"value":264},"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use.",{"type":13,"tag":14,"props":266,"children":267},{},[268],{"type":18,"value":269},"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise.",{"type":13,"tag":14,"props":271,"children":272},{},[273],{"type":18,"value":274},"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":276,"children":278},{"id":277},"_6-limitation-of-liability",[279],{"type":18,"value":280},"6. LIMITATION OF LIABILITY:",{"type":13,"tag":14,"props":282,"children":283},{},[284],{"type":18,"value":285},"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages.",{"type":13,"tag":14,"props":287,"children":288},{},[289],{"type":18,"value":290},"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability.",{"type":13,"tag":14,"props":292,"children":293},{},[294],{"type":18,"value":295},"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":297,"children":299},{"id":298},"_7-modification-and-termination",[300],{"type":18,"value":301},"7. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":303,"children":304},{},[305],{"type":18,"value":306},"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms.",{"type":13,"tag":14,"props":308,"children":309},{},[310],{"type":18,"value":311},"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website.",{"type":13,"tag":14,"props":313,"children":314},{},[315],{"type":18,"value":316},"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination.",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":18,"value":321},"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it.",{"type":13,"tag":32,"props":323,"children":325},{"id":324},"_8-governing-law-and-dispute-resolution",[326],{"type":18,"value":327},"8. GOVERNING LAW AND DISPUTE RESOLUTION:",{"type":13,"tag":14,"props":329,"children":330},{},[331],{"type":18,"value":332},"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles.",{"type":13,"tag":14,"props":334,"children":335},{},[336],{"type":18,"value":337},"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction.",{"type":13,"tag":14,"props":339,"children":340},{},[341],{"type":18,"value":342},"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party.",{"type":13,"tag":14,"props":344,"children":345},{},[346],{"type":18,"value":347},"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security.",{"type":13,"tag":14,"props":349,"children":350},{},[351],{"type":18,"value":352},"The language of arbitration and all related proceedings shall be English.",{"type":13,"tag":32,"props":354,"children":356},{"id":355},"_9-miscellaneous",[357],{"type":18,"value":358},"9. MISCELLANEOUS:",{"type":13,"tag":14,"props":360,"children":361},{},[362],{"type":18,"value":363},"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law.",{"type":13,"tag":14,"props":365,"children":366},{},[367],{"type":18,"value":368},"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter.",{"type":13,"tag":14,"props":370,"children":371},{},[372],{"type":18,"value":373},"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction.",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms.",{"type":13,"tag":14,"props":395,"children":396},{},[397,399],{"type":18,"value":398},"Contact Information: If you have any questions about these Terms or the QAComet website, please ",{"type":13,"tag":25,"props":400,"children":401},{"href":27},[402],{"type":18,"value":30},{"title":5,"searchDepth":404,"depth":404,"links":405},2,[406,407,408,409,410,411,412,413,414,415],{"id":34,"depth":404,"text":37},{"id":138,"depth":404,"text":141},{"id":164,"depth":404,"text":167},{"id":190,"depth":404,"text":193},{"id":226,"depth":404,"text":229},{"id":246,"depth":404,"text":249},{"id":277,"depth":404,"text":280},{"id":298,"depth":404,"text":301},{"id":324,"depth":404,"text":327},{"id":355,"depth":404,"text":358},"markdown","content:terms-and-conditions.md","content","terms-and-conditions.md","md",1714069923298] \ No newline at end of file +[{"data":1,"prerenderedAt":421},["Reactive",2],{"content-query-tsMkigp1TY":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":416,"_id":417,"_source":418,"_file":419,"_extension":420},"/terms-and-conditions","",false,"Terms And Conditions","Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").",{"type":10,"children":11,"toc":403},"root",[12,19,31,38,43,64,76,81,92,103,114,125,136,142,147,152,157,162,168,173,178,183,188,194,199,204,209,214,219,224,230,244,250,255,260,265,270,275,281,286,291,296,302,307,312,317,322,328,333,338,343,348,353,359,364,369,374,379,384,389,394],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22,24],{"type":18,"value":23},"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please ",{"type":13,"tag":25,"props":26,"children":28},"a",{"href":27},"mailto:contact@QAComet.com",[29],{"type":18,"value":30},"Contact Us",{"type":13,"tag":32,"props":33,"children":35},"h2",{"id":34},"definitions",[36],{"type":18,"value":37},"DEFINITIONS",{"type":13,"tag":14,"props":39,"children":40},{},[41],{"type":18,"value":42},"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:",{"type":13,"tag":14,"props":44,"children":45},{},[46,52,54,62],{"type":13,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":18,"value":51},"Website",{"type":18,"value":53},"\" refers to the QAComet website, accessible at ",{"type":13,"tag":25,"props":55,"children":59},{"href":56,"rel":57},"https://qacomet.com/",[58],"nofollow",[60],{"type":18,"value":61},"QAComet.com",{"type":18,"value":63},", including all associated web pages.",{"type":13,"tag":14,"props":65,"children":66},{},[67,69,74],{"type":18,"value":68},"\"",{"type":13,"tag":47,"props":70,"children":71},{},[72],{"type":18,"value":73},"Owner",{"type":18,"value":75},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website.",{"type":13,"tag":14,"props":77,"children":78},{},[79],{"type":18,"value":80},"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website.",{"type":13,"tag":14,"props":82,"children":83},{},[84,85,90],{"type":18,"value":68},{"type":13,"tag":47,"props":86,"children":87},{},[88],{"type":18,"value":89},"Services",{"type":18,"value":91},"\" refers to any products, features, or functionalities offered on the Website.",{"type":13,"tag":14,"props":93,"children":94},{},[95,96,101],{"type":18,"value":68},{"type":13,"tag":47,"props":97,"children":98},{},[99],{"type":18,"value":100},"Content",{"type":18,"value":102},"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website.",{"type":13,"tag":14,"props":104,"children":105},{},[106,107,112],{"type":18,"value":68},{"type":13,"tag":47,"props":108,"children":109},{},[110],{"type":18,"value":111},"Affiliates",{"type":18,"value":113},"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner.",{"type":13,"tag":14,"props":115,"children":116},{},[117,118,123],{"type":18,"value":68},{"type":13,"tag":47,"props":119,"children":120},{},[121],{"type":18,"value":122},"Terms",{"type":18,"value":124},"\" refers to these General Terms and Conditions governing the use of the Website.",{"type":13,"tag":14,"props":126,"children":127},{},[128,129,134],{"type":18,"value":68},{"type":13,"tag":47,"props":130,"children":131},{},[132],{"type":18,"value":133},"Modification",{"type":18,"value":135},"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion.",{"type":13,"tag":32,"props":137,"children":139},{"id":138},"_1-acceptance-of-terms",[140],{"type":18,"value":141},"1. ACCEPTANCE OF TERMS:",{"type":13,"tag":14,"props":143,"children":144},{},[145],{"type":18,"value":146},"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website.",{"type":13,"tag":14,"props":148,"children":149},{},[150],{"type":18,"value":151},"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet.",{"type":13,"tag":14,"props":153,"children":154},{},[155],{"type":18,"value":156},"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes.",{"type":13,"tag":14,"props":158,"children":159},{},[160],{"type":18,"value":161},"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website.",{"type":13,"tag":32,"props":163,"children":165},{"id":164},"_2-use-of-website",[166],{"type":18,"value":167},"2. USE OF WEBSITE",{"type":13,"tag":14,"props":169,"children":170},{},[171],{"type":18,"value":172},"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable.",{"type":13,"tag":14,"props":174,"children":175},{},[176],{"type":18,"value":177},"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection.",{"type":13,"tag":14,"props":179,"children":180},{},[181],{"type":18,"value":182},"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable.",{"type":13,"tag":14,"props":184,"children":185},{},[186],{"type":18,"value":187},"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities",{"type":13,"tag":32,"props":189,"children":191},{"id":190},"_3-intellectual-property",[192],{"type":18,"value":193},"3. INTELLECTUAL PROPERTY:",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties.",{"type":13,"tag":32,"props":225,"children":227},{"id":226},"_4-privacy-policy",[228],{"type":18,"value":229},"4. PRIVACY POLICY",{"type":13,"tag":14,"props":231,"children":232},{},[233,235,242],{"type":18,"value":234},"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our ",{"type":13,"tag":25,"props":236,"children":239},{"href":237,"rel":238},"https://qacomet.com/privacy-policy",[58],[240],{"type":18,"value":241},"Privacy Policy",{"type":18,"value":243},".",{"type":13,"tag":32,"props":245,"children":247},{"id":246},"_5-disclaimer-of-warranties",[248],{"type":18,"value":249},"5. DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":251,"children":252},{},[253],{"type":18,"value":254},"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content.",{"type":13,"tag":14,"props":256,"children":257},{},[258],{"type":18,"value":259},"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.",{"type":13,"tag":14,"props":261,"children":262},{},[263],{"type":18,"value":264},"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use.",{"type":13,"tag":14,"props":266,"children":267},{},[268],{"type":18,"value":269},"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise.",{"type":13,"tag":14,"props":271,"children":272},{},[273],{"type":18,"value":274},"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":276,"children":278},{"id":277},"_6-limitation-of-liability",[279],{"type":18,"value":280},"6. LIMITATION OF LIABILITY:",{"type":13,"tag":14,"props":282,"children":283},{},[284],{"type":18,"value":285},"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages.",{"type":13,"tag":14,"props":287,"children":288},{},[289],{"type":18,"value":290},"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability.",{"type":13,"tag":14,"props":292,"children":293},{},[294],{"type":18,"value":295},"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":297,"children":299},{"id":298},"_7-modification-and-termination",[300],{"type":18,"value":301},"7. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":303,"children":304},{},[305],{"type":18,"value":306},"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms.",{"type":13,"tag":14,"props":308,"children":309},{},[310],{"type":18,"value":311},"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website.",{"type":13,"tag":14,"props":313,"children":314},{},[315],{"type":18,"value":316},"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination.",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":18,"value":321},"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it.",{"type":13,"tag":32,"props":323,"children":325},{"id":324},"_8-governing-law-and-dispute-resolution",[326],{"type":18,"value":327},"8. GOVERNING LAW AND DISPUTE RESOLUTION:",{"type":13,"tag":14,"props":329,"children":330},{},[331],{"type":18,"value":332},"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles.",{"type":13,"tag":14,"props":334,"children":335},{},[336],{"type":18,"value":337},"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction.",{"type":13,"tag":14,"props":339,"children":340},{},[341],{"type":18,"value":342},"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party.",{"type":13,"tag":14,"props":344,"children":345},{},[346],{"type":18,"value":347},"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security.",{"type":13,"tag":14,"props":349,"children":350},{},[351],{"type":18,"value":352},"The language of arbitration and all related proceedings shall be English.",{"type":13,"tag":32,"props":354,"children":356},{"id":355},"_9-miscellaneous",[357],{"type":18,"value":358},"9. MISCELLANEOUS:",{"type":13,"tag":14,"props":360,"children":361},{},[362],{"type":18,"value":363},"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law.",{"type":13,"tag":14,"props":365,"children":366},{},[367],{"type":18,"value":368},"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter.",{"type":13,"tag":14,"props":370,"children":371},{},[372],{"type":18,"value":373},"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction.",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms.",{"type":13,"tag":14,"props":395,"children":396},{},[397,399],{"type":18,"value":398},"Contact Information: If you have any questions about these Terms or the QAComet website, please ",{"type":13,"tag":25,"props":400,"children":401},{"href":27},[402],{"type":18,"value":30},{"title":5,"searchDepth":404,"depth":404,"links":405},2,[406,407,408,409,410,411,412,413,414,415],{"id":34,"depth":404,"text":37},{"id":138,"depth":404,"text":141},{"id":164,"depth":404,"text":167},{"id":190,"depth":404,"text":193},{"id":226,"depth":404,"text":229},{"id":246,"depth":404,"text":249},{"id":277,"depth":404,"text":280},{"id":298,"depth":404,"text":301},{"id":324,"depth":404,"text":327},{"id":355,"depth":404,"text":358},"markdown","content:terms-and-conditions.md","content","terms-and-conditions.md","md",1714258642243] \ No newline at end of file diff --git a/terms-and-conditions/index.html b/terms-and-conditions/index.html index a345967..ce9f805 100644 --- a/terms-and-conditions/index.html +++ b/terms-and-conditions/index.html @@ -1,15 +1,15 @@ Terms And Conditions - - + + - + @@ -21,34 +21,34 @@ - + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - -
- \ No newline at end of file + +
+ \ No newline at end of file diff --git a/terms-of-service/_payload.json b/terms-of-service/_payload.json index 73694ea..517c874 100644 --- a/terms-of-service/_payload.json +++ b/terms-of-service/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":792},["Reactive",2],{"content-query-InhJyj2aeT":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":787,"_id":788,"_source":789,"_file":790,"_extension":791},"/terms-of-service","",false,"Terms Of Service","Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.",{"type":10,"children":11,"toc":768},"root",[12,19,24,29,34,39,46,57,67,77,87,97,107,117,127,137,147,157,167,173,184,189,194,199,204,209,214,219,224,230,239,244,249,254,260,269,274,279,284,290,299,304,309,314,320,329,334,339,344,349,354,359,365,374,379,384,389,394,399,404,409,414,420,429,434,439,444,449,454,459,464,469,474,479,485,496,501,506,511,516,521,526,532,537,542,547,552,558,567,572,577,582,587,592,597,603,612,617,622,627,632,637,642,647,653,662,667,672,677,682,688,697,702,707,721,726,732,741,746,751,757],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22],{"type":18,"value":23},"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services.",{"type":13,"tag":14,"props":25,"children":26},{},[27],{"type":18,"value":28},"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more.",{"type":13,"tag":14,"props":30,"children":31},{},[32],{"type":18,"value":33},"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference.",{"type":13,"tag":14,"props":35,"children":36},{},[37],{"type":18,"value":38},"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us.",{"type":13,"tag":40,"props":41,"children":43},"h2",{"id":42},"definitions",[44],{"type":18,"value":45},"Definitions:",{"type":13,"tag":14,"props":47,"children":48},{},[49,55],{"type":13,"tag":50,"props":51,"children":52},"strong",{},[53],{"type":18,"value":54},"Client",{"type":18,"value":56},": Refers to individuals or entities who utilize QAComet's QA/Testing services.",{"type":13,"tag":14,"props":58,"children":59},{},[60,65],{"type":13,"tag":50,"props":61,"children":62},{},[63],{"type":18,"value":64},"Company",{"type":18,"value":66},": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms.",{"type":13,"tag":14,"props":68,"children":69},{},[70,75],{"type":13,"tag":50,"props":71,"children":72},{},[73],{"type":18,"value":74},"Services",{"type":18,"value":76},": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company.",{"type":13,"tag":14,"props":78,"children":79},{},[80,85],{"type":13,"tag":50,"props":81,"children":82},{},[83],{"type":18,"value":84},"Materials",{"type":18,"value":86},": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services.",{"type":13,"tag":14,"props":88,"children":89},{},[90,95],{"type":13,"tag":50,"props":91,"children":92},{},[93],{"type":18,"value":94},"Ownership",{"type":18,"value":96},": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms.",{"type":13,"tag":14,"props":98,"children":99},{},[100,105],{"type":13,"tag":50,"props":101,"children":102},{},[103],{"type":18,"value":104},"Client-Specific Utilities",{"type":18,"value":106},": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services.",{"type":13,"tag":14,"props":108,"children":109},{},[110,115],{"type":13,"tag":50,"props":111,"children":112},{},[113],{"type":18,"value":114},"Design Patterns",{"type":18,"value":116},": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects.",{"type":13,"tag":14,"props":118,"children":119},{},[120,125],{"type":13,"tag":50,"props":121,"children":122},{},[123],{"type":18,"value":124},"Trial Period",{"type":18,"value":126},": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription.",{"type":13,"tag":14,"props":128,"children":129},{},[130,135],{"type":13,"tag":50,"props":131,"children":132},{},[133],{"type":18,"value":134},"Subscription Fee",{"type":18,"value":136},": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis.",{"type":13,"tag":14,"props":138,"children":139},{},[140,145],{"type":13,"tag":50,"props":141,"children":142},{},[143],{"type":18,"value":144},"Intellectual Property Rights",{"type":18,"value":146},": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms.",{"type":13,"tag":14,"props":148,"children":149},{},[150,155],{"type":13,"tag":50,"props":151,"children":152},{},[153],{"type":18,"value":154},"Dispute Resolution",{"type":18,"value":156},": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms.",{"type":13,"tag":14,"props":158,"children":159},{},[160,165],{"type":13,"tag":50,"props":161,"children":162},{},[163],{"type":18,"value":164},"Privacy Policy",{"type":18,"value":166},": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms.",{"type":13,"tag":40,"props":168,"children":170},{"id":169},"_2-scope-of-service",[171],{"type":18,"value":172},"2. SCOPE OF SERVICE",{"type":13,"tag":14,"props":174,"children":175},{},[176,178],{"type":18,"value":177},"Summary: ",{"type":13,"tag":179,"props":180,"children":181},"em",{},[182],{"type":18,"value":183},"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients.",{"type":13,"tag":14,"props":185,"children":186},{},[187],{"type":18,"value":188},"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:",{"type":13,"tag":14,"props":190,"children":191},{},[192],{"type":18,"value":193},"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing.",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions.",{"type":13,"tag":40,"props":225,"children":227},{"id":226},"_3-account-security",[228],{"type":18,"value":229},"3. ACCOUNT SECURITY",{"type":13,"tag":14,"props":231,"children":232},{},[233,234],{"type":18,"value":177},{"type":13,"tag":179,"props":235,"children":236},{},[237],{"type":18,"value":238},"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested.",{"type":13,"tag":14,"props":240,"children":241},{},[242],{"type":18,"value":243},"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals.",{"type":13,"tag":14,"props":245,"children":246},{},[247],{"type":18,"value":248},"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision.",{"type":13,"tag":14,"props":250,"children":251},{},[252],{"type":18,"value":253},"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet.",{"type":13,"tag":40,"props":255,"children":257},{"id":256},"_4-right-to-refuse-or-cancel-services",[258],{"type":18,"value":259},"4. RIGHT TO REFUSE OR CANCEL SERVICES",{"type":13,"tag":14,"props":261,"children":262},{},[263,264],{"type":18,"value":177},{"type":13,"tag":179,"props":265,"children":266},{},[267],{"type":18,"value":268},"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested.",{"type":13,"tag":14,"props":270,"children":271},{},[272],{"type":18,"value":273},"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service.",{"type":13,"tag":14,"props":275,"children":276},{},[277],{"type":18,"value":278},"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation.",{"type":13,"tag":14,"props":280,"children":281},{},[282],{"type":18,"value":283},"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law.",{"type":13,"tag":40,"props":285,"children":287},{"id":286},"_5-promotional-rights",[288],{"type":18,"value":289},"5. PROMOTIONAL RIGHTS:",{"type":13,"tag":14,"props":291,"children":292},{},[293,294],{"type":18,"value":177},{"type":13,"tag":179,"props":295,"children":296},{},[297],{"type":18,"value":298},"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested.",{"type":13,"tag":14,"props":300,"children":301},{},[302],{"type":18,"value":303},"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies.",{"type":13,"tag":14,"props":305,"children":306},{},[307],{"type":18,"value":308},"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information.",{"type":13,"tag":14,"props":310,"children":311},{},[312],{"type":18,"value":313},"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials.",{"type":13,"tag":40,"props":315,"children":317},{"id":316},"_6-ownership-of-materials",[318],{"type":18,"value":319},"6. OWNERSHIP OF MATERIALS:",{"type":13,"tag":14,"props":321,"children":322},{},[323,324],{"type":18,"value":177},{"type":13,"tag":179,"props":325,"children":326},{},[327],{"type":18,"value":328},"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights.",{"type":13,"tag":14,"props":330,"children":331},{},[332],{"type":18,"value":333},"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services.",{"type":13,"tag":14,"props":335,"children":336},{},[337],{"type":18,"value":338},"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities.",{"type":13,"tag":14,"props":340,"children":341},{},[342],{"type":18,"value":343},"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet.",{"type":13,"tag":14,"props":345,"children":346},{},[347],{"type":18,"value":348},"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes.",{"type":13,"tag":14,"props":350,"children":351},{},[352],{"type":18,"value":353},"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":355,"children":356},{},[357],{"type":18,"value":358},"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials.",{"type":13,"tag":40,"props":360,"children":362},{"id":361},"_7-client-responsibilities",[363],{"type":18,"value":364},"7. CLIENT RESPONSIBILITIES:",{"type":13,"tag":14,"props":366,"children":367},{},[368,369],{"type":18,"value":177},{"type":13,"tag":179,"props":370,"children":371},{},[372],{"type":18,"value":373},"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities.",{"type":13,"tag":14,"props":395,"children":396},{},[397],{"type":18,"value":398},"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet.",{"type":13,"tag":14,"props":400,"children":401},{},[402],{"type":18,"value":403},"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested.",{"type":13,"tag":14,"props":405,"children":406},{},[407],{"type":18,"value":408},"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach.",{"type":13,"tag":14,"props":410,"children":411},{},[412],{"type":18,"value":413},"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions.",{"type":13,"tag":40,"props":415,"children":417},{"id":416},"_8-billing-and-payments",[418],{"type":18,"value":419},"8. BILLING AND PAYMENTS:",{"type":13,"tag":14,"props":421,"children":422},{},[423,424],{"type":18,"value":177},{"type":13,"tag":179,"props":425,"children":426},{},[427],{"type":18,"value":428},"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients.",{"type":13,"tag":14,"props":430,"children":431},{},[432],{"type":18,"value":433},"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:",{"type":13,"tag":14,"props":435,"children":436},{},[437],{"type":18,"value":438},"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client.",{"type":13,"tag":14,"props":440,"children":441},{},[442],{"type":18,"value":443},"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate.",{"type":13,"tag":14,"props":445,"children":446},{},[447],{"type":18,"value":448},"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month.",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":18,"value":453},"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":18,"value":458},"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":18,"value":463},"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle.",{"type":13,"tag":14,"props":465,"children":466},{},[467],{"type":18,"value":468},"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription.",{"type":13,"tag":14,"props":470,"children":471},{},[472],{"type":18,"value":473},"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full.",{"type":13,"tag":14,"props":475,"children":476},{},[477],{"type":18,"value":478},"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client.",{"type":13,"tag":40,"props":480,"children":482},{"id":481},"_9-intellectual-property-rights",[483],{"type":18,"value":484},"9. INTELLECTUAL PROPERTY RIGHTS:",{"type":13,"tag":14,"props":486,"children":487},{},[488,489,494],{"type":18,"value":177},{"type":13,"tag":179,"props":490,"children":491},{},[492],{"type":18,"value":493},"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests.",{"type":18,"value":495},"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:",{"type":13,"tag":14,"props":497,"children":498},{},[499],{"type":18,"value":500},"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services.",{"type":13,"tag":14,"props":502,"children":503},{},[504],{"type":18,"value":505},"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets.",{"type":13,"tag":14,"props":507,"children":508},{},[509],{"type":18,"value":510},"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":512,"children":513},{},[514],{"type":18,"value":515},"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties.",{"type":13,"tag":14,"props":517,"children":518},{},[519],{"type":18,"value":520},"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent.",{"type":13,"tag":14,"props":522,"children":523},{},[524],{"type":18,"value":525},"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client.",{"type":13,"tag":40,"props":527,"children":529},{"id":528},"_10-qacomet-pre-existing-ip-materials",[530],{"type":18,"value":531},"10. QACOMET Pre-Existing IP MATERIALS.",{"type":13,"tag":14,"props":533,"children":534},{},[535],{"type":18,"value":536},"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”).",{"type":13,"tag":14,"props":538,"children":539},{},[540],{"type":18,"value":541},"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services.",{"type":13,"tag":14,"props":543,"children":544},{},[545],{"type":18,"value":546},"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission.",{"type":13,"tag":14,"props":548,"children":549},{},[550],{"type":18,"value":551},"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement.",{"type":13,"tag":40,"props":553,"children":555},{"id":554},"_11-limitation-of-liability-and-disclaimer-of-warranties",[556],{"type":18,"value":557},"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":559,"children":560},{},[561,562],{"type":18,"value":177},{"type":13,"tag":179,"props":563,"children":564},{},[565],{"type":18,"value":566},"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing.",{"type":13,"tag":14,"props":568,"children":569},{},[570],{"type":18,"value":571},"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:",{"type":13,"tag":14,"props":573,"children":574},{},[575],{"type":18,"value":576},"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access.",{"type":13,"tag":14,"props":578,"children":579},{},[580],{"type":18,"value":581},"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected.",{"type":13,"tag":14,"props":583,"children":584},{},[585],{"type":18,"value":586},"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet.",{"type":13,"tag":14,"props":588,"children":589},{},[590],{"type":18,"value":591},"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim.",{"type":13,"tag":14,"props":593,"children":594},{},[595],{"type":18,"value":596},"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances.",{"type":13,"tag":40,"props":598,"children":600},{"id":599},"_12-confidentiality",[601],{"type":18,"value":602},"12. CONFIDENTIALITY:",{"type":13,"tag":14,"props":604,"children":605},{},[606,607],{"type":18,"value":177},{"type":13,"tag":179,"props":608,"children":609},{},[610],{"type":18,"value":611},"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data.",{"type":13,"tag":14,"props":613,"children":614},{},[615],{"type":18,"value":616},"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:",{"type":13,"tag":14,"props":618,"children":619},{},[620],{"type":18,"value":621},"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies.",{"type":13,"tag":14,"props":623,"children":624},{},[625],{"type":18,"value":626},"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls.",{"type":13,"tag":14,"props":628,"children":629},{},[630],{"type":18,"value":631},"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms.",{"type":13,"tag":14,"props":633,"children":634},{},[635],{"type":18,"value":636},"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation.",{"type":13,"tag":14,"props":638,"children":639},{},[640],{"type":18,"value":641},"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter.",{"type":13,"tag":14,"props":643,"children":644},{},[645],{"type":18,"value":646},"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity.",{"type":13,"tag":40,"props":648,"children":650},{"id":649},"_13-dispute-resolution-and-governing-law",[651],{"type":18,"value":652},"13. DISPUTE RESOLUTION AND GOVERNING LAW:",{"type":13,"tag":14,"props":654,"children":655},{},[656,657],{"type":18,"value":177},{"type":13,"tag":179,"props":658,"children":659},{},[660],{"type":18,"value":661},"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law.",{"type":13,"tag":14,"props":663,"children":664},{},[665],{"type":18,"value":666},"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution.",{"type":13,"tag":14,"props":668,"children":669},{},[670],{"type":18,"value":671},"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties.",{"type":13,"tag":14,"props":673,"children":674},{},[675],{"type":18,"value":676},"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator.",{"type":13,"tag":14,"props":678,"children":679},{},[680],{"type":18,"value":681},"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts.",{"type":13,"tag":40,"props":683,"children":685},{"id":684},"_14-modification-and-termination",[686],{"type":18,"value":687},"14. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":689,"children":690},{},[691,692],{"type":18,"value":177},{"type":13,"tag":179,"props":693,"children":694},{},[695],{"type":18,"value":696},"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations.",{"type":13,"tag":14,"props":698,"children":699},{},[700],{"type":18,"value":701},"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect.",{"type":13,"tag":14,"props":703,"children":704},{},[705],{"type":18,"value":706},"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination.",{"type":13,"tag":14,"props":708,"children":709},{},[710,712,719],{"type":18,"value":711},"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing ",{"type":13,"tag":713,"props":714,"children":716},"a",{"href":715},"mailto:contact@qacomet.com",[717],{"type":18,"value":718},"contact@qacomet.com",{"type":18,"value":720},".",{"type":13,"tag":14,"props":722,"children":723},{},[724],{"type":18,"value":725},"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service.",{"type":13,"tag":40,"props":727,"children":729},{"id":728},"_15-severability",[730],{"type":18,"value":731},"15. SEVERABILITY",{"type":13,"tag":14,"props":733,"children":734},{},[735,736],{"type":18,"value":177},{"type":13,"tag":179,"props":737,"children":738},{},[739],{"type":18,"value":740},"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible",{"type":13,"tag":14,"props":742,"children":743},{},[744],{"type":18,"value":745},"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions.",{"type":13,"tag":14,"props":747,"children":748},{},[749],{"type":18,"value":750},"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision.",{"type":13,"tag":40,"props":752,"children":754},{"id":753},"_16-contact-us",[755],{"type":18,"value":756},"16. Contact Us:",{"type":13,"tag":14,"props":758,"children":759},{},[760,762,766],{"type":18,"value":761},"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at ",{"type":13,"tag":713,"props":763,"children":764},{"href":715},[765],{"type":18,"value":718},{"type":18,"value":767},". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients.",{"title":5,"searchDepth":769,"depth":769,"links":770},2,[771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786],{"id":42,"depth":769,"text":45},{"id":169,"depth":769,"text":172},{"id":226,"depth":769,"text":229},{"id":256,"depth":769,"text":259},{"id":286,"depth":769,"text":289},{"id":316,"depth":769,"text":319},{"id":361,"depth":769,"text":364},{"id":416,"depth":769,"text":419},{"id":481,"depth":769,"text":484},{"id":528,"depth":769,"text":531},{"id":554,"depth":769,"text":557},{"id":599,"depth":769,"text":602},{"id":649,"depth":769,"text":652},{"id":684,"depth":769,"text":687},{"id":728,"depth":769,"text":731},{"id":753,"depth":769,"text":756},"markdown","content:terms-of-service.md","content","terms-of-service.md","md",1714069923301] \ No newline at end of file +[{"data":1,"prerenderedAt":792},["Reactive",2],{"content-query-InhJyj2aeT":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":787,"_id":788,"_source":789,"_file":790,"_extension":791},"/terms-of-service","",false,"Terms Of Service","Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.",{"type":10,"children":11,"toc":768},"root",[12,19,24,29,34,39,46,57,67,77,87,97,107,117,127,137,147,157,167,173,184,189,194,199,204,209,214,219,224,230,239,244,249,254,260,269,274,279,284,290,299,304,309,314,320,329,334,339,344,349,354,359,365,374,379,384,389,394,399,404,409,414,420,429,434,439,444,449,454,459,464,469,474,479,485,496,501,506,511,516,521,526,532,537,542,547,552,558,567,572,577,582,587,592,597,603,612,617,622,627,632,637,642,647,653,662,667,672,677,682,688,697,702,707,721,726,732,741,746,751,757],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22],{"type":18,"value":23},"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services.",{"type":13,"tag":14,"props":25,"children":26},{},[27],{"type":18,"value":28},"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more.",{"type":13,"tag":14,"props":30,"children":31},{},[32],{"type":18,"value":33},"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference.",{"type":13,"tag":14,"props":35,"children":36},{},[37],{"type":18,"value":38},"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us.",{"type":13,"tag":40,"props":41,"children":43},"h2",{"id":42},"definitions",[44],{"type":18,"value":45},"Definitions:",{"type":13,"tag":14,"props":47,"children":48},{},[49,55],{"type":13,"tag":50,"props":51,"children":52},"strong",{},[53],{"type":18,"value":54},"Client",{"type":18,"value":56},": Refers to individuals or entities who utilize QAComet's QA/Testing services.",{"type":13,"tag":14,"props":58,"children":59},{},[60,65],{"type":13,"tag":50,"props":61,"children":62},{},[63],{"type":18,"value":64},"Company",{"type":18,"value":66},": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms.",{"type":13,"tag":14,"props":68,"children":69},{},[70,75],{"type":13,"tag":50,"props":71,"children":72},{},[73],{"type":18,"value":74},"Services",{"type":18,"value":76},": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company.",{"type":13,"tag":14,"props":78,"children":79},{},[80,85],{"type":13,"tag":50,"props":81,"children":82},{},[83],{"type":18,"value":84},"Materials",{"type":18,"value":86},": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services.",{"type":13,"tag":14,"props":88,"children":89},{},[90,95],{"type":13,"tag":50,"props":91,"children":92},{},[93],{"type":18,"value":94},"Ownership",{"type":18,"value":96},": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms.",{"type":13,"tag":14,"props":98,"children":99},{},[100,105],{"type":13,"tag":50,"props":101,"children":102},{},[103],{"type":18,"value":104},"Client-Specific Utilities",{"type":18,"value":106},": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services.",{"type":13,"tag":14,"props":108,"children":109},{},[110,115],{"type":13,"tag":50,"props":111,"children":112},{},[113],{"type":18,"value":114},"Design Patterns",{"type":18,"value":116},": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects.",{"type":13,"tag":14,"props":118,"children":119},{},[120,125],{"type":13,"tag":50,"props":121,"children":122},{},[123],{"type":18,"value":124},"Trial Period",{"type":18,"value":126},": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription.",{"type":13,"tag":14,"props":128,"children":129},{},[130,135],{"type":13,"tag":50,"props":131,"children":132},{},[133],{"type":18,"value":134},"Subscription Fee",{"type":18,"value":136},": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis.",{"type":13,"tag":14,"props":138,"children":139},{},[140,145],{"type":13,"tag":50,"props":141,"children":142},{},[143],{"type":18,"value":144},"Intellectual Property Rights",{"type":18,"value":146},": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms.",{"type":13,"tag":14,"props":148,"children":149},{},[150,155],{"type":13,"tag":50,"props":151,"children":152},{},[153],{"type":18,"value":154},"Dispute Resolution",{"type":18,"value":156},": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms.",{"type":13,"tag":14,"props":158,"children":159},{},[160,165],{"type":13,"tag":50,"props":161,"children":162},{},[163],{"type":18,"value":164},"Privacy Policy",{"type":18,"value":166},": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms.",{"type":13,"tag":40,"props":168,"children":170},{"id":169},"_2-scope-of-service",[171],{"type":18,"value":172},"2. SCOPE OF SERVICE",{"type":13,"tag":14,"props":174,"children":175},{},[176,178],{"type":18,"value":177},"Summary: ",{"type":13,"tag":179,"props":180,"children":181},"em",{},[182],{"type":18,"value":183},"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients.",{"type":13,"tag":14,"props":185,"children":186},{},[187],{"type":18,"value":188},"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:",{"type":13,"tag":14,"props":190,"children":191},{},[192],{"type":18,"value":193},"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing.",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions.",{"type":13,"tag":40,"props":225,"children":227},{"id":226},"_3-account-security",[228],{"type":18,"value":229},"3. ACCOUNT SECURITY",{"type":13,"tag":14,"props":231,"children":232},{},[233,234],{"type":18,"value":177},{"type":13,"tag":179,"props":235,"children":236},{},[237],{"type":18,"value":238},"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested.",{"type":13,"tag":14,"props":240,"children":241},{},[242],{"type":18,"value":243},"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals.",{"type":13,"tag":14,"props":245,"children":246},{},[247],{"type":18,"value":248},"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision.",{"type":13,"tag":14,"props":250,"children":251},{},[252],{"type":18,"value":253},"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet.",{"type":13,"tag":40,"props":255,"children":257},{"id":256},"_4-right-to-refuse-or-cancel-services",[258],{"type":18,"value":259},"4. RIGHT TO REFUSE OR CANCEL SERVICES",{"type":13,"tag":14,"props":261,"children":262},{},[263,264],{"type":18,"value":177},{"type":13,"tag":179,"props":265,"children":266},{},[267],{"type":18,"value":268},"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested.",{"type":13,"tag":14,"props":270,"children":271},{},[272],{"type":18,"value":273},"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service.",{"type":13,"tag":14,"props":275,"children":276},{},[277],{"type":18,"value":278},"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation.",{"type":13,"tag":14,"props":280,"children":281},{},[282],{"type":18,"value":283},"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law.",{"type":13,"tag":40,"props":285,"children":287},{"id":286},"_5-promotional-rights",[288],{"type":18,"value":289},"5. PROMOTIONAL RIGHTS:",{"type":13,"tag":14,"props":291,"children":292},{},[293,294],{"type":18,"value":177},{"type":13,"tag":179,"props":295,"children":296},{},[297],{"type":18,"value":298},"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested.",{"type":13,"tag":14,"props":300,"children":301},{},[302],{"type":18,"value":303},"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies.",{"type":13,"tag":14,"props":305,"children":306},{},[307],{"type":18,"value":308},"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information.",{"type":13,"tag":14,"props":310,"children":311},{},[312],{"type":18,"value":313},"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials.",{"type":13,"tag":40,"props":315,"children":317},{"id":316},"_6-ownership-of-materials",[318],{"type":18,"value":319},"6. OWNERSHIP OF MATERIALS:",{"type":13,"tag":14,"props":321,"children":322},{},[323,324],{"type":18,"value":177},{"type":13,"tag":179,"props":325,"children":326},{},[327],{"type":18,"value":328},"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights.",{"type":13,"tag":14,"props":330,"children":331},{},[332],{"type":18,"value":333},"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services.",{"type":13,"tag":14,"props":335,"children":336},{},[337],{"type":18,"value":338},"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities.",{"type":13,"tag":14,"props":340,"children":341},{},[342],{"type":18,"value":343},"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet.",{"type":13,"tag":14,"props":345,"children":346},{},[347],{"type":18,"value":348},"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes.",{"type":13,"tag":14,"props":350,"children":351},{},[352],{"type":18,"value":353},"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":355,"children":356},{},[357],{"type":18,"value":358},"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials.",{"type":13,"tag":40,"props":360,"children":362},{"id":361},"_7-client-responsibilities",[363],{"type":18,"value":364},"7. CLIENT RESPONSIBILITIES:",{"type":13,"tag":14,"props":366,"children":367},{},[368,369],{"type":18,"value":177},{"type":13,"tag":179,"props":370,"children":371},{},[372],{"type":18,"value":373},"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities.",{"type":13,"tag":14,"props":395,"children":396},{},[397],{"type":18,"value":398},"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet.",{"type":13,"tag":14,"props":400,"children":401},{},[402],{"type":18,"value":403},"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested.",{"type":13,"tag":14,"props":405,"children":406},{},[407],{"type":18,"value":408},"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach.",{"type":13,"tag":14,"props":410,"children":411},{},[412],{"type":18,"value":413},"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions.",{"type":13,"tag":40,"props":415,"children":417},{"id":416},"_8-billing-and-payments",[418],{"type":18,"value":419},"8. BILLING AND PAYMENTS:",{"type":13,"tag":14,"props":421,"children":422},{},[423,424],{"type":18,"value":177},{"type":13,"tag":179,"props":425,"children":426},{},[427],{"type":18,"value":428},"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients.",{"type":13,"tag":14,"props":430,"children":431},{},[432],{"type":18,"value":433},"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:",{"type":13,"tag":14,"props":435,"children":436},{},[437],{"type":18,"value":438},"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client.",{"type":13,"tag":14,"props":440,"children":441},{},[442],{"type":18,"value":443},"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate.",{"type":13,"tag":14,"props":445,"children":446},{},[447],{"type":18,"value":448},"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month.",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":18,"value":453},"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":18,"value":458},"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":18,"value":463},"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle.",{"type":13,"tag":14,"props":465,"children":466},{},[467],{"type":18,"value":468},"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription.",{"type":13,"tag":14,"props":470,"children":471},{},[472],{"type":18,"value":473},"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full.",{"type":13,"tag":14,"props":475,"children":476},{},[477],{"type":18,"value":478},"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client.",{"type":13,"tag":40,"props":480,"children":482},{"id":481},"_9-intellectual-property-rights",[483],{"type":18,"value":484},"9. INTELLECTUAL PROPERTY RIGHTS:",{"type":13,"tag":14,"props":486,"children":487},{},[488,489,494],{"type":18,"value":177},{"type":13,"tag":179,"props":490,"children":491},{},[492],{"type":18,"value":493},"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests.",{"type":18,"value":495},"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:",{"type":13,"tag":14,"props":497,"children":498},{},[499],{"type":18,"value":500},"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services.",{"type":13,"tag":14,"props":502,"children":503},{},[504],{"type":18,"value":505},"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets.",{"type":13,"tag":14,"props":507,"children":508},{},[509],{"type":18,"value":510},"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":512,"children":513},{},[514],{"type":18,"value":515},"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties.",{"type":13,"tag":14,"props":517,"children":518},{},[519],{"type":18,"value":520},"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent.",{"type":13,"tag":14,"props":522,"children":523},{},[524],{"type":18,"value":525},"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client.",{"type":13,"tag":40,"props":527,"children":529},{"id":528},"_10-qacomet-pre-existing-ip-materials",[530],{"type":18,"value":531},"10. QACOMET Pre-Existing IP MATERIALS.",{"type":13,"tag":14,"props":533,"children":534},{},[535],{"type":18,"value":536},"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”).",{"type":13,"tag":14,"props":538,"children":539},{},[540],{"type":18,"value":541},"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services.",{"type":13,"tag":14,"props":543,"children":544},{},[545],{"type":18,"value":546},"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission.",{"type":13,"tag":14,"props":548,"children":549},{},[550],{"type":18,"value":551},"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement.",{"type":13,"tag":40,"props":553,"children":555},{"id":554},"_11-limitation-of-liability-and-disclaimer-of-warranties",[556],{"type":18,"value":557},"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":559,"children":560},{},[561,562],{"type":18,"value":177},{"type":13,"tag":179,"props":563,"children":564},{},[565],{"type":18,"value":566},"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing.",{"type":13,"tag":14,"props":568,"children":569},{},[570],{"type":18,"value":571},"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:",{"type":13,"tag":14,"props":573,"children":574},{},[575],{"type":18,"value":576},"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access.",{"type":13,"tag":14,"props":578,"children":579},{},[580],{"type":18,"value":581},"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected.",{"type":13,"tag":14,"props":583,"children":584},{},[585],{"type":18,"value":586},"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet.",{"type":13,"tag":14,"props":588,"children":589},{},[590],{"type":18,"value":591},"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim.",{"type":13,"tag":14,"props":593,"children":594},{},[595],{"type":18,"value":596},"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances.",{"type":13,"tag":40,"props":598,"children":600},{"id":599},"_12-confidentiality",[601],{"type":18,"value":602},"12. CONFIDENTIALITY:",{"type":13,"tag":14,"props":604,"children":605},{},[606,607],{"type":18,"value":177},{"type":13,"tag":179,"props":608,"children":609},{},[610],{"type":18,"value":611},"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data.",{"type":13,"tag":14,"props":613,"children":614},{},[615],{"type":18,"value":616},"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:",{"type":13,"tag":14,"props":618,"children":619},{},[620],{"type":18,"value":621},"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies.",{"type":13,"tag":14,"props":623,"children":624},{},[625],{"type":18,"value":626},"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls.",{"type":13,"tag":14,"props":628,"children":629},{},[630],{"type":18,"value":631},"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms.",{"type":13,"tag":14,"props":633,"children":634},{},[635],{"type":18,"value":636},"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation.",{"type":13,"tag":14,"props":638,"children":639},{},[640],{"type":18,"value":641},"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter.",{"type":13,"tag":14,"props":643,"children":644},{},[645],{"type":18,"value":646},"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity.",{"type":13,"tag":40,"props":648,"children":650},{"id":649},"_13-dispute-resolution-and-governing-law",[651],{"type":18,"value":652},"13. DISPUTE RESOLUTION AND GOVERNING LAW:",{"type":13,"tag":14,"props":654,"children":655},{},[656,657],{"type":18,"value":177},{"type":13,"tag":179,"props":658,"children":659},{},[660],{"type":18,"value":661},"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law.",{"type":13,"tag":14,"props":663,"children":664},{},[665],{"type":18,"value":666},"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution.",{"type":13,"tag":14,"props":668,"children":669},{},[670],{"type":18,"value":671},"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties.",{"type":13,"tag":14,"props":673,"children":674},{},[675],{"type":18,"value":676},"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator.",{"type":13,"tag":14,"props":678,"children":679},{},[680],{"type":18,"value":681},"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts.",{"type":13,"tag":40,"props":683,"children":685},{"id":684},"_14-modification-and-termination",[686],{"type":18,"value":687},"14. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":689,"children":690},{},[691,692],{"type":18,"value":177},{"type":13,"tag":179,"props":693,"children":694},{},[695],{"type":18,"value":696},"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations.",{"type":13,"tag":14,"props":698,"children":699},{},[700],{"type":18,"value":701},"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect.",{"type":13,"tag":14,"props":703,"children":704},{},[705],{"type":18,"value":706},"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination.",{"type":13,"tag":14,"props":708,"children":709},{},[710,712,719],{"type":18,"value":711},"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing ",{"type":13,"tag":713,"props":714,"children":716},"a",{"href":715},"mailto:contact@qacomet.com",[717],{"type":18,"value":718},"contact@qacomet.com",{"type":18,"value":720},".",{"type":13,"tag":14,"props":722,"children":723},{},[724],{"type":18,"value":725},"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service.",{"type":13,"tag":40,"props":727,"children":729},{"id":728},"_15-severability",[730],{"type":18,"value":731},"15. SEVERABILITY",{"type":13,"tag":14,"props":733,"children":734},{},[735,736],{"type":18,"value":177},{"type":13,"tag":179,"props":737,"children":738},{},[739],{"type":18,"value":740},"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible",{"type":13,"tag":14,"props":742,"children":743},{},[744],{"type":18,"value":745},"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions.",{"type":13,"tag":14,"props":747,"children":748},{},[749],{"type":18,"value":750},"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision.",{"type":13,"tag":40,"props":752,"children":754},{"id":753},"_16-contact-us",[755],{"type":18,"value":756},"16. Contact Us:",{"type":13,"tag":14,"props":758,"children":759},{},[760,762,766],{"type":18,"value":761},"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at ",{"type":13,"tag":713,"props":763,"children":764},{"href":715},[765],{"type":18,"value":718},{"type":18,"value":767},". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients.",{"title":5,"searchDepth":769,"depth":769,"links":770},2,[771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786],{"id":42,"depth":769,"text":45},{"id":169,"depth":769,"text":172},{"id":226,"depth":769,"text":229},{"id":256,"depth":769,"text":259},{"id":286,"depth":769,"text":289},{"id":316,"depth":769,"text":319},{"id":361,"depth":769,"text":364},{"id":416,"depth":769,"text":419},{"id":481,"depth":769,"text":484},{"id":528,"depth":769,"text":531},{"id":554,"depth":769,"text":557},{"id":599,"depth":769,"text":602},{"id":649,"depth":769,"text":652},{"id":684,"depth":769,"text":687},{"id":728,"depth":769,"text":731},{"id":753,"depth":769,"text":756},"markdown","content:terms-of-service.md","content","terms-of-service.md","md",1714258642248] \ No newline at end of file diff --git a/terms-of-service/index.html b/terms-of-service/index.html index dac7fcc..be02d84 100644 --- a/terms-of-service/index.html +++ b/terms-of-service/index.html @@ -1,15 +1,15 @@ Terms Of Service - - + + - + @@ -21,36 +21,36 @@ - + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - -
- \ No newline at end of file + +
+ \ No newline at end of file