UNPKG

playwright-json-runner

Version:

Extends Playwright to run tests using JSON-based test definitions.

1 lines 52 kB
{"version":3,"sources":["../node_modules/@playwright/test/index.mjs","../src/locator-actions.ts","../src/defaults/action-type-handlers.ts","../src/defaults/getter-setter-rules.ts","../src/defaults/getter-strategies.ts","../src/defaults/setter-strategies.ts","../src/locator-resolver.ts","../src/defaults/locator-strategies.ts","../src/config.ts","../src/runner.ts"],"names":["default","test_star","config"],"mappings":";;;;;;;;;AAAA,IAAA,YAAA,GAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAAA,OAAAA,EAAAA,MAAAA;AAAA,CAAA,CAAA;AAgBA,UAAA,CAAA,YAAA,EAAAC,QAAA,CAAA;ACTA,eAAsB,eAAA,CAAgB,OAAkB,EAAA,KAAA,EAA2B,OAA+C,EAAA;AAPlI,EAAA,IAAA,EAAA;AAQE,EAAA,MAAMC,UAAS,gBAAiB,EAAA;AAChC,EAAA,MAAM,OAAU,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAT,KAAA,IAAA,GAAA,EAAA,GAAoBA,OAAO,CAAA,iBAAA;AAC3C,EAAA,MAAM,QAAQ,OAAQ,CAAA,EAAE,KAAO,EAAA,UAAA,EAAY,SAAS,CAAA;AACpD,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,SAAS,CAAC,EAAA,KAAO,GAAG,SAAS,CAAA;AACxD,EAAM,MAAA,SAAA,GAAY,YAAa,CAAA,IAAA,EAAMA,OAAM,CAAA;AAE3C,EAAA,IAAI,SAAaA,IAAAA,OAAAA,CAAO,gBAAiB,CAAA,SAAA,CAAU,EAAE,CAAG,EAAA;AACtD,IAAM,MAAA,aAAA,GACJ,UAAU,YAAgB,IAAA,SAAA,CAAU,QAAQ,OAAQ,CAAA,OAAA,CAAQ,SAAU,CAAA,KAAK,CAAI,GAAA,OAAA;AACjF,IAAO,OAAA,MAAMA,OAAO,CAAA,gBAAA,CAAiB,SAAU,CAAA,EAAE,CAAE,CAAA,EAAE,OAAS,EAAA,aAAA,EAAe,SAAW,EAAA,KAAA,EAAO,CAAA;AAAA;AAGjG,EAAM,MAAA,IAAI,MAAM,CAAwC,qCAAA,EAAA,IAAA,CAAK,UAAU,CAAG,EAAA,GAAG,CAAC,CAAE,CAAA,CAAA;AAClF;AAKA,eAAsB,eAAA,CAAgB,SAAkB,OAAwD,EAAA;AA1BhH,EAAA,IAAA,EAAA;AA2BE,EAAA,MAAMA,UAAS,gBAAiB,EAAA;AAChC,EAAA,MAAM,OAAU,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAT,KAAA,IAAA,GAAA,EAAA,GAAoBA,OAAO,CAAA,iBAAA;AAC3C,EAAA,MAAM,QAAQ,OAAQ,CAAA,EAAE,KAAO,EAAA,UAAA,EAAY,SAAS,CAAA;AACpD,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,SAAS,CAAC,EAAA,KAAO,GAAG,SAAS,CAAA;AACxD,EAAM,MAAA,SAAA,GAAY,YAAa,CAAA,IAAA,EAAMA,OAAM,CAAA;AAE3C,EAAA,IAAI,SAAaA,IAAAA,OAAAA,CAAO,gBAAiB,CAAA,SAAA,CAAU,EAAE,CAAG,EAAA;AACtD,IAAM,MAAA,aAAA,GACJ,UAAU,YAAgB,IAAA,SAAA,CAAU,QAAQ,OAAQ,CAAA,OAAA,CAAQ,SAAU,CAAA,KAAK,CAAI,GAAA,OAAA;AACjF,IAAO,OAAA,MAAMA,OAAO,CAAA,gBAAA,CAAiB,SAAU,CAAA,EAAE,EAAE,EAAE,OAAA,EAAS,aAAe,EAAA,SAAA,EAAW,CAAA;AAAA;AAG1F,EAAM,MAAA,IAAI,MAAM,CAAwC,qCAAA,EAAA,IAAA,CAAK,UAAU,CAAG,EAAA,GAAG,CAAC,CAAE,CAAA,CAAA;AAClF;AAEA,SAAS,YAAA,CAAa,MAAcA,OAAyC,EAAA;AA1C7E,EAAA,IAAA,EAAA;AA2CE,EAAA,MAAM,EAAE,QAAS,EAAA,GAAI,IAAI,KAAA,CAAM,IAAI,CAAE,CAAA,MAAA;AACrC,EAAA,MAAM,IAAO,GAAA,CAAA,EAAA,GAAA,QAAA,CAAS,IAAK,CAAA,iBAAA,KAAd,YAAmC,QAAS,CAAA,IAAA;AACzD,EAAI,IAAA,CAAC,MAAa,OAAA,IAAA;AAElB,EAAI,IAAA,UAAA;AACJ,EAAI,IAAA,YAAA;AAEJ,EAAM,MAAA,SAAA,GAAY,CAAC,KAA2B,KAAA;AAC5C,IAAA,MAAM,SAAS,QAAS,CAAA,QAAA,CAAS,OAAO,IAAM,EAAA,IAAA,EAAM,GAAG,IAAI,CAAA;AAC3D,IAAM,MAAA,SAAA,GAAY,OAAO,WAAY,EAAA;AACrC,IAAI,IAAA,CAAC,WAAkB,OAAA,KAAA;AACvB,IAAA,MAAM,WAAc,GAAA,CAAC,CAAC,MAAA,CAAO,WAAY,EAAA;AACzC,IAAa,UAAA,GAAA,KAAA;AAEb,IAAe,YAAA,GAAA,CAAC,eAAe,IAAS,KAAA,SAAA;AACxC,IAAO,OAAA,IAAA;AAAA,GACT;AAEA,EAAW,KAAA,MAAA,CAAC,IAAI,SAAS,CAAA,IAAK,OAAO,OAAQA,CAAAA,OAAAA,CAAO,KAAK,CAAG,EAAA;AAC1D,IAAI,IAAA;AACF,MAAa,UAAA,GAAA,KAAA,CAAA;AACb,MAAe,YAAA,GAAA,KAAA,CAAA;AACf,MAAA,IAAI,UAAU,EAAE,QAAA,EAAU,SAAS,IAAM,EAAA,SAAA,EAAW,CAAG,EAAA;AACrD,QAAA,OAAO,EAAE,EAAI,EAAA,KAAA,EAAO,UAAY,EAAA,YAAA,EAAc,sCAAgB,KAAM,EAAA;AAAA;AACtE,aACO,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,yBAAyB,EAAE,CAAA;AACzC,MAAM,MAAA,GAAA;AAAA;AACR;AAGF,EAAO,OAAA,IAAA;AACT;;;ACtEA,SAAS,cAAA,CAAe,SAAwB,UAAoB,EAAA;AAClE,EAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAW,QAAA,EAAA,UAAU,CAAuB,qBAAA,CAAA,CAAA;AAAA;AAE9D,EAAA,OAAO,OAAQ,CAAA,OAAA;AACjB;AAEA,IAAM,kBAAwD,GAAA;AAAA;AAAA,EAG5D,QAAU,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AAChD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,IAAK,CAAA,IAAA,CAAK,CAAE,CAAA,GAAA,EAAK,EAAE,OAAO,CAAA;AAAA,GAClC;AAAA,EAEA,KAAO,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AApBjD,IAAA,IAAA,EAAA;AAqBI,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,IAAK,CAAA,cAAA,CAAA,CAAe,EAAE,GAAA,CAAA,CAAA,QAAA,KAAF,YAAc,CAAC,CAAA;AAAA,GAC3C;AAAA,EAEA,UAAY,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AAClD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,IAAK,CAAA,UAAA,CAAW,CAAE,CAAA,GAAA,EAAK,EAAE,OAAO,CAAA;AAAA,GACxC;AAAA,EAEA,MAAQ,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AAC9C,IAAM,MAAA,IAAA,CAAK,MAAQ,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC3C;AAAA,EAEA,SAAW,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AACjD,IAAM,MAAA,IAAA,CAAK,SAAW,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC9C;AAAA,EAEA,MAAQ,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AAC9C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,KAAK,KAAM,CAAA,KAAA,CAAM,CAAE,CAAA,MAAA,EAAQ,EAAE,MAAM,CAAA;AAAA,GAC3C;AAAA,EAEA,WAAa,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AACnD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,KAAK,SAAU,CAAA,CAAA,CAAE,KAAK,CAAE,CAAA,OAAA,CAAQ,EAAE,OAAO,CAAA;AAAA,GACjD;AAAA,EAEA,gBAAkB,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AACxD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAM,MAAA,IAAA,CAAK,MAAM,KAAM,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,EAAG,EAAE,OAAO,CAAA;AAAA,GAC5C;AAAA,EAEA,gBAAkB,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AACxD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GAChD;AAAA,EAEA,SAAW,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AACjD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAA,IAAM,qBAAO,IAAI,CAAA,CAAE,UAAU,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACjD;AAAA,EAEA,WAAa,EAAA,OAAO,EAAE,IAAA,IAAQ,MAAuB,KAAA;AACnD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAA,IAAM,qBAAO,IAAI,CAAA,CAAE,YAAY,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACnD;AAAA,EAEA,UAAA,EAAY,OAAO,OAAA,EAAS,MAAuB,KAAA;AACjD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAM,MAAA,OAAA,CAAQ,OAAQ,CAAA,UAAA,CAAW,EAAE,IAAA,EAAM,EAAE,IAAM,EAAA,GAAG,CAAE,CAAA,OAAA,EAAS,CAAA;AAAA,KAC1D,MAAA;AACL,MAAM,MAAA,OAAA,CAAQ,IAAK,CAAA,UAAA,CAAW,EAAE,IAAA,EAAM,EAAE,IAAM,EAAA,GAAG,CAAE,CAAA,OAAA,EAAS,CAAA;AAAA;AAC9D,GACF;AAAA,EAEA,cAAA,EAAgB,OAAO,OAAA,EAAS,MAAuB,KAAA;AACrD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,UAAU,CAAE,CAAA,IAAA,GAAO,CAAC,CAAE,CAAA,IAAI,IAAI,EAAC;AACrC,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAM,MAAA,IAAA,YAAA,CAAA,MAAA,EAAO,QAAQ,OAAO,CAAA,CAAE,iBAAiB,GAAG,OAAA,EAAS,EAAE,OAAO,CAAA;AAAA,KAC/D,MAAA;AACL,MAAM,MAAA,IAAA,YAAA,CAAA,MAAA,EAAO,QAAQ,IAAI,CAAA,CAAE,iBAAiB,GAAG,OAAA,EAAS,EAAE,OAAO,CAAA;AAAA;AACnE,GACF;AAAA;AAAA,EAIA,KAAA,EAAO,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC5C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAM,MAAA,OAAA,CAAQ,KAAO,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC7C;AAAA,EAEA,QAAA,EAAU,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC/C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,UAAU,CAAA;AAClD,IAAM,MAAA,OAAA,CAAQ,QAAU,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAChD;AAAA,EAEA,IAAA,EAAM,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC3C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,MAAM,CAAA;AAC9C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,OAAQ,CAAA,IAAA,CAAK,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACvC;AAAA,EAEA,IAAA,EAAM,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC3C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,MAAM,CAAA;AAC9C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,OAAQ,CAAA,iBAAA,CAAkB,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACpD;AAAA,EAEA,KAAA,EAAO,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC5C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,OAAQ,CAAA,KAAA,CAAM,CAAE,CAAA,GAAA,EAAK,EAAE,OAAO,CAAA;AAAA,GACtC;AAAA,EAEA,KAAA,EAAO,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC5C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAM,MAAA,OAAA,CAAQ,KAAO,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC7C;AAAA,EAEA,OAAA,EAAS,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC9C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,SAAS,CAAA;AACjD,IAAM,MAAA,OAAA,CAAQ,OAAS,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC/C;AAAA,EAEA,YAAA,EAAc,OAAO,OAAA,EAAS,MAAuB,KAAA;AACnD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,cAAc,CAAA;AACtD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,OAAQ,CAAA,YAAA,CAAa,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GAC/C;AAAA,EAEA,KAAA,EAAO,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC5C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAM,MAAA,OAAA,CAAQ,KAAO,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC7C;AAAA,EAEA,KAAA,EAAO,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC5C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAM,MAAA,OAAA,CAAQ,KAAO,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC7C;AAAA,EAEA,IAAA,EAAM,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC3C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,MAAM,CAAA;AAC9C,IAAM,MAAA,OAAA,CAAQ,IAAM,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC5C;AAAA,EAEA,KAAA,EAAO,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC5C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAM,MAAA,OAAA,CAAQ,KAAO,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC7C;AAAA,EAEA,cAAA,EAAgB,OAAO,OAAA,EAAS,MAAuB,KAAA;AACrD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,gBAAgB,CAAA;AACxD,IAAM,MAAA,OAAA,CAAQ,sBAAwB,CAAA,MAAA,CAAe,OAAO,CAAA;AAAA,GAC9D;AAAA,EAEA,OAAA,EAAS,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC9C,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,SAAS,CAAA;AACjD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAM,MAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,EAAE,KAAO,EAAA,GAAG,CAAE,CAAA,OAAA,EAAS,CAAA;AAAA,GACxD;AAAA,EAEA,aAAA,EAAe,OAAO,OAAA,EAAS,MAAuB,KAAA;AACpD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,eAAe,CAAA;AACvD,IAAM,MAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,UAAU,GAAI,MAAA,CAAe,SAAS,CAAA;AAAA,GACvE;AAAA,EAEA,eAAA,EAAiB,OAAO,OAAA,EAAS,MAAuB,KAAA;AACtD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,iBAAiB,CAAA;AACzD,IAAM,MAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,WAAW,GAAI,MAAA,CAAe,SAAS,CAAA;AAAA,GACxE;AAAA;AAAA,EAIA,aAAA,EAAe,OAAO,OAAA,EAAS,MAAuB,KAAA;AACpD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,eAAe,CAAA;AACvD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,eAAgB,CAAA,OAAA,EAAS,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACnD;AAAA,EAEA,sBAAA,EAAwB,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC7D,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,wBAAwB,CAAA;AAChE,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,MAAS,GAAA,MAAM,eAAgB,CAAA,OAAA,EAAS,EAAE,OAAO,CAAA;AACvD,IAAA,IAAA,YAAA,CAAA,MAAA,EAAO,MAAM,CAAA,CAAE,IAAK,CAAA,CAAA,CAAE,KAAK,CAAA;AAAA,GAC7B;AAAA,EAEA,wBAAA,EAA0B,OAAO,OAAA,EAAS,MAAuB,KAAA;AAC/D,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,0BAA0B,CAAA;AAClE,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,MAAS,GAAA,MAAM,eAAgB,CAAA,OAAA,EAAS,EAAE,OAAO,CAAA;AACvD,IAAA,IAAA,YAAA,CAAA,MAAA,EAAO,MAAM,CAAA,CAAE,SAAU,CAAA,CAAA,CAAE,KAAK,CAAA;AAAA,GAClC;AAAA;AAAA,EAIA,aAAA,EAAe,OAAO,OAAA,EAAS,MAAuB,KAAA;AACpD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,eAAe,CAAA;AACvD,IAAA,MAAA,IAAM,YAAO,CAAA,MAAA,EAAA,OAAO,CAAE,CAAA,WAAA,CAAa,OAAe,OAAO,CAAA;AAAA,GAC3D;AAAA,EAEA,YAAA,EAAc,OAAO,OAAA,EAAS,MAAuB,KAAA;AACnD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,cAAc,CAAA;AACtD,IAAA,MAAA,IAAM,YAAO,CAAA,MAAA,EAAA,OAAO,CAAE,CAAA,UAAA,CAAY,OAAe,OAAO,CAAA;AAAA,GAC1D;AAAA,EAEA,aAAA,EAAe,OAAO,OAAA,EAAS,MAAuB,KAAA;AACpD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,eAAe,CAAA;AACvD,IAAA,MAAA,IAAM,YAAO,CAAA,MAAA,EAAA,OAAO,CAAE,CAAA,WAAA,CAAa,OAAe,OAAO,CAAA;AAAA,GAC3D;AAAA,EAEA,cAAA,EAAgB,OAAO,OAAA,EAAS,MAAuB,KAAA;AACrD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,gBAAgB,CAAA;AACxD,IAAA,MAAA,IAAM,YAAO,CAAA,MAAA,EAAA,OAAO,CAAE,CAAA,YAAA,CAAc,OAAe,OAAO,CAAA;AAAA,GAC5D;AAAA,EAEA,aAAA,EAAe,OAAO,OAAA,EAAS,MAAuB,KAAA;AACpD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,eAAe,CAAA;AACvD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAM,MAAA,IAAA,YAAA,CAAA,MAAA,EAAO,OAAO,CAAA,CAAE,WAAY,CAAA,EAAE,OAAS,EAAA,CAAA,CAAE,OAAS,EAAA,GAAG,CAAE,CAAA,OAAA,EAAS,CAAA;AAAA,GACxE;AAAA,EAEA,UAAA,EAAY,OAAO,OAAA,EAAS,MAAuB,KAAA;AACjD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,YAAY,CAAA;AACpD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAA,IAAM,qBAAO,OAAO,CAAA,CAAE,WAAW,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACrD;AAAA,EAEA,kBAAA,EAAoB,OAAO,OAAA,EAAS,MAAuB,KAAA;AACzD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,oBAAoB,CAAA;AAC5D,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAA,IAAM,qBAAO,OAAO,CAAA,CAAE,cAAc,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACxD;AAAA,EAEA,WAAA,EAAa,OAAO,OAAA,EAAS,MAAuB,KAAA;AAClD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,aAAa,CAAA;AACrD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAA,IAAM,qBAAO,OAAO,CAAA,CAAE,YAAY,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACtD;AAAA,EAEA,WAAA,EAAa,OAAO,OAAA,EAAS,MAAuB,KAAA;AAClD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,aAAa,CAAA;AACrD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAA,IAAM,qBAAO,OAAO,CAAA,CAAE,YAAY,CAAE,CAAA,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,GACtD;AAAA,EAEA,eAAA,EAAiB,OAAO,OAAA,EAAS,MAAuB,KAAA;AACtD,IAAM,MAAA,OAAA,GAAU,cAAe,CAAA,OAAA,EAAS,iBAAiB,CAAA;AACzD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAM,MAAA,IAAA,YAAA,CAAA,MAAA,EAAO,OAAO,CAAE,CAAA,eAAA,CAAgB,EAAE,SAAW,EAAA,CAAA,CAAE,KAAO,EAAA,CAAA,CAAE,OAAO,CAAA;AAAA;AAEzE,CAAA;AAEA,IAAO,4BAAQ,GAAA,kBAAA;;;AC5Pf,IAAM,iBAA8C,GAAA;AAAA,EAClD,oBAAoB,CAAC,EAAE,SAAc,KAAA,OAAA,CAAQ,QAAQ,oBAAoB,CAAA;AAAA,EACzE,UAAU,CAAC,EAAE,SAAU,EAAA,KAAM,UAAU,2BAA2B,CAAA;AAAA,EAClE,OAAO,CAAC,EAAE,SAAU,EAAA,KAAM,UAAU,wBAAwB,CAAA;AAAA,EAC5D,eAAiB,EAAA,CAAC,EAAE,OAAA,EAClB,KAAA,OAAA,CAAQ,OAAQ,CAAA,gDAAgD,CAChE,IAAA,OAAA,CAAQ,aAAc,CAAA,gDAAgD,CAAM,KAAA,IAAA;AAAA,EAC9E,kBAAA,EAAoB,CAAC,EAAE,OAAA,OACrB,OAAQ,CAAA,aAAA,CAAc,yEAAyE,CAAM,KAAA,IAAA;AAAA,EACvG,QAAQ,CAAC,EAAE,SAAU,EAAA,KAAM,UAAU,UAAU,CAAA;AAAA,EAC/C,MAAM,CAAC,EAAE,SAAU,EAAA,KAAM,UAAU,sBAAsB;AAC3D,CAAA;AAEA,IAAO,2BAAQ,GAAA,iBAAA;;;ACdf,IAAM,gBAAuD,GAAA;AAAA,EAC3D,QAAU,EAAA,OAAO,EAAE,OAAA,EAAc,KAAA;AAC/B,IAAM,MAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,SAAU,EAAA;AACxC,IAAA,OAAO,OAAO,OAAO,CAAA;AAAA,GACvB;AAAA,EACA,KAAO,EAAA,OAAO,EAAE,OAAA,EAAc,KAAA;AAC5B,IAAM,MAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,QAAS,CAAA,CAAC,OAAO,EAAG,CAAA,OAAA,CAAQ,WAAY,EAAA,KAAM,OAAO,CAAA;AACnF,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,OAAQ,MAAM,OAAQ,CAAA,SAAA,KAAe,MAAM,OAAA,CAAQ,YAAe,GAAA,IAAA;AAAA;AAGpE,IAAM,MAAA,OAAA,GAAU,OAAQ,CAAA,OAAA,CAAQ,6BAA6B,CAAA;AAC7D,IAAM,MAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,KAAM,EAAA;AAClC,IAAA,OAAO,KAAQ,GAAA,CAAA,GAAI,MAAM,OAAA,CAAQ,YAAe,GAAA,IAAA;AAAA,GAClD;AAAA,EACA,eAAiB,EAAA,OAAO,EAAE,OAAA,EAAc,KAAA;AACtC,IAAO,OAAA,MAAM,QAAQ,SAAU,EAAA;AAAA,GACjC;AAAA,EACA,kBAAoB,EAAA,OAAO,EAAE,OAAA,EAAc,KAAA;AAEzC,IAAA,MAAM,SAAS,OAAQ,CAAA,OAAA;AAAA,MACrB;AAAA,KACF;AACA,IAAO,OAAA,MAAM,OAAO,SAAU,EAAA;AAAA,GAChC;AAAA,EACA,MAAQ,EAAA,OAAO,EAAE,OAAA,EAAc,KAAA;AAC7B,IAAM,MAAA,cAAA,GAAiB,OAAQ,CAAA,OAAA,CAAQ,gBAAgB,CAAA;AACvD,IAAA,OAAO,cAAiB,GAAA,MAAM,cAAe,CAAA,SAAA,EAAc,GAAA,EAAA;AAAA,GAC7D;AAAA,EACA,IAAM,EAAA,OAAO,EAAE,OAAA,EAAc,KAAA;AAC3B,IAAO,OAAA,MAAM,QAAQ,UAAW,EAAA;AAAA,GAClC;AAAA,EACA,kBAAoB,EAAA,OAAO,EAAE,OAAA,EAAc,KAAA;AACzC,IAAO,OAAA,MAAM,QAAQ,UAAW,EAAA;AAAA;AAEpC,CAAA;AAEA,IAAO,yBAAQ,GAAA,gBAAA;;;ACrCf,IAAM,gBAAuD,GAAA;AAAA,EAC3D,QAAU,EAAA,OAAO,EAAE,OAAA,EAAS,OAAY,KAAA;AACtC,IAAA,MAAM,eAAkB,GAAA,CAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,WAAkB,EAAA,MAAA,MAAA,IAAU,KAAU,KAAA,GAAA;AACrE,IAAM,MAAA,OAAA,CAAQ,WAAW,eAAe,CAAA;AAAA,GAC1C;AAAA,EACA,KAAO,EAAA,OAAO,EAAE,OAAA,EAAS,OAAY,KAAA;AAEnC,IAAM,MAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,QAAS,CAAA,CAAC,OAAO,EAAG,CAAA,OAAA,CAAQ,WAAY,EAAA,KAAM,OAAO,CAAA;AACnF,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,MAAM,QAAQ,KAAM,EAAA;AAAA,KACf,MAAA;AACL,MAAA,MAAM,QAAQ,OAAQ,CAAA,CAAA,2BAAA,EAA8B,KAAK,CAAA,EAAA,CAAI,EAAE,KAAM,EAAA;AAAA;AACvE,GACF;AAAA,EACA,eAAiB,EAAA,OAAO,EAAE,OAAA,EAAS,OAAY,KAAA;AAC7C,IAAA,MAAM,QAAQ,KAAM,EAAA;AACpB,IAAA,MAAM,QAAQ,QAAS,CAAA,CAAC,EAAQ,KAAA,EAAA,CAAG,YAAY,EAAG,CAAA;AAClD,IAAM,MAAA,OAAA,CAAQ,iBAAkB,CAAA,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,EAAE,CAAA;AAAA,GAC7C;AAAA,EACA,kBAAoB,EAAA,OAAO,EAAE,OAAA,EAAS,OAAY,KAAA;AAEhD,IAAA,MAAM,SAAS,OAAQ,CAAA,OAAA;AAAA,MACrB;AAAA,KACF;AACA,IAAA,MAAM,OAAO,KAAM,EAAA;AAEnB,IAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,OAAA,CAAQ,gBAAgB,CAAA;AAC7C,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,OAAQ,CAAA,CAAA,2BAAA,EAA8B,KAAK,CAAI,EAAA,CAAA,CAAA;AACpE,IAAA,IAAK,MAAM,OAAA,CAAQ,KAAM,EAAA,GAAK,CAAG,EAAA;AAC/B,MAAM,MAAA,OAAA,CAAQ,KAAM,EAAA,CAAE,KAAM,EAAA;AAAA,KACvB,MAAA;AACL,MAAM,MAAA,IAAA,CAAK,QAAQ,gBAAkB,EAAA,EAAE,SAAS,KAAM,EAAC,EAAE,KAAM,EAAA;AAAA;AACjE,GACF;AAAA,EACA,MAAQ,EAAA,OAAO,EAAE,OAAA,EAAS,OAAY,KAAA;AAEpC,IAAA,MAAM,OAAU,GAAA,OAAA,CAAQ,OAAQ,CAAA,CAAA,cAAA,EAAiB,KAAK,CAAI,EAAA,CAAA,CAAA;AAC1D,IAAA,IAAK,MAAM,OAAA,CAAQ,KAAM,EAAA,GAAK,CAAG,EAAA;AAC/B,MAAA,MAAM,OAAQ,CAAA,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA;AAAA,KAC/B,MAAA;AACL,MAAA,MAAM,OAAQ,CAAA,YAAA,CAAa,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA;AAC7C,GACF;AAAA,EACA,IAAM,EAAA,OAAO,EAAE,OAAA,EAAS,OAAY,KAAA;AAClC,IAAM,MAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,EAAE,CAAA;AAAA,GAChC;AAAA,EACA,kBAAoB,EAAA,OAAO,EAAE,OAAA,EAAS,OAAY,KAAA;AAChD,IAAA,MAAM,QAAQ,KAAM,EAAA;AACpB,IAAM,MAAA,OAAA,CAAQ,MAAO,CAAA,OAAA,CAAQ,oBAAoB,KAAK,CAAA,EAAA,CAAI,EAAE,KAAM,EAAA;AAAA;AAEtE,CAAA;AAEA,IAAO,yBAAQ,GAAA,gBAAA;;;AChDf,eAAsB,cAAA,CACpB,UACA,EAAA,IAAA,EACA,MACkB,EAAA;AAClB,EAAM,MAAA,OAAA,GAAU,UAAW,CAAA,MAAA,CAAO,EAAE,CAAA;AACpC,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAqC,kCAAA,EAAA,MAAA,CAAO,EAAE,CAAoD,kDAAA,CAAA,CAAA;AAAA;AAEpH,EAAA,IAAI,OAAU,GAAA,MAAM,OAAQ,CAAA,IAAA,EAAM,MAAM,CAAA;AACxC,EAAI,IAAA,MAAA,CAAO,QAAQ,MAAW,EAAA;AAC5B,IAAU,OAAA,GAAA,OAAA,CAAQ,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA;AAAA;AAElC,EAAO,OAAA,OAAA;AACT;;;ACjBA,IAAM,iBAAuC,GAAA;AAAA,EAC3C,UAAU,OAAO,IAAA,EAAM,WACrB,IAAK,CAAA,OAAA,CAAS,OAAe,KAAK,CAAA;AAAA,EAEpC,OAAO,OAAO,IAAA,EAAM,WAClB,IAAK,CAAA,OAAA,CAAS,OAAe,KAAK,CAAA;AAAA,EAEpC,IAAA,EAAM,OAAO,IAAA,EAAM,MAA0B,KAAA;AAC3C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,CAAA,CAAE,IAAM,EAAA;AAAA,MAC5B,MAAM,CAAE,CAAA,IAAA;AAAA,MACR,OAAO,CAAE,CAAA,KAAA;AAAA,MACT,SAAS,CAAE,CAAA,OAAA;AAAA,MACX,UAAU,CAAE,CAAA,QAAA;AAAA,MACZ,UAAU,CAAE,CAAA,QAAA;AAAA,MACZ,eAAe,CAAE,CAAA,aAAA;AAAA,MACjB,OAAO,CAAE,CAAA,KAAA;AAAA,MACT,SAAS,CAAE,CAAA,OAAA;AAAA,MACX,UAAU,CAAE,CAAA;AAAA,KACb,CAAA;AAAA,GACH;AAAA,EAEA,IAAA,EAAM,OAAO,IAAA,EAAM,MAA0B,KAAA;AAC3C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAO,OAAA,IAAA,CAAK,UAAU,CAAE,CAAA,KAAA,EAAO,EAAE,KAAO,EAAA,CAAA,CAAE,OAAO,CAAA;AAAA,GACnD;AAAA,EAEA,KAAA,EAAO,OAAO,IAAA,EAAM,MAA0B,KAAA;AAC5C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAO,OAAA,IAAA,CAAK,WAAW,CAAE,CAAA,KAAA,EAAO,EAAE,KAAO,EAAA,CAAA,CAAE,OAAO,CAAA;AAAA,GACpD;AAAA,EAEA,WAAA,EAAa,OAAO,IAAA,EAAM,MAA0B,KAAA;AAClD,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAO,OAAA,IAAA,CAAK,iBAAiB,CAAE,CAAA,KAAA,EAAO,EAAE,KAAO,EAAA,CAAA,CAAE,OAAO,CAAA;AAAA,GAC1D;AAAA,EAEA,OAAA,EAAS,OAAO,IAAA,EAAM,MAA0B,KAAA;AAC9C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAO,OAAA,IAAA,CAAK,aAAa,CAAE,CAAA,KAAA,EAAO,EAAE,KAAO,EAAA,CAAA,CAAE,OAAO,CAAA;AAAA,GACtD;AAAA,EAEA,KAAA,EAAO,OAAO,IAAA,EAAM,MAA0B,KAAA;AAC5C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAO,OAAA,IAAA,CAAK,WAAW,CAAE,CAAA,KAAA,EAAO,EAAE,KAAO,EAAA,CAAA,CAAE,OAAO,CAAA;AAAA,GACpD;AAAA,EAEA,QAAQ,OAAO,IAAA,EAAM,WACnB,IAAK,CAAA,WAAA,CAAa,OAAe,KAAK,CAAA;AAAA,EAExC,MAAA,EAAQ,OAAO,IAAA,EAAM,MAA0B,KAAA;AAC7C,IAAA,MAAM,CAAI,GAAA,MAAA;AACV,IAAA,MAAM,gBAAgB,MAAM,cAAA,CAAe,iBAAmB,EAAA,IAAA,EAAM,EAAE,MAAM,CAAA;AAC5E,IAAA,MAAM,eAAe,MAAM,cAAA,CAAe,iBAAmB,EAAA,IAAA,EAAM,EAAE,KAAK,CAAA;AAC1E,IAAO,OAAA,aAAA,CAAc,QAAQ,YAAY,CAAA;AAAA;AAE7C,CAAA;AAEA,IAAO,0BAAQ,GAAA,iBAAA;;;AC6DR,IAAM,UAA4B,GAAA;AAAA,EACvC,WAAa,EAAA,WAAA;AAAA,EACb,WAAa,EAAA,YAAA;AAAA,EACb,aAAe,EAAA,CAAA,oBAAA,CAAA;AAAA,EACf,iBAAA,EAAA,0BAAA;AAAA,EACA,kBAAA,EAAA,4BAAA;AAAA,EACA,KAAO,EAAA,2BAAA;AAAA,EACP,gBAAA,EAAA,yBAAA;AAAA,EACA,gBAAA,EAAA,yBAAA;AAAA,EACA,iBAAmB,EAAA;AACrB;AAoBO,SAAS,aACd,UAC4B,EAAA;AA1J9B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2JE,EAAO,OAAA;AAAA,IACL,GAAI,UAAA;AAAA,IACJ,GAAG,UAAA;AAAA,IACH,iBAAmB,EAAA;AAAA,MACjB,GAAG,UAAW,CAAA,iBAAA;AAAA,MACd,GAAI,CAAA,EAAA,GAAA,UAAA,CAAW,iBAAX,KAAA,IAAA,GAAA,EAAA,GAAgC;AAAC,KACvC;AAAA,IACA,kBAAoB,EAAA;AAAA,MAClB,GAAI,UAAW,CAAA,kBAAA;AAAA,MACf,GAAI,CAAA,EAAA,GAAA,UAAA,CAAW,kBAAX,KAAA,IAAA,GAAA,EAAA,GAAiC;AAAC,KACxC;AAAA,IACA,KAAO,EAAA;AAAA,MACL,GAAG,UAAW,CAAA,KAAA;AAAA,MACd,GAAI,CAAA,EAAA,GAAA,UAAA,CAAW,KAAX,KAAA,IAAA,GAAA,EAAA,GAAoB;AAAC,KAC3B;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,GAAG,UAAW,CAAA,gBAAA;AAAA,MACd,GAAI,CAAA,EAAA,GAAA,UAAA,CAAW,gBAAX,KAAA,IAAA,GAAA,EAAA,GAA+B;AAAC,KACtC;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,GAAG,UAAW,CAAA,gBAAA;AAAA,MACd,GAAI,CAAA,EAAA,GAAA,UAAA,CAAW,gBAAX,KAAA,IAAA,GAAA,EAAA,GAA+B;AAAC;AACtC,GACF;AACF;AAEA,IAAI,MAAA;AAEG,SAAS,gBAAkC,GAAA;AAChD,EAAA,IAAI,QAAe,OAAA,MAAA;AACnB,EAAA,MAAA,GAAS,iBAAkB,EAAA;AAC3B,EAAO,OAAA,MAAA;AACT;AAEA,IAAM,QAAA,GAAW,gBAAgB,iBAAmB,EAAA;AAAA,EAClD,YAAA,EAAc,CAAC,2BAAA,EAA6B,2BAA2B;AACzE,CAAC,CAAA;AAEM,SAAS,iBAAmC,GAAA;AAjMnD,EAAA,IAAA,EAAA;AAkME,EAAI,IAAA;AACF,IAAA,IAAI,QAAU,EAAA;AACZ,MAAM,MAAA,MAAA,GAAS,SAAS,MAAO,EAAA;AAC/B,MAAI,IAAA,MAAA,IAAU,OAAO,MAAQ,EAAA;AAC3B,QAAA,MAAM,UAA4B,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,MAAO,CAAA,OAAA,KAAd,YAAyB,MAAO,CAAA,MAAA;AAClE,QAAA,UAAA,CAAW,SAAY,GAAA,IAAA,CAAK,OAAQ,CAAA,MAAA,CAAO,QAAQ,CAAA;AACnD,QAAO,OAAA,UAAA;AAAA;AACT;AAEF,IAAO,OAAA,UAAA;AAAA,WACA,KAAO,EAAA;AACd,IAAQ,OAAA,CAAA,KAAA,CAAM,sCAAiC,KAAK,CAAA;AACpD,IAAO,OAAA,UAAA;AAAA;AAEX;;;ACxMA,eAAsB,SAAS,OAAiC,EAAA;AARhE,EAAA,IAAA,EAAA;AASE,EAAA,MAAMA,UAAS,gBAAiB,EAAA;AAEhC,EAAM,MAAA,WAAA,GAAA,CACJ,EAAE,GAAA,EAAA,MAAA,EAAQ,QAAU,EAAA,OAAA,EAAS,QAAS,CAAA,OAAA,CAAQ,OAAO,CAAA,KAArD,IAA0D,GAAA,EAAA,GAAA,QAAA;AAE5D,EAAM,MAAA,OAAA,GAAmB,MAAM,WAAA,CAAY,MAAO,EAAA;AAElD,EAAA,OAAA,CAAQ,IAAI,CAAuB,2BAAA,EAAA,OAAA,CAAQ,IAAI,CAAU,OAAA,EAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,CAAA;AAE1E,EAAM,MAAA,cAAA,CAAeA,OAAQ,EAAA,OAAA,EAAS,OAAO,CAAA;AAE7C,EAAA,MAAM,QAAQ,KAAM,EAAA;AACtB;AAEA,eAAe,cAAA,CAAeA,OAAuB,EAAA,OAAA,EAAkB,OAAkB,EAAA;AACvF,EAAW,KAAA,MAAA,QAAA,IAAY,QAAQ,SAAW,EAAA;AACxC,IAAM,MAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAW,CAAA;AAAA,MACvC,SAAS,OAAQ,CAAA,IAAA;AAAA,MACjB,WAAA,EAAa,EAAE,GAAA,EAAK,UAAW;AAAA,KAChC,CAAA;AACD,IAAM,MAAA,IAAA,GAAa,MAAM,OAAA,CAAQ,OAAQ,EAAA;AACzC,IAAI,IAAA;AACF,MAAM,MAAA,eAAA,CAAgBA,OAAQ,EAAA,IAAA,EAAM,QAAQ,CAAA;AAAA,KAC5C,SAAA;AACA,MAAA,MAAM,QAAQ,KAAM,EAAA;AAAA;AACtB;AAEJ;AAEA,eAAe,eAAA,CAAgBA,OAAuB,EAAA,IAAA,EAAY,QAAwB,EAAA;AAtC1F,EAAA,IAAA,EAAA;AAuCE,EAAA,OAAA,CAAQ,IAAI,CAA0B,8BAAA,EAAA,CAAA,EAAA,GAAA,QAAA,CAAS,UAAT,IAAkB,GAAA,EAAA,GAAA,QAAA,CAAS,IAAI,CAAE,CAAA,CAAA;AACvE,EAAM,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACnB,EAAW,KAAA,MAAA,IAAA,IAAQ,SAAS,KAAO,EAAA;AACjC,IAAM,MAAA,WAAA,CAAYA,OAAQ,EAAA,IAAA,EAAM,IAAI,CAAA;AAAA;AAExC;AAEA,eAAe,WAAA,CAAYA,OAAuB,EAAA,IAAA,EAAY,IAAgB,EAAA;AA9C9E,EAAA,IAAA,EAAA;AA+CE,EAAA,OAAA,CAAQ,IAAI,CAAc,kBAAA,EAAA,CAAA,EAAA,GAAA,IAAA,CAAK,UAAL,IAAc,GAAA,EAAA,GAAA,IAAA,CAAK,WAAW,CAAE,CAAA,CAAA;AAC1D,EAAW,KAAA,MAAA,MAAA,IAAU,KAAK,OAAS,EAAA;AACjC,IAAM,MAAA,aAAA,CAAcA,OAAQ,EAAA,IAAA,EAAM,MAAM,CAAA;AAAA;AAE5C;AAEA,eAAsB,aAAA,CACpBA,OACA,EAAA,IAAA,EACA,MACe,EAAA;AAzDjB,EAAA,IAAA,EAAA;AA0DE,EAAA,MAAM,CAAI,GAAA,MAAA;AACV,EAAA,OAAA,CAAQ,IAAI,CAA+B,mCAAA,EAAA,CAAA,EAAA,GAAA,CAAA,CAAE,UAAF,IAAW,GAAA,EAAA,GAAA,CAAA,CAAE,MAAM,CAAE,CAAA,CAAA;AAEhE,EAAA,MAAM,OAAUA,GAAAA,OAAAA,CAAO,kBAAmB,CAAA,CAAA,CAAE,MAAM,CAAA;AAClD,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAsC,mCAAA,EAAA,CAAA,CAAE,MAAM,CAAqD,mDAAA,CAAA,CAAA;AAAA;AAIrH,EAAM,MAAA,OAAA,GACJ,CAAE,CAAA,OAAA,IAAW,IACT,GAAA,MAAM,cAAeA,CAAAA,OAAAA,CAAO,iBAAmB,EAAA,IAAA,EAAM,CAAE,CAAA,OAAO,CAC9D,GAAA,MAAA;AAEN,EAAA,MAAM,OAAQ,CAAA,EAAE,IAAM,EAAA,OAAA,IAAW,MAAM,CAAA;AACzC","file":"chunk-HUKYBBJG.mjs","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from 'playwright/test';\nexport { default } from 'playwright/test';\n","import { Locator } from \"playwright\";\nimport { JSDOM } from \"jsdom\";\nimport { getConfiguration, RuleMatch, Configuration } from \"./config\";\n\n/**\n * Sets a field value using the first matching rule's setter strategy.\n */\nexport async function setLocatorValue(locator: Locator, value: string | undefined, options?: { timeout?: number }): Promise<void> {\n const config = getConfiguration();\n const timeout = options?.timeout ?? config.fieldValueTimeout;\n await locator.waitFor({ state: \"attached\", timeout });\n const html = await locator.evaluate((el) => el.outerHTML);\n const ruleMatch = getRuleMatch(html, config);\n\n if (ruleMatch && config.setterStrategies[ruleMatch.id]) {\n const targetLocator =\n ruleMatch.matchedChild && ruleMatch.xpath ? locator.locator(ruleMatch.xpath) : locator;\n return await config.setterStrategies[ruleMatch.id]({ locator: targetLocator, ruleMatch, value });\n }\n\n throw new Error(`No matching setter rule for element: ${html.substring(0, 200)}`);\n}\n\n/**\n * Gets a field value using the first matching rule's getter strategy.\n */\nexport async function getLocatorValue(locator: Locator, options?: { timeout?: number }): Promise<string | null> {\n const config = getConfiguration();\n const timeout = options?.timeout ?? config.fieldValueTimeout;\n await locator.waitFor({ state: \"attached\", timeout });\n const html = await locator.evaluate((el) => el.outerHTML);\n const ruleMatch = getRuleMatch(html, config);\n\n if (ruleMatch && config.getterStrategies[ruleMatch.id]) {\n const targetLocator =\n ruleMatch.matchedChild && ruleMatch.xpath ? locator.locator(ruleMatch.xpath) : locator;\n return await config.getterStrategies[ruleMatch.id]({ locator: targetLocator, ruleMatch });\n }\n\n throw new Error(`No matching getter rule for element: ${html.substring(0, 200)}`);\n}\n\nfunction getRuleMatch(html: string, config: Configuration): RuleMatch | null {\n const { document } = new JSDOM(html).window;\n const root = document.body.firstElementChild ?? document.body;\n if (!root) return null;\n\n let xpathMatch: string | undefined;\n let matchedChild: boolean | undefined;\n\n const xpathEval = (xpath: string): boolean => {\n const result = document.evaluate(xpath, root, null, 5, null);\n const firstNode = result.iterateNext();\n if (!firstNode) return false;\n const hasMultiple = !!result.iterateNext();\n xpathMatch = xpath;\n // Only narrow to child when exactly one element matched and it's not the root itself\n matchedChild = !hasMultiple && root !== firstNode;\n return true;\n };\n\n for (const [id, condition] of Object.entries(config.rules)) {\n try {\n xpathMatch = undefined;\n matchedChild = undefined;\n if (condition({ document, element: root, xpathEval })) {\n return { id, xpath: xpathMatch, matchedChild: matchedChild ?? false };\n }\n } catch (err) {\n console.error(\"Error executing rule:\", id);\n throw err;\n }\n }\n\n return null;\n}\n","import { expect } from \"@playwright/test\";\nimport { ActionContext, ActionTypeHandler } from \"../config\";\nimport { setLocatorValue, getLocatorValue } from \"../locator-actions\";\nimport { TestAction } from \"../schemas/test-action\";\n\nfunction requireLocator(context: ActionContext, actionName: string) {\n if (!context.locator) {\n throw new Error(`Action \"${actionName}\" requires a locator.`);\n }\n return context.locator;\n}\n\nconst actionTypeHandlers: Record<string, ActionTypeHandler> = {\n // ── Page-level ────────────────────────────────────────────────────────────\n\n navigate: async ({ page }, action: TestAction) => {\n const a = action as any;\n await page.goto(a.url, a.options);\n },\n\n sleep: async ({ page }, action: TestAction) => {\n const a = action as any;\n await page.waitForTimeout(a.duration ?? 0);\n },\n\n waitForURL: async ({ page }, action: TestAction) => {\n const a = action as any;\n await page.waitForURL(a.url, a.options);\n },\n\n goBack: async ({ page }, action: TestAction) => {\n await page.goBack((action as any).options);\n },\n\n goForward: async ({ page }, action: TestAction) => {\n await page.goForward((action as any).options);\n },\n\n scroll: async ({ page }, action: TestAction) => {\n const a = action as any;\n await page.mouse.wheel(a.deltaX, a.deltaY);\n },\n\n waitForText: async ({ page }, action: TestAction) => {\n const a = action as any;\n await page.getByText(a.value).waitFor(a.options);\n },\n\n clickCoordinates: async ({ page }, action: TestAction) => {\n const a = action as any;\n await page.mouse.click(a.x, a.y, a.options);\n },\n\n waitForLoadState: async ({ page }, action: TestAction) => {\n const a = action as any;\n await page.waitForLoadState(a.state, a.options);\n },\n\n assertURL: async ({ page }, action: TestAction) => {\n const a = action as any;\n await expect(page).toHaveURL(a.value, a.options);\n },\n\n assertTitle: async ({ page }, action: TestAction) => {\n const a = action as any;\n await expect(page).toHaveTitle(a.value, a.options);\n },\n\n screenshot: async (context, action: TestAction) => {\n const a = action as any;\n if (context.locator) {\n await context.locator.screenshot({ path: a.path, ...a.options });\n } else {\n await context.page.screenshot({ path: a.path, ...a.options });\n }\n },\n\n assertSnapshot: async (context, action: TestAction) => {\n const a = action as any;\n const nameArg = a.name ? [a.name] : [];\n if (context.locator) {\n await expect(context.locator).toHaveScreenshot(...nameArg, a.options);\n } else {\n await expect(context.page).toHaveScreenshot(...nameArg, a.options);\n }\n },\n\n // ── Locator interactions ──────────────────────────────────────────────────\n\n click: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"click\");\n await locator.click((action as any).options);\n },\n\n dblclick: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"dblclick\");\n await locator.dblclick((action as any).options);\n },\n\n fill: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"fill\");\n const a = action as any;\n await locator.fill(a.value, a.options);\n },\n\n type: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"type\");\n const a = action as any;\n await locator.pressSequentially(a.value, a.options);\n },\n\n press: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"press\");\n const a = action as any;\n await locator.press(a.key, a.options);\n },\n\n check: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"check\");\n await locator.check((action as any).options);\n },\n\n uncheck: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"uncheck\");\n await locator.uncheck((action as any).options);\n },\n\n selectOption: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"selectOption\");\n const a = action as any;\n await locator.selectOption(a.value, a.options);\n },\n\n hover: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"hover\");\n await locator.hover((action as any).options);\n },\n\n focus: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"focus\");\n await locator.focus((action as any).options);\n },\n\n blur: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"blur\");\n await locator.blur((action as any).options);\n },\n\n clear: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"clear\");\n await locator.clear((action as any).options);\n },\n\n scrollIntoView: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"scrollIntoView\");\n await locator.scrollIntoViewIfNeeded((action as any).options);\n },\n\n waitFor: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"waitFor\");\n const a = action as any;\n await locator.waitFor({ state: a.state, ...a.options });\n },\n\n waitForHidden: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"waitForHidden\");\n await locator.waitFor({ state: \"hidden\", ...(action as any).options });\n },\n\n waitForSelector: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"waitForSelector\");\n await locator.waitFor({ state: \"visible\", ...(action as any).options });\n },\n\n // ── Field value actions ───────────────────────────────────────────────────\n\n setFieldValue: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"setFieldValue\");\n const a = action as any;\n await setLocatorValue(locator, a.value, a.options);\n },\n\n assertFieldValueEquals: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertFieldValueEquals\");\n const a = action as any;\n const actual = await getLocatorValue(locator, a.options);\n expect(actual).toBe(a.value);\n },\n\n assertFieldValueContains: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertFieldValueContains\");\n const a = action as any;\n const actual = await getLocatorValue(locator, a.options);\n expect(actual).toContain(a.value);\n },\n\n // ── Assertions ────────────────────────────────────────────────────────────\n\n assertVisible: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertVisible\");\n await expect(locator).toBeVisible((action as any).options);\n },\n\n assertHidden: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertHidden\");\n await expect(locator).toBeHidden((action as any).options);\n },\n\n assertEnabled: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertEnabled\");\n await expect(locator).toBeEnabled((action as any).options);\n },\n\n assertDisabled: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertDisabled\");\n await expect(locator).toBeDisabled((action as any).options);\n },\n\n assertChecked: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertChecked\");\n const a = action as any;\n await expect(locator).toBeChecked({ checked: a.checked, ...a.options });\n },\n\n assertText: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertText\");\n const a = action as any;\n await expect(locator).toHaveText(a.value, a.options);\n },\n\n assertContainsText: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertContainsText\");\n const a = action as any;\n await expect(locator).toContainText(a.value, a.options);\n },\n\n assertValue: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertValue\");\n const a = action as any;\n await expect(locator).toHaveValue(a.value, a.options);\n },\n\n assertCount: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertCount\");\n const a = action as any;\n await expect(locator).toHaveCount(a.count, a.options);\n },\n\n assertAttribute: async (context, action: TestAction) => {\n const locator = requireLocator(context, \"assertAttribute\");\n const a = action as any;\n await expect(locator).toHaveAttribute(a.attribute, a.value, a.options);\n },\n};\n\nexport default actionTypeHandlers;\n","import { RuleType } from \"../config\";\n\n// Order matters — first match wins. Specific rules must come before generic ones.\nconst getterSetterRules: Record<string, RuleType> = {\n \"input.datepicker\": ({ element }) => element.matches(\".custom-datepicker\"),\n checkbox: ({ xpathEval }) => xpathEval(\"//input[@type='checkbox']\"),\n radio: ({ xpathEval }) => xpathEval(\"//input[@type='radio']\"),\n contenteditable: ({ element }) =>\n element.matches(\"[contenteditable='true'], [contenteditable='']\") ||\n element.querySelector(\"[contenteditable='true'], [contenteditable='']\") !== null,\n \"select.bootstrap\": ({ element }) =>\n element.querySelector(\".dropdown-toggle, [data-bs-toggle='dropdown'], [data-toggle='dropdown']\") !== null,\n select: ({ xpathEval }) => xpathEval(\"//select\"),\n text: ({ xpathEval }) => xpathEval(\"//input | //textarea\"),\n};\n\nexport default getterSetterRules;\n","import { GetterStrategyType } from \"../config\";\n\nconst getterStrategies: Record<string, GetterStrategyType> = {\n checkbox: async ({ locator }) => {\n const checked = await locator.isChecked();\n return String(checked);\n },\n radio: async ({ locator }) => {\n const isInput = await locator.evaluate((el) => el.tagName.toLowerCase() === \"input\");\n if (isInput) {\n return (await locator.isChecked()) ? await locator.inputValue() : null;\n }\n // Container with multiple radios — find the checked one\n const checked = locator.locator('input[type=\"radio\"]:checked');\n const count = await checked.count();\n return count > 0 ? await checked.inputValue() : null;\n },\n contenteditable: async ({ locator }) => {\n return await locator.innerText();\n },\n \"select.bootstrap\": async ({ locator }) => {\n // Read the currently displayed text from the toggle button\n const toggle = locator.locator(\n \".dropdown-toggle, [data-bs-toggle='dropdown'], [data-toggle='dropdown']\"\n );\n return await toggle.innerText();\n },\n select: async ({ locator }) => {\n const selectedOption = locator.locator(\"option:checked\");\n return selectedOption ? await selectedOption.innerText() : \"\";\n },\n text: async ({ locator }) => {\n return await locator.inputValue();\n },\n \"input.datepicker\": async ({ locator }) => {\n return await locator.inputValue();\n },\n};\n\nexport default getterStrategies;\n","import { SetterStrategyType } from \"../config\";\n\nconst setterStrategies: Record<string, SetterStrategyType> = {\n checkbox: async ({ locator, value }) => {\n const shouldBeChecked = value?.toLowerCase() === \"true\" || value === \"1\";\n await locator.setChecked(shouldBeChecked);\n },\n radio: async ({ locator, value }) => {\n // If locator is a container with multiple radios, find the one with matching value\n const isInput = await locator.evaluate((el) => el.tagName.toLowerCase() === \"input\");\n if (isInput) {\n await locator.check();\n } else {\n await locator.locator(`input[type=\"radio\"][value=\"${value}\"]`).check();\n }\n },\n contenteditable: async ({ locator, value }) => {\n await locator.click();\n await locator.evaluate((el) => (el.innerHTML = \"\"));\n await locator.pressSequentially(value ?? \"\");\n },\n \"select.bootstrap\": async ({ locator, value }) => {\n // Click the toggle to open the dropdown menu\n const toggle = locator.locator(\n \".dropdown-toggle, [data-bs-toggle='dropdown'], [data-toggle='dropdown']\"\n );\n await toggle.click();\n // Click the matching option from the dropdown menu — try by value first, then by text\n const menu = locator.locator(\".dropdown-menu\");\n const byValue = menu.locator(`.dropdown-item[data-value=\"${value}\"]`);\n if ((await byValue.count()) > 0) {\n await byValue.first().click();\n } else {\n await menu.locator(\".dropdown-item\", { hasText: value }).click();\n }\n },\n select: async ({ locator, value }) => {\n // Try matching by option value first, then fall back to label (visible text)\n const byValue = locator.locator(`option[value=\"${value}\"]`);\n if ((await byValue.count()) > 0) {\n await locator.selectOption({ value });\n } else {\n await locator.selectOption({ label: value });\n }\n },\n text: async ({ locator, value }) => {\n await locator.fill(value ?? \"\");\n },\n \"input.datepicker\": async ({ locator, value }) => {\n await locator.click();\n await locator.page().locator(`//button[text()='${value}']`).click();\n },\n};\n\nexport default setterStrategies;\n","import { Locator, Page } from \"playwright\";\nimport { LocatorParams } from \"./schemas/locators/locator-parameters\";\n\nexport type LocatorStrategyFn = (page: Page, params: LocatorParams) => Promise<Locator>;\nexport type LocatorStrategies = Record<string, LocatorStrategyFn>;\n\nexport async function resolveLocator(\n strategies: LocatorStrategies,\n page: Page,\n params: LocatorParams\n): Promise<Locator> {\n const handler = strategies[params.by];\n if (!handler) {\n throw new Error(`No locator strategy found for by=\"${params.by}\". Register it in your config's locatorStrategies.`);\n }\n let locator = await handler(page, params);\n if (params.nth !== undefined) {\n locator = locator.nth(params.nth);\n }\n return locator;\n}\n","import { LocatorParams } from \"../schemas/locators/locator-parameters\";\nimport { LocatorStrategies, resolveLocator } from \"../locator-resolver\";\n\nconst locatorStrategies: LocatorStrategies = {\n selector: async (page, params: LocatorParams) =>\n page.locator((params as any).value),\n\n xpath: async (page, params: LocatorParams) =>\n page.locator((params as any).value),\n\n role: async (page, params: LocatorParams) => {\n const p = params as any;\n return page.getByRole(p.role, {\n name: p.name,\n exact: p.exact,\n checked: p.checked,\n disabled: p.disabled,\n expanded: p.expanded,\n includeHidden: p.includeHidden,\n level: p.level,\n pressed: p.pressed,\n selected: p.selected,\n });\n },\n\n text: async (page, params: LocatorParams) => {\n const p = params as any;\n return page.getByText(p.value, { exact: p.exact });\n },\n\n label: async (page, params: LocatorParams) => {\n const p = params as any;\n return page.getByLabel(p.value, { exact: p.exact });\n },\n\n placeholder: async (page, params: LocatorParams) => {\n const p = params as any;\n return page.getByPlaceholder(p.value, { exact: p.exact });\n },\n\n altText: async (page, params: LocatorParams) => {\n const p = params as any;\n return page.getByAltText(p.value, { exact: p.exact });\n },\n\n title: async (page, params: LocatorParams) => {\n const p = params as any;\n return page.getByTitle(p.value, { exact: p.exact });\n },\n\n testId: async (page, params: LocatorParams) =>\n page.getByTestId((params as any).value),\n\n nested: async (page, params: LocatorParams) => {\n const p = params as any;\n const parentLocator = await resolveLocator(locatorStrategies, page, p.parent);\n const childLocator = await resolveLocator(locatorStrategies, page, p.child);\n return parentLocator.locator(childLocator);\n },\n};\n\nexport default locatorStrategies;\n","import { cosmiconfigSync } from \"cosmiconfig\";\nimport path from \"path\";\nimport { Locator, Page } from \"playwright\";\nimport actionTypeHandlers from \"./defaults/action-type-handlers\";\nimport getterSetterRules from \"./defaults/getter-setter-rules\";\nimport getterStrategies from \"./defaults/getter-strategies\";\nimport setterStrategies from \"./defaults/setter-strategies\";\nimport locatorStrategies from \"./defaults/locator-strategies\";\nimport { TestAction } from \"./schemas/test-action\";\nimport { LocatorStrategies } from \"./locator-resolver\";\n\nexport interface ActionContext {\n page: Page;\n locator?: Locator;\n}\n\nexport type ActionTypeHandler = (context: ActionContext, action: TestAction) => Promise<void>;\n\nexport interface ConditionParams {\n document: Document;\n element: Element;\n xpathEval: (xpath: string) => boolean;\n}\n\nexport interface RuleMatch {\n id: string;\n xpath?: string;\n matchedChild: boolean;\n}\n\nexport interface StrategyParam {\n locator: Locator;\n ruleMatch: RuleMatch;\n value?: string;\n}\n\nexport type RuleType = (params: ConditionParams) => boolean;\nexport type SetterStrategyType = (param: StrategyParam) => Promise<void>;\nexport type GetterStrategyType = (param: StrategyParam) => Promise<string | null>;\n\nexport interface Configuration<TActionType extends string = string> {\n /**\n * Absolute path to the directory containing the playwright-json config file.\n * Resolved automatically — do not set manually.\n * @internal\n */\n configDir?: string;\n /**\n * Directory where visual-regression snapshots are stored.\n * Defaults to `snapshots` (resolved relative to `configDir`).\n */\n snapshotDir: string;\n /**\n * Directory that will be recursively scanned for test files.\n * Defaults to `json-tests`.\n */\n jsonTestDir: string;\n /**\n * Glob pattern or RegExp to match test files.\n * Defaults to `**\\/*.playwright.json`.\n */\n jsonTestMatch: string | RegExp;\n /**\n * Locator strategy functions keyed by the `by` discriminant value.\n * Add custom entries here to support new `by` types in your JSON tests.\n *\n * @example\n * ```ts\n * locatorStrategies: {\n * textAfterLoad: async (page, params) => {\n * await page.waitForLoadState(\"domcontentloaded\");\n * return page.getByText(params.value);\n * }\n * }\n * // Then in JSON: { \"by\": \"textAfterLoad\", \"value\": \"Submit\" }\n * ```\n */\n locatorStrategies: LocatorStrategies;\n /**\n * Action handler functions keyed by the `action` field value.\n * Add custom entries here to support new action types in your JSON tests.\n *\n * @example\n * ```ts\n * actionTypeHandlers: {\n * clearAndFill: async ({ locator }, action) => {\n * if (!locator) throw new Error(\"clearAndFill requires a locator\");\n * await locator.clear();\n * await locator.fill((action as any).value ?? \"\");\n * }\n * }\n * // Then in JSON: { \"action\": \"clearAndFill\", \"locator\": {...}, \"value\": \"hello\" }\n * ```\n */\n actionTypeHandlers: Record<TActionType, ActionTypeHandler>;\n /**\n * Rules that determine which getter/setter strategy applies to a given element.\n * Each rule receives the element's HTML and returns true if its strategy should be used.\n * Order matters — the first matching rule wins.\n *\n * `xpathEval` runs an XPath query within the element's context, allowing you to\n * match on child elements (e.g. a `<select>` or `<input>` inside a wrapper `<div>`).\n */\n rules: Record<string, RuleType>;\n /**\n * Strategies for **setting** a field value. Keyed by rule name.\n * Called by `setLocatorValue` when the matching rule fires.\n */\n setterStrategies: Record<string, SetterStrategyType>;\n /**\n * Strategies for **getting** a field value. Keyed by rule name.\n * Called by `getLocatorValue` when the matching rule fires.\n */\n getterStrategies: Record<string, GetterStrategyType>;\n /**\n * Default timeout in milliseconds for `setFieldValue` / `assertFieldValue*`\n * actions to wait for the element to be attached before reading its HTML.\n * Defaults to `10_000` (10 seconds).\n */\n fieldValueTimeout: number;\n}\n\nexport const baseConfig: Configuration = {\n snapshotDir: \"snapshots\",\n jsonTestDir: \"json-tests\",\n jsonTestMatch: `**/*.playwright.json`,\n locatorStrategies,\n actionTypeHandlers,\n rules: getterSetterRules,\n setterStrategies,\n getterStrategies,\n fieldValueTimeout: 10_000,\n};\n\n/**\n * Merge your custom config on top of the defaults.\n *\n * @example\n * ```ts\n * // playwright-json.config.ts\n * import { extendConfig } from \"playwright-json-runner\";\n *\n * export default extendConfig({\n * jsonTestDir: \"e2e/json-tests\",\n * actionTypeHandlers: {\n * myCustomAction: async ({ locator }, action) => {\n * await locator!.fill((action as any).value ?? \"\");\n * }\n * }\n * });\n * ```\n */\nexport function extendConfig<TActionType extends string = string>(\n extensions: Partial<Configuration<TActionType>>\n): Configuration<TActionType> {\n return {\n ...(baseConfig as Configuration<TActionType>),\n ...extensions,\n locatorStrategies: {\n ...baseConfig.locatorStrategies,\n ...(extensions.locatorStrategies ?? {}),\n },\n actionTypeHandlers: {\n ...(baseConfig.actionTypeHandlers as Record<TActionType, ActionTypeHandler>),\n ...(extensions.actionTypeHandlers ?? {}),\n },\n rules: {\n ...baseConfig.rules,\n ...(extensions.rules ?? {}),\n },\n setterStrategies: {\n ...baseConfig.setterStrategies,\n ...(extensions.setterStrategies ?? {}),\n },\n getterStrategies: {\n ...baseConfig.getterStrategies,\n ...(extensions.getterStrategies ?? {}),\n },\n };\n}\n\nlet config: Configuration | undefined;\n\nexport function getConfiguration(): Configuration {\n if (config) return config;\n config = loadConfiguration();\n return config;\n}\n\nconst explorer = cosmiconfigSync(\"playwright-json\", {\n searchPlaces: [\"playwright-json.config.ts\", \"playwright-json.config.js\"],\n});\n\nexport function loadConfiguration(): Configuration {\n try {\n if (explorer) {\n const result = explorer.search();\n if (result && result.config) {\n const userConfig: Configuration = result.config.default ?? result.config;\n userConfig.configDir = path.dirname(result.filepath);\n return userConfig;\n }\n }\n return baseConfig;\n } catch (error) {\n console.error(\"❌ Failed to load user config:\", error);\n return baseConfig;\n }\n}\n\n","import { chromium, firefox, webkit, Browser, Page } from \"playwright\";\nimport { getConfiguration, Configuration } from \"./config\";\nimport { TestAction } from \"./schemas/test-action\";\nimport { TestScenario } from \"./schemas/test-scenario\";\nimport { TestStep } from \"./schemas/test-step\";\nimport { TestRun } from \"./schemas/test-run\";\nimport { resolveLocator } from \"./locator-resolver\";\n\nexport async function runTests(testRun: TestRun): Promise<void> {\n const config = getConfiguration();\n\n const browserType =\n { chrome: chromium, firefox, webkit }[testRun.browser] ?? chromium;\n\n const browser: Browser = await browserType.launch();\n\n console.log(`🚀 Running tests on ${testRun.host} using ${testRun.browser}`);\n\n await executeTestRun(config, browser, testRun);\n\n await browser.close();\n}\n\nasync function executeTestRun(config: Configuration, browser: Browser, testRun: TestRun) {\n for (const scenario of tes