shiplightai 0.1.13 → 0.1.14
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/cjs/index.cjs +119 -119
- package/dist/cli.js +473 -473
- package/dist/index.js +7 -7
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "module";
|
|
2
2
|
const require = __createRequire(import.meta.url);
|
|
3
|
-
import{r as
|
|
3
|
+
import{r as ye,s as we}from"./chunk-NDYQF4WM.js";import"./chunk-JY6U4L7Q.js";import"./chunk-ESJGKHJ4.js";import"./chunk-VXL4KP4U.js";import"./chunk-YU3XZJIJ.js";import"./chunk-QU5HYOUM.js";import{l as $e}from"./chunk-4JBGAENP.js";import"./chunk-FL4TL6US.js";import"./chunk-BVOD5VWH.js";import{b as _e}from"./chunk-FBJSHHRD.js";import{Ka as G,ga as N}from"./chunk-SUZXLRAA.js";import"./chunk-CSINHOOD.js";import*as x from"fs";import*as S from"path";import Qe from"dotenv";import{globSync as Ze}from"glob";import{readFileSync as le,writeFileSync as De,statSync as Ge,existsSync as We}from"fs";import{resolve as Ye}from"path";import{globSync as Ve}from"glob";import{parse as Ee,stringify as K}from"yaml";import{readFileSync as Se}from"fs";import{resolve as V,dirname as be}from"path";import{parse as W,stringify as Ae}from"yaml";var Y=5;function J(e,t){let n={expandingPaths:new Set([V(t)]),depth:0,referencedPaths:new Set},s={...e};Array.isArray(s.statements)&&(s.statements=k(s.statements,t,n)),Array.isArray(s.teardown)&&(s.teardown=k(s.teardown,t,n));for(let r of["beforeAll","afterAll","beforeEach","afterEach"])Array.isArray(s[r])&&(s[r]=k(s[r],t,n));return{doc:s,referencedTemplatePaths:Array.from(n.referencedPaths)}}function k(e,t,n){let s=[];for(let r of e)if(xe(r)){let a=ke(r,t,n);s.push(...a)}else s.push(Te(r,t,n));return s}function xe(e){return typeof e=="object"&&e!==null&&typeof e.template=="string"}function ke(e,t,n){if(n.depth>=Y)throw new Error(`Template expansion exceeded maximum depth of ${Y}. Check for deeply nested or circular template references.`);let s=V(be(t),e.template);if(n.expandingPaths.has(s))throw new Error(`Circular template reference detected: ${s} is already being expanded. Stack: ${Array.from(n.expandingPaths).join(" \u2192 ")} \u2192 ${s}`);n.referencedPaths.add(s);let r;try{r=Se(s,"utf-8")}catch(u){throw new Error(`Failed to read template file: ${s} (referenced from ${t}): ${u.message}`)}let a=W(r);if(!a||typeof a!="object")throw new Error(`Invalid template file: ${s} \u2014 expected a YAML object`);let i=a.params||[],o=e.params||{};for(let u of i)if(!(u in o))throw new Error(`Template ${e.template} requires param "${u}" but it was not provided. Required params: [${i.join(", ")}]`);let l=a.statements;if(!Array.isArray(l))throw new Error(`Template ${e.template} must have a "statements" array`);if(Object.keys(o).length>0){let f=Ae(l);for(let[h,g]of Object.entries(o))f=f.replaceAll(`<<${h}>>`,String(g));l=W(f)}let c={expandingPaths:new Set([...n.expandingPaths,s]),depth:n.depth+1,referencedPaths:n.referencedPaths};return k(l,s,c)}function Te(e,t,n){if(typeof e!="object"||e===null)return e;let s={...e};return Array.isArray(s.statements)&&(s.statements=k(s.statements,t,n)),Array.isArray(s.THEN)&&(s.THEN=k(s.THEN,t,n)),Array.isArray(s.ELSE)&&(s.ELSE=k(s.ELSE,t,n)),Array.isArray(s.DO)&&(s.DO=k(s.DO,t,n)),s}function q(e,t){let n=Ee(e),s=n?.name,r=n?.tags,a=n?.use;if(n&&(n.name!==void 0||n.tags!==void 0||n.use!==void 0)&&(delete n.name,delete n.tags,delete n.use),n?.suite){if(n.goal||n.statements)throw new Error('YAML file cannot have both "suite" and top-level "goal"/"statements". Use either suite format or single-test format.');return ve(n,s,r,a,t)}return Oe(n,s,r,a,t)}function Oe(e,t,n,s,r){let a=e?.beforeEach,i=e?.afterEach,o=B(e?.parameters),l=e?.timeout,c=e?.skip,u=e?.fail,f=e?.only,h=e?.slow;e&&(delete e.beforeEach,delete e.afterEach,delete e.parameters,delete e.timeout,delete e.skip,delete e.fail,delete e.only,delete e.slow),e&&!e.goal&&t&&(e.goal=t);let g=[];if(r&&e&&typeof e=="object"){let b=J(e,r);e=b.doc,g=b.referencedTemplatePaths}let _=K(e);return{testFlow:N(_),name:t,tags:n,use:s,beforeEach:a,afterEach:i,parameters:o,timeout:l,skip:c,fail:u,only:f,slow:h,referencedTemplatePaths:g}}function ve(e,t,n,s,r){let a=e.suite;if(!Array.isArray(a.tests)||a.tests.length===0)throw new Error('Suite must have a non-empty "tests" array.');let i=a.serial,o=a.beforeAll,l=a.afterAll,c=a.beforeEach,u=a.afterEach,f=[],h=a.tests.map(g=>{if(!g.name)throw new Error('Each test in a suite must have a "name" field.');if(!Array.isArray(g.statements)||g.statements.length===0)throw new Error(`Suite test "${g.name}" must have a non-empty "statements" array.`);let _={goal:g.name,statements:g.statements};g.teardown&&(_.teardown=g.teardown);let T=[],b=_;if(r&&typeof _=="object"){let A=J(_,r);b=A.doc,T=A.referencedTemplatePaths,f.push(...T)}let P=K(b),L=N(P),y=B(g.parameters);return{testFlow:L,name:g.name,parameters:y,timeout:g.timeout,skip:g.skip,fail:g.fail,only:g.only,slow:g.slow}});return{suite:{serial:i,beforeAll:o,afterAll:l,beforeEach:c,afterEach:u,tests:h},name:t,tags:n,use:s,referencedTemplatePaths:f}}function B(e){if(!(!Array.isArray(e)||e.length===0))return e.map((t,n)=>{if(!t.name)throw new Error(`Parameter set at index ${n} must have a "name" field.`);if(!t.values||typeof t.values!="object")throw new Error(`Parameter set "${t.name}" must have a "values" object.`);return{name:t.name,values:t.values}})}import{stringify as ne}from"yaml";function w(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function d(e){return e.replace(/\r\n/g," ").replace(/\n/g," ").replace(/\r/g," ").trim()}function Pe(e){let t=e.frame_path;return!t||t.length===0?"page":`page.frameLocator('${t[0]}')`}function Ne(e){let t=e.xpath;return typeof t=="string"&&t.trim()?!t.startsWith("xpath=")&&!t.startsWith("/")&&!t.startsWith("//")?`xpath=//${t}`:t.startsWith("xpath=")?t:`xpath=${t}`:null}function H(e){let t=Pe(e),n=e.locator;if(typeof n=="string"&&n.trim())return n=n.trim(),n.endsWith("first()")?`${t}.${n}`:`${t}.${n}.first()`;let s=Ne(e);if(s){let r=JSON.stringify(s);return`${t}.locator(${r}).first()`}return null}var Le=["ai_action","ai_step","ai_assert","ai_extract","ai_wait_until","verify","assert"],Ce=["js_code","function","wait","wait_for_download_complete","wait_for_page_ready","extract_email_content","extract_activation_code"];function M(e){let t=e.action_data?.action_name;return!t||(t==="verify"||t==="ai_assert"||t==="assert")&&e.action_data?.kwargs?.code?!1:Le.includes(t)}function z(e){let t=e.action_data?.action_name;return!t||(t==="verify"||t==="ai_assert"||t==="assert")&&e.action_data?.kwargs?.code?!1:!Ce.includes(t)}var m=new Map;function p(e,t){m.set(e,t)}function Z(e){return m.get(e)}function E(e,t,n=[]){let s=[...n];return t.locator?s.push(`locator: ${JSON.stringify(t.locator)}`):t.xpath&&s.push(`xpath: ${JSON.stringify(t.xpath)}`),t.frame_path&&t.frame_path.length>0&&s.push(`frame_path: ${JSON.stringify(t.frame_path)}`),s.length===0?[`await agent.execAction("${e}", page, {});`]:[`await agent.execAction("${e}", page, {`,...s.map(r=>` ${r},`),"});"]}p("click",e=>{let t=H(e);return t?[`await ${t}.click({ timeout: ${5e3} });`]:['await agent.execAction("click", page, {});']});p("click_element",m.get("click"));p("click_element_by_index",m.get("click"));p("double_click",e=>E("double_click",e));p("double_click_on_element",m.get("double_click"));p("right_click",e=>E("right_click",e));p("right_click_on_element",m.get("right_click"));p("hover",e=>E("hover",e));p("hover_element_by_index",m.get("hover"));p("input_text",e=>{let t=e.action_data?.kwargs?.text??e.action_data?.kwargs?.value??"";return E("input_text",e,[`action_data: { kwargs: { text: ${JSON.stringify(t)} } }`])});p("fill",m.get("input_text"));p("clear_input",e=>E("clear_input",e));p("press",e=>{let t=e.action_data?.kwargs?.keys;return[`await page.keyboard.press(${JSON.stringify(t)});`]});p("send_keys",m.get("press"));p("send_keys_on_element",e=>{let t=H(e),n=e.action_data?.kwargs?.keys||"";return t?[`await ${t}.press(${JSON.stringify(n)}, { timeout: ${5e3} });`]:['await agent.execAction("send_keys_on_element", page, {',` action_data: { kwargs: { keys: ${JSON.stringify(n)} } },`,"});"]});p("select_dropdown_option",e=>{let t=e.action_data?.kwargs?.text||e.action_data?.kwargs?.option||"";return E("select_dropdown_option",e,[`action_data: { kwargs: { text: ${JSON.stringify(t)} } }`])});p("scroll",e=>{let t=e.action_data?.kwargs?.down??!0;return[`await page.evaluate('window.scrollBy(0, window.innerHeight * ${(e.action_data?.kwargs?.num_pages??1)*(t?1:-1)})');`]});p("scroll_down",m.get("scroll"));p("scroll_up",m.get("scroll"));p("scroll_element",m.get("scroll"));p("scroll_to_text",e=>{let t=e.action_data?.kwargs?.text||"";return[`await page.getByText(${JSON.stringify(t)}, { exact: false }).first().scrollIntoViewIfNeeded();`]});p("scroll_on_element",e=>E("scroll_on_element",e,[`action_data: { kwargs: ${JSON.stringify(e.action_data?.kwargs||{})} }`]));p("go_to_url",e=>{let t=e.action_data?.kwargs?.url||"";return e.action_data?.kwargs?.new_tab===!0?['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(t)}, new_tab: true } },`,"});"]:['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(t)} } },`,"});"]});p("open_tab",m.get("go_to_url"));p("go_back",()=>['await agent.execAction("go_back", page, {});']);p("reload_page",()=>['await agent.execAction("reload_page", page, {});']);p("wait",e=>[`await page.waitForTimeout(${(e.action_data?.kwargs?.seconds||1)*1e3});`]);p("wait_for_page_ready",()=>["await page.waitForLoadState('domcontentloaded');"]);p("verify",(e,t)=>{let n=e.action_data?.kwargs;if(n?.code)return n.code.split(`
|
|
4
4
|
`);let s=n?.statement||e.action_description;return s?[`await agent.assert(page, ${JSON.stringify(s)}, '${t||""}');`]:["// Skipping verify: missing statement or code"]});p("ai_assert",m.get("verify"));p("assert",m.get("verify"));p("ai_action",(e,t)=>{let n=e.action_data?.kwargs?.statement;if(!n)return["// Skipping ai_action: missing statement"];let s=JSON.stringify(n),r=e.action_data?.kwargs?.use_pure_vision;return[`await agent.execute(page, ${s}, '${t||""}', ${r});`]});p("ai_step",(e,t)=>{let n=e.action_data?.kwargs?.statement;return n?[`await agent.run(page, ${JSON.stringify(n)}, '${t||""}');`]:["// Skipping ai_step: missing statement"]});p("ai_extract",(e,t)=>{let n=e.action_data?.kwargs?.element_description,s=e.action_data?.kwargs?.variable_name;if(!n||!s)return["// Skipping ai_extract: missing element_description or variable_name"];let r=JSON.stringify(n),a=JSON.stringify(s);return[`await agent.extract(page, ${r}, ${a}, '${t||""}');`]});p("ai_wait_until",(e,t)=>{let n=e.action_data?.kwargs?.condition,s=e.action_data?.kwargs?.timeout_seconds||60;return n?[`await agent.waitUntilCondition(page, ${JSON.stringify(n)}, ${s}, '${t||""}');`]:["// Skipping ai_wait_until: missing condition"]});p("save_variable",e=>{let t=e.action_data?.kwargs?.name||"",n=e.action_data?.kwargs?.value;return['await agent.execAction("save_variable", page, {',` action_data: { kwargs: { name: ${JSON.stringify(t)}, value: ${JSON.stringify(n)} } },`,"});"]});p("js_code",e=>{let t=e.action_data?.kwargs?.code;if(!t)return["// Skipping js_code: missing code"];let n=["{"],s=t.split(`
|
|
5
|
-
`);for(let r of s)n.push(` ${r}`);return n.push("}"),n});p("function",(e,t,n)=>{let s=e.action_data?.kwargs||{},r=s.functionName;if(r&&r.includes("#")){let[i,o]=r.split("#");if(i&&o){let l=i.replace(/\.(ts|js|mjs)$/,""),c=`import { ${o} } from '${l}';`;n?.imports?.add(c);let u={...s,functionName:o},f=z(u);return f?[f.endsWith(";")?f:`${f};`]:["// Skipping function: invalid export pattern"]}}let a=z(s);return a?[a.endsWith(";")?a:`${a};`]:["// Skipping function: missing functionName"]});p("generate_2fa_code",e=>{let t=e.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(t)} } },`,"});"]});p("upload_file",e=>{let t=e.action_data?.kwargs||{},n=[],s={};return t.paths?s.paths=t.paths:t.path&&(s.path=t.path),t.use_file_input&&(s.use_file_input=!0),n.push(`action_data: { kwargs: ${JSON.stringify(s)} }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("upload_file", page, {',...n.map(r=>` ${r},`),"});"]});p("wait_for_download_complete",e=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${e.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);p("switch_tab",e=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${e.action_data?.kwargs?.page_id??0} } },`,"});"]);p("close_tab",e=>{let t=e.action_data?.kwargs?.page_id;return t=t??e.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${t} } },`,"});"]});p("set_date_for_native_date_picker",e=>{let t=e.action_data?.kwargs?.date??"",n=[];return n.push(`action_data: { kwargs: { date: ${JSON.stringify(t)} } }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...n.map(s=>` ${s},`),"});"]});p("done",()=>["// Done - no action needed"]);function z(e){let t=e.functionName;if(!t)return null;let n={},s=e.parameterNames||[],r=e.parameterValues||e.args||[];if(s.forEach((l,c)=>{c<r.length&&(n[l]=r[c])}),Object.keys(n).length===0)return`await ${t}()`;let a=["page","testContext","request","agentServices"],i=["undefined","null","true","false"],o=Object.entries(n).map(([l,c])=>{let u=String(c);return c==null?"undefined":a.includes(l)&&a.includes(u)||i.includes(u)||/^-?\d+(\.\d+)?$/.test(u)?u:u.startsWith("$")?`agent.agentServices.readVariable('${u.substring(1)}')`:`"${u}"`});return`await ${t}(${o.join(", ")})`}function $(e,t,n,s="main"){let r=[];for(let a=0;a<e.length;a++){let i=e[a],o=`${s}.${a}`,l=Ce(i,t,o,n);l.length>0&&(r.push(...l),a<e.length-1&&r.push(""))}return r}function Ce(e,t,n,s){let r=" ".repeat(t);switch(e.type){case"DRAFT":return Ie(e,t,n,s);case"ACTION":return je(e,t,n,s);case"STEP":return Fe(e,t,n,s);case"IF_ELSE":return Re(e,t,n,s);case"WHILE_LOOP":return Je(e,t,n,s);default:return[`${r}// Unknown statement type: ${e.type}`]}}function Ie(e,t,n,s){let r=" ".repeat(t),a=e.description?.trim()||"";if(!a)return[`${r}// ${n}: Skipping - no description`];if(s.noAgent)return[`${r}// ${n}: ${d(a)}`,`${r}// DRAFT: ${d(a)} (requires agent - skipped in hook)`];let i=JSON.stringify(a);return[`${r}// ${n}: ${d(a)}`,`${r}// \u26A0 DRAFT: AI-resolved at runtime (~5-10s). Add a locator to make this <1s.`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.run(page, ${i}, '${n}');`]}function je(e,t,n,s){let r=" ".repeat(t),a=e.description,i=e.uid,l=s.actionEntityStore?.entries[e.uid]?.action_entity??e.action_entity;if(!l){if(!a)return[`${r}// ${n}: Skipping - no description`];if(s.noAgent)return[`${r}// ${n}: ${d(a)}`,`${r}// DRAFT: ${d(a)} (requires agent - skipped in hook)`];let y=JSON.stringify(a),A=!!e.use_pure_vision;return[`${r}// ${n}: ${d(a)}`,`${r}// \u26A0 DRAFT: AI-resolved at runtime (~5-10s). Add a locator to make this <1s.`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.execute(page, ${y}, '${n}', ${A});`]}let c=e.locator?{...l,locator:e.locator}:l;a&&a!==c.action_description&&(c={...c,action_description:a});let u=c.action_data?.action_name||"",f=c.action_description||"",h=Q(u);if(!h)return[`${r}// ${n}: Unknown action: ${u}`];let g={imports:s.imports},_=h(c,n,g);if(s.noAgent){if(H(c))return[`${r}// ${n}: ${d(f)}`,`${r}// AI action: ${d(f)} (requires agent - skipped in hook)`];let y=He(c,u,r,n);return y||[`${r}// ${n}: ${d(f)}`,..._.map(A=>`${r}${A}`)]}if(H(c))return[`${r}// ${n}: ${d(f)}`,`${r}page = agent.agentServices.validatePage(page);`,..._.map(y=>`${r}${y}`)];let T=JSON.stringify(f),b=_.map(y=>`${r} ${y}`),P=B(c),L=i?`'${i}'`:"undefined";return[`${r}// ${n}: ${d(f)}`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.step(page, async () => {`,...b,`${r}}, ${T}, '${n}', ${L}, ${P});`]}function Fe(e,t,n,s){let r=" ".repeat(t),a=[];e.description&&e.description.trim()&&a.push(`${r}// Step: ${d(e.description)}`);let i=$(e.statements,t,s,n);return a.push(...i),a}function Re(e,t,n,s){let r=" ".repeat(t),a=[];if(a.push(`${r}// ${n}: Conditional check`),e.condition.type==="JS_CODE")a.push(`${r}if (${e.condition.expression}) {`);else{a.push(`${r}// AI Condition: ${d(e.condition.expression)}`);let o=JSON.stringify(e.condition.expression);a.push(`${r}if (await agent.evaluate(page, ${o}, "${n}")) {`)}let i=$(e.then,t+1,s,`${n}.then`);if(a.push(...i),e.else&&e.else.length>0){a.push(`${r}} else {`);let o=$(e.else,t+1,s,`${n}.else`);a.push(...o)}return a.push(`${r}}`),a}function Je(e,t,n,s){let r=" ".repeat(t),a=[];a.push(`${r}// ${n}: Loop`);let i=e.timeout_ms??D,o=i/1e3,l=e.timeout_ms?`While loop exceeded timeout of ${o}s`:`While loop exceeded default timeout of ${o}s`,c=`loop_${n.replace(/\./g,"_")}`;if(a.push(`${r}const ${c}_start = Date.now();`),a.push(`${r}const ${c}_timeout = ${i};`),a.push(`${r}const ${c}_check = () => {`),a.push(`${r} if (Date.now() - ${c}_start > ${c}_timeout) {`),a.push(`${r} throw new Error('${l}');`),a.push(`${r} }`),a.push(`${r} return true;`),a.push(`${r}};`),e.condition.type==="JS_CODE")a.push(`${r}while (${c}_check() && (${e.condition.expression})) {`);else{a.push(`${r}// AI Loop Condition: ${d(e.condition.expression)}`);let f=JSON.stringify(e.condition.expression);a.push(`${r}while (${c}_check() && await agent.evaluate(page, ${f}, "${n}")) {`)}let u=$(e.body,t+1,s,`${n}.body`);return a.push(...u),a.push(`${r}}`),a}function He(e,t,n,s){let r=e.action_description||"",a=e.action_data?.kwargs||{};switch(t){case"go_to_url":case"open_tab":{let i=a.url||"";return[`${n}// ${s}: ${d(r)}`,`${n}await page.goto(${JSON.stringify(i)}, { waitUntil: 'domcontentloaded' });`]}case"go_back":return[`${n}// ${s}: ${d(r)}`,`${n}await page.goBack();`];case"go_forward":return[`${n}// ${s}: ${d(r)}`,`${n}await page.goForward();`];case"input_text":{let i=a.text||"",o=getPageLocatorExpression(e);return o?[`${n}// ${s}: ${d(r)}`,`${n}await ${o}.fill(${JSON.stringify(i)}, { timeout: ${ACTION_TIMEOUT} });`]:null}case"select_dropdown_option":{let i=a.text||a.label||"",o=getPageLocatorExpression(e);return o?[`${n}// ${s}: ${d(r)}`,`${n}await ${o}.selectOption({ label: ${JSON.stringify(i)} }, { timeout: ${ACTION_TIMEOUT} });`]:null}default:return null}}var Z={name:"shiplightai",version:"0.1.13",type:"module",description:"Shiplight CLI for running and debugging .test.yaml files",main:"dist/index.js",types:"dist/index.d.ts",bin:{shiplight:"dist/cli.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/cjs/index.cjs",default:"./dist/index.js"},"./fixture":{types:"./dist/fixture.d.ts",import:"./dist/fixture.js",require:"./dist/cjs/fixture.cjs",default:"./dist/fixture.js"},"./debugger-pw":{types:"./dist/debugger-pw.d.ts",import:"./dist/debugger-pw.js",require:"./dist/cjs/debugger-pw.cjs",default:"./dist/debugger-pw.js"}},files:["dist","README.md"],publishConfig:{registry:"https://registry.npmjs.org",access:"public"},scripts:{build:"tsup","build:cli":"tsup",clean:"rm -rf dist",dev:"tsup --watch",test:"playwright test",typecheck:"tsc --noEmit"},dependencies:{"@babel/plugin-transform-typescript":"^7.27.0","@babel/preset-env":"^7.26.9","@babel/preset-typescript":"^7.27.0","@anthropic-ai/claude-agent-sdk":"^0.1.72","@modelcontextprotocol/sdk":"^0.5.0",axios:"^1.6.0",dotenv:"^16.0.3",express:"^4.21.0",glob:"^13.0.0",open:"^10.1.0",sharp:"^0.34.5",uuid:"^11.1.0",yaml:"^2.8.0",zod:"^3.22.0","zod-to-json-schema":"^3.24.6"},devDependencies:{"@playwright/test":"1.55.0","@types/express":"^4.17.21","@types/node":"^24.0.0",copilot3:"workspace:*","mcp-tools":"workspace:*","sdk-core":"workspace:*","sdk-internal":"workspace:*","shiplight-types":"workspace:*",tsup:"^8.3.5",typescript:"5.5.4","web-session":"workspace:*"},peerDependencies:{"@playwright/test":">=1.40.0"},engines:{node:">=22.0.0"},keywords:["playwright","yaml","testing","automation","ai","shiplight","mcp"],author:"Shiplight",license:"MIT"};var C=Z.version;function ne(e,t){let n=[];n.push(`// @generated by shiplightai v${C}`),n.push(...ie()),n.push(""),t?.use&&Object.keys(t.use).length>0&&(n.push(`test.use(${JSON.stringify(t.use,null,2)});`),n.push(""));let s=new Set,r={imports:s};t?.beforeEach&&t.beforeEach.length>0&&(n.push(...ee("beforeEach",t.beforeEach,r)),n.push(""));let a=t?.timeout||t?.skip!==void 0||t?.fail!==void 0||t?.only||t?.slow?{timeout:t.timeout,skip:t.skip,fail:t.fail,only:t.only,slow:t.slow}:void 0;if(t?.parameters&&t.parameters.length>0){let i=t?.testName||e.goal||"Generated test",o=M(t?.tags);for(let l of t.parameters){let c=ae(e,l.values);n.push(...j(c,`${o}${w(i)} [${w(l.name)}]`,r,0,a)),n.push("")}}else{let i=t?.testName||e.goal||"Generated test",o=M(t?.tags);n.push(...j(e,`${o}${w(i)}`,r,0,a))}return t?.afterEach&&t.afterEach.length>0&&(n.push(""),n.push(...ee("afterEach",t.afterEach,r))),oe(n,s),n.join(`
|
|
6
|
-
`)}function
|
|
7
|
-
`)}function
|
|
8
|
-
`,1)[0]!==
|
|
5
|
+
`);for(let r of s)n.push(` ${r}`);return n.push("}"),n});p("function",(e,t,n)=>{let s=e.action_data?.kwargs||{},r=s.functionName;if(r&&r.includes("#")){let[i,o]=r.split("#");if(i&&o){let l=i.replace(/\.(ts|js|mjs)$/,""),c=`import { ${o} } from '${l}';`;n?.imports?.add(c);let u={...s,functionName:o},f=X(u);return f?[f.endsWith(";")?f:`${f};`]:["// Skipping function: invalid export pattern"]}}let a=X(s);return a?[a.endsWith(";")?a:`${a};`]:["// Skipping function: missing functionName"]});p("generate_2fa_code",e=>{let t=e.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(t)} } },`,"});"]});p("upload_file",e=>{let t=e.action_data?.kwargs||{},n=[],s={};return t.paths?s.paths=t.paths:t.path&&(s.path=t.path),t.use_file_input&&(s.use_file_input=!0),n.push(`action_data: { kwargs: ${JSON.stringify(s)} }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("upload_file", page, {',...n.map(r=>` ${r},`),"});"]});p("wait_for_download_complete",e=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${e.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);p("switch_tab",e=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${e.action_data?.kwargs?.page_id??0} } },`,"});"]);p("close_tab",e=>{let t=e.action_data?.kwargs?.page_id;return t=t??e.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${t} } },`,"});"]});p("set_date_for_native_date_picker",e=>{let t=e.action_data?.kwargs?.date??"",n=[];return n.push(`action_data: { kwargs: { date: ${JSON.stringify(t)} } }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...n.map(s=>` ${s},`),"});"]});p("done",()=>["// Done - no action needed"]);function X(e){let t=e.functionName;if(!t)return null;let n={},s=e.parameterNames||[],r=e.parameterValues||e.args||[];if(s.forEach((l,c)=>{c<r.length&&(n[l]=r[c])}),Object.keys(n).length===0)return`await ${t}()`;let a=["page","testContext","request","agentServices"],i=["undefined","null","true","false"],o=Object.entries(n).map(([l,c])=>{let u=String(c);return c==null?"undefined":a.includes(l)&&a.includes(u)||i.includes(u)||/^-?\d+(\.\d+)?$/.test(u)?u:u.startsWith("$")?`agent.agentServices.readVariable('${u.substring(1)}')`:`"${u}"`});return`await ${t}(${o.join(", ")})`}function $(e,t,n,s="main"){let r=[];for(let a=0;a<e.length;a++){let i=e[a],o=`${s}.${a}`,l=Ie(i,t,o,n);l.length>0&&(r.push(...l),a<e.length-1&&r.push(""))}return r}function Ie(e,t,n,s){let r=" ".repeat(t);switch(e.type){case"DRAFT":return je(e,t,n,s);case"ACTION":return Fe(e,t,n,s);case"STEP":return Re(e,t,n,s);case"IF_ELSE":return Je(e,t,n,s);case"WHILE_LOOP":return He(e,t,n,s);default:return[`${r}// Unknown statement type: ${e.type}`]}}function je(e,t,n,s){let r=" ".repeat(t),a=e.description?.trim()||"";if(!a)return[`${r}// ${n}: Skipping - no description`];if(s.noAgent)return[`${r}// ${n}: ${d(a)}`,`${r}// DRAFT: ${d(a)} (requires agent - skipped in hook)`];let i=JSON.stringify(a);return[`${r}// ${n}: ${d(a)}`,`${r}// \u26A0 DRAFT: AI-resolved at runtime (~5-10s). Add a locator to make this <1s.`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.run(page, ${i}, '${n}');`]}function Fe(e,t,n,s){let r=" ".repeat(t),a=e.description,i=e.uid,l=s.actionEntityStore?.entries[e.uid]?.action_entity??e.action_entity;if(!l){if(!a)return[`${r}// ${n}: Skipping - no description`];if(s.noAgent)return[`${r}// ${n}: ${d(a)}`,`${r}// DRAFT: ${d(a)} (requires agent - skipped in hook)`];let y=JSON.stringify(a),A=!!e.use_pure_vision;return[`${r}// ${n}: ${d(a)}`,`${r}// \u26A0 DRAFT: AI-resolved at runtime (~5-10s). Add a locator to make this <1s.`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.execute(page, ${y}, '${n}', ${A});`]}let c=e.locator?{...l,locator:e.locator}:l;a&&a!==c.action_description&&(c={...c,action_description:a});let u=c.action_data?.action_name||"",f=c.action_description||"",h=Z(u);if(!h)return[`${r}// ${n}: Unknown action: ${u}`];let g={imports:s.imports},_=h(c,n,g);if(s.noAgent){if(M(c))return[`${r}// ${n}: ${d(f)}`,`${r}// AI action: ${d(f)} (requires agent - skipped in hook)`];let y=Me(c,u,r,n);return y||[`${r}// ${n}: ${d(f)}`,..._.map(A=>`${r}${A}`)]}if(M(c))return[`${r}// ${n}: ${d(f)}`,`${r}page = agent.agentServices.validatePage(page);`,..._.map(y=>`${r}${y}`)];let T=JSON.stringify(f),b=_.map(y=>`${r} ${y}`),P=z(c),L=i?`'${i}'`:"undefined";return[`${r}// ${n}: ${d(f)}`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.step(page, async () => {`,...b,`${r}}, ${T}, '${n}', ${L}, ${P});`]}function Re(e,t,n,s){let r=" ".repeat(t),a=[];e.description&&e.description.trim()&&a.push(`${r}// Step: ${d(e.description)}`);let i=$(e.statements,t,s,n);return a.push(...i),a}function Je(e,t,n,s){let r=" ".repeat(t),a=[];if(a.push(`${r}// ${n}: Conditional check`),e.condition.type==="JS_CODE")a.push(`${r}if (${e.condition.expression}) {`);else{a.push(`${r}// AI Condition: ${d(e.condition.expression)}`);let o=JSON.stringify(e.condition.expression);a.push(`${r}if (await agent.evaluate(page, ${o}, "${n}")) {`)}let i=$(e.then,t+1,s,`${n}.then`);if(a.push(...i),e.else&&e.else.length>0){a.push(`${r}} else {`);let o=$(e.else,t+1,s,`${n}.else`);a.push(...o)}return a.push(`${r}}`),a}function He(e,t,n,s){let r=" ".repeat(t),a=[];a.push(`${r}// ${n}: Loop`);let i=e.timeout_ms??G,o=i/1e3,l=e.timeout_ms?`While loop exceeded timeout of ${o}s`:`While loop exceeded default timeout of ${o}s`,c=`loop_${n.replace(/\./g,"_")}`;if(a.push(`${r}const ${c}_start = Date.now();`),a.push(`${r}const ${c}_timeout = ${i};`),a.push(`${r}const ${c}_check = () => {`),a.push(`${r} if (Date.now() - ${c}_start > ${c}_timeout) {`),a.push(`${r} throw new Error('${l}');`),a.push(`${r} }`),a.push(`${r} return true;`),a.push(`${r}};`),e.condition.type==="JS_CODE")a.push(`${r}while (${c}_check() && (${e.condition.expression})) {`);else{a.push(`${r}// AI Loop Condition: ${d(e.condition.expression)}`);let f=JSON.stringify(e.condition.expression);a.push(`${r}while (${c}_check() && await agent.evaluate(page, ${f}, "${n}")) {`)}let u=$(e.body,t+1,s,`${n}.body`);return a.push(...u),a.push(`${r}}`),a}function Me(e,t,n,s){let r=e.action_description||"",a=e.action_data?.kwargs||{};switch(t){case"go_to_url":case"open_tab":{let i=a.url||"";return[`${n}// ${s}: ${d(r)}`,`${n}await page.goto(${JSON.stringify(i)}, { waitUntil: 'domcontentloaded' });`]}case"go_back":return[`${n}// ${s}: ${d(r)}`,`${n}await page.goBack();`];case"go_forward":return[`${n}// ${s}: ${d(r)}`,`${n}await page.goForward();`];case"input_text":{let i=a.text||"",o=getPageLocatorExpression(e);return o?[`${n}// ${s}: ${d(r)}`,`${n}await ${o}.fill(${JSON.stringify(i)}, { timeout: ${ACTION_TIMEOUT} });`]:null}case"select_dropdown_option":{let i=a.text||a.label||"",o=getPageLocatorExpression(e);return o?[`${n}// ${s}: ${d(r)}`,`${n}await ${o}.selectOption({ label: ${JSON.stringify(i)} }, { timeout: ${ACTION_TIMEOUT} });`]:null}default:return null}}var ee={name:"shiplightai",version:"0.1.14",type:"module",description:"Shiplight CLI for running and debugging .test.yaml files",main:"dist/index.js",types:"dist/index.d.ts",bin:{shiplight:"dist/cli.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/cjs/index.cjs",default:"./dist/index.js"},"./fixture":{types:"./dist/fixture.d.ts",import:"./dist/fixture.js",require:"./dist/cjs/fixture.cjs",default:"./dist/fixture.js"},"./debugger-pw":{types:"./dist/debugger-pw.d.ts",import:"./dist/debugger-pw.js",require:"./dist/cjs/debugger-pw.cjs",default:"./dist/debugger-pw.js"}},files:["dist","README.md"],publishConfig:{registry:"https://registry.npmjs.org",access:"public"},scripts:{build:"tsup","build:cli":"tsup",clean:"rm -rf dist",dev:"tsup --watch",test:"playwright test",typecheck:"tsc --noEmit"},dependencies:{"@babel/plugin-transform-typescript":"^7.27.0","@babel/preset-env":"^7.26.9","@babel/preset-typescript":"^7.27.0","@anthropic-ai/claude-agent-sdk":"^0.1.72","@modelcontextprotocol/sdk":"^0.5.0",axios:"^1.6.0",dotenv:"^16.0.3",express:"^4.21.0",glob:"^13.0.0",open:"^10.1.0",sharp:"^0.34.5",uuid:"^11.1.0",yaml:"^2.8.0",zod:"^3.22.0","zod-to-json-schema":"^3.24.6"},devDependencies:{"@playwright/test":"1.55.0","@types/express":"^4.17.21","@types/node":"^24.0.0",copilot3:"workspace:*","mcp-tools":"workspace:*","sdk-core":"workspace:*","sdk-internal":"workspace:*","shiplight-types":"workspace:*",tsup:"^8.3.5",typescript:"5.5.4","web-session":"workspace:*"},peerDependencies:{"@playwright/test":">=1.40.0"},engines:{node:">=22.0.0"},keywords:["playwright","yaml","testing","automation","ai","shiplight","mcp"],author:"Shiplight",license:"MIT"};var C=ee.version;function re(e,t){let n=[];n.push(`// @generated by shiplightai v${C}`),n.push(...oe()),n.push(""),t?.use&&Object.keys(t.use).length>0&&(n.push(`test.use(${JSON.stringify(t.use,null,2)});`),n.push(""));let s=new Set,r={imports:s};t?.beforeEach&&t.beforeEach.length>0&&(n.push(...te("beforeEach",t.beforeEach,r)),n.push(""));let a=t?.timeout||t?.skip!==void 0||t?.fail!==void 0||t?.only||t?.slow?{timeout:t.timeout,skip:t.skip,fail:t.fail,only:t.only,slow:t.slow}:void 0;if(t?.parameters&&t.parameters.length>0){let i=t?.testName||e.goal||"Generated test",o=U(t?.tags);for(let l of t.parameters){let c=ie(e,l.values);n.push(...j(c,`${o}${w(i)} [${w(l.name)}]`,r,0,a)),n.push("")}}else{let i=t?.testName||e.goal||"Generated test",o=U(t?.tags);n.push(...j(e,`${o}${w(i)}`,r,0,a))}return t?.afterEach&&t.afterEach.length>0&&(n.push(""),n.push(...te("afterEach",t.afterEach,r))),ce(n,s),n.join(`
|
|
6
|
+
`)}function se(e,t){let n=[];n.push(`// @generated by shiplightai v${C}`),n.push(...oe()),n.push(""),t?.use&&Object.keys(t.use).length>0&&(n.push(`test.use(${JSON.stringify(t.use,null,2)});`),n.push(""));let s=new Set,r={imports:s},a=t?.testName||"Test Suite",i=U(t?.tags),o=e.serial?"test.describe.serial":"test.describe";n.push(`${o}('${i}${w(a)}', () => {`),e.beforeAll&&e.beforeAll.length>0&&(n.push(...I("beforeAll",e.beforeAll,r,1)),n.push("")),e.beforeEach&&e.beforeEach.length>0&&(n.push(...I("beforeEach",e.beforeEach,r,1)),n.push(""));for(let l=0;l<e.tests.length;l++){let c=e.tests[l],u=c.timeout||c.skip!==void 0||c.fail!==void 0||c.only||c.slow?{timeout:c.timeout,skip:c.skip,fail:c.fail,only:c.only,slow:c.slow}:void 0;if(c.parameters&&c.parameters.length>0)for(let f of c.parameters){let h=ie(c.testFlow,f.values);n.push(...j(h,`${w(c.name)} [${w(f.name)}]`,r,1,u)),n.push("")}else n.push(...j(c.testFlow,w(c.name),r,1,u)),(l<e.tests.length-1||e.afterEach||e.afterAll)&&n.push("")}return e.afterEach&&e.afterEach.length>0&&(n.push(...I("afterEach",e.afterEach,r,1)),n.push("")),e.afterAll&&e.afterAll.length>0&&n.push(...I("afterAll",e.afterAll,r,1)),n.push("});"),ce(n,s),n.join(`
|
|
7
|
+
`)}function U(e){return e&&e.length>0?e.map(t=>`@${t}`).join(" ")+" ":""}function j(e,t,n,s=0,r){let a=" ".repeat(s),i=[],o=r?.only?"test.only":"test";i.push(`${a}${o}('${t}', async ({ page, agent }) => {`),r?.skip===!0?i.push(`${a} test.skip();`):typeof r?.skip=="string"&&i.push(`${a} test.skip(true, '${w(r.skip)}');`),r?.fail===!0?i.push(`${a} test.fail();`):typeof r?.fail=="string"&&i.push(`${a} test.fail(true, '${w(r.fail)}');`),r?.slow&&i.push(`${a} test.slow();`),r?.timeout&&i.push(`${a} test.setTimeout(${r.timeout});`);let l=e.teardown&&e.teardown.length>0,c=s+1;if(l){if(i.push(`${a} try {`),e.statements&&e.statements.length>0){i.push(`${a} // Test steps`);let f=$(e.statements,c+1,n);i.push(...f)}i.push(`${a} } finally {`),i.push(`${a} // Teardown`);let u=$(e.teardown,c+1,n,"teardown");i.push(...u),i.push(`${a} }`)}else if(e.statements&&e.statements.length>0){i.push(`${a} // Test steps`);let u=$(e.statements,c,n);i.push(...u)}return i.push(`${a}});`),i}function te(e,t,n){let s=[],r=ae(t);return s.push(`test.${e}(async ({ page, agent }) => {`),s.push(...$(r,1,n,e)),s.push("});"),s}function I(e,t,n,s){let r=" ".repeat(s),a=[],i=ae(t);if(e==="beforeAll"||e==="afterAll"){let l={...n,noAgent:!0};a.push(`${r}test.${e}(async ({ browser }, workerInfo) => {`),a.push(`${r} const page = await browser.newPage({ baseURL: workerInfo.project.use.baseURL });`),a.push(...$(i,s+1,l,e)),a.push(`${r} await page.close();`),a.push(`${r}});`)}else a.push(`${r}test.${e}(async ({ page, agent }) => {`),a.push(...$(i,s+1,n,e)),a.push(`${r}});`);return a}function ae(e){let n=ne({goal:"_hook",statements:e});return N(n).statements}function ie(e,t){let n=ne({goal:e.goal,statements:e.statements,teardown:e.teardown});for(let[s,r]of Object.entries(t))n=n.replaceAll(`<<${s}>>`,String(r));return N(n)}function oe(){return["import { test, expect } from 'shiplightai/fixture';"]}function ce(e,t){if(t.size>0){let n=0;for(let r=0;r<e.length;r++)e[r].startsWith("import ")&&(n=r+1);let s=Array.from(t);e.splice(n,0,...s)}}function pe(e){try{return Ge(e).mtimeMs}catch{return 0}}var Ke=`// @generated by shiplightai v${C}`;function qe(e,t){if(!We(e)||le(e,"utf-8").split(`
|
|
8
|
+
`,1)[0]!==Ke)return!1;let s=pe(e);for(let r of t)if(pe(r)>s)return!1;return!0}function ue(e){let t=Ve("**/*.test.yaml",{cwd:e.cwd,ignore:["**/node_modules/**"]}),n=[];for(let s of t){let r=Ye(e.cwd,s),a=r.replace(/\.test\.yaml$/,".yaml.spec.ts"),i=le(r,"utf-8");try{let o=q(i,r);if(qe(a,[r,...o.referencedTemplatePaths]))continue;let l;o.suite?l=se(o.suite,{testName:o.name,tags:o.tags,use:o.use}):l=re(o.testFlow,{testName:o.name,tags:o.tags,use:o.use,beforeEach:o.beforeEach,afterEach:o.afterEach,parameters:o.parameters,timeout:o.timeout,skip:o.skip,fail:o.fail,only:o.only,slow:o.slow}),De(a,l)}catch(o){console.error(`[shiplight] Failed to transpile ${s}:`,o),n.push({file:s,error:o})}}if(n.length>0)throw new Error(`[shiplight] Transpilation failed for ${n.length} file(s):
|
|
9
9
|
`+n.map(s=>` - ${s.file}`).join(`
|
|
10
|
-
`))}import*as v from"path";import*as
|
|
10
|
+
`))}import*as v from"path";import*as de from"fs";import{mkdir as ze}from"fs/promises";import*as R from"fs";import*as O from"path";function D(e){let t=null,n=process.env.SHIPLIGHT_LOGIN_EMAIL,s=process.env.SHIPLIGHT_LOGIN_PASSWORD;return n&&s&&(t={username:n,password:s}),t||(t=Be(e)),t?(process.env.SHIPLIGHT_LOGIN_URL&&(t.loginUrl=process.env.SHIPLIGHT_LOGIN_URL),process.env.SHIPLIGHT_LOGIN_TOTP_SECRET&&(t.totpSecret=process.env.SHIPLIGHT_LOGIN_TOTP_SECRET),t):null}function F(e){if(e.startsWith("$")){let t=e.slice(1);return process.env[t]||e}return e}function Be(e){let t=O.resolve(e),n=O.resolve(process.cwd());for(;;){for(let r of["shiplight.config.json","login.config.json"]){let a=O.join(t,r);if(R.existsSync(a))try{let i=JSON.parse(R.readFileSync(a,"utf-8"));if(i.username&&i.password)return{username:F(i.username),password:F(i.password),loginUrl:i.url?F(i.url):void 0,totpSecret:i.totp_secret?F(i.totp_secret):void 0}}catch{}}if(t===n)break;let s=O.dirname(t);if(s===t)break;t=s}return null}var me="auth.setup.ts",fe=".auth",ge="storage-state.json";async function Xe(e,t){let n=v.resolve(t),s=v.join(n,fe,ge);if(de.existsSync(s)){console.log("[INFO] Storage state exists, skipping login. Delete",s,"to force re-auth.");return}let r=D(n);if(!r)return;let{WebAgent:a,createAgentContext:i,configureSdk:o,VariableStore:l,LoginType:c,TwoFactorAuthType:u}=await import("./dist-OOFTSMK3.js");o({env:{GOOGLE_API_KEY:process.env.GOOGLE_API_KEY??"",ANTHROPIC_API_KEY:process.env.ANTHROPIC_API_KEY??""}});let{resolveModelFromEnv:f}=await import("./dist-WQ66EMT6.js"),h=f(process.env);if(!h)throw new Error("No AI model configured. Set WEB_AGENT_MODEL, ANTHROPIC_API_KEY, or GOOGLE_API_KEY.");let g=new a(i({model:h,variableStore:new l})),{username:_,password:T,loginUrl:b,totpSecret:P}=r,L=b||e.url()||"about:blank";if(!(await g.loginPage(e,{site_url:L,num_verification_exprs:0,account:{type:c.PASSWORD,username:_,password:T,...P&&{two_factor_auth_config:{type:u.TOTP,data:P}}}})).success)throw new Error("Login failed.");let A=v.join(n,fe);await ze(A,{recursive:!0}),await e.context().storageState({path:v.join(A,ge)})}function he(){return`// @generated by shiplightai \u2014 do not edit
|
|
11
11
|
import { test as setup } from '@playwright/test';
|
|
12
12
|
import { authSetup } from 'shiplightai';
|
|
13
13
|
|
|
14
14
|
setup('authenticate', async ({ page }) => {
|
|
15
15
|
await authSetup(page, import.meta.dirname);
|
|
16
16
|
});
|
|
17
|
-
`}function
|
|
17
|
+
`}function et(e={}){e.dotenv!==!1&&tt(e.scanDir||process.cwd());let t=e.scanDir||process.cwd();return ue({cwd:t}),nt(t),e.apiKey&&(process.env.__SHIPLIGHT_API_KEY=e.apiKey),{}}function tt(e){let t=[],n=S.resolve(e),s=S.resolve(process.cwd());for(;;){let r=S.join(n,".env");if(x.existsSync(r)&&t.push(r),n===s)break;let a=S.dirname(n);if(a===n)break;n=a}for(let r of t)Qe.config({path:r})}function nt(e){let t=Ze("**/shiplight.config.json",{cwd:e,ignore:["**/node_modules/**"]});for(let n of t){let s=S.resolve(e,n),r=S.dirname(s),a=S.join(r,me),i=!1;try{let o=JSON.parse(x.readFileSync(s,"utf-8"));i=!!(o.username&&o.password)}catch{}if(!i&&process.env.SHIPLIGHT_LOGIN_EMAIL&&process.env.SHIPLIGHT_LOGIN_PASSWORD&&(i=!0),!!i){try{let o=x.statSync(s).mtimeMs;if(x.statSync(a).mtimeMs>o)continue}catch{}x.writeFileSync(a,he())}}}export{$e as VariableStore,ye as WebAgent,Xe as authSetup,_e as configureSdk,we as createAgentContext,D as resolveLoginConfig,et as shiplightConfig};
|