{"version":3,"file":"mod.cjs","sources":["../../lib/src/state.ts","../src/mod.ts","../src/channel/dom.ts"],"sourcesContent":["import Emittery from 'emittery';\n\nimport {RunEvent, ErrorDescription, TestHistory} from './events';\n\nexport type State = {\n\tparsed: boolean;\n\tdeclared: number;\n\tqueued: number;\n\tpass: number;\n\tfail: number;\n\terror: ErrorDescription | undefined;\n\thistory: Record<string, TestHistory>;\n};\n\nconst initHistory = () => {\n\treturn {\n\t\tqueued: false,\n\t\tdone: false,\n\t\tpass: false,\n\t\tfail: false,\n\t\trunning: false,\n\t\terrors: [],\n\t};\n};\n\nconst init = (): State => {\n\treturn {\n\t\tparsed: false,\n\t\tdeclared: 0,\n\t\tqueued: 0,\n\t\tpass: 0,\n\t\tfail: 0,\n\t\terror: undefined,\n\t\thistory: {},\n\t};\n};\n\nexport const create = (): Emittery => {\n\tconst emitter = new Emittery();\n\n\tlet state = init();\n\n\temitter.on('init', () => {\n\t\tstate = init();\n\t});\n\n\temitter.on('event', (event: RunEvent) => {\n\t\t// eslint-disable-next-line default-case\n\t\tswitch (event.type) {\n\t\t\tcase 'error':\n\t\t\t\tstate.error = event.error;\n\t\t\t\tbreak;\n\t\t\tcase 'test-declare':\n\t\t\t\t++state.declared;\n\t\t\t\tstate.history[event.title] = initHistory();\n\t\t\t\tbreak;\n\t\t\tcase 'test-queue':\n\t\t\t\tstate.history[event.title].queued = true;\n\t\t\t\t++state.queued;\n\t\t\t\tbreak;\n\t\t\tcase 'test-start':\n\t\t\t\tstate.history[event.title].queued = false;\n\t\t\t\tstate.history[event.title].running = true;\n\t\t\t\tbreak;\n\t\t\tcase 'test-pass':\n\t\t\t\tstate.history[event.title].running = false;\n\t\t\t\tstate.history[event.title].pass = true;\n\t\t\t\tstate.history[event.title].done = true;\n\t\t\t\t++state.pass;\n\t\t\t\tbreak;\n\t\t\tcase 'test-fail':\n\t\t\t\tstate.history[event.title].running = false;\n\t\t\t\tstate.history[event.title].fail = true;\n\t\t\t\tstate.history[event.title].done = true;\n\t\t\t\tstate.history[event.title].errors.push(event.error);\n\t\t\t\t++state.fail;\n\t\t\t\tbreak;\n\t\t\tcase 'parsed':\n\t\t\t\tstate.parsed = true;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\temitter.on('dump', (cb: (state: State) => void) => {\n\t\tcb(state);\n\t});\n\n\treturn emitter;\n};\n","import {RunEvent} from '../../lib/src/events';\nimport {create} from './channel/dom'; // TODO allow any implementation given by s\n\nconst path = decodeURIComponent(\n\tdocument.location.pathname.split('/').pop() ?? '',\n);\n// TODO receive this to long-polling or websocket and drop one-way DOM channel\n// implementation\nconst title = decodeURIComponent(document.location.hash.slice(1));\n\nexport type Test = () => Promise<void>;\n\nconst _tests = new Map<string, Test>();\n\nconst channel = create();\n\nconst init = async () => {\n\treturn channel.emit('init');\n};\n\nconst emit = async (event: RunEvent) => {\n\treturn channel.emit('event', event);\n};\n\nconst flush = async () => {\n\treturn channel.emit('flush');\n};\n\nconst run = async (title: string) => {\n\tconsole.error(`Running test ${title}`);\n\tconst testFn = _tests.get(title);\n\tif (testFn === undefined) {\n\t\tthrow new Error(`could not find title ${title}`);\n\t} else {\n\t\tawait emit({type: 'test-queue', path, title});\n\t\tawait flush();\n\t\tawait testFn().then(\n\t\t\tasync () => {\n\t\t\t\tawait emit({type: 'test-pass', path, title});\n\t\t\t\treturn flush();\n\t\t\t},\n\t\t\tasync (error: Error) => {\n\t\t\t\tconst {message, stack} = error;\n\t\t\t\tconsole.error(`Test ${title} failed with error`, {error});\n\t\t\t\tawait emit({type: 'test-fail', path, title, error: {message, stack}});\n\t\t\t\treturn flush();\n\t\t\t},\n\t\t);\n\t}\n};\n\nconst autorun = async () => {\n\tawait init();\n\tawait flush();\n\tfor (const title of _tests.keys()) {\n\t\t// TODO declare tests as we read them\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tawait emit({type: 'test-declare', path, title});\n\t}\n\n\tawait emit({type: 'parsed', path});\n\tawait flush();\n\tif (title !== '') {\n\t\trun(title).catch(async (error: Error) => {\n\t\t\tconst {message, stack} = error;\n\t\t\tawait emit({type: 'error', path, error: {message, stack}});\n\t\t\tawait flush();\n\t\t\tconsole.error(error);\n\t\t});\n\t}\n};\n\nlet to: any;\n\nconst setupAutorun = () => {\n\tto = setTimeout(autorun, 0);\n};\n\nconst cancelAutorun = () => {\n\tclearTimeout(to);\n};\n\nsetupAutorun();\n\nconst test = (title: string, testFn: Test) => {\n\tif (_tests.has(title)) {\n\t\tcancelAutorun();\n\t\tconst error = new Error(`duplicate title ${title}`);\n\t\tconst {message, stack} = error;\n\t\temit({type: 'error', path, error: {message, stack}})\n\t\t\t.then(flush)\n\t\t\t.catch((error: Error) => {\n\t\t\t\tconsole.error('uncaught error', error);\n\t\t\t});\n\t\treturn;\n\t}\n\n\t_tests.set(title, testFn);\n};\n\nexport default test;\n","import Emittery from 'emittery';\nimport {RunEvent, RunEventWithDateTime} from '../../../lib/src/events';\nimport {State, create as createState} from '../../../lib/src/state';\n\nexport const create = (): Emittery => {\n\tconst emitter = new Emittery();\n\n\tconst state = createState();\n\tlet events: RunEventWithDateTime[] = [];\n\n\tconst render = async () => {\n\t\treturn state.emit('dump', (state: State) => {\n\t\t\tconst done = state.pass + state.fail;\n\t\t\tconst _state = document.querySelector('#state');\n\t\t\tif (_state === null) {\n\t\t\t\tthrow new Error('could not find #state element');\n\t\t\t}\n\n\t\t\t_state.textContent = JSON.stringify(\n\t\t\t\t{\n\t\t\t\t\tdeclared: state.declared,\n\t\t\t\t\tqueued: state.queued,\n\t\t\t\t\tdone,\n\t\t\t\t\tpass: state.pass,\n\t\t\t\t\tfail: state.fail,\n\t\t\t\t\terror: state.error,\n\t\t\t\t\thistory: state.history,\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t);\n\t\t\tconst _events = document.querySelector('#events');\n\t\t\tif (_events === null) {\n\t\t\t\tthrow new Error('could not find #events element');\n\t\t\t}\n\n\t\t\t_events.textContent = JSON.stringify(events, undefined, 2);\n\t\t});\n\t};\n\n\temitter.on('init', async () => {\n\t\tevents = [];\n\t\treturn state.emit('init');\n\t});\n\n\temitter.on('flush', render);\n\n\temitter.on('event', async (event: RunEvent) => {\n\t\tevents.push({...event, datetime: new Date()});\n\t\treturn state.emit('event', event);\n\t});\n\n\treturn emitter;\n};\n"],"names":["_settle","pact","state","value","s","o","bind","v","then","observer","_document$location$pa","_Pact","prototype","onFulfilled","onRejected","this","callback","result","e","_this","_isSettledPact","thenable","emitter","events","to","path","decodeURIComponent","document","location","pathname","split","pop","title","hash","slice","_tests","Map","Emittery","parsed","declared","queued","pass","fail","error","undefined","history","on","event","type","done","running","errors","push","cb","createState","emit","Promise","reject","resolve","_state","querySelector","Error","textContent","JSON","stringify","_events","datetime","Date","channel","flush","setTimeout","init","console","testFn","get","message","stack","run","_temp","_forOf","keys","_temp2","has","clearTimeout","set"],"mappings":"kUAcA,2GCwCC,SAAAA,EAAoBC,EAAMC,EAAOC,SACKC,EAAA,mBACO,CAC5C,IAAAD,EAAAC,EAQC,YADAD,EAAAE,EAAAL,EAAcM,KAAA,OAAWJ,IAN1B,EAAAA,IAEKA,EAAAC,EAAUC,GAEhBD,EAAIA,EAAUI,EAMb,GAAAJ,GAAGA,EAAAK,KAEH,YADAL,EAAAK,KAAAR,EAAAM,KAAA,KAAAL,EAAAC,GAAAF,EAAAM,KAAA,KAAAL,EAAA,IAKIA,EAAAG,EAAAF,EACLD,IAAeE,EACd,IAAAM,EAAAR,EAAAI,EAEII,KACOR,QA9EbS,EAEaC,0BAGiE,cA2C7E,OA1CgBA,EAAAC,UAAAJ,KAAA,SAAAK,EAAAC,GACjB,MAAgC,IAAAH,IAIbI,KAAAX,EAEnB,GAAMF,EAAO,CAEb,MAAwB,EAANA,EAAMW,EAAAC,EACvB,GAAAE,GACC,IAEFhB,EAAaiB,EAAO,EAAAD,EAAmBD,KAAAR,IAC/B,MAAAW,GACNlB,EAAAiB,EAAA,EAAAC,GAGD,SAGD,YAkBG,YAfEb,EAAA,SAAWc,GACd,IACA,IAAAhB,EAAAgB,EAAAZ,EAAM,EAAAY,EAAAf,EACNJ,EAAAiB,EAAY,EAAAJ,EAAMA,EAAoBV,GAAQA,GACxCW,EACNd,EAAAiB,EAAc,UAGLA,EAAA,EAAKd,GAGZ,MAAAe,KACAD,EAAQ,EAAKC,KAKfD,GAGFN,KAmCE,SAAAS,EAAgBC,UAChBA,aAAAV,GAA2C,EAAAU,EAAAjB,EApF7C,ICEOkB,EAEApB,EACFqB,EDgELC,EArEMC,EAAOC,mBAAkB,SAC9BC,SAASC,SAASC,SAASC,MAAM,KAAKC,OADRrB,EACiB,IAI1CsB,EAAQN,mBAAmBC,SAASC,SAASK,KAAKC,MAAM,IAIxDC,EAAS,IAAIC,OCPZd,EAAU,IAAhBe,EAAA,QAEMnC,EF8Be,WACrB,MAAgB,IAAhBmC,UAESnC,EAdF,CACNoC,QAAQ,EACRC,SAAU,EACVC,OAAQ,EACRC,KAAM,EACNC,KAAM,EACNC,WAAOC,EACPC,QAAS,IAsDV,OA7CAvB,EAAQwB,GAAG,OAAQ,WAClB5C,EAjBM,CACNoC,QAAQ,EACRC,SAAU,EACVC,OAAQ,EACRC,KAAM,EACNC,KAAM,EACNC,WAAOC,EACPC,QAAS,MAaVvB,EAAQwB,GAAG,QAAS,SAACC,GAEpB,OAAQA,EAAMC,MACb,IAAK,QACJ9C,EAAMyC,MAAQI,EAAMJ,MACpB,MACD,IAAK,iBACFzC,EAAMqC,SACRrC,EAAM2C,QAAQE,EAAMf,OAvChB,CACNQ,QAAQ,EACRS,MAAM,EACNR,MAAM,EACNC,MAAM,EACNQ,SAAS,EACTC,OAAQ,IAkCN,MACD,IAAK,aACJjD,EAAM2C,QAAQE,EAAMf,OAAOQ,QAAS,IAClCtC,EAAMsC,OACR,MACD,IAAK,aACJtC,EAAM2C,QAAQE,EAAMf,OAAOQ,QAAS,EACpCtC,EAAM2C,QAAQE,EAAMf,OAAOkB,SAAU,EACrC,MACD,IAAK,YACJhD,EAAM2C,QAAQE,EAAMf,OAAOkB,SAAU,EACrChD,EAAM2C,QAAQE,EAAMf,OAAOS,MAAO,EAClCvC,EAAM2C,QAAQE,EAAMf,OAAOiB,MAAO,IAChC/C,EAAMuC,KACR,MACD,IAAK,YACJvC,EAAM2C,QAAQE,EAAMf,OAAOkB,SAAU,EACrChD,EAAM2C,QAAQE,EAAMf,OAAOU,MAAO,EAClCxC,EAAM2C,QAAQE,EAAMf,OAAOiB,MAAO,EAClC/C,EAAM2C,QAAQE,EAAMf,OAAOmB,OAAOC,KAAKL,EAAMJ,SAC3CzC,EAAMwC,KACR,MACD,IAAK,SACJxC,EAAMoC,QAAS,KAKlBhB,EAAQwB,GAAG,OAAQ,SAACO,GACnBA,EAAGnD,OE7EUoD,GACV/B,EAAiC,GAgCrCD,EAAQwB,GAAG,OAAmB,WAAA,IAE7B,OADAvB,EAAS,GACFrB,QAAAA,QAAAA,EAAMqD,KAAK,SAFnB,MAAArC,GAAA,OAAAsC,QAAAC,OAAAvC,MAKAI,EAAQwB,GAAG,QAnCC,WAAA,IACX,OAAAU,QAAAE,QAAOxD,EAAMqD,KAAK,OAAQ,SAACrD,GAC1B,IAAM+C,EAAO/C,EAAMuC,KAAOvC,EAAMwC,KAC1BiB,EAAShC,SAASiC,cAAc,UACtC,GAAe,OAAXD,EACH,MAAM,IAAAE,MAAU,iCAGjBF,EAAOG,YAAcC,KAAKC,UACzB,CACCzB,SAAUrC,EAAMqC,SAChBC,OAAQtC,EAAMsC,OACdS,KAAAA,EACAR,KAAMvC,EAAMuC,KACZC,KAAMxC,EAAMwC,KACZC,MAAOzC,EAAMyC,MACbE,QAAS3C,EAAM2C,cAEhBD,EACA,GAED,IAAaqB,EAAGtC,SAASiC,cAAc,WACvC,GAAgB,OAAZK,EACH,MAAUJ,IAAAA,MAAM,kCAGjBI,EAAQH,YAAcC,KAAKC,UAAUzC,OAAQqB,EAAW,MA1B9C,MAAZ1B,GAAA,OAAAsC,QAAAC,OAAAvC,MAqCAI,EAAQwB,GAAG,QAAX,SAA2BC,GAA3B,IAEC,OADAxB,EAAO6B,KAASL,EAAAA,GAAAA,EAAOmB,CAAAA,SAAU,IAAjCC,QACOjE,QAAAA,QAAAA,EAAMqD,KAAK,QAASR,IAF5B,MAAA7B,GAAA,OAAAsC,QAAAC,OAAAvC,MAKOI,GDhCFiC,EAAAA,SAAcR,GAAV,IACT,OAAOqB,QAAAA,QAAAA,EAAQb,KAAK,QAASR,IADpB,MAAA7B,GAAA,OAAAsC,QAAAC,OAAAvC,KAIJmD,EAAAA,eACL,OAAAb,QAAAE,QAAOU,EAAQb,KAAK,UADV,oCAmDV/B,EAAK8C,WAxBO,WAAc,OAAAd,QAAAE,QAnCjB,WAAc,IACvB,uBAAOU,EAAQb,KAAK,SADX,MAAArC,GAAA,OAAAsC,QAAAC,OAAAvC,IAoCHqD,IADoB/D,KAAA,WAAA,OAAAgD,QAAAE,QAEpBW,yDAOAd,EAAK,CAACP,KAAM,SAAUvB,KAAAA,KACtB4C,KAAAA,WAAAA,OAAAA,QAAAA,QAAAA,KACFrC,KAAAA,WAAU,KAAVA,GAlCI,SAAUA,GAAiB,IACnCwC,QAAQ7B,MAAsBX,gBAAAA,GAC9B,IAAMyC,EAAStC,EAAOuC,IAAI1C,GAFS,OAG/ByC,QAAAA,QAAAA,WAAAA,QAAW7B,IAAX6B,EACH,MAAM,UAAkCzC,wBAAAA,GAElCuB,OAAAA,QAAAA,QAAAA,EAAK,CAACP,KAAM,aAAcvB,KAAAA,EAAMO,MAAAA,4CAChCqC,4CACAI,IAASjE,KAAT,WAAA,2BAEE+C,EAAK,CAACP,KAAM,YAAavB,KAAAA,EAAMO,MAAAA,KACrCxB,KAAA,WAAA,OAAY6D,MAHR,MAAAnD,GAAA,OAAAsC,QAAAC,OAAAvC,KAAA,SAKEyB,GALF,IAMJ,IAAOgC,EAAkBhC,EAAlBgC,QAASC,EAASjC,EAATiC,MADM,OAEtBJ,QAAQ7B,MAAR,QAAsBX,EAAtB,qBAAiD,CAACW,MAAAA,IAC5CY,QAAAA,QAAAA,EAAK,CAACP,KAAM,YAAavB,KAAAA,EAAMO,MAAAA,EAAOW,MAAO,CAACgC,QAAAA,EAASC,MAAAA,MAHvCpE,KAAA,WAItB,OAAY6D,MATR,sCAaP7D,KAAA,kBAlBIiE,IAHI,MAATvD,GAAA,OAAAsC,QAAAC,OAAAvC,IAmCE2D,CAAI7C,kBAAoBW,GAAxB,IAAwC,OAEjCY,QAAAA,QAAAA,EAAK,CAACP,KAAM,QAASvB,KAAAA,EAAMkB,MAAO,CAACgC,QADhBhC,EAAlBgC,QAC2CC,MADzBjC,EAATiC,iDAEVP,KACNG,KAAAA,WAAAA,QAAQ7B,MAAMA,OAJf,MAZyBzB,GAAA,OAAAsC,QAAAC,OAAAvC,UAAA,IAAA4D,+uBAAAC,CAGN5C,EAAO6C,OAHD,SAGfhD,0BAGJuB,EAAK,CAACP,KAAM,eAAgBvB,KAAAA,EAAMO,MAAAA,KAHNxB,KAAA,gBAHT,OAAAsE,GAAAA,EAAAtE,KAAAsE,EAAAtE,KAAAyE,GAAAA,SAwBD,kBASb,SAACjD,EAAeyC,GAC5B,GAAItC,EAAO+C,IAAIlD,GAAf,CANAmD,aAAa3D,GAQZ,IAAMmB,EAAQ,UAA6BX,mBAAAA,GAE3CuB,EAAK,CAACP,KAAM,QAASvB,KAAAA,EAAMkB,MAAO,CAACgC,QADVhC,EAAlBgC,QACqCC,MADnBjC,EAATiC,SAEdpE,KAAK6D,SACC,SAAC1B,GACP6B,QAAQ7B,MAAM,iBAAkBA,UAKnCR,EAAOiD,IAAIpD,EAAOyC"}