{ "version": 3, "sources": ["../src/api.ts", "../src/index.ts"], "sourcesContent": ["export interface GenerateIdentityRequest { }\nexport interface GenerateIdentityResponse {\n WorkflowID: string\n RunID: string\n}\nexport interface IdentityResponse {\n FirstName: string\n LastName: string\n PhotoURL: string\n EmailAddress: string\n}\n\nexport type UpdateStatus = \"STARTING\" | \"GENERATING_NAME\" | \"GENERATING_PHOTO\" | \"GENERATING_EMAIL\" | \"COMPLETED\"\n\nexport interface UpdateStep {\n\tStatus: UpdateStatus\n\tStep: number\n}\n\nexport interface UpdateResponse {\n\tCurrentStep: UpdateStep\n\n\t// Only if CurrentStep is 'COMPLETED'\n\tIdentity?: IdentityResponse\n}\n\nexport interface Address {\n Name: string\n Address: string\n}\n\nexport interface Message {\n\tFrom: Address | null\n\tTo: (Address | null)[]\n\tSubject: string\n\tDate: string | null\n\tTextBody: string\n\tHTMLBody: string\n\n\t// Inlines []*enmime.Part\n\t// Attachments []*enmime.Part\n}\n\nexport const getEmails = (email: GenerateIdentityRequest, fn: (msg: Message) => void) => {\n const evtSource = new EventSource(`/api/emails?address=${email}`)\n \n evtSource.onmessage = (e) => {\n console.log('[raw] received email!', e.data)\n const msg: Message = JSON.parse(e.data)\n fn(msg)\n }\n}\n\nexport const generateIdentity = async (req: GenerateIdentityRequest, fn: (us: UpdateStep) => void): Promise => {\n const resp = await fetch('/api/identity', {\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify(req)\n });\n\n if (resp.status !== 200) {\n throw new Error(`unexpected response code ${resp.status}`)\n }\n\n const giResp: GenerateIdentityResponse = await resp.json()\n\n return new Promise((resolve) => {\n const evtSource = new EventSource(`/api/listen?workflow_id=${giResp.WorkflowID}&run_id=${giResp.RunID}`)\n \n evtSource.onmessage = (e) => {\n const data: UpdateResponse = JSON.parse(e.data)\n\n if (data.CurrentStep.Status !== \"COMPLETED\") {\n fn(data.CurrentStep)\n return\n }\n\n if (!data.Identity) {\n throw new Error('step was COMPLETED but no identity was returned')\n }\n\n // Close the EventSource so that it doesn't try reconnecting.\n evtSource.close()\n resolve(data.Identity)\n };\n })\n}\n", "import { type UpdateStep, generateIdentity, type Message, getEmails, type Address } from './api'\n\nfunction ready(fn: () => void) {\n if (document.readyState !== 'loading') {\n fn();\n } else {\n document.addEventListener('DOMContentLoaded', fn);\n }\n}\n\nconst setText = (id: string, text: string) => {\n const el = document.getElementById(id)\n if (!el) {\n throw new Error(`no element #${id} found`)\n }\n el.textContent = text\n}\n\nconst showUser = () => {\n document.getElementById('user')?.classList.remove('hidden')\n document.getElementById('header')?.classList.add('hidden')\n}\n\nconst updateProgressBar = (us: UpdateStep) => {\n let label = 'Generating...'\n switch (us.Status) {\n case 'STARTING':\n label = 'Generating identity...'\n break\n case 'GENERATING_NAME':\n label = 'Coming up with a name...'\n break\n case 'PINGING_PHOTO_GENERATOR':\n label = 'Starting the photo generator service (because we\\'re cheap)...'\n break\n case 'GENERATING_PHOTO':\n label = 'Generating a photo...'\n break\n case 'GENERATING_EMAIL':\n label = 'Adding an photo...'\n break\n case 'COMPLETED':\n label = 'Success!'\n break\n }\n setText('loading-text', label)\n setText('loading-step', `${us.Step}/4`)\n const pb = document.getElementById('progress-bar')\n if (!pb) {\n console.log('no progress bar element')\n return\n }\n pb.style.width = `${(100 * us.Step) / 4}%`\n}\n\nconst formatAddress = (addr: Address): string => {\n if (addr.Name) {\n return addr.Name\n }\n return addr.Address\n}\n\nready(() => {\n const generateBtn = document.getElementById('generate')\n if (!generateBtn) {\n throw new Error('no generate button found')\n }\n\n const emailTemplate = document.getElementById('email-row')\n if (!emailTemplate || !(emailTemplate instanceof HTMLTemplateElement)) {\n throw new Error('no email template found')\n }\n if (!emailTemplate.content) {\n throw new Error('browser doesnt support templates')\n }\n const emailTBody = document.getElementById('email-tbody')\n if (!emailTBody) {\n throw new Error('no email tbody found')\n }\n\n generateBtn.addEventListener('click', async(_ev: MouseEvent) => {\n updateProgressBar({Status: 'STARTING', Step: 0})\n document.getElementById('progress')?.classList.remove('hidden')\n const identity = await generateIdentity({}, updateProgressBar)\n\n setText('name', `${identity.FirstName} ${identity.LastName}`)\n setText('email', identity.EmailAddress)\n const pp = document.getElementById('profile-picture')\n if (!pp || !(pp instanceof HTMLImageElement)) {\n throw new Error('profile picture element invalid')\n }\n var newImg = new Image();\n newImg.onload = function() {\n pp.src = (this as HTMLImageElement).src;\n showUser()\n }\n newImg.src = identity.PhotoURL;\n document.getElementById('progress')?.classList.add('hidden')\n\n getEmails(identity.EmailAddress, (msg: Message) => {\n const clone = emailTemplate.content.cloneNode(true) as Element;\n\n const td = clone.querySelectorAll(\"td\");\n td[0].textContent = msg.From ? formatAddress(msg.From) : 'Unknown sender'\n td[1].textContent = msg.Subject\n td[2].textContent = msg.Date ?? ''\n emailTBody.appendChild(clone);\n })\n })\n})\n"], "mappings": "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", "names": ["getEmails", "email", "fn", "evtSource", "e", "msg", "generateIdentity", "req", "resp", "giResp", "resolve", "data", "ready", "fn", "setText", "id", "text", "el", "showUser", "_a", "_b", "updateProgressBar", "us", "label", "pb", "formatAddress", "addr", "generateBtn", "emailTemplate", "emailTBody", "_ev", "identity", "generateIdentity", "pp", "newImg", "getEmails", "msg", "clone", "td"] }