@flemist/simple-utils 2.1.3 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../urlGet-BOGFUahf.js"),$=require("@flemist/async-utils"),M=require("@flemist/time-limits"),Ie=require("node:os"),ne=require("path"),J=require("@flemist/priority-queue"),Te=require("fs"),Fe=require("picomatch"),K=require("child_process"),Re=require("@flemist/abort-controller-fast");function ue(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,s.get?s:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const F=ue(ne),R=ue(Te),ee=new M.Pool(Ie.cpus().length);function B(e){return e.replace(/\\/g,"/")}let H=null;function _e(e){H==null&&(H=new Map);const t=B(e);let o=H.get(t);return o==null&&(o=new $.Locker,H.set(t,o)),o}function Ne(e){const{filePath:t,func:o}=e;return _e(t).lock(()=>M.poolRunWait({pool:ee,count:1,func:o}))}function fe(e){return e.match(/^[/\\]?[^/\\]+/)[0]}function he(e,t){return fe(e)+"|"+t.ino}function de(e){return e.endsWith(":")&&(e+="/"),F.resolve(e)}function ce(e,t){e.totalSize+=t.totalSize,e.maxFileDateModified=Math.max(e.maxFileDateModified,t.maxFileDateModified),e.countFiles+=t.countFiles,e.countDirs+=t.countDirs,e.countLinks+=t.countLinks}const me=function(t){return t.code==="ENOENT"};function ye(e){const t=e.paths;if(!t||t.length===0)return Promise.resolve({totalSize:0,maxFileDateModified:0,countFiles:0,countDirs:0,countLinks:0});const o=e.level??0,s=e.walkedIds??new Set,r=e.abortSignal,i=e.pool??ee,a=e.handleError,c=e.priority??J.priorityCreate(0),f=e.walkLinks??!1,l=e.log,E=e.handlePath,h=e.matchPath;async function w(d){if(!(a&&await a(d))&&!me(d))throw d}function j(d){return!(!l||l.minTotalContentSize!=null&&d<l.minTotalContentSize||l.maxNestedLevel!=null&&o>l.maxNestedLevel)}return $.useAbortController(async d=>{const g=$.combineAbortSignals(r,d),y={totalSize:0,maxFileDateModified:0,countFiles:0,countDirs:0,countLinks:0};function I(S,P){if(j(P.totalSize)){const b=`${P.totalSize.toLocaleString("en-US").replace(/,/g," ").padStart(19)}: ${S}`;l?.handleLog?l.handleLog(b):console.log(b)}}async function u(S,P,p,b){return E?await M.poolRunWait({pool:i,func:async()=>{try{return await E({level:o,path:S,stat:P,itemStat:p,totalStat:y,abortSignal:g})}catch(k){return await w(k),!1}},count:1,priority:b,abortSignal:g}):!0}async function O(S,P,p,b){b||(b=S);const k=await M.poolRunWait({pool:i,func:()=>R.promises.lstat(S).catch(w),count:1,priority:J.priorityCreate(P,J.priorityCreate(1,c)),abortSignal:g});if(!k||!p&&k.isFile())return null;const A=he(S,k);if(s.has(A))return null;s.add(A);let m={totalSize:k.size,maxFileDateModified:k.isDirectory()?0:k.mtimeMs,countFiles:0,countDirs:0,countLinks:0};const D=J.priorityCreate(P,J.priorityCreate(k.isDirectory()?2:3,c));if(k.isSymbolicLink()){if(f){const C=await M.poolRunWait({pool:i,func:()=>R.promises.readlink(S).catch(w).then(T=>T??null),count:1,priority:D,abortSignal:g});if(C){const T=F.isAbsolute(C)?C:F.resolve(F.dirname(b),C),_=await O(T,P,p,b);_&&(m=_)}}return(p||m.countFiles+m.countDirs+m.countLinks>=1)&&(m.countLinks+=1,await u(b,k,m,D)&&(ce(y,m),I(b,m))),m}else if(k.isDirectory()){const C=await M.poolRunWait({pool:i,func:()=>R.promises.readdir(S).catch(w),count:1,priority:c,abortSignal:g});if(C){for(let T=0,_=C.length;T<_;T++)C[T]=F.join(b,C[T]);m=await ye({...e,paths:C,abortSignal:g,priority:D,level:o+1,walkedIds:s})}}return(p||m.countFiles+m.countDirs+m.countLinks>=1)&&(k.isDirectory()?m.countDirs+=1:k.isFile()&&(m.countFiles+=1),await u(b,k,m,D)&&(ce(y,m),I(b,m))),m}const x=[];for(let S=0,P=t.length;S<P;S++){const p=de(t[S]),b=h?h(p):!0;b!==!1&&x.push(O(p,S,b))}return await Promise.all(x),y})}function We(e){return ye(e)}function Me({globs:e,rootDir:t,noCase:o}){const s=[];return e.forEach(r=>{r=B(r).trim();const i=r.startsWith("^");i&&(r=r.substring(1).trim());const a=r.startsWith("!");if(a&&(r=r.substring(1).trim()),r.startsWith("!")||r.startsWith("^"))throw new Error(`Invalid glob pattern: "${r}". The syntax '${r.substring(0,2)}' is not supported. Valid glob patterns use: * (match any characters), ** (match any directories), ? (match single character), [abc] (character class), ! (negate pattern), ^ (exclude if included). Examples of valid patterns: "*.js", "src/**/*.ts", "!node_modules", "^dist". Avoid starting with '!' after '^' or multiple special prefixes.`);r.startsWith("/")&&(r="."+r);const c=B(t?F.resolve(t,r):r);if(!c)return;let f;try{f=Fe(c,{nocase:o??!1,dot:!0,strictBrackets:!0})}catch(l){throw new Error(`Invalid glob pattern: "${r}". ${l instanceof Error?l.message:"Unknown error"}. Valid glob patterns use: * (match any characters), ** (match any directories), ? (match single character), [abc] (character class with balanced brackets), ! (negate pattern), ^ (exclude if included). Examples: "*.js", "src/**/*.ts", "!node_modules", "[abc]def.txt". Ensure all brackets [ ] are properly closed and balanced.`)}s.push({exclude:i,negative:a,debugInfo:c,match:f})}),function(i){i=B(i);let a=null,c=!1;for(let f=0,l=s.length;f<l;f++){const E=s[f];E.match(i)&&(E.exclude?c=!E.negative:(a=!E.negative,c=!1))}return c?!1:a}}function pe(e){const t=e.startsWith("!");return t&&(e=e.substring(1)),e.startsWith("/")?e=e.substring(1):!e.startsWith("**")&&!e.startsWith("../")&&(e=`**/${e}`),t&&(e="!"+e),e}function we(e,t){if(!t||t===".")return e;const o=e.startsWith("^");o&&(e=e.substring(1));const s=e.startsWith("!");return s&&(e=e.substring(1)),e.startsWith("/")?(t.endsWith("/")&&(t=t.substring(0,t.length-1)),e=t+e):(t.endsWith("/")||(t+="/"),e.startsWith("./")?e=t+e.substring(2):e.startsWith("../")?e=t+e:(t.startsWith("..")&&(t=""),e.startsWith("**")?e=t+e:e=t+"**/"+e)),e=B(F.normalize(e)),s&&(e="!"+e),o&&(e="^"+e),e}function le(e){return"^"+e}async function ge(e){const o=(await R.promises.readFile(e,"utf-8")).split(`
2
- `),s=[];return o.forEach(r=>{r=r.trim(),!(!r||r.startsWith("#"))&&s.push(r)}),s}async function Be(e){const t=e.rootDir??".",o=[];if(!e.globs?.length)return o;const s=[];return e.globs.forEach(r=>{r.value&&(r.valueType==="file-contains-patterns"?s.push(r):r.valueType==="pattern"&&o.push(r.exclude?le(r.value):r.value))}),s.length&&await Promise.all(s.map(async r=>{await M.poolRunWait({pool:ee,count:1,func:async()=>{const i=F.resolve(t,r.value),a=await ge(i),c=F.relative(t,F.dirname(i));a.forEach(f=>{f=pe(f),f=we(f,c),o.push(r.exclude?le(f):f)})}})})),o}function be(e,t={}){return new Promise((o,s)=>{const r=K.spawn(e,{shell:!0,...t}),i=[];r.stdout.on("data",a=>{i.push(a)}),r.on("error",a=>{s(a)}),r.on("exit",a=>{const c=Buffer.concat(i).toString("utf8");if(a!==0){s(new Error(`[exec][exit] code: ${a}`));return}o(c)})})}async function $e(){let e;switch(process.platform){case"darwin":e=K.spawn("afplay",["/System/Library/Sounds/Ping.aiff"],{stdio:"ignore"});break;case"linux":e=K.spawn("beep",[],{stdio:"ignore",shell:!0});break;case"win32":e=K.spawn("powershell",["-c","[console]::beep(1000,300)"],{stdio:"ignore"});break;default:throw new Error(`[nodeBeep] Beep not supported on platform: ${process.platform}`)}await new Promise((t,o)=>{e.on("error",o),e.on("close",s=>{s!==0?o(new Error(`[nodeBeep] Beep process exited with code ${s}`)):t()})})}async function Se({page:e,urlFilters:t,timeouts:o}){return o||(o={}),o.downloadInternal||(o.downloadInternal=10*1e3),o.downloadExternal||(o.downloadExternal=60*1e3),o.total||(o.total=300*1e3),await n.withTimeout(()=>e.evaluate(({urlFilters:r,timeouts:i})=>{function a(l){return function(h){let w=!1;for(let j=0,d=l.length;j<d;j++){const g=l[j];g.pattern.test(h)&&(w=g.value)}return w}}const c=r&&a(r);let f=performance.getEntries&&performance.getEntries();return f||(f=[]),f.push({name:location.href}),Promise.all(f.map(l=>{if(l.entryType!=null&&l.entryType!=="resource"||c&&!c(l.name))return null;if(l.responseStatus!=null)return l.responseStatus>=400?Promise.resolve({url:l.name,error:l.responseStatus}):null;if(navigator.userAgent.indexOf("Chrome")===-1)return null;const E=typeof AbortController<"u"?new AbortController:null,h=new URL(l.name).origin===location.origin,w=h?i.downloadInternal:i.downloadExternal;let j;const d=new Promise((u,O)=>{j=O}),g=w&&setTimeout(()=>{E?.abort(),j(new Error("[test][getPageHttpErrors] fetch timeout"))},w);let y=fetch(l.name,{mode:h?"same-origin":"no-cors",signal:E?.signal,cache:h?"force-cache":void 0,method:"HEAD"}).then(u=>u.ok?null:{url:l.name,error:u.status+" "+u.statusText}).catch(u=>({url:l.name,error:u.message}));E||(y=Promise.race([y,d]));function I(){g&&clearTimeout(g)}return y.then(u=>(I(),u),u=>{throw I(),u})})).then(l=>{const E=l.filter(h=>h).map(h=>({url:new URL(h.url),error:h.error}));return E.length>0?E:null})},{urlFilters:t,timeouts:o}),{timeout:o.total})}async function Ee({page:e,urlFilters:t,errorFilter:o}){let s=await Se({page:e,urlFilters:t});if(s&&(o&&(s=s.filter(o)),s.length>0))throw new Error(`[test][checkPageHttpErrors] Page has http errors: ${JSON.stringify(s,null,2)}`)}async function Oe({page:e,filter:t,onError:o}){const s="callback_191b355ea6f64499a6607ad571da5d4d",r=e.context().browser()?.browserType().name(),i=n.getStackTrace();function a(c){try{if(t&&!t({url:new URL(e.url()),error:c}))return}catch(f){c=String(f)}try{console.error(`[test][subscribeJsErrors] BROWSER JS ERROR (${r}): ${c}`);const f=new Error(c);f.stack=i,o(f)}catch(f){console.error("[test][subscribeJsErrors] error",f)}}await e.exposeFunction(s,a),await e.addInitScript(c=>{function f(h){if(Array.isArray(h))return h.map(f).join(`\r
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../urlGet-CerQ1cKh.js"),v=require("@flemist/async-utils"),N=require("@flemist/time-limits"),Ne=require("node:os"),ae=require("path"),U=require("@flemist/priority-queue"),_e=require("fs"),$e=require("picomatch"),V=require("child_process"),Y=require("@flemist/abort-controller-fast"),We=require("@flemist/test-variants");function me(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const a=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,a.get?a:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const I=me(ae),L=me(_e),te=new N.Pool(Ne.cpus().length);function W(e){return e.replace(/\\/g,"/")}let H=null;function ve(e){H==null&&(H=new Map);const t=W(e);let o=H.get(t);return o==null&&(o=new v.Locker,H.set(t,o)),o}function Be(e){const{filePath:t,func:o}=e;return ve(t).lock(()=>N.poolRunWait({pool:te,count:1,func:o}))}function de(e){return e.match(/^[/\\]?[^/\\]+/)[0]}function ye(e,t){return de(e)+"|"+t.ino}function pe(e){return e.endsWith(":")&&(e+="/"),I.resolve(e)}function fe(e,t){e.totalSize+=t.totalSize,e.maxFileDateModified=Math.max(e.maxFileDateModified,t.maxFileDateModified),e.countFiles+=t.countFiles,e.countDirs+=t.countDirs,e.countLinks+=t.countLinks}const we=function(t){return t.code==="ENOENT"};function ge(e){const t=e.paths;if(!t||t.length===0)return Promise.resolve({totalSize:0,maxFileDateModified:0,countFiles:0,countDirs:0,countLinks:0});const o=e.level??0,a=e.walkedIds??new Set,n=e.abortSignal,s=e.pool??te,c=e.handleError,i=e.priority??U.priorityCreate(0),m=e.walkLinks??!1,u=e.log,E=e.handlePath,d=e.matchPath;async function h(f){if(!(c&&await c(f))&&!we(f))throw f}function x(f){return!(!u||u.minTotalContentSize!=null&&f<u.minTotalContentSize||u.maxNestedLevel!=null&&o>u.maxNestedLevel)}return v.useAbortController(async f=>{const y=v.combineAbortSignals(n,f),p={totalSize:0,maxFileDateModified:0,countFiles:0,countDirs:0,countLinks:0};function C(w,P){if(x(P.totalSize)){const k=`${P.totalSize.toLocaleString("en-US").replace(/,/g," ").padStart(19)}: ${w}`;u?.handleLog?u.handleLog(k):console.log(k)}}async function l(w,P,O,k){return E?await N.poolRunWait({pool:s,func:async()=>{try{return await E({level:o,path:w,stat:P,itemStat:O,totalStat:p,abortSignal:y})}catch(T){return await h(T),!1}},count:1,priority:k,abortSignal:y}):!0}async function g(w,P,O,k){k||(k=w);const T=await N.poolRunWait({pool:s,func:()=>L.promises.lstat(w).catch(h),count:1,priority:U.priorityCreate(P,U.priorityCreate(1,i)),abortSignal:y});if(!T||!O&&T.isFile())return null;const A=ye(w,T);if(a.has(A))return null;a.add(A);let b={totalSize:T.size,maxFileDateModified:T.isDirectory()?0:T.mtimeMs,countFiles:0,countDirs:0,countLinks:0};const j=U.priorityCreate(P,U.priorityCreate(T.isDirectory()?2:3,i));if(T.isSymbolicLink()){if(m){const M=await N.poolRunWait({pool:s,func:()=>L.promises.readlink(w).catch(h).then(D=>D??null),count:1,priority:j,abortSignal:y});if(M){const D=I.isAbsolute(M)?M:I.resolve(I.dirname(k),M),F=await g(D,P,O,k);F&&(b=F)}}return(O||b.countFiles+b.countDirs+b.countLinks>=1)&&(b.countLinks+=1,await l(k,T,b,j)&&(fe(p,b),C(k,b))),b}else if(T.isDirectory()){const M=await N.poolRunWait({pool:s,func:()=>L.promises.readdir(w).catch(h),count:1,priority:i,abortSignal:y});if(M){for(let D=0,F=M.length;D<F;D++)M[D]=I.join(k,M[D]);b=await ge({...e,paths:M,abortSignal:y,priority:j,level:o+1,walkedIds:a})}}return(O||b.countFiles+b.countDirs+b.countLinks>=1)&&(T.isDirectory()?b.countDirs+=1:T.isFile()&&(b.countFiles+=1),await l(k,T,b,j)&&(fe(p,b),C(k,b))),b}const S=[];for(let w=0,P=t.length;w<P;w++){const O=pe(t[w]),k=d?d(O):!0;k!==!1&&S.push(g(O,w,k))}return await Promise.all(S),p})}function ze(e){return ge(e)}function Ue({globs:e,rootDir:t,noCase:o}){const a=[];return e.forEach(n=>{n=W(n).trim();const s=n.startsWith("^");s&&(n=n.substring(1).trim());const c=n.startsWith("!");if(c&&(n=n.substring(1).trim()),n.startsWith("!")||n.startsWith("^"))throw new Error(`Invalid glob pattern: "${n}". The syntax '${n.substring(0,2)}' is not supported. Valid glob patterns use: * (match any characters), ** (match any directories), ? (match single character), [abc] (character class), ! (negate pattern), ^ (exclude if included). Examples of valid patterns: "*.js", "src/**/*.ts", "!node_modules", "^dist". Avoid starting with '!' after '^' or multiple special prefixes.`);n.startsWith("/")&&(n="."+n);const i=W(t?I.resolve(t,n):n);if(!i)return;let m;try{m=$e(i,{nocase:o??!1,dot:!0,strictBrackets:!0})}catch(u){throw new Error(`Invalid glob pattern: "${n}". ${u instanceof Error?u.message:"Unknown error"}. Valid glob patterns use: * (match any characters), ** (match any directories), ? (match single character), [abc] (character class with balanced brackets), ! (negate pattern), ^ (exclude if included). Examples: "*.js", "src/**/*.ts", "!node_modules", "[abc]def.txt". Ensure all brackets [ ] are properly closed and balanced.`)}a.push({exclude:s,negative:c,debugInfo:i,match:m})}),function(s){s=W(s);let c=null,i=!1;for(let m=0,u=a.length;m<u;m++){const E=a[m];E.match(s)&&(E.exclude?i=!E.negative:(c=!E.negative,i=!1))}return i?!1:c}}function be(e){const t=e.startsWith("!");return t&&(e=e.substring(1)),e.startsWith("/")?e=e.substring(1):!e.startsWith("**")&&!e.startsWith("../")&&(e=`**/${e}`),t&&(e="!"+e),e}function Ee(e,t){if(!t||t===".")return e;const o=e.startsWith("^");o&&(e=e.substring(1));const a=e.startsWith("!");return a&&(e=e.substring(1)),e.startsWith("/")?(t.endsWith("/")&&(t=t.substring(0,t.length-1)),e=t+e):(t.endsWith("/")||(t+="/"),e.startsWith("./")?e=t+e.substring(2):e.startsWith("../")?e=t+e:(t.startsWith("..")&&(t=""),e.startsWith("**")?e=t+e:e=t+"**/"+e)),e=W(I.normalize(e)),a&&(e="!"+e),o&&(e="^"+e),e}function he(e){return"^"+e}async function Se(e){const o=(await L.promises.readFile(e,"utf-8")).split(`
2
+ `),a=[];return o.forEach(n=>{n=n.trim(),!(!n||n.startsWith("#"))&&a.push(n)}),a}async function Je(e){const t=e.rootDir??".",o=[];if(!e.globs?.length)return o;const a=[];return e.globs.forEach(n=>{n.value&&(n.valueType==="file-contains-patterns"?a.push(n):n.valueType==="pattern"&&o.push(n.exclude?he(n.value):n.value))}),a.length&&await Promise.all(a.map(async n=>{await N.poolRunWait({pool:te,count:1,func:async()=>{const s=I.resolve(t,n.value),c=await Se(s),i=I.relative(t,I.dirname(s));c.forEach(m=>{m=be(m),m=Ee(m,i),o.push(n.exclude?he(m):m)})}})})),o}function Oe(e,t={}){return new Promise((o,a)=>{const n=V.spawn(e,{shell:!0,...t}),s=[];n.stdout.on("data",c=>{s.push(c)}),n.on("error",c=>{a(c)}),n.on("exit",c=>{const i=Buffer.concat(s).toString("utf8");if(c!==0){a(new Error(`[exec][exit] code: ${c}`));return}o(i)})})}async function Ge(){let e;switch(process.platform){case"darwin":e=V.spawn("afplay",["/System/Library/Sounds/Ping.aiff"],{stdio:"ignore"});break;case"linux":e=V.spawn("beep",[],{stdio:"ignore",shell:!0});break;case"win32":e=V.spawn("powershell",["-c","[console]::beep(1000,300)"],{stdio:"ignore"});break;default:throw new Error(`[nodeBeep] Beep not supported on platform: ${process.platform}`)}await new Promise((t,o)=>{e.on("error",o),e.on("close",a=>{a!==0?o(new Error(`[nodeBeep] Beep process exited with code ${a}`)):t()})})}async function xe({page:e,urlFilters:t,timeouts:o}){return o||(o={}),o.downloadInternal||(o.downloadInternal=10*1e3),o.downloadExternal||(o.downloadExternal=60*1e3),o.total||(o.total=300*1e3),await r.withTimeout(()=>e.evaluate(({urlFilters:n,timeouts:s})=>{function c(u){return function(d){let h=!1;for(let x=0,f=u.length;x<f;x++){const y=u[x];y.pattern.test(d)&&(h=y.value)}return h}}const i=n&&c(n);let m=performance.getEntries&&performance.getEntries();return m||(m=[]),m.push({name:location.href}),Promise.all(m.map(u=>{if(u.entryType!=null&&u.entryType!=="resource"||i&&!i(u.name))return null;if(u.responseStatus!=null)return u.responseStatus>=400?Promise.resolve({url:u.name,error:u.responseStatus}):null;if(navigator.userAgent.indexOf("Chrome")===-1)return null;const E=typeof AbortController<"u"?new AbortController:null,d=new URL(u.name).origin===location.origin,h=d?s.downloadInternal:s.downloadExternal;let x;const f=new Promise((l,g)=>{x=g}),y=h&&setTimeout(()=>{E?.abort(),x(new Error("[test][getPageHttpErrors] fetch timeout"))},h);let p=fetch(u.name,{mode:d?"same-origin":"no-cors",signal:E?.signal,cache:d?"force-cache":void 0,method:"HEAD"}).then(l=>l.ok?null:{url:u.name,error:l.status+" "+l.statusText}).catch(l=>({url:u.name,error:l.message}));E||(p=Promise.race([p,f]));function C(){y&&clearTimeout(y)}return p.then(l=>(C(),l),l=>{throw C(),l})})).then(u=>{const E=u.filter(d=>d).map(d=>({url:new URL(d.url),error:d.error}));return E.length>0?E:null})},{urlFilters:t,timeouts:o}),{timeout:o.total})}async function ke({page:e,urlFilters:t,errorFilter:o}){let a=await xe({page:e,urlFilters:t});if(a&&(o&&(a=a.filter(o)),a.length>0))throw new Error(`[test][checkPageHttpErrors] Page has http errors: ${JSON.stringify(a,null,2)}`)}async function Te({page:e,filter:t,onError:o}){const a="callback_191b355ea6f64499a6607ad571da5d4d",n=e.context().browser()?.browserType().name(),s=r.getStackTrace();function c(i){try{if(t&&!t({url:new URL(e.url()),error:i}))return}catch(m){i=String(m)}try{console.error(`[test][subscribeJsErrors] BROWSER JS ERROR (${n}): ${i}`);const m=new Error(i);m.stack=s,o(m)}catch(m){console.error("[test][subscribeJsErrors] error",m)}}await e.exposeFunction(a,c),await e.addInitScript(i=>{function m(d){if(Array.isArray(d))return d.map(m).join(`\r
3
3
  \r
4
- `);if(h instanceof Error)return h.stack||h.toString();if(typeof h=="object"&&h!=null){const w=new Set;return JSON.stringify(h,(j,d)=>{if(typeof d=="object"&&d!=null){if(w.has(d))return"[Circular]";w.add(d)}return d},2)}return String(h)}function l(h){window[c](h)}const E={warn:console.warn.bind(console),error:console.error.bind(console)};console.warn=function(...w){return l("console.warn: "+f(w)),E.warn.apply(this,w)},console.error=function(...w){return l("console.error: "+f(w)),E.error.apply(this,w)},window.addEventListener("error",function(h){l("window error: "+(h.message||JSON.stringify(h)))},!0),window.addEventListener("unhandledrejection",function(h){l("window unhandledrejection: "+f(h.reason))},!0)},s)}async function xe(){try{process.platform==="win32"&&await be(`wmic process where "commandline like '%ms-playwright%' and not commandline like '%wmic.exe%' and priority != 4" CALL setpriority "idle"`)}catch(e){const t=e?.message?.trim();if(/exit code: 2147749890/.test(t))return;console.warn("[test][setPlaywrightPriorityLow] error: "+t)}}let V=null,te=null;function ze(e){te=e}function ke(){if(V)return;const e=te||(process.env.DELAY_ON_ERROR?parseInt(process.env.DELAY_ON_ERROR,10):0);if(te)return console.log(`[test][delayOnError] Delay on error: ${e} ms`),V=$.delay(e),V}function ve(){return V}async function Pe(e){const{page:t}=e,o=t.context().browser()?.browserType().name(),s=new Re.AbortControllerFast,r=$.combineAbortSignals(s.signal,e.abortSignal),i=c=>{let f=`Error in (${o}) ${t.url()}
5
- `;e.pageFilePath&&(f+=` at _ (${ne.resolve(e.pageFilePath)}:0:0)
6
- `),c.stack=f+(c.stack||c.message),c.message=f+c.message,console.error("[test][initPage] error",c),s.abort(c)};return await Oe({page:t,filter:e.filters?.js?.filter,onError:i}),{abortSignal:r,checkErrors:async()=>{await Ee({page:t,urlFilters:e.filters?.http?.urlFilters,errorFilter:e.filters?.http?.errorFilter}),r.throwIfAborted()}}}async function Je({page:e,abortSignal:t,filters:o,func:s,pageFilePath:r}){const i=e.context().browser()?.browserType().name();try{const{abortSignal:a,checkErrors:c}=await Pe({page:e,abortSignal:t,filters:o,pageFilePath:r});await s({page:e,abortSignal:a,checkErrors:c}),await c()}catch(a){let c=`Error in (${i}) ${e.url()}
7
- `;throw r&&(c+=` at _ (${ne.resolve(r)}:0:0)
8
- `),a.stack=c+(a.stack||a.message),a.message=c+a.message,a}}function Ue({browserType:e,options:t}){return async function(s){const r=await e.launch(t??void 0);try{return await s(r)}finally{await r.close()}}}function Ge({browser:e,options:t}){return async function(s){const r=await e.newContext(t??void 0);await xe();try{const i=await s(r);return await r.close(),i}catch(i){const a=ke?.();throw a?(console.error("[test][useBrowserContext] error",i),a.finally(()=>r.close())):await r.close(),i}}}async function Q(e,t){const o=F.dirname(e);await R.promises.stat(o).catch(()=>null)||await R.promises.mkdir(o,{recursive:!0}),await R.promises.writeFile(e,JSON.stringify(t,null,4),{encoding:"utf-8"})}async function je(e){if(!await R.promises.stat(e).catch(()=>null))return null;const t=await R.promises.readFile(e,{encoding:"utf-8"});return JSON.parse(t)}const X="-",Z="+";function U(e,t,o){if(e===t)return null;if(Array.isArray(e)){if(Array.isArray(t)){let r=null;for(let i=0,a=Math.max(t.length,t.length);i<a;i++){const c=U(e[i],t[i],o);c!=null&&(r||(r=[]),r.push(c))}return r!=null&&o&&(r=o(e,t,r)),r}}else if(e instanceof Object&&t instanceof Object){let r=null;for(const i in e)if(Object.prototype.hasOwnProperty.call(e,i)){const a=U(e[i],t[i],o);a!=null&&(r||(r={}),r[i]=a)}for(const i in t)if(Object.prototype.hasOwnProperty.call(t,i)&&!Object.prototype.hasOwnProperty.call(e,i)){const a=U(e[i],t[i],o);a!=null&&(r||(r={}),r[i]=a)}return r!=null&&o&&(r=o(e,t,r)),r}let s={[X]:e,[Z]:t};return o&&(s=o(e,t,s)),s}function re(e){function t(u){return u.sort((O,x)=>O[0]>x[0]?1:-1).reduce((O,x)=>(O[x[0]]=x[1],O),{})}function o(u){return u.reduce((O,x)=>(O[x]=!0,O),{})}const s=e.filters&&e.filters.excludeAttrs&&o(e.filters.excludeAttrs),r=e.filters&&e.filters.fixAttrs,i=e.filters&&e.filters.fixStyles,a=e.filters&&e.filters.excludeStyles&&o(e.filters.excludeStyles),c=e.filters&&e.filters.fixTags,f=e.filters&&e.filters.excludeClasses,l=e.filters&&e.filters.excludeIds,E=e.filters&&e.filters.excludeSelectorClasses,h=e.filters&&e.filters.excludeSelectorIds;let w;if(e.filters&&e.filters.excludeSelectors&&e.filters.excludeSelectors.length>0){const u=Array.from(document.querySelectorAll(e.filters.excludeSelectors.join(",")));u.length>0&&(w=new Set(u))}function j(u,O,x,S){const P=getComputedStyle(u,O),p=[];for(let b=0,k=P.length;b<k;b++){const A=P[b];if(a&&a[A])continue;let m=P[A];if(m&&i)for(let D=0,C=i.length;D<C;D++)i[D].name.test(A)&&(m=m.replace(i[D].search,i[D].replace));(!x||x[A]!==m)&&(!S||S[A]===m)&&p.push([A,m])}return t(p)}function d(u,O,x){return{_:j(u,void 0,O&&O._,x&&x._),before:j(u,"before",O&&O.before,x&&x.before),after:j(u,"after",O&&O.after,x&&x.after)}}function g(u,O,x,S,P){for(let p=0,b=u.childNodes.length;p<b;p++){const k=u.childNodes[p];if(!k)throw new Error(`child is null; index=${p}; ${S}, ${u.className}\r
9
- You should wait js executions before test`);k instanceof Element&&y(k,O,x,S,P)}}function y(u,O,x,S,P){const p=P&&P[O.length];if(P&&!p||w&&w.has(u))return;let b=u.tagName&&u.tagName.toLowerCase();if(b==="head"&&(x=!1),c)for(let L=0,z=c.length;L<z;L++)b=b.replace(c[L].search,c[L].replace);if(p&&p.tag!==b)return;const k=[];for(let L=0,z=u.attributes.length;L<z;L++){const N=u.attributes.item(L);let W=N.name,q=N.value;if(W=W.toLowerCase(),W!=="class"&&!(s&&s[W])){if(r)for(let v=0,Le=r.length;v<Le;v++)r[v].name.test(W)&&(q=q.replace(r[v].search,r[v].replace));(!p||p.attrs&&p.attrs[W]===q)&&k.push([W,q])}}const A=[],m=[];for(let L=0,z=u.classList.length;L<z;L++){const N=u.classList.item(L);(!f||!f.test(N))&&A.push(N),(!E||!E.test(N))&&m.push(N)}const D=x?d(u,e.defaultStyle,p&&p.style):null,C=u.childElementCount?[]:null;u.id&&(!l||!l.test(u.id))&&u.id;const T=u.id&&(!h||!h.test(u.id))?u.id:"",_=(b||"")+(T?"#"+T:"")+(m.length>0?"."+m.join("."):""),ae=_?S?S+" > "+_:_:S,De={tag:b,selector:ae,classes:A,attrs:k.length>0?t(k):null,style:D,childs:C};O.push(De),C&&g(u,C,x,ae,p&&p.childs)}const I=[];return y(document.documentElement,I,!0,"",e.shouldEqualResult&&[e.shouldEqualResult]),I[0]}async function oe(e){const t=await e.context().newCDPSession(e);return await t.send("DOM.enable"),await t.send("CSS.enable"),t}async function se(e){await e.send("CSS.disable"),await e.send("DOM.disable"),await e.detach()}async function qe(e,t){const o=await oe(e);try{return await t(o)}finally{await se(o)}}async function Ce(e,t){const{nodes:o}=await e.send("DOM.getFlattenedDocument",{depth:-1,pierce:!0}),s=o.filter(r=>r.nodeType===1).map(r=>r.nodeId);for(const r of s)await e.send("CSS.forcePseudoState",{nodeId:r,forcedPseudoClasses:t})}function Y(e,t){if(!e||!t)return t||null;let o=null;for(const s in t)Object.prototype.hasOwnProperty.call(t,s)&&t[s]!==e[s]&&(o||(o={}),o[s]=t[s]);for(const s in e)Object.prototype.hasOwnProperty.call(e,s)&&!Object.prototype.hasOwnProperty.call(t,s)&&(o||(o={}),o[s]="");return o}function He(e,t){if(!e||!t)return t||null;const o=Y(e._,t._),s=Y(e.before,t.before),r=Y(e.after,t.after);return!o&&!s&&!r?null:{_:o||{},before:s||{},after:r||{}}}function Ke(e,t){if(!e||!t)return t||null;if(e.length!==t.length)return t;for(let o=0,s=e.length;o<s;o++)if(e[o]!==t[o])return t;return null}function ie(e,t){const o=Ke(e.classes,t.classes),s=Y(e.attrs,t.attrs),r=He(e.style,t.style);let i=null;if(e.childs&&t.childs){const a=Math.min(e.childs.length,t.childs.length);for(let c=0;c<a;c++){const f=ie(e.childs[c],t.childs[c]);if(f){if(!i){i=[];for(let l=0;l<a;l++)i.push({})}i[c]=f}}}return!o&&!s&&!r&&!i?null:{tag:t.tag,selector:t.selector,classes:o,attrs:s,style:r,childs:i}}const G=(e,t,o,s)=>{const r=s(e,t,o,s);if(r==null)return r;if(Array.isArray(r))return r.map((i,a,c)=>G(i,a,c,s));if(typeof r=="object"){const i={};for(const a in r)Object.prototype.hasOwnProperty.call(r,a)&&(i[a]=G(r[a],a,r,s));return i}return r};function Ae(e,t){if(e.attrs&&t.excludeAttrs){for(let o=0,s=t.excludeAttrs.length;o<s;o++)delete e.attrs[t.excludeAttrs[o]];Object.keys(e.attrs).length===0&&(e.attrs=null)}if(e.classes&&t.excludeClasses&&(e.classes=e.classes.filter(o=>!t.excludeClasses.test(o))),e.style&&t.excludeStyles)for(const o of["_","before","after"]){const s=e.style[o];if(s)for(let r=0,i=t.excludeStyles.length;r<i;r++)delete s[t.excludeStyles[r]]}if(e.childs)for(let o=0,s=e.childs.length;o<s;o++)Ae(e.childs[o],t)}function Ve(e,t){for(const o in e){if(!Object.prototype.hasOwnProperty.call(e,o))continue;const s=e[o];for(const r in s){if(!Object.prototype.hasOwnProperty.call(s,r))continue;const i=s[r];for(const a in i)Object.prototype.hasOwnProperty.call(i,a)&&Ae(i[a],t)}}}function Qe({actualResultFile:e,expectedResultFile:t,diffResultFile:o,filters:s,transform:r,pseudoStates:i}){let a,c,f,l={};return{async init(E){a=await je(t),r&&(a=G(a,null,null,r)),a&&s&&Ve(a,s),await E.goto("about:blank"),c=await E.evaluate(re,{filters:s}),f=c.style},async handlePage({page:E,testId:h,url:w,stateId:j,_filters:d}){let g=l[h];g||(g={},l[h]=g);let y=g[w.href];y||(y={},g[w.href]=y),await E.addStyleTag({content:"*, *::before, *::after { animation-name: none!important; transition-duration: 0s !important; }"});const I=i??[{states:[]}];let u=null,O;try{for(let x=0;x<I.length;x++){const S=I[x],P=S.states.length>0?j+":"+S.states.join(":"):j;let p=null;if(S.states.length>0){u||(u=await oe(E));const m=performance.now();await Ce(u,S.states),p=performance.now()-m}S.delay&&await $.delay(S.delay);const b=performance.now(),k=await E.evaluate(re,{filters:d||s,defaultStyle:f,shouldEqualResult:y[P]}),A=performance.now()-b;if(console.log(`SNAPSHOT ${P}:`+(p!=null?` forcePseudoClasses ${p.toFixed(0)}ms,`:"")+` getAllElements ${A.toFixed(0)}ms`),!O)O=k,y[P]=k;else{const m=ie(O,k);m&&(y[P]=m)}}}finally{u&&await se(u)}},async end({checkExistUrlsOnly:E}){if(l=n.getNormalizedObject(l),r&&(l=G(l,null,null,r)),a){let h,w;if(!E)h=a,w=l;else{h={},w={};for(const d in a)if(Object.prototype.hasOwnProperty.call(a,d)&&Object.prototype.hasOwnProperty.call(l,d)){h[d]={},w[d]={};for(const g in a[d])Object.prototype.hasOwnProperty.call(a[d],g)&&Object.prototype.hasOwnProperty.call(l[d],g)&&(h[d][g]=a[d][g],w[d][g]=l[d][g])}}const j=U(h,w,(d,g,y)=>y.selector&&(delete y.selector,Object.keys(y).length===0)?null:y.childs&&y.childs.length===1?y.childs[0]:(g&&g.selector?y[Z]?y[Z]=g.selector:y={selector:g.selector,...y}:d&&d.selector&&(y[X]?y[X]=d.selector:y={selector:d.selector,...y}),y));if(o&&await Q(o,j||{}),j)throw await Q(e,l),console.error("Pages elements changes: "+JSON.stringify(j,null,4).substring(0,5e3)),new Error("Pages elements changes detected");await R.promises.stat(e).catch(()=>null)&&await R.promises.unlink(e)}else await Q(t,l);return l}}}exports.ConsoleMessageLevel=n.ConsoleMessageLevel;exports.Lazy=n.Lazy;exports.LazyWithId=n.LazyWithId;exports.LogLevel=n.LogLevel;exports.Random=n.Random;exports.Subject=n.Subject;exports.SubjectWithId=n.SubjectWithId;exports.UNIQUE_PSEUDO_RANDOM_MAX_COUNT=n.UNIQUE_PSEUDO_RANDOM_MAX_COUNT;exports.alertConsole=n.alertConsole;exports.alertReplace=n.alertReplace;exports.check=n.check;exports.consoleIntercept=n.consoleIntercept;exports.consoleMessageToString=n.consoleMessageToString;exports.consoleReplace=n.consoleReplace;exports.convertTimeZone=n.convertTimeZone;exports.createTaskDelayRetry=n.createTaskDelayRetry;exports.createUniquePseudoRandom=n.createUniquePseudoRandom;exports.dateNowUnique=n.dateNowUnique;exports.deepCloneJsonLike=n.deepCloneJsonLike;exports.deepEqualJsonLike=n.deepEqualJsonLike;exports.deepEqualJsonLikeMap=n.deepEqualJsonLikeMap;exports.equalArray=n.equalArray;exports.escapeHtml=n.escapeHtml;exports.escapeRegExp=n.escapeRegExp;exports.fixStackTrace=n.fixStackTrace;exports.formatAny=n.formatAny;exports.formatDate=n.formatDate;exports.formatDateFileName=n.formatDateFileName;exports.getConsoleMessages=n.getConsoleMessages;exports.getDateInet=n.getDateInet;exports.getNormalizedObject=n.getNormalizedObject;exports.getRandomFunc=n.getRandomFunc;exports.getRandomSeed=n.getRandomSeed;exports.getStackTrace=n.getStackTrace;exports.isObservable=n.isObservable;exports.match=n.match;exports.matchAnd=n.matchAnd;exports.matchAndPipe=n.matchAndPipe;exports.matchAny=n.matchAny;exports.matchArray=n.matchArray;exports.matchArrayBuffer=n.matchArrayBuffer;exports.matchArrayIncludes=n.matchArrayIncludes;exports.matchArrayItem=n.matchArrayItem;exports.matchArrayLength=n.matchArrayLength;exports.matchArrayWith=n.matchArrayWith;exports.matchBoolean=n.matchBoolean;exports.matchConstructor=n.matchConstructor;exports.matchConvert=n.matchConvert;exports.matchCustom=n.matchCustom;exports.matchDeep=n.matchDeep;exports.matchEnum=n.matchEnum;exports.matchFloat=n.matchFloat;exports.matchIn=n.matchIn;exports.matchInstanceOf=n.matchInstanceOf;exports.matchInt=n.matchInt;exports.matchIntDate=n.matchIntDate;exports.matchIs=n.matchIs;exports.matchIsNonStrict=n.matchIsNonStrict;exports.matchNever=n.matchNever;exports.matchNot=n.matchNot;exports.matchNotNullish=n.matchNotNullish;exports.matchNullish=n.matchNullish;exports.matchNumber=n.matchNumber;exports.matchObject=n.matchObject;exports.matchObjectEntries=n.matchObjectEntries;exports.matchObjectEntry=n.matchObjectEntry;exports.matchObjectKey=n.matchObjectKey;exports.matchObjectKeyValue=n.matchObjectKeyValue;exports.matchObjectKeys=n.matchObjectKeys;exports.matchObjectKeysNotNull=n.matchObjectKeysNotNull;exports.matchObjectPartial=n.matchObjectPartial;exports.matchObjectValue=n.matchObjectValue;exports.matchObjectValues=n.matchObjectValues;exports.matchObjectWith=n.matchObjectWith;exports.matchOptional=n.matchOptional;exports.matchOr=n.matchOr;exports.matchOrPipe=n.matchOrPipe;exports.matchRange=n.matchRange;exports.matchRangeDate=n.matchRangeDate;exports.matchRef=n.matchRef;exports.matchString=n.matchString;exports.matchStringLength=n.matchStringLength;exports.matchTypeOf=n.matchTypeOf;exports.matchUuid=n.matchUuid;exports.matchValueState=n.matchValueState;exports.max=n.max;exports.min=n.min;exports.minMax=n.minMax;exports.numberMod=n.numberMod;exports.randomBoolean=n.randomBoolean;exports.randomEnum=n.randomEnum;exports.randomFloat=n.randomFloat;exports.randomIndexWeighted=n.randomIndexWeighted;exports.randomInt=n.randomInt;exports.randomItem=n.randomItem;exports.randomItems=n.randomItems;exports.setFuncName=n.setFuncName;exports.sha256=n.sha256;exports.sha256Buffer=n.sha256Buffer;exports.timeoutAbortController=n.timeoutAbortController;exports.toHex=n.toHex;exports.truncateString=n.truncateString;exports.urlGetBoolean=n.urlGetBoolean;exports.urlGetFloat=n.urlGetFloat;exports.urlGetInt=n.urlGetInt;exports.urlGetParams=n.urlGetParams;exports.urlGetString=n.urlGetString;exports.urlParamToBoolean=n.urlParamToBoolean;exports.urlParamToFloat=n.urlParamToFloat;exports.urlParamToInt=n.urlParamToInt;exports.waitObservable=n.waitObservable;exports.withConsoleReplace=n.withConsoleReplace;exports.withRetry=n.withRetry;exports.withTimeout=n.withTimeout;exports.DIFF_NEW=Z;exports.DIFF_OLD=X;exports.checkPageHttpErrors=Ee;exports.createCDPSession=oe;exports.createMatchPath=Me;exports.createPagesElementsChangesTest=Qe;exports.delayOnErrorCall=ke;exports.delayOnErrorSet=ze;exports.delayOnErrorWait=ve;exports.destroyCDPSession=se;exports.exec=be;exports.fileLock=Ne;exports.forcePseudoClasses=Ce;exports.getAllElements=re;exports.getDrive=fe;exports.getElementsStyleDiff=ie;exports.getFileId=he;exports.getObjectsDiff=U;exports.getPageHttpErrors=Se;exports.globGitIgnoreToPicomatch=pe;exports.globToRelative=we;exports.initPage=Pe;exports.loadGlobs=Be;exports.loadGlobsFromFile=ge;exports.loadJson=je;exports.nodeBeep=$e;exports.objectTransform=G;exports.pathNormalize=B;exports.pathResolve=de;exports.poolFs=ee;exports.saveJson=Q;exports.setPlaywrightPriorityLow=xe;exports.subscribeJsErrors=Oe;exports.testPage=Je;exports.useBrowser=Ue;exports.useBrowserContext=Ge;exports.usingCDPSession=qe;exports.walkPathHandleErrorDefault=me;exports.walkPaths=We;
4
+ `);if(d instanceof Error)return d.stack||d.toString();if(typeof d=="object"&&d!=null){const h=new Set;return JSON.stringify(d,(x,f)=>{if(typeof f=="object"&&f!=null){if(h.has(f))return"[Circular]";h.add(f)}return f},2)}return String(d)}function u(d){window[i](d)}const E={warn:console.warn.bind(console),error:console.error.bind(console)};console.warn=function(...h){return u("console.warn: "+m(h)),E.warn.apply(this,h)},console.error=function(...h){return u("console.error: "+m(h)),E.error.apply(this,h)},window.addEventListener("error",function(d){u("window error: "+(d.message||JSON.stringify(d)))},!0),window.addEventListener("unhandledrejection",function(d){u("window unhandledrejection: "+m(d.reason))},!0)},a)}async function se(){try{process.platform==="win32"&&await Oe(`wmic process where "commandline like '%ms-playwright%' and not commandline like '%wmic.exe%' and priority != 4" CALL setpriority "idle"`)}catch(e){const t=e?.message?.trim();if(/exit code: 2147749890/.test(t))return;console.warn("[test][setPlaywrightPriorityLow] error: "+t)}}let K=null,ne=null;function qe(e){ne=e}function Pe(){if(K)return;const e=ne||(process.env.DELAY_ON_ERROR?parseInt(process.env.DELAY_ON_ERROR,10):0);if(ne)return console.log(`[test][delayOnError] Delay on error: ${e} ms`),K=v.delay(e),K}function He(){return K}async function Ce(e){const{page:t}=e,o=t.context().browser()?.browserType().name(),a=new Y.AbortControllerFast,n=v.combineAbortSignals(a.signal,e.abortSignal),s=i=>{let m=`Error in (${o}) ${t.url()}
5
+ `;e.pageFilePath&&(m+=` at _ (${ae.resolve(e.pageFilePath)}:0:0)
6
+ `),i.stack=m+(i.stack||i.message),i.message=m+i.message,console.error("[test][initPage] error",i),a.abort(i)};return await Te({page:t,filter:e.filters?.js?.filter,onError:s}),{abortSignal:n,checkErrors:async()=>{await ke({page:t,urlFilters:e.filters?.http?.urlFilters,errorFilter:e.filters?.http?.errorFilter}),n.throwIfAborted()}}}async function Me({page:e,abortSignal:t,filters:o,func:a,pageFilePath:n}){const s=e.context().browser()?.browserType().name();try{const{abortSignal:c,checkErrors:i}=await Ce({page:e,abortSignal:t,filters:o,pageFilePath:n});await a({page:e,abortSignal:c,checkErrors:i}),await i()}catch(c){let i=`Error in (${s}) ${e.url()}
7
+ `;throw n&&(i+=` at _ (${ae.resolve(n)}:0:0)
8
+ `),c.stack=i+(c.stack||c.message),c.message=i+c.message,c}}function Ve({browserType:e,options:t}){return async function(a){const n=await e.launch(t??void 0);try{return await a(n)}finally{await n.close()}}}function Ae({browser:e,options:t}){return async function(a){const n=await e.newContext(t??void 0);await se();try{const s=await a(n);return await n.close(),s}catch(s){const c=Pe?.();throw c?(console.error("[test][useBrowserContext] error",s),c.finally(()=>n.close())):await n.close(),s}}}async function Ke(e,t){const o=await e.$$(t);for(const a of o)await a.click()}const re=new Y.AbortControllerFast;let Xe=0;function je(e){return async function({browser:o,contextOptions:a,name:n,url:s,pool:c,priority:i,filters:m,...u},E){const d=v.combineAbortSignals(re.signal,E);try{await N.poolRunWait({pool:c,count:1,priority:i,abortSignal:d,func:async(h,x)=>{x.throwIfAborted(),await Ae({browser:o,options:a})(async f=>{x.throwIfAborted();const y=await f.newPage();await se();const p=o.browserType().name(),C=x.subscribe(()=>{y.isClosed()||(y.close({runBeforeUnload:!1}),f.close({}))});try{console.log(`START ${n} (${p}): ${s}`),await Me({page:y,abortSignal:x,filters:m,func:async({page:l,checkErrors:g,abortSignal:S})=>{await e({page:l,url:s,checkErrors:g,abortSignal:S,args:u})}}),console.log(`END [${Xe++}] ${n} (${p}): ${s}`)}catch(l){if(x.aborted||l instanceof Y.AbortError){console.log(`ABORTED ${n} (${p}): ${s}`);return}throw console.log(`ERROR ${n} (${p}): ${s}`),re.signal.aborted||(console.log("unsubscribe on first error"),C()),re.abort(),l}})}})}catch(h){if(h instanceof Y.AbortError)return;throw h}}}function Qe(e){const t=je(e);return We.createTestVariants(async o=>await t(o))}function Ye(e,t){const o=t.stableTime,a=t.timeout,n=t.mutation?{childList:!!t.mutation.childList,attributes:!!t.mutation.attributes,characterData:!!t.mutation.characterData,subtree:!!t.mutation.subtree,selector:t.mutation.selector??null}:null,s=t.resource?{resource:!!t.resource.resource,navigation:!!t.resource.navigation,paint:!!t.resource.paint,longTask:!!t.resource.longTask}:null;return e.evaluate(({stableTime:c,timeout:i,mutation:m,resource:u})=>{return new Promise((h,x)=>{let f=Date.now(),y=null,p=null;const C=[];function l(){f=Date.now()}function g(){y!=null&&(clearTimeout(y),y=null),p!=null&&(clearTimeout(p),p=null);for(let w=0,P=C.length;w<P;w++)C[w]()}function S(){const w=c-(Date.now()-f);w<=0?(g(),h()):y=setTimeout(S,w)}if(m){const w=E(m,l);C.push(w)}if(u){const w=d(u,l);C.push(w)}y=setTimeout(S,c),p=setTimeout(()=>{g(),x(new Error(`[waitPageStable] timed out after ${i}ms waiting for page to stabilize`))},i)});function E(h,x){const f=h.selector?document.querySelector(h.selector):document.documentElement;if(!f)throw new Error(`[waitPageStable] element not found: ${h.selector}`);const y=new MutationObserver(x);return y.observe(f,{childList:h.childList,attributes:h.attributes,characterData:h.characterData,subtree:h.subtree}),()=>{y.disconnect()}}function d(h,x){const f=[];h.resource&&f.push("resource"),h.navigation&&f.push("navigation"),h.paint&&f.push("paint"),h.longTask&&f.push("longtask");const y=new PerformanceObserver(x);return y.observe({entryTypes:f}),()=>{y.disconnect()}}},{stableTime:o,timeout:a,mutation:n,resource:s})}async function X(e,t){const o=I.dirname(e);await L.promises.stat(o).catch(()=>null)||await L.promises.mkdir(o,{recursive:!0}),await L.promises.writeFile(e,JSON.stringify(t,null,4),{encoding:"utf-8"})}async function Re(e){if(!await L.promises.stat(e).catch(()=>null))return null;const t=await L.promises.readFile(e,{encoding:"utf-8"});return JSON.parse(t)}const Z="-",ee="+";function J(e,t,o){if(e===t)return null;if(Array.isArray(e)){if(Array.isArray(t)){let n=null;for(let s=0,c=Math.max(t.length,t.length);s<c;s++){const i=J(e[s],t[s],o);i!=null&&(n||(n=[]),n.push(i))}return n!=null&&o&&(n=o(e,t,n)),n}}else if(e instanceof Object&&t instanceof Object){let n=null;for(const s in e)if(Object.prototype.hasOwnProperty.call(e,s)){const c=J(e[s],t[s],o);c!=null&&(n||(n={}),n[s]=c)}for(const s in t)if(Object.prototype.hasOwnProperty.call(t,s)&&!Object.prototype.hasOwnProperty.call(e,s)){const c=J(e[s],t[s],o);c!=null&&(n||(n={}),n[s]=c)}return n!=null&&o&&(n=o(e,t,n)),n}let a={[Z]:e,[ee]:t};return o&&(a=o(e,t,a)),a}function oe(e){function t(l){return l.sort((g,S)=>g[0]>S[0]?1:-1).reduce((g,S)=>(g[S[0]]=S[1],g),{})}function o(l){return l.reduce((g,S)=>(g[S]=!0,g),{})}const a=e.filters&&e.filters.excludeAttrs&&o(e.filters.excludeAttrs),n=e.filters&&e.filters.fixAttrs,s=e.filters&&e.filters.fixStyles,c=e.filters&&e.filters.excludeStyles&&o(e.filters.excludeStyles),i=e.filters&&e.filters.fixTags,m=e.filters&&e.filters.excludeClasses,u=e.filters&&e.filters.excludeIds,E=e.filters&&e.filters.excludeSelectorClasses,d=e.filters&&e.filters.excludeSelectorIds;let h;if(e.filters&&e.filters.excludeSelectors&&e.filters.excludeSelectors.length>0){const l=Array.from(document.querySelectorAll(e.filters.excludeSelectors.join(",")));l.length>0&&(h=new Set(l))}function x(l,g,S,w){const P=getComputedStyle(l,g),O=[];for(let k=0,T=P.length;k<T;k++){const A=P[k];if(c&&c[A])continue;let b=P[A];if(b&&s)for(let j=0,M=s.length;j<M;j++)s[j].name.test(A)&&(b=b.replace(s[j].search,s[j].replace));(!S||S[A]!==b)&&(!w||w[A]===b)&&O.push([A,b])}return t(O)}function f(l,g,S){return{_:x(l,void 0,g&&g._,S&&S._),before:x(l,"before",g&&g.before,S&&S.before),after:x(l,"after",g&&g.after,S&&S.after)}}function y(l,g,S,w,P){for(let O=0,k=l.childNodes.length;O<k;O++){const T=l.childNodes[O];if(!T)throw new Error(`child is null; index=${O}; ${w}, ${l.className}\r
9
+ You should wait js executions before test`);T instanceof Element&&p(T,g,S,w,P)}}function p(l,g,S,w,P){const O=P&&P[g.length];if(P&&!O||h&&h.has(l))return;let k=l.tagName&&l.tagName.toLowerCase();if(k==="head"&&(S=!1),i)for(let R=0,B=i.length;R<B;R++)k=k.replace(i[R].search,i[R].replace);if(O&&O.tag!==k)return;const T=[];for(let R=0,B=l.attributes.length;R<B;R++){const _=l.attributes.item(R);let $=_.name,q=_.value;if($=$.toLowerCase(),$!=="class"&&!(a&&a[$])){if(n)for(let z=0,Fe=n.length;z<Fe;z++)n[z].name.test($)&&(q=q.replace(n[z].search,n[z].replace));(!O||O.attrs&&O.attrs[$]===q)&&T.push([$,q])}}const A=[],b=[];for(let R=0,B=l.classList.length;R<B;R++){const _=l.classList.item(R);(!m||!m.test(_))&&A.push(_),(!E||!E.test(_))&&b.push(_)}const j=S?f(l,e.defaultStyle,O&&O.style):null,M=l.childElementCount?[]:null;l.id&&(!u||!u.test(l.id))&&l.id;const D=l.id&&(!d||!d.test(l.id))?l.id:"",F=(k||"")+(D?"#"+D:"")+(b.length>0?"."+b.join("."):""),ue=F?w?w+" > "+F:F:w,Le={tag:k,selector:ue,classes:A,attrs:T.length>0?t(T):null,style:j,childs:M};g.push(Le),M&&y(l,M,S,ue,O&&O.childs)}const C=[];return p(document.documentElement,C,!0,"",e.shouldEqualResult&&[e.shouldEqualResult]),C[0]}async function ce(e){const t=await e.context().newCDPSession(e);return await t.send("DOM.enable"),await t.send("CSS.enable"),t}async function ie(e){await e.send("CSS.disable"),await e.send("DOM.disable"),await e.detach()}async function Ze(e,t){const o=await ce(e);try{return await t(o)}finally{await ie(o)}}async function De(e,t){const{nodes:o}=await e.send("DOM.getFlattenedDocument",{depth:-1,pierce:!0}),a=o.filter(n=>n.nodeType===1).map(n=>n.nodeId);for(const n of a)await e.send("CSS.forcePseudoState",{nodeId:n,forcedPseudoClasses:t})}function Q(e,t){if(!e||!t)return t||null;let o=null;for(const a in t)Object.prototype.hasOwnProperty.call(t,a)&&t[a]!==e[a]&&(o||(o={}),o[a]=t[a]);for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&!Object.prototype.hasOwnProperty.call(t,a)&&(o||(o={}),o[a]="");return o}function et(e,t){if(!e||!t)return t||null;const o=Q(e._,t._),a=Q(e.before,t.before),n=Q(e.after,t.after);return!o&&!a&&!n?null:{_:o||{},before:a||{},after:n||{}}}function tt(e,t){if(!e||!t)return t||null;if(e.length!==t.length)return t;for(let o=0,a=e.length;o<a;o++)if(e[o]!==t[o])return t;return null}function le(e,t){const o=tt(e.classes,t.classes),a=Q(e.attrs,t.attrs),n=et(e.style,t.style);let s=null;if(e.childs&&t.childs){const c=Math.min(e.childs.length,t.childs.length);for(let i=0;i<c;i++){const m=le(e.childs[i],t.childs[i]);if(m){if(!s){s=[];for(let u=0;u<c;u++)s.push({})}s[i]=m}}}return!o&&!a&&!n&&!s?null:{tag:t.tag,selector:t.selector,classes:o,attrs:a,style:n,childs:s}}const G=(e,t,o,a)=>{const n=a(e,t,o,a);if(n==null)return n;if(Array.isArray(n))return n.map((s,c,i)=>G(s,c,i,a));if(typeof n=="object"){const s={};for(const c in n)Object.prototype.hasOwnProperty.call(n,c)&&(s[c]=G(n[c],c,n,a));return s}return n};function Ie(e,t){if(e.attrs&&t.excludeAttrs){for(let o=0,a=t.excludeAttrs.length;o<a;o++)delete e.attrs[t.excludeAttrs[o]];Object.keys(e.attrs).length===0&&(e.attrs=null)}if(e.classes&&t.excludeClasses&&(e.classes=e.classes.filter(o=>!t.excludeClasses.test(o))),e.style&&t.excludeStyles)for(const o of["_","before","after"]){const a=e.style[o];if(a)for(let n=0,s=t.excludeStyles.length;n<s;n++)delete a[t.excludeStyles[n]]}if(e.childs)for(let o=0,a=e.childs.length;o<a;o++)Ie(e.childs[o],t)}function rt(e,t){for(const o in e){if(!Object.prototype.hasOwnProperty.call(e,o))continue;const a=e[o];for(const n in a){if(!Object.prototype.hasOwnProperty.call(a,n))continue;const s=a[n];for(const c in s)Object.prototype.hasOwnProperty.call(s,c)&&Ie(s[c],t)}}}function nt({actualResultFile:e,expectedResultFile:t,diffResultFile:o,filters:a,transform:n,pseudoStates:s}){let c,i,m,u={};return{async init(E){c=await Re(t),n&&(c=G(c,null,null,n)),c&&a&&rt(c,a),await E.goto("about:blank"),i=await E.evaluate(oe,{filters:a}),m=i.style},async handlePage({page:E,testId:d,url:h,stateId:x,_filters:f}){let y=u[d];y||(y={},u[d]=y);let p=y[h.href];p||(p={},y[h.href]=p),await E.addStyleTag({content:"*, *::before, *::after { animation-name: none!important; transition-duration: 0s !important; }"});const C=s??[{states:[]}];let l=null,g;try{for(let S=0;S<C.length;S++){const w=C[S],P=w.states.length>0?x+":"+w.states.join(":"):x;let O=null;if(w.states.length>0){l||(l=await ce(E));const b=performance.now();await De(l,w.states),O=performance.now()-b}w.delay&&await v.delay(w.delay);const k=performance.now(),T=await E.evaluate(oe,{filters:f||a,defaultStyle:m,shouldEqualResult:p[P]}),A=performance.now()-k;if(console.log(`SNAPSHOT ${P}:`+(O!=null?` forcePseudoClasses ${O.toFixed(0)}ms,`:"")+` getAllElements ${A.toFixed(0)}ms`),!g)g=T,p[P]=T;else{const b=le(g,T);b&&(p[P]=b)}}}finally{l&&await ie(l)}},async end({checkExistUrlsOnly:E}){if(u=r.getNormalizedObject(u),n&&(u=G(u,null,null,n)),c){let d,h;if(!E)d=c,h=u;else{d={},h={};for(const f in c)if(Object.prototype.hasOwnProperty.call(c,f)&&Object.prototype.hasOwnProperty.call(u,f)){d[f]={},h[f]={};for(const y in c[f])Object.prototype.hasOwnProperty.call(c[f],y)&&Object.prototype.hasOwnProperty.call(u[f],y)&&(d[f][y]=c[f][y],h[f][y]=u[f][y])}}const x=J(d,h,(f,y,p)=>p.selector&&(delete p.selector,Object.keys(p).length===0)?null:p.childs&&p.childs.length===1?p.childs[0]:(y&&y.selector?p[ee]?p[ee]=y.selector:p={selector:y.selector,...p}:f&&f.selector&&(p[Z]?p[Z]=f.selector:p={selector:f.selector,...p}),p));if(o&&await X(o,x||{}),x)throw await X(e,u),console.error("Pages elements changes: "+JSON.stringify(x,null,4).substring(0,5e3)),new Error("Pages elements changes detected");await L.promises.stat(e).catch(()=>null)&&await L.promises.unlink(e)}else await X(t,u);return u}}}exports.CheckError=r.CheckError;exports.ConsoleMessageLevel=r.ConsoleMessageLevel;exports.Lazy=r.Lazy;exports.LazyWithId=r.LazyWithId;exports.LogLevel=r.LogLevel;exports.MAX_REPORT_ITEMS_DEFAULT=r.MAX_REPORT_ITEMS_DEFAULT;exports.MatchInternalError=r.MatchInternalError;exports.Matcher=r.Matcher;exports.MatcherAny=r.MatcherAny;exports.MatcherArray=r.MatcherArray;exports.MatcherArrayItem=r.MatcherArrayItem;exports.MatcherConvert=r.MatcherConvert;exports.MatcherCustom=r.MatcherCustom;exports.MatcherFew=r.MatcherFew;exports.MatcherIn=r.MatcherIn;exports.MatcherInstanceOf=r.MatcherInstanceOf;exports.MatcherIs=r.MatcherIs;exports.MatcherNever=r.MatcherNever;exports.MatcherNot=r.MatcherNot;exports.MatcherNumber=r.MatcherNumber;exports.MatcherObject=r.MatcherObject;exports.MatcherObjectEntry=r.MatcherObjectEntry;exports.MatcherRef=r.MatcherRef;exports.MatcherString=r.MatcherString;exports.Random=r.Random;exports.Subject=r.Subject;exports.SubjectWithId=r.SubjectWithId;exports.UNIQUE_PSEUDO_RANDOM_MAX_COUNT=r.UNIQUE_PSEUDO_RANDOM_MAX_COUNT;exports.alertConsole=r.alertConsole;exports.alertReplace=r.alertReplace;exports.argsToString=r.argsToString;exports.check=r.check;exports.checkFunc=r.checkFunc;exports.consoleIntercept=r.consoleIntercept;exports.consoleMessageToString=r.consoleMessageToString;exports.consoleReplace=r.consoleReplace;exports.convertTimeZone=r.convertTimeZone;exports.createMatchResult=r.createMatchResult;exports.createMatchResultBoolean=r.createMatchResultBoolean;exports.createMatchResultError=r.createMatchResultError;exports.createTaskDelayRetry=r.createTaskDelayRetry;exports.createUniquePseudoRandom=r.createUniquePseudoRandom;exports.dateNowUnique=r.dateNowUnique;exports.deepCloneJsonLike=r.deepCloneJsonLike;exports.deepEqualJsonLike=r.deepEqualJsonLike;exports.deepEqualJsonLikeMap=r.deepEqualJsonLikeMap;exports.equalArray=r.equalArray;exports.escapeHtml=r.escapeHtml;exports.escapeRegExp=r.escapeRegExp;exports.expectedToString=r.expectedToString;exports.filterMatchResult=r.filterMatchResult;exports.filterMatchResultNested=r.filterMatchResultNested;exports.fixStackTrace=r.fixStackTrace;exports.formatAny=r.formatAny;exports.formatDate=r.formatDate;exports.formatDateFileName=r.formatDateFileName;exports.getConsoleMessages=r.getConsoleMessages;exports.getDateInet=r.getDateInet;exports.getNormalizedObject=r.getNormalizedObject;exports.getObjectId=r.getObjectId;exports.getRandomFunc=r.getRandomFunc;exports.getRandomSeed=r.getRandomSeed;exports.getStackTrace=r.getStackTrace;exports.isMatcher=r.isMatcher;exports.isObservable=r.isObservable;exports.match=r.match;exports.matchAnd=r.matchAnd;exports.matchAndPipe=r.matchAndPipe;exports.matchAny=r.matchAny;exports.matchArray=r.matchArray;exports.matchArrayBuffer=r.matchArrayBuffer;exports.matchArrayIncludes=r.matchArrayIncludes;exports.matchArrayItem=r.matchArrayItem;exports.matchArrayLength=r.matchArrayLength;exports.matchArrayWith=r.matchArrayWith;exports.matchBoolean=r.matchBoolean;exports.matchConstructor=r.matchConstructor;exports.matchConvert=r.matchConvert;exports.matchCustom=r.matchCustom;exports.matchDeep=r.matchDeep;exports.matchEnum=r.matchEnum;exports.matchFloat=r.matchFloat;exports.matchIn=r.matchIn;exports.matchInstanceOf=r.matchInstanceOf;exports.matchInt=r.matchInt;exports.matchIntDate=r.matchIntDate;exports.matchIs=r.matchIs;exports.matchIsNonStrict=r.matchIsNonStrict;exports.matchNever=r.matchNever;exports.matchNot=r.matchNot;exports.matchNotNullish=r.matchNotNullish;exports.matchNullish=r.matchNullish;exports.matchNumber=r.matchNumber;exports.matchObject=r.matchObject;exports.matchObjectEntries=r.matchObjectEntries;exports.matchObjectEntry=r.matchObjectEntry;exports.matchObjectKey=r.matchObjectKey;exports.matchObjectKeyValue=r.matchObjectKeyValue;exports.matchObjectKeys=r.matchObjectKeys;exports.matchObjectKeysNotNull=r.matchObjectKeysNotNull;exports.matchObjectPartial=r.matchObjectPartial;exports.matchObjectValue=r.matchObjectValue;exports.matchObjectValues=r.matchObjectValues;exports.matchObjectWith=r.matchObjectWith;exports.matchOptional=r.matchOptional;exports.matchOr=r.matchOr;exports.matchOrPipe=r.matchOrPipe;exports.matchRange=r.matchRange;exports.matchRangeDate=r.matchRangeDate;exports.matchRef=r.matchRef;exports.matchResultNestedToString=r.matchResultNestedToString;exports.matchResultToString=r.matchResultToString;exports.matchString=r.matchString;exports.matchStringLength=r.matchStringLength;exports.matchTypeOf=r.matchTypeOf;exports.matchUuid=r.matchUuid;exports.matchValueState=r.matchValueState;exports.max=r.max;exports.min=r.min;exports.minMax=r.minMax;exports.numberMod=r.numberMod;exports.randomBoolean=r.randomBoolean;exports.randomEnum=r.randomEnum;exports.randomFloat=r.randomFloat;exports.randomIndexWeighted=r.randomIndexWeighted;exports.randomInt=r.randomInt;exports.randomItem=r.randomItem;exports.randomItems=r.randomItems;exports.setFuncName=r.setFuncName;exports.sha256=r.sha256;exports.sha256Buffer=r.sha256Buffer;exports.timeoutAbortController=r.timeoutAbortController;exports.toHex=r.toHex;exports.truncateString=r.truncateString;exports.urlGetBoolean=r.urlGetBoolean;exports.urlGetFloat=r.urlGetFloat;exports.urlGetInt=r.urlGetInt;exports.urlGetParams=r.urlGetParams;exports.urlGetString=r.urlGetString;exports.urlParamToBoolean=r.urlParamToBoolean;exports.urlParamToFloat=r.urlParamToFloat;exports.urlParamToInt=r.urlParamToInt;exports.validateMatchResult=r.validateMatchResult;exports.waitObservable=r.waitObservable;exports.withConsoleReplace=r.withConsoleReplace;exports.withRetry=r.withRetry;exports.withTimeout=r.withTimeout;exports.DIFF_NEW=ee;exports.DIFF_OLD=Z;exports.checkPageHttpErrors=ke;exports.clickAll=Ke;exports.createCDPSession=ce;exports.createMatchPath=Ue;exports.createPagesElementsChangesTest=nt;exports.createTestE2e=je;exports.createTestE2eVariants=Qe;exports.delayOnErrorCall=Pe;exports.delayOnErrorSet=qe;exports.delayOnErrorWait=He;exports.destroyCDPSession=ie;exports.exec=Oe;exports.fileLock=Be;exports.forcePseudoClasses=De;exports.getAllElements=oe;exports.getDrive=de;exports.getElementsStyleDiff=le;exports.getFileId=ye;exports.getObjectsDiff=J;exports.getPageHttpErrors=xe;exports.globGitIgnoreToPicomatch=be;exports.globToRelative=Ee;exports.initPage=Ce;exports.loadGlobs=Je;exports.loadGlobsFromFile=Se;exports.loadJson=Re;exports.nodeBeep=Ge;exports.objectTransform=G;exports.pathNormalize=W;exports.pathResolve=pe;exports.poolFs=te;exports.saveJson=X;exports.setPlaywrightPriorityLow=se;exports.subscribeJsErrors=Te;exports.testPage=Me;exports.useBrowser=Ve;exports.useBrowserContext=Ae;exports.usingCDPSession=Ze;exports.waitPageStable=Ye;exports.walkPathHandleErrorDefault=we;exports.walkPaths=ze;