@bloom-perf/yaml-pptr 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var B=Object.create;var b=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var _=(o,t)=>{for(var i in t)b(o,i,{get:t[i],enumerable:!0})},$=(o,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of j(t))!V.call(o,r)&&r!==i&&b(o,r,{get:()=>t[r],enumerable:!(n=P(t,r))||n.enumerable});return o};var T=(o,t,i)=>(i=o!=null?B(U(o)):{},$(t||!o||!o.__esModule?b(i,"default",{value:o,enumerable:!0}):i,o)),G=o=>$(b({},"__esModule",{value:!0}),o);var bt={};_(bt,{readYamlAndInterpret:()=>wt});module.exports=G(bt);var C=T(require("puppeteer"),1);var x=T(require("js-yaml"),1);var e=T(require("zod"),1),E=e.enum(["load","domcontentloaded","networkidle0","networkidle2"]),I=e.enum(["left","right","middle"]),M=e.enum(["chrome","firefox"]),N=e.object({timeout:e.number().optional(),waitUntil:e.union([E,E.array()]).optional(),referer:e.string().optional()}).optional(),D=e.object({type:e.literal("WAIT"),milliseconds:e.number()}),q=e.object({button:I.optional(),clickCount:e.number().optional(),delay:e.number().optional()}).optional(),H=e.object({delay:e.number().optional()}).optional(),K=e.object({visible:e.boolean().optional(),hidden:e.boolean().optional(),timeout:e.number().optional()}).optional(),J=e.object({type:e.enum(["png","jpeg"]).optional(),quality:e.number().optional(),fullPage:e.boolean().optional(),clip:e.object({x:e.number(),y:e.number(),width:e.number(),height:e.number()}).optional(),omitBackground:e.boolean().optional(),encoding:e.enum(["base64","binary"]).optional()}).optional(),Q=e.object({type:e.literal("GOTO"),url:e.string(),options:N}),Z=e.object({type:e.literal("CLICK"),selector:e.string(),options:q}),X=e.object({type:e.literal("TYPE"),selector:e.string(),text:e.string(),options:H}),Y=e.object({type:e.literal("WAIT_FOR_SELECTOR"),selector:e.string(),options:K}),tt=e.object({type:e.literal("WAIT_FOR_TIMEOUT"),timeout:e.number()}),et=e.object({type:e.literal("PAUSE")}),ot=e.object({type:e.literal("SCREENSHOT"),path:e.string(),options:J}),it=e.object({type:e.literal("EVALUATE"),script:e.union([e.string(),e.function()])}),nt=e.object({type:e.literal("SET_VIEWPORT"),width:e.number(),height:e.number()}),rt=e.object({type:e.literal("CLOSE")}),W=[Q,Z,X,Y,tt,et,ot,it,nt,rt,D];if(W.length===0)throw new Error("Le tableau des sch\xE9mas d'actions est vide.");var st=W,at=e.discriminatedUnion("type",st),ct=e.object({navigate:e.string()}),pt=e.literal("waitForever"),lt=e.object({wait:e.number()}),ut=e.object({click:e.string()}),gt=e.object({input:e.object({selector:e.string(),text:e.string()})}),St=e.union([ct,pt,lt,ut,gt]),dt=e.object({name:e.string().optional(),browser:M.optional(),run:e.enum(["PARALLEL","SEQUENTIAL"]).optional(),initialDelaySeconds:e.number().nonnegative().optional(),workers:e.number().positive().optional(),iterations:e.number().positive().optional(),location:e.string().optional(),steps:e.array(St).optional(),actions:e.array(at).optional()}),k=e.object({scenarios:e.array(dt)});var O=o=>{let t=x.load(o);return k.parse(t)};var S={debug(o){console.log(o)},info(o){console.log(o)},warn(o){console.log(o)},error(o){console.error(o)}};var v=class{envVarResolve;logger;constructor(t,i=S){this.envVarResolve=n=>{let r=n.startsWith("$")?n.substring(1):n;return t(r)},this.logger=i}resolve(t){return{scenarios:t.scenarios.map((i,n)=>this.resolveScenario(i,n+1))}}resolveScenario(t,i){this.logger.debug(`Resolving YAML scenario: ${JSON.stringify(t)}`);let n=[];t.location&&n.push(this.createNavigateAction(t.location)),t.steps&&n.push(...t.steps.map(s=>this.resolveStep(s))),t.actions&&n.push(...t.actions.map(s=>this.resolveAction(s)));let r=t.run==="SEQUENTIAL"?{delaySecondsBetweenWorkerInits:t.initialDelaySeconds||0}:{initialDelaySeconds:t.initialDelaySeconds||0};return{name:t.name||`Scenario ${i}`,browser:t.browser||"chrome",run:r,workers:t.workers||1,iterations:t.iterations||1,actions:n}}resolveStep(t){if(t==="waitForever")return this.logger.debug("Resolving step: waitForever"),{actionType:"WaitForever"};if("wait"in t)return this.logger.debug(`Resolving step: wait ${t.wait} seconds`),{actionType:"Wait",milliseconds:t.wait*1e3};if("navigate"in t)return this.logger.debug("Resolving step: navigate"),this.createNavigateAction(t.navigate);if("click"in t)return this.logger.debug(`Resolving step: click "${t.click}"`),{actionType:"CLICK",selector:t.click};if("input"in t)return this.logger.debug(`Resolving step: input into "${t.input.selector}"`),{actionType:"TYPE",selector:t.input.selector,text:t.input.text};throw new Error(`Unknown step format: ${JSON.stringify(t)}`)}resolveAction(t){switch(this.logger.debug(`Resolving action: ${JSON.stringify(t)}`),t.type){case"GOTO":return{actionType:"GOTO",url:this.resolveStringOrEnv(t.url),options:t.options};case"WAIT":return{actionType:"Wait",milliseconds:t.milliseconds*1e3};case"CLICK":return{actionType:"CLICK",selector:t.selector,options:t.options};case"TYPE":return{actionType:"TYPE",selector:t.selector,text:t.text,options:t.options};case"WAIT_FOR_SELECTOR":return{actionType:"WAIT_FOR_SELECTOR",selector:t.selector,options:t.options};case"WAIT_FOR_TIMEOUT":return{actionType:"WAIT_FOR_TIMEOUT",timeout:t.timeout};case"PAUSE":return{actionType:"PAUSE"};case"SCREENSHOT":return{actionType:"SCREENSHOT",path:this.resolveStringOrEnv(t.path),options:t.options};case"EVALUATE":return{actionType:"EVALUATE",script:t.script};case"SET_VIEWPORT":return{actionType:"SET_VIEWPORT",width:t.width,height:t.height};case"CLOSE":return{actionType:"CLOSE"};default:return t}}createNavigateAction(t){return{actionType:"Navigate",location:this.resolveUrlOrEnv(t)}}resolveUrlOrEnv(t){let i="[workerIndex]";if(t.startsWith("$")){if(t.endsWith(i)){this.logger.debug(`Resolving indexed environment variable: "${t}"`);let n=t.substring(1,t.length-i.length);return{workerIndex:this.envVarResolve(n).split(",").map(c=>c.trim())}}return this.logger.debug(`Resolving environment variable: "${t}"`),{url:this.envVarResolve(t.substring(1))}}return this.logger.debug(`Using direct URL: "${t}"`),{url:t}}resolveStringOrEnv(t){return t.startsWith("$")?(this.logger.debug(`Resolving environment variable: "${t}"`),this.envVarResolve(t.substring(1))):t}};function At(o,t){let i=t||"png";return o.endsWith(".png")||o.endsWith(".jpeg")||o.endsWith(".jpg")||o.endsWith(".webp")?o:`${o}.${i}`}var R=async(o,t,i=S)=>await ht(t.workers,t.name,async n=>{for(let r=0;r<t.iterations;r++){let s=t.run;"delaySecondsBetweenWorkerInits"in s?(i.info(`Scenario "${t.name}" (worker ${n}) > Choosing SEQUENTIAL start with ${s.delaySecondsBetweenWorkerInits} seconds between workers`),await new Promise(p=>setTimeout(p,s.delaySecondsBetweenWorkerInits*n*1e3))):(i.info(`Scenario "${t.name}" (worker ${n}) > Choosing PARALLEL start with ${s.initialDelaySeconds} seconds of initial delay`),await new Promise(p=>setTimeout(p,s.initialDelaySeconds*1e3)));let c=await o.newPage();await yt(t.name,t.actions,c,n,i),await c.close()}},i),ht=async(o,t,i,n=S)=>Promise.all(Array.from({length:o},async(r,s)=>{try{n.info(`Scenario "${t}" (worker ${s}) started.`),await i(s)}catch(c){n.error(`Scenario ${t} (worker ${s}) failed: ${c}`)}})),yt=async(o,t,i,n,r=S)=>{for(let s of t){let{actionType:c}=s;switch(c){case"Navigate":let p=s;"url"in p.location?(r.info(`Scenario "${o}" (worker ${n}) > Navigating to location "${p.location.url}"`),await i.goto(p.location.url)):(r.info(`Scenario "${o}" (worker ${n}) > Navigating to indexed location "${p.location.workerIndex[n]}"`),await i.goto(p.location.workerIndex[n]));break;case"Wait":let y=s;r.info(`Scenario "${o}" (worker ${n}) > Waiting ${y.milliseconds} milliseconds...`),await i.evaluate(h=>new Promise(f=>setTimeout(f,h)),y.milliseconds);break;case"WaitForever":for(r.info(`Scenario "${o}" (worker ${n}) > Waiting forever...`);;)await new Promise(h=>setTimeout(h,3600*1e3));break;case"GOTO":let a=s;r.info(`Scenario "${o}" (worker ${n}) > GOTO "${a.url}"`);let l={timeout:a.options?.timeout,waitUntil:a.options?.waitUntil,referer:a.options?.referer};await i.goto(a.url,l);break;case"CLICK":let u=s;r.info(`Scenario "${o}" (worker ${n}) > CLICK on "${u.selector}"`);let d={button:u.options?.button,clickCount:u.options?.clickCount,delay:u.options?.delay};await i.click(u.selector,d);break;case"TYPE":let m=s;r.info(`Scenario "${o}" (worker ${n}) > TYPE into "${m.selector}"`),await i.type(m.selector,m.text,m.options);break;case"WAIT_FOR_SELECTOR":let A=s;r.info(`Scenario "${o}" (worker ${n}) > WAIT_FOR_SELECTOR "${A.selector}"`),await i.waitForSelector(A.selector,A.options);break;case"WAIT_FOR_TIMEOUT":let z=s;r.info(`Scenario "${o}" (worker ${n}) > WAIT_FOR_TIMEOUT ${z.timeout} milliseconds`),await i.evaluate(h=>new Promise(f=>setTimeout(f,h)),z.timeout);break;case"PAUSE":r.info(`Scenario "${o}" (worker ${n}) > PAUSE, press Enter to continue...`),await new Promise(h=>{process.stdin.resume(),process.stdin.once("data",()=>{process.stdin.pause(),h()})});break;case"SCREENSHOT":let g=s;r.info(`Scenario "${o}" (worker ${n}) > SCREENSHOT "${g.path}"`);let F={path:At(g.path,g.options?.type),type:g.options?.type,quality:g.options?.quality,fullPage:g.options?.fullPage,clip:g.options?.clip,omitBackground:g.options?.omitBackground,encoding:g.options?.encoding};await i.screenshot(F);break;case"EVALUATE":let L=s;r.info(`Scenario "${o}" (worker ${n}) > EVALUATE script`),await i.evaluate(L.script);break;case"SET_VIEWPORT":let w=s;r.info(`Scenario "${o}" (worker ${n}) > SET_VIEWPORT width=${w.width}, height=${w.height}`),await i.setViewport({width:w.width,height:w.height});break;case"CLOSE":r.info(`Scenario "${o}" (worker ${n}) > CLOSE page`),await i.close();break;default:throw new Error(`Unhandled action type "${c}" while evaluating scenario "${o}" on worker ${n}`)}}};var wt=async(o,t={},i=S)=>{let n=O(o),s=new v(a=>{let l=process.env[a];if(i.debug(`Resolving env variable "${a}" with value ***`),l)return l;throw new Error(`Tried to resolve env variable ${a} but was empty.`)},i).resolve(n),c={};for(let a of s.scenarios){let l=a.browser||"chrome";c[l]||(c[l]=[]),c[l]?.push(a)}let p=["chrome","firefox"],y=Object.entries(c).map(async([a,l])=>{if(!l)return;if(!p.includes(a)){console.error(`Navigateur non support\xE9: ${a}. Les navigateurs support\xE9s sont: ${p.join(", ")}`);return}let u=["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage","--disable-accelerated-2d-canvas","--disable-gpu","--ignore-certificate-errors"];a==="chrome"&&u.push("--start-maximized"),a==="firefox"&&u.push("--private");let d=t[a],m=!1;d||(d=await C.launch({headless:!1,channel:a,acceptInsecureCerts:!0,args:u}),m=!0);try{for(let A of l)await R(d,A,i)}catch(A){console.error(`Erreur lors de l'ex\xE9cution des sc\xE9narios pour ${a}:`,A)}finally{m&&d&&await d.close()}});await Promise.all(y)};0&&(module.exports={readYamlAndInterpret});
1
+ "use strict";var L=Object.create;var w=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var _=(o,t)=>{for(var n in t)w(o,n,{get:t[n],enumerable:!0})},$=(o,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of j(t))!V.call(o,r)&&r!==n&&w(o,r,{get:()=>t[r],enumerable:!(i=B(t,r))||i.enumerable});return o};var z=(o,t,n)=>(n=o!=null?L(U(o)):{},$(t||!o||!o.__esModule?w(n,"default",{value:o,enumerable:!0}):n,o)),G=o=>$(w({},"__esModule",{value:!0}),o);var wt={};_(wt,{readYamlAndInterpret:()=>bt});module.exports=G(wt);var R=z(require("puppeteer"),1);var x=z(require("js-yaml"),1);var e=z(require("zod"),1),k=e.enum(["load","domcontentloaded","networkidle0","networkidle2"]),I=e.enum(["left","right","middle"]),N=e.enum(["chrome","firefox"]),M=e.object({timeout:e.number().optional(),waitUntil:e.union([k,k.array()]).optional(),referer:e.string().optional()}).optional(),D=e.object({type:e.literal("WAIT"),milliseconds:e.number()}),q=e.object({button:I.optional(),clickCount:e.number().optional(),delay:e.number().optional()}).optional(),H=e.object({delay:e.number().optional()}).optional(),K=e.object({visible:e.boolean().optional(),hidden:e.boolean().optional(),timeout:e.number().optional()}).optional(),J=e.object({type:e.enum(["png","jpeg"]).optional(),quality:e.number().optional(),fullPage:e.boolean().optional(),clip:e.object({x:e.number(),y:e.number(),width:e.number(),height:e.number()}).optional(),omitBackground:e.boolean().optional(),encoding:e.enum(["base64","binary"]).optional()}).optional(),Q=e.object({type:e.literal("GOTO"),url:e.string(),options:M}),Z=e.object({type:e.literal("CLICK"),selector:e.string(),options:q}),X=e.object({type:e.literal("TYPE"),selector:e.string(),text:e.string(),options:H}),Y=e.object({type:e.literal("WAIT_FOR_SELECTOR"),selector:e.string(),options:K}),tt=e.object({type:e.literal("WAIT_FOR_TIMEOUT"),timeout:e.number()}),et=e.object({type:e.literal("PAUSE")}),ot=e.object({type:e.literal("SCREENSHOT"),path:e.string(),options:J}),it=e.object({type:e.literal("EVALUATE"),script:e.union([e.string(),e.function()])}),nt=e.object({type:e.literal("SET_VIEWPORT"),width:e.number(),height:e.number()}),rt=e.object({type:e.literal("CLOSE")}),E=[Q,Z,X,Y,tt,et,ot,it,nt,rt,D];if(E.length===0)throw new Error("Le tableau des sch\xE9mas d'actions est vide.");var st=E,at=e.discriminatedUnion("type",st),ct=e.object({navigate:e.string()}),pt=e.literal("waitForever"),lt=e.object({wait:e.number()}),ut=e.object({click:e.string()}),gt=e.object({input:e.object({selector:e.string(),text:e.string()})}),mt=e.union([ct,pt,lt,ut,gt]),dt=e.object({name:e.string().optional(),browser:N.optional(),run:e.enum(["PARALLEL","SEQUENTIAL"]).optional(),initialDelaySeconds:e.number().nonnegative().optional(),workers:e.number().positive().optional(),iterations:e.number().positive().optional(),location:e.string().optional(),steps:e.array(mt).optional(),actions:e.array(at).optional()}),W=e.object({scenarios:e.array(dt)});var O=o=>{let t=x.load(o);return W.parse(t)};var A={debug(o){console.log(o)},info(o){console.log(o)},warn(o){console.log(o)},error(o){console.error(o)}};var v=class{envVarResolve;logger;constructor(t,n=A){this.envVarResolve=i=>{let r=i.startsWith("$")?i.substring(1):i;return t(r)},this.logger=n}resolve(t){return{scenarios:t.scenarios.map((n,i)=>this.resolveScenario(n,i+1))}}resolveScenario(t,n){this.logger.debug(`Resolving YAML scenario: ${JSON.stringify(t)}`);let i=[];t.location&&i.push(this.createNavigateAction(t.location)),t.steps&&i.push(...t.steps.map(s=>this.resolveStep(s))),t.actions&&i.push(...t.actions.map(s=>this.resolveAction(s)));let r=t.run==="SEQUENTIAL"?{delaySecondsBetweenWorkerInits:t.initialDelaySeconds||0}:{initialDelaySeconds:t.initialDelaySeconds||0};return{name:t.name||`Scenario ${n}`,browser:t.browser||"chrome",run:r,workers:t.workers||1,iterations:t.iterations||1,actions:i}}resolveStep(t){if(t==="waitForever")return this.logger.debug("Resolving step: waitForever"),{actionType:"WaitForever"};if("wait"in t)return this.logger.debug(`Resolving step: wait ${t.wait} seconds`),{actionType:"Wait",milliseconds:t.wait*1e3};if("navigate"in t)return this.logger.debug("Resolving step: navigate"),this.createNavigateAction(t.navigate);if("click"in t)return this.logger.debug(`Resolving step: click "${t.click}"`),{actionType:"CLICK",selector:t.click};if("input"in t)return this.logger.debug(`Resolving step: input into "${t.input.selector}"`),{actionType:"TYPE",selector:t.input.selector,text:t.input.text};throw new Error(`Unknown step format: ${JSON.stringify(t)}`)}resolveAction(t){switch(this.logger.debug(`Resolving action: ${JSON.stringify(t)}`),t.type){case"GOTO":return{actionType:"GOTO",url:this.resolveStringOrEnv(t.url),options:t.options};case"WAIT":return{actionType:"Wait",milliseconds:t.milliseconds*1e3};case"CLICK":return{actionType:"CLICK",selector:t.selector,options:t.options};case"TYPE":return{actionType:"TYPE",selector:t.selector,text:t.text,options:t.options};case"WAIT_FOR_SELECTOR":return{actionType:"WAIT_FOR_SELECTOR",selector:t.selector,options:t.options};case"WAIT_FOR_TIMEOUT":return{actionType:"WAIT_FOR_TIMEOUT",timeout:t.timeout};case"PAUSE":return{actionType:"PAUSE"};case"SCREENSHOT":return{actionType:"SCREENSHOT",path:this.resolveStringOrEnv(t.path),options:t.options};case"EVALUATE":return{actionType:"EVALUATE",script:t.script};case"SET_VIEWPORT":return{actionType:"SET_VIEWPORT",width:t.width,height:t.height};case"CLOSE":return{actionType:"CLOSE"};default:return t}}createNavigateAction(t){return{actionType:"Navigate",location:this.resolveUrlOrEnv(t)}}resolveUrlOrEnv(t){let n="[workerIndex]";if(t.startsWith("$")){if(t.endsWith(n)){this.logger.debug(`Resolving indexed environment variable: "${t}"`);let i=t.substring(1,t.length-n.length);return{workerIndex:this.envVarResolve(i).split(",").map(c=>c.trim())}}return this.logger.debug(`Resolving environment variable: "${t}"`),{url:this.envVarResolve(t.substring(1))}}return this.logger.debug(`Using direct URL: "${t}"`),{url:t}}resolveStringOrEnv(t){return t.startsWith("$")?(this.logger.debug(`Resolving environment variable: "${t}"`),this.envVarResolve(t.substring(1))):t}};function At(o,t){let n=t||"png";return o.endsWith(".png")||o.endsWith(".jpeg")||o.endsWith(".jpg")||o.endsWith(".webp")?o:`${o}.${n}`}var C=async(o,t,n=A,i)=>await yt(t.workers,t.name,async r=>{for(let s=0;s<t.iterations;s++){let c=t.run;"delaySecondsBetweenWorkerInits"in c?(n.info(`Scenario "${t.name}" (worker ${r}) > Choosing SEQUENTIAL start with ${c.delaySecondsBetweenWorkerInits} seconds between workers`),await new Promise(u=>setTimeout(u,c.delaySecondsBetweenWorkerInits*r*1e3))):(n.info(`Scenario "${t.name}" (worker ${r}) > Choosing PARALLEL start with ${c.initialDelaySeconds} seconds of initial delay`),await new Promise(u=>setTimeout(u,c.initialDelaySeconds*1e3)));let l=await o.newPage();i&&await i(l,{scenarioName:t.name,workerIndex:r,iteration:s}),await ht(t.name,t.actions,l,r,n),await l.close()}},n),yt=async(o,t,n,i=A)=>Promise.all(Array.from({length:o},async(r,s)=>{try{i.info(`Scenario "${t}" (worker ${s}) started.`),await n(s)}catch(c){i.error(`Scenario ${t} (worker ${s}) failed: ${c}`)}})),ht=async(o,t,n,i,r=A)=>{for(let s of t){let{actionType:c}=s;switch(c){case"Navigate":let l=s;"url"in l.location?(r.info(`Scenario "${o}" (worker ${i}) > Navigating to location "${l.location.url}"`),await n.goto(l.location.url)):(r.info(`Scenario "${o}" (worker ${i}) > Navigating to indexed location "${l.location.workerIndex[i]}"`),await n.goto(l.location.workerIndex[i]));break;case"Wait":let u=s;r.info(`Scenario "${o}" (worker ${i}) > Waiting ${u.milliseconds} milliseconds...`),await n.evaluate(y=>new Promise(T=>setTimeout(T,y)),u.milliseconds);break;case"WaitForever":for(r.info(`Scenario "${o}" (worker ${i}) > Waiting forever...`);;)await new Promise(y=>setTimeout(y,3600*1e3));break;case"GOTO":let d=s;r.info(`Scenario "${o}" (worker ${i}) > GOTO "${d.url}"`);let f={timeout:d.options?.timeout,waitUntil:d.options?.waitUntil,referer:d.options?.referer};await n.goto(d.url,f);break;case"CLICK":let a=s;r.info(`Scenario "${o}" (worker ${i}) > CLICK on "${a.selector}"`);let g={button:a.options?.button,clickCount:a.options?.clickCount,delay:a.options?.delay};await n.click(a.selector,g);break;case"TYPE":let S=s;r.info(`Scenario "${o}" (worker ${i}) > TYPE into "${S.selector}"`),await n.type(S.selector,S.text,S.options);break;case"WAIT_FOR_SELECTOR":let m=s;r.info(`Scenario "${o}" (worker ${i}) > WAIT_FOR_SELECTOR "${m.selector}"`),await n.waitForSelector(m.selector,m.options);break;case"WAIT_FOR_TIMEOUT":let h=s;r.info(`Scenario "${o}" (worker ${i}) > WAIT_FOR_TIMEOUT ${h.timeout} milliseconds`),await n.evaluate(y=>new Promise(T=>setTimeout(T,y)),h.timeout);break;case"PAUSE":r.info(`Scenario "${o}" (worker ${i}) > PAUSE, press Enter to continue...`),await new Promise(y=>{process.stdin.resume(),process.stdin.once("data",()=>{process.stdin.pause(),y()})});break;case"SCREENSHOT":let p=s;r.info(`Scenario "${o}" (worker ${i}) > SCREENSHOT "${p.path}"`);let P={path:At(p.path,p.options?.type),type:p.options?.type,quality:p.options?.quality,fullPage:p.options?.fullPage,clip:p.options?.clip,omitBackground:p.options?.omitBackground,encoding:p.options?.encoding};await n.screenshot(P);break;case"EVALUATE":let F=s;r.info(`Scenario "${o}" (worker ${i}) > EVALUATE script`),await n.evaluate(F.script);break;case"SET_VIEWPORT":let b=s;r.info(`Scenario "${o}" (worker ${i}) > SET_VIEWPORT width=${b.width}, height=${b.height}`),await n.setViewport({width:b.width,height:b.height});break;case"CLOSE":r.info(`Scenario "${o}" (worker ${i}) > CLOSE page`),await n.close();break;default:throw new Error(`Unhandled action type "${c}" while evaluating scenario "${o}" on worker ${i}`)}}};var bt=async(o,t={})=>{let{browsers:n={},logger:i=A,onPage:r}=t,s=O(o),l=new v(a=>{let g=process.env[a];if(i.debug(`Resolving env variable "${a}" with value ***`),g)return g;throw new Error(`Tried to resolve env variable ${a} but was empty.`)},i).resolve(s),u={};for(let a of l.scenarios){let g=a.browser||"chrome";u[g]||(u[g]=[]),u[g]?.push(a)}let d=["chrome","firefox"],f=Object.entries(u).map(async([a,g])=>{if(!g)return;if(!d.includes(a)){console.error(`Navigateur non support\xE9: ${a}. Les navigateurs support\xE9s sont: ${d.join(", ")}`);return}let S=["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage","--disable-accelerated-2d-canvas","--disable-gpu","--ignore-certificate-errors"];a==="chrome"&&S.push("--start-maximized"),a==="firefox"&&S.push("--private");let m=n[a],h=!1;m||(m=await R.launch({headless:!1,channel:a,acceptInsecureCerts:!0,args:S}),h=!0);try{for(let p of g)await C(m,p,i,r)}catch(p){console.error(`Erreur lors de l'ex\xE9cution des sc\xE9narios pour ${a}:`,p)}finally{h&&m&&await m.close()}});await Promise.all(f)};0&&(module.exports={readYamlAndInterpret});
@@ -128,3 +128,9 @@ export type Scenario = {
128
128
  export type Root = {
129
129
  scenarios: Scenario[];
130
130
  };
131
+ export type ScenarioContext = {
132
+ scenarioName: string;
133
+ workerIndex: number;
134
+ iteration: number;
135
+ };
136
+ export type OnPageCallback = (page: import('puppeteer').Page, context: ScenarioContext) => Promise<void>;
@@ -1,4 +1,12 @@
1
1
  import * as p from 'puppeteer';
2
- import { SupportedBrowser } from './core/model';
2
+ import { SupportedBrowser, OnPageCallback } from './core/model';
3
3
  import { YpLogger } from './core/logger';
4
- export declare const readYamlAndInterpret: (yamlContent: string, browsers?: { [key in SupportedBrowser]?: p.Browser; }, logger?: YpLogger) => Promise<void>;
4
+ export type { ScenarioContext, OnPageCallback } from './core/model';
5
+ export type ReadYamlOptions = {
6
+ browsers?: {
7
+ [key in SupportedBrowser]?: p.Browser;
8
+ };
9
+ logger?: YpLogger;
10
+ onPage?: OnPageCallback;
11
+ };
12
+ export declare const readYamlAndInterpret: (yamlContent: string, options?: ReadYamlOptions) => Promise<void>;
@@ -1,4 +1,4 @@
1
1
  import * as p from 'puppeteer';
2
2
  import { YpLogger } from '../core/logger';
3
- import { Scenario } from '../core/model';
4
- export declare const evalScenario: (browser: p.Browser, scenario: Scenario, logger?: YpLogger) => Promise<void[]>;
3
+ import { OnPageCallback, Scenario } from '../core/model';
4
+ export declare const evalScenario: (browser: p.Browser, scenario: Scenario, logger?: YpLogger, onPage?: OnPageCallback) => Promise<void[]>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bloom-perf/yaml-pptr",
3
- "version": "1.0.1",
3
+ "version": "2.0.0",
4
4
  "description": "A library to generate puppeteer browser controls through a YAML api.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,14 +13,14 @@
13
13
  "@types/chai": "5.2.3",
14
14
  "@types/js-yaml": "4.0.9",
15
15
  "@types/mocha": "10.0.10",
16
- "c8": "10.1.3",
16
+ "c8": "11.0.0",
17
17
  "chai": "6.2.2",
18
18
  "cross-env": "10.1.0",
19
- "esbuild": "0.27.2",
19
+ "esbuild": "0.27.3",
20
20
  "esbuild-node-externals": "1.20.1",
21
21
  "mocha": "11.7.5",
22
22
  "prettier": "3.8.1",
23
- "puppeteer": "24.36.1",
23
+ "puppeteer": "24.38.0",
24
24
  "ts-mockito": "2.6.1",
25
25
  "ts-node": "10.9.2",
26
26
  "tsx": "4.21.0",