[{"data":1,"prerenderedAt":2265},["ShallowReactive",2],{"versions":3,"plugin-litestar-email":6,"readme-litestar-email":48},{"v3":4,"v4":5},"3.21.10","4.5.1",{"id":7,"title":8,"body":9,"category":10,"changelog":11,"compatibility":12,"created_at":14,"description":15,"documentation":16,"extension":17,"github":18,"icon":19,"issues":20,"key":21,"latest_version":22,"license":9,"maintainers":23,"meta":28,"monthly_downloads":29,"name":8,"navigation":30,"path":31,"pypi":21,"python_compatibility":32,"python_compatibility_raw":33,"repo":40,"seo":41,"sponsor":42,"stars":43,"stem":44,"type":45,"updated_at":46,"website":18,"__hash__":47},"plugins\u002Fplugins\u002Flitestar-email.yml","Litestar Email",null,"Others","https:\u002F\u002Fgithub.com\u002Flitestar-org\u002Flitestar-email\u002Freleases\u002F",{"litestar":13},">=2.0.0","2026-01-04T21:35:28","Email plugin for Litestar","https:\u002F\u002Flitestar-org.github.io\u002Flitestar-email\u002F","yml","https:\u002F\u002Fgithub.com\u002Flitestar-org\u002Flitestar-email","_default_icon.svg","https:\u002F\u002Fgithub.com\u002Flitestar-org\u002Flitestar-email\u002Fissues\u002F","litestar-email","0.4.0",[24],{"name":25,"github":26,"avatar":27},"Cody Fincher","cofin","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F204685?v=4",{},3465,true,"\u002Fplugins\u002Flitestar-email",{"raw":33,"specifier_set":33,"compatible":34},">=3.10",[35,36,37,38,39],"3.10","3.11","3.12","3.13","3.14","litestar-org\u002Flitestar-email",{"description":15},false,15,"plugins\u002Flitestar-email","official","2026-05-03T16:59:03","WYaZIb7ES6o6IEH-dFysWOqvNNxaQu-oROpU-Z6UhyM",{"id":49,"extension":50,"meta":51,"stem":2263,"__hash__":2264},"readme\u002Freadmes\u002Flitestar-email.md","md",{"body":52},{"type":53,"value":54,"toc":2249},"minimark",[55,59,64,90,93,157,175,179,341,344,473,478,615,630,634,641,858,861,872,876,879,1337,1351,1355,1358,1541,1544,1599,1603,1699,1703,1824,1827,1922,1926,1933,2051,2057,2189,2193,2238,2242,2245],[56,57,58],"p",{},"Email support for Litestar applications. This plugin provides a pluggable email backend\nsystem for sending transactional emails with support for multiple providers.",[60,61,63],"h2",{"id":62},"installation","Installation",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-bash shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","pip install litestar-email\n","bash","",[72,73,74],"code",{"__ignoreMap":70},[75,76,79,83,87],"span",{"class":77,"line":78},"line",1,[75,80,82],{"class":81},"s52Pk","pip",[75,84,86],{"class":85},"sGFVr"," install",[75,88,89],{"class":85}," litestar-email\n",[56,91,92],{},"For production backends, install with the appropriate extra:",[65,94,96],{"className":67,"code":95,"language":69,"meta":70,"style":70},"# SMTP backend\npip install litestar-email[smtp]\n\n# Amazon SES backend (adds botocore for SigV4 signing)\npip install litestar-email[ses]\n\n# aiohttp transport (alternative to httpx for API backends)\npip install litestar-email[aiohttp]\n",[72,97,98,104,114,120,126,136,141,147],{"__ignoreMap":70},[75,99,100],{"class":77,"line":78},[75,101,103],{"class":102},"sWuyu","# SMTP backend\n",[75,105,107,109,111],{"class":77,"line":106},2,[75,108,82],{"class":81},[75,110,86],{"class":85},[75,112,113],{"class":85}," litestar-email[smtp]\n",[75,115,117],{"class":77,"line":116},3,[75,118,119],{"emptyLinePlaceholder":30},"\n",[75,121,123],{"class":77,"line":122},4,[75,124,125],{"class":102},"# Amazon SES backend (adds botocore for SigV4 signing)\n",[75,127,129,131,133],{"class":77,"line":128},5,[75,130,82],{"class":81},[75,132,86],{"class":85},[75,134,135],{"class":85}," litestar-email[ses]\n",[75,137,139],{"class":77,"line":138},6,[75,140,119],{"emptyLinePlaceholder":30},[75,142,144],{"class":77,"line":143},7,[75,145,146],{"class":102},"# aiohttp transport (alternative to httpx for API backends)\n",[75,148,150,152,154],{"class":77,"line":149},8,[75,151,82],{"class":81},[75,153,86],{"class":85},[75,155,156],{"class":85}," litestar-email[aiohttp]\n",[158,159,160],"blockquote",{},[56,161,162,166,167,170,171,174],{},[163,164,165],"strong",{},"Note",": API backends (Resend, SendGrid, Mailgun, SES) use ",[72,168,169],{},"httpx"," which is bundled with Litestar.\nNo extra HTTP transport installation is needed. SES additionally requires the ",[72,172,173],{},"[ses]"," extra\nfor AWS Signature Version 4 signing.",[60,176,178],{"id":177},"usage","Usage",[65,180,184],{"className":181,"code":182,"language":183,"meta":70,"style":70},"language-python shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","from litestar import Litestar\nfrom litestar_email import EmailConfig, EmailPlugin\n\n# Development: console output\nconfig = EmailConfig(\n    backend=\"console\",\n    from_email=\"noreply@example.com\",\n    from_name=\"My App\",\n)\n\napp = Litestar(plugins=[EmailPlugin(config=config)])\n","python",[72,185,186,202,221,225,230,244,263,279,295,301,306],{"__ignoreMap":70},[75,187,188,192,196,199],{"class":77,"line":78},[75,189,191],{"class":190},"s8R28","from",[75,193,195],{"class":194},"sZSNi"," litestar ",[75,197,198],{"class":190},"import",[75,200,201],{"class":194}," Litestar\n",[75,203,204,206,209,211,214,218],{"class":77,"line":106},[75,205,191],{"class":190},[75,207,208],{"class":194}," litestar_email ",[75,210,198],{"class":190},[75,212,213],{"class":194}," EmailConfig",[75,215,217],{"class":216},"sDfIl",",",[75,219,220],{"class":194}," EmailPlugin\n",[75,222,223],{"class":77,"line":116},[75,224,119],{"emptyLinePlaceholder":30},[75,226,227],{"class":77,"line":122},[75,228,229],{"class":102},"# Development: console output\n",[75,231,232,235,238,241],{"class":77,"line":128},[75,233,234],{"class":194},"config ",[75,236,237],{"class":216},"=",[75,239,213],{"class":240},"s3cPz",[75,242,243],{"class":216},"(\n",[75,245,246,250,252,255,258,260],{"class":77,"line":138},[75,247,249],{"class":248},"s1nJG","    backend",[75,251,237],{"class":216},[75,253,254],{"class":216},"\"",[75,256,257],{"class":85},"console",[75,259,254],{"class":216},[75,261,262],{"class":216},",\n",[75,264,265,268,270,272,275,277],{"class":77,"line":143},[75,266,267],{"class":248},"    from_email",[75,269,237],{"class":216},[75,271,254],{"class":216},[75,273,274],{"class":85},"noreply@example.com",[75,276,254],{"class":216},[75,278,262],{"class":216},[75,280,281,284,286,288,291,293],{"class":77,"line":149},[75,282,283],{"class":248},"    from_name",[75,285,237],{"class":216},[75,287,254],{"class":216},[75,289,290],{"class":85},"My App",[75,292,254],{"class":216},[75,294,262],{"class":216},[75,296,298],{"class":77,"line":297},9,[75,299,300],{"class":216},")\n",[75,302,304],{"class":77,"line":303},10,[75,305,119],{"emptyLinePlaceholder":30},[75,307,309,312,314,317,320,323,326,329,331,334,336,338],{"class":77,"line":308},11,[75,310,311],{"class":194},"app ",[75,313,237],{"class":216},[75,315,316],{"class":240}," Litestar",[75,318,319],{"class":216},"(",[75,321,322],{"class":248},"plugins",[75,324,325],{"class":216},"=[",[75,327,328],{"class":240},"EmailPlugin",[75,330,319],{"class":216},[75,332,333],{"class":248},"config",[75,335,237],{"class":216},[75,337,333],{"class":240},[75,339,340],{"class":216},")])\n",[56,342,343],{},"For production, pass a backend config object directly:",[65,345,347],{"className":181,"code":346,"language":183,"meta":70,"style":70},"from litestar_email import EmailConfig, EmailPlugin, SMTPConfig\n\nconfig = EmailConfig(\n    backend=SMTPConfig(host=\"smtp.example.com\", port=587, use_tls=True),\n    from_email=\"noreply@example.com\",\n)\n\napp = Litestar(plugins=[EmailPlugin(config=config)])\n",[72,348,349,369,373,383,425,439,443,447],{"__ignoreMap":70},[75,350,351,353,355,357,359,361,364,366],{"class":77,"line":78},[75,352,191],{"class":190},[75,354,208],{"class":194},[75,356,198],{"class":190},[75,358,213],{"class":194},[75,360,217],{"class":216},[75,362,363],{"class":194}," EmailPlugin",[75,365,217],{"class":216},[75,367,368],{"class":194}," SMTPConfig\n",[75,370,371],{"class":77,"line":106},[75,372,119],{"emptyLinePlaceholder":30},[75,374,375,377,379,381],{"class":77,"line":116},[75,376,234],{"class":194},[75,378,237],{"class":216},[75,380,213],{"class":240},[75,382,243],{"class":216},[75,384,385,387,389,392,394,397,399,401,404,406,408,411,413,417,419,422],{"class":77,"line":122},[75,386,249],{"class":248},[75,388,237],{"class":216},[75,390,391],{"class":240},"SMTPConfig",[75,393,319],{"class":216},[75,395,396],{"class":248},"host",[75,398,237],{"class":216},[75,400,254],{"class":216},[75,402,403],{"class":85},"smtp.example.com",[75,405,254],{"class":216},[75,407,217],{"class":216},[75,409,410],{"class":248}," port",[75,412,237],{"class":216},[75,414,416],{"class":415},"sYRBq","587",[75,418,217],{"class":216},[75,420,421],{"class":248}," use_tls",[75,423,424],{"class":216},"=True),\n",[75,426,427,429,431,433,435,437],{"class":77,"line":128},[75,428,267],{"class":248},[75,430,237],{"class":216},[75,432,254],{"class":216},[75,434,274],{"class":85},[75,436,254],{"class":216},[75,438,262],{"class":216},[75,440,441],{"class":77,"line":138},[75,442,300],{"class":216},[75,444,445],{"class":77,"line":143},[75,446,119],{"emptyLinePlaceholder":30},[75,448,449,451,453,455,457,459,461,463,465,467,469,471],{"class":77,"line":149},[75,450,311],{"class":194},[75,452,237],{"class":216},[75,454,316],{"class":240},[75,456,319],{"class":216},[75,458,322],{"class":248},[75,460,325],{"class":216},[75,462,328],{"class":240},[75,464,319],{"class":216},[75,466,333],{"class":248},[75,468,237],{"class":216},[75,470,333],{"class":240},[75,472,340],{"class":216},[474,475,477],"h3",{"id":476},"sending-email","Sending Email",[65,479,481],{"className":181,"code":480,"language":183,"meta":70,"style":70},"from litestar_email import EmailMessage\n\nmessage = EmailMessage(\n    subject=\"Welcome!\",\n    body=\"Thanks for signing up.\",\n    to=[\"user@example.com\"],\n)\n\nasync with config.provide_service() as mailer:\n    await mailer.send_message(message)\n",[72,482,483,494,498,510,526,542,559,563,567,596],{"__ignoreMap":70},[75,484,485,487,489,491],{"class":77,"line":78},[75,486,191],{"class":190},[75,488,208],{"class":194},[75,490,198],{"class":190},[75,492,493],{"class":194}," EmailMessage\n",[75,495,496],{"class":77,"line":106},[75,497,119],{"emptyLinePlaceholder":30},[75,499,500,503,505,508],{"class":77,"line":116},[75,501,502],{"class":194},"message ",[75,504,237],{"class":216},[75,506,507],{"class":240}," EmailMessage",[75,509,243],{"class":216},[75,511,512,515,517,519,522,524],{"class":77,"line":122},[75,513,514],{"class":248},"    subject",[75,516,237],{"class":216},[75,518,254],{"class":216},[75,520,521],{"class":85},"Welcome!",[75,523,254],{"class":216},[75,525,262],{"class":216},[75,527,528,531,533,535,538,540],{"class":77,"line":128},[75,529,530],{"class":248},"    body",[75,532,237],{"class":216},[75,534,254],{"class":216},[75,536,537],{"class":85},"Thanks for signing up.",[75,539,254],{"class":216},[75,541,262],{"class":216},[75,543,544,547,549,551,554,556],{"class":77,"line":138},[75,545,546],{"class":248},"    to",[75,548,325],{"class":216},[75,550,254],{"class":216},[75,552,553],{"class":85},"user@example.com",[75,555,254],{"class":216},[75,557,558],{"class":216},"],\n",[75,560,561],{"class":77,"line":143},[75,562,300],{"class":216},[75,564,565],{"class":77,"line":149},[75,566,119],{"emptyLinePlaceholder":30},[75,568,569,572,575,578,581,584,587,590,593],{"class":77,"line":297},[75,570,571],{"class":190},"async",[75,573,574],{"class":190}," with",[75,576,577],{"class":194}," config",[75,579,580],{"class":216},".",[75,582,583],{"class":240},"provide_service",[75,585,586],{"class":216},"()",[75,588,589],{"class":190}," as",[75,591,592],{"class":194}," mailer",[75,594,595],{"class":216},":\n",[75,597,598,601,603,605,608,610,613],{"class":77,"line":303},[75,599,600],{"class":190},"    await",[75,602,592],{"class":194},[75,604,580],{"class":216},[75,606,607],{"class":240},"send_message",[75,609,319],{"class":216},[75,611,612],{"class":240},"message",[75,614,300],{"class":216},[56,616,617,618,621,622,625,626,629],{},"If ",[72,619,620],{},"message.from_email"," is omitted, the service uses ",[72,623,624],{},"config.from_email"," and\n",[72,627,628],{},"config.from_name"," as defaults.",[474,631,633],{"id":632},"dependency-injection","Dependency Injection",[56,635,636,637,640],{},"The plugin registers a ",[72,638,639],{},"mailer"," dependency for handlers by default:",[65,642,644],{"className":181,"code":643,"language":183,"meta":70,"style":70},"from litestar import get\nfrom litestar_email import EmailMessage, EmailService\n\n@get(\"\u002Fwelcome\u002F{email:str}\")\nasync def send_welcome(email: str, mailer: EmailService) -> dict[str, str]:\n    message = EmailMessage(\n        subject=\"Welcome!\",\n        body=\"Thanks for signing up.\",\n        to=[email],\n    )\n    await mailer.send_message(message)\n    return {\"status\": \"sent\"}\n",[72,645,646,657,672,676,705,756,767,782,797,808,813,829],{"__ignoreMap":70},[75,647,648,650,652,654],{"class":77,"line":78},[75,649,191],{"class":190},[75,651,195],{"class":194},[75,653,198],{"class":190},[75,655,656],{"class":194}," get\n",[75,658,659,661,663,665,667,669],{"class":77,"line":106},[75,660,191],{"class":190},[75,662,208],{"class":194},[75,664,198],{"class":190},[75,666,507],{"class":194},[75,668,217],{"class":216},[75,670,671],{"class":194}," EmailService\n",[75,673,674],{"class":77,"line":116},[75,675,119],{"emptyLinePlaceholder":30},[75,677,678,681,684,686,688,691,694,698,701,703],{"class":77,"line":122},[75,679,680],{"class":216},"@",[75,682,683],{"class":240},"get",[75,685,319],{"class":216},[75,687,254],{"class":216},[75,689,690],{"class":85},"\u002Fwelcome\u002F",[75,692,693],{"class":415},"{email",[75,695,697],{"class":696},"smZ93",":",[75,699,700],{"class":415},"str}",[75,702,254],{"class":216},[75,704,300],{"class":216},[75,706,707,709,712,715,717,720,722,725,727,729,731,734,737,740,743,746,749,751,753],{"class":77,"line":128},[75,708,571],{"class":696},[75,710,711],{"class":696}," def",[75,713,714],{"class":240}," send_welcome",[75,716,319],{"class":216},[75,718,719],{"class":248},"email",[75,721,697],{"class":216},[75,723,724],{"class":81}," str",[75,726,217],{"class":216},[75,728,592],{"class":248},[75,730,697],{"class":216},[75,732,733],{"class":194}," EmailService",[75,735,736],{"class":216},")",[75,738,739],{"class":216}," ->",[75,741,742],{"class":194}," dict",[75,744,745],{"class":216},"[",[75,747,748],{"class":81},"str",[75,750,217],{"class":216},[75,752,724],{"class":81},[75,754,755],{"class":216},"]:\n",[75,757,758,761,763,765],{"class":77,"line":138},[75,759,760],{"class":194},"    message ",[75,762,237],{"class":216},[75,764,507],{"class":240},[75,766,243],{"class":216},[75,768,769,772,774,776,778,780],{"class":77,"line":143},[75,770,771],{"class":248},"        subject",[75,773,237],{"class":216},[75,775,254],{"class":216},[75,777,521],{"class":85},[75,779,254],{"class":216},[75,781,262],{"class":216},[75,783,784,787,789,791,793,795],{"class":77,"line":149},[75,785,786],{"class":248},"        body",[75,788,237],{"class":216},[75,790,254],{"class":216},[75,792,537],{"class":85},[75,794,254],{"class":216},[75,796,262],{"class":216},[75,798,799,802,804,806],{"class":77,"line":297},[75,800,801],{"class":248},"        to",[75,803,325],{"class":216},[75,805,719],{"class":240},[75,807,558],{"class":216},[75,809,810],{"class":77,"line":303},[75,811,812],{"class":216},"    )\n",[75,814,815,817,819,821,823,825,827],{"class":77,"line":308},[75,816,600],{"class":190},[75,818,592],{"class":194},[75,820,580],{"class":216},[75,822,607],{"class":240},[75,824,319],{"class":216},[75,826,612],{"class":240},[75,828,300],{"class":216},[75,830,832,835,838,840,843,845,847,850,853,855],{"class":77,"line":831},12,[75,833,834],{"class":190},"    return",[75,836,837],{"class":216}," {",[75,839,254],{"class":216},[75,841,842],{"class":85},"status",[75,844,254],{"class":216},[75,846,697],{"class":216},[75,848,849],{"class":216}," \"",[75,851,852],{"class":85},"sent",[75,854,254],{"class":216},[75,856,857],{"class":216},"}\n",[56,859,860],{},"This works for both router handlers and controller methods the same way, since the dependency is registered on the app.",[56,862,863,864,867,868,871],{},"If you need a service outside of Litestar (e.g., for a worker), use\n",[72,865,866],{},"config.get_service()"," for a one-off instance or ",[72,869,870],{},"config.provide_service()","\nfor batch sending.",[474,873,875],{"id":874},"events-and-listeners","Events and Listeners",[56,877,878],{},"Event listeners in Litestar execute outside request context and cannot receive\nDI-injected dependencies. Pass the mailer explicitly:",[65,880,882],{"className":181,"code":881,"language":183,"meta":70,"style":70},"from litestar import Litestar, get\nfrom litestar.events import listener\nfrom litestar_email import EmailConfig, EmailMessage, EmailPlugin, EmailService, SMTPConfig\n\nconfig = EmailConfig(\n    backend=SMTPConfig(host=\"localhost\", port=1025),\n    from_email=\"noreply@example.com\",\n    from_name=\"My App\",\n)\n\n@get(\"\u002Fregister\u002F{email:str}\")\nasync def register(email: str, mailer: EmailService) -> dict[str, str]:\n    # Pass the DI-injected mailer to the event\n    request.app.emit(\"user.registered\", email, mailer=mailer)\n    return {\"status\": \"queued\"}\n\n@listener(\"user.registered\")\nasync def on_user_registered(email: str, mailer: EmailService) -> None:\n    # mailer is passed explicitly from emit(), not injected via DI\n    await mailer.send_message(\n        EmailMessage(subject=\"Welcome!\", body=\"Thanks for signing up.\", to=[email]),\n    )\n\napp = Litestar(\n    plugins=[EmailPlugin(config=config)],\n    listeners=[on_user_registered],\n)\n",[72,883,884,898,915,941,945,955,988,1002,1016,1020,1024,1047,1088,1094,1135,1158,1163,1181,1214,1220,1233,1277,1282,1287,1298,1319,1332],{"__ignoreMap":70},[75,885,886,888,890,892,894,896],{"class":77,"line":78},[75,887,191],{"class":190},[75,889,195],{"class":194},[75,891,198],{"class":190},[75,893,316],{"class":194},[75,895,217],{"class":216},[75,897,656],{"class":194},[75,899,900,902,905,907,910,912],{"class":77,"line":106},[75,901,191],{"class":190},[75,903,904],{"class":194}," litestar",[75,906,580],{"class":216},[75,908,909],{"class":194},"events ",[75,911,198],{"class":190},[75,913,914],{"class":194}," listener\n",[75,916,917,919,921,923,925,927,929,931,933,935,937,939],{"class":77,"line":116},[75,918,191],{"class":190},[75,920,208],{"class":194},[75,922,198],{"class":190},[75,924,213],{"class":194},[75,926,217],{"class":216},[75,928,507],{"class":194},[75,930,217],{"class":216},[75,932,363],{"class":194},[75,934,217],{"class":216},[75,936,733],{"class":194},[75,938,217],{"class":216},[75,940,368],{"class":194},[75,942,943],{"class":77,"line":122},[75,944,119],{"emptyLinePlaceholder":30},[75,946,947,949,951,953],{"class":77,"line":128},[75,948,234],{"class":194},[75,950,237],{"class":216},[75,952,213],{"class":240},[75,954,243],{"class":216},[75,956,957,959,961,963,965,967,969,971,974,976,978,980,982,985],{"class":77,"line":138},[75,958,249],{"class":248},[75,960,237],{"class":216},[75,962,391],{"class":240},[75,964,319],{"class":216},[75,966,396],{"class":248},[75,968,237],{"class":216},[75,970,254],{"class":216},[75,972,973],{"class":85},"localhost",[75,975,254],{"class":216},[75,977,217],{"class":216},[75,979,410],{"class":248},[75,981,237],{"class":216},[75,983,984],{"class":415},"1025",[75,986,987],{"class":216},"),\n",[75,989,990,992,994,996,998,1000],{"class":77,"line":143},[75,991,267],{"class":248},[75,993,237],{"class":216},[75,995,254],{"class":216},[75,997,274],{"class":85},[75,999,254],{"class":216},[75,1001,262],{"class":216},[75,1003,1004,1006,1008,1010,1012,1014],{"class":77,"line":149},[75,1005,283],{"class":248},[75,1007,237],{"class":216},[75,1009,254],{"class":216},[75,1011,290],{"class":85},[75,1013,254],{"class":216},[75,1015,262],{"class":216},[75,1017,1018],{"class":77,"line":297},[75,1019,300],{"class":216},[75,1021,1022],{"class":77,"line":303},[75,1023,119],{"emptyLinePlaceholder":30},[75,1025,1026,1028,1030,1032,1034,1037,1039,1041,1043,1045],{"class":77,"line":308},[75,1027,680],{"class":216},[75,1029,683],{"class":240},[75,1031,319],{"class":216},[75,1033,254],{"class":216},[75,1035,1036],{"class":85},"\u002Fregister\u002F",[75,1038,693],{"class":415},[75,1040,697],{"class":696},[75,1042,700],{"class":415},[75,1044,254],{"class":216},[75,1046,300],{"class":216},[75,1048,1049,1051,1053,1056,1058,1060,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086],{"class":77,"line":831},[75,1050,571],{"class":696},[75,1052,711],{"class":696},[75,1054,1055],{"class":240}," register",[75,1057,319],{"class":216},[75,1059,719],{"class":248},[75,1061,697],{"class":216},[75,1063,724],{"class":81},[75,1065,217],{"class":216},[75,1067,592],{"class":248},[75,1069,697],{"class":216},[75,1071,733],{"class":194},[75,1073,736],{"class":216},[75,1075,739],{"class":216},[75,1077,742],{"class":194},[75,1079,745],{"class":216},[75,1081,748],{"class":81},[75,1083,217],{"class":216},[75,1085,724],{"class":81},[75,1087,755],{"class":216},[75,1089,1091],{"class":77,"line":1090},13,[75,1092,1093],{"class":102},"    # Pass the DI-injected mailer to the event\n",[75,1095,1097,1100,1102,1106,1108,1111,1113,1115,1118,1120,1122,1125,1127,1129,1131,1133],{"class":77,"line":1096},14,[75,1098,1099],{"class":194},"    request",[75,1101,580],{"class":216},[75,1103,1105],{"class":1104},"sRlkE","app",[75,1107,580],{"class":216},[75,1109,1110],{"class":240},"emit",[75,1112,319],{"class":216},[75,1114,254],{"class":216},[75,1116,1117],{"class":85},"user.registered",[75,1119,254],{"class":216},[75,1121,217],{"class":216},[75,1123,1124],{"class":240}," email",[75,1126,217],{"class":216},[75,1128,592],{"class":248},[75,1130,237],{"class":216},[75,1132,639],{"class":240},[75,1134,300],{"class":216},[75,1136,1137,1139,1141,1143,1145,1147,1149,1151,1154,1156],{"class":77,"line":43},[75,1138,834],{"class":190},[75,1140,837],{"class":216},[75,1142,254],{"class":216},[75,1144,842],{"class":85},[75,1146,254],{"class":216},[75,1148,697],{"class":216},[75,1150,849],{"class":216},[75,1152,1153],{"class":85},"queued",[75,1155,254],{"class":216},[75,1157,857],{"class":216},[75,1159,1161],{"class":77,"line":1160},16,[75,1162,119],{"emptyLinePlaceholder":30},[75,1164,1166,1168,1171,1173,1175,1177,1179],{"class":77,"line":1165},17,[75,1167,680],{"class":216},[75,1169,1170],{"class":240},"listener",[75,1172,319],{"class":216},[75,1174,254],{"class":216},[75,1176,1117],{"class":85},[75,1178,254],{"class":216},[75,1180,300],{"class":216},[75,1182,1184,1186,1188,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211],{"class":77,"line":1183},18,[75,1185,571],{"class":696},[75,1187,711],{"class":696},[75,1189,1190],{"class":240}," on_user_registered",[75,1192,319],{"class":216},[75,1194,719],{"class":248},[75,1196,697],{"class":216},[75,1198,724],{"class":81},[75,1200,217],{"class":216},[75,1202,592],{"class":248},[75,1204,697],{"class":216},[75,1206,733],{"class":194},[75,1208,736],{"class":216},[75,1210,739],{"class":216},[75,1212,1213],{"class":216}," None:\n",[75,1215,1217],{"class":77,"line":1216},19,[75,1218,1219],{"class":102},"    # mailer is passed explicitly from emit(), not injected via DI\n",[75,1221,1223,1225,1227,1229,1231],{"class":77,"line":1222},20,[75,1224,600],{"class":190},[75,1226,592],{"class":194},[75,1228,580],{"class":216},[75,1230,607],{"class":240},[75,1232,243],{"class":216},[75,1234,1236,1239,1241,1244,1246,1248,1250,1252,1254,1257,1259,1261,1263,1265,1267,1270,1272,1274],{"class":77,"line":1235},21,[75,1237,1238],{"class":240},"        EmailMessage",[75,1240,319],{"class":216},[75,1242,1243],{"class":248},"subject",[75,1245,237],{"class":216},[75,1247,254],{"class":216},[75,1249,521],{"class":85},[75,1251,254],{"class":216},[75,1253,217],{"class":216},[75,1255,1256],{"class":248}," body",[75,1258,237],{"class":216},[75,1260,254],{"class":216},[75,1262,537],{"class":85},[75,1264,254],{"class":216},[75,1266,217],{"class":216},[75,1268,1269],{"class":248}," to",[75,1271,325],{"class":216},[75,1273,719],{"class":240},[75,1275,1276],{"class":216},"]),\n",[75,1278,1280],{"class":77,"line":1279},22,[75,1281,812],{"class":216},[75,1283,1285],{"class":77,"line":1284},23,[75,1286,119],{"emptyLinePlaceholder":30},[75,1288,1290,1292,1294,1296],{"class":77,"line":1289},24,[75,1291,311],{"class":194},[75,1293,237],{"class":216},[75,1295,316],{"class":240},[75,1297,243],{"class":216},[75,1299,1301,1304,1306,1308,1310,1312,1314,1316],{"class":77,"line":1300},25,[75,1302,1303],{"class":248},"    plugins",[75,1305,325],{"class":216},[75,1307,328],{"class":240},[75,1309,319],{"class":216},[75,1311,333],{"class":248},[75,1313,237],{"class":216},[75,1315,333],{"class":240},[75,1317,1318],{"class":216},")],\n",[75,1320,1322,1325,1327,1330],{"class":77,"line":1321},26,[75,1323,1324],{"class":248},"    listeners",[75,1326,325],{"class":216},[75,1328,1329],{"class":240},"on_user_registered",[75,1331,558],{"class":216},[75,1333,1335],{"class":77,"line":1334},27,[75,1336,300],{"class":216},[56,1338,1339,1340,1343,1344,1347,1348,580],{},"You can override the dependency and state keys via ",[72,1341,1342],{},"EmailConfig"," if needed:\n",[72,1345,1346],{},"email_service_dependency_key=\"email_service\""," and ",[72,1349,1350],{},"email_service_state_key=\"email_service\"",[474,1352,1354],{"id":1353},"standalone-no-litestar","Standalone (No Litestar)",[56,1356,1357],{},"Use the config helpers directly without Litestar:",[65,1359,1361],{"className":181,"code":1360,"language":183,"meta":70,"style":70},"from litestar_email import EmailConfig, EmailMessage, SMTPConfig\n\nconfig = EmailConfig(\n    backend=SMTPConfig(host=\"localhost\", port=1025),\n    from_email=\"noreply@example.com\",\n)\nmessage = EmailMessage(\n    subject=\"Hello!\",\n    body=\"This is a standalone send.\",\n    to=[\"user@example.com\"],\n)\n\nasync with config.provide_service() as mailer:\n    await mailer.send_message(message)\n",[72,1362,1363,1381,1385,1395,1425,1439,1443,1453,1468,1483,1497,1501,1505,1525],{"__ignoreMap":70},[75,1364,1365,1367,1369,1371,1373,1375,1377,1379],{"class":77,"line":78},[75,1366,191],{"class":190},[75,1368,208],{"class":194},[75,1370,198],{"class":190},[75,1372,213],{"class":194},[75,1374,217],{"class":216},[75,1376,507],{"class":194},[75,1378,217],{"class":216},[75,1380,368],{"class":194},[75,1382,1383],{"class":77,"line":106},[75,1384,119],{"emptyLinePlaceholder":30},[75,1386,1387,1389,1391,1393],{"class":77,"line":116},[75,1388,234],{"class":194},[75,1390,237],{"class":216},[75,1392,213],{"class":240},[75,1394,243],{"class":216},[75,1396,1397,1399,1401,1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423],{"class":77,"line":122},[75,1398,249],{"class":248},[75,1400,237],{"class":216},[75,1402,391],{"class":240},[75,1404,319],{"class":216},[75,1406,396],{"class":248},[75,1408,237],{"class":216},[75,1410,254],{"class":216},[75,1412,973],{"class":85},[75,1414,254],{"class":216},[75,1416,217],{"class":216},[75,1418,410],{"class":248},[75,1420,237],{"class":216},[75,1422,984],{"class":415},[75,1424,987],{"class":216},[75,1426,1427,1429,1431,1433,1435,1437],{"class":77,"line":128},[75,1428,267],{"class":248},[75,1430,237],{"class":216},[75,1432,254],{"class":216},[75,1434,274],{"class":85},[75,1436,254],{"class":216},[75,1438,262],{"class":216},[75,1440,1441],{"class":77,"line":138},[75,1442,300],{"class":216},[75,1444,1445,1447,1449,1451],{"class":77,"line":143},[75,1446,502],{"class":194},[75,1448,237],{"class":216},[75,1450,507],{"class":240},[75,1452,243],{"class":216},[75,1454,1455,1457,1459,1461,1464,1466],{"class":77,"line":149},[75,1456,514],{"class":248},[75,1458,237],{"class":216},[75,1460,254],{"class":216},[75,1462,1463],{"class":85},"Hello!",[75,1465,254],{"class":216},[75,1467,262],{"class":216},[75,1469,1470,1472,1474,1476,1479,1481],{"class":77,"line":297},[75,1471,530],{"class":248},[75,1473,237],{"class":216},[75,1475,254],{"class":216},[75,1477,1478],{"class":85},"This is a standalone send.",[75,1480,254],{"class":216},[75,1482,262],{"class":216},[75,1484,1485,1487,1489,1491,1493,1495],{"class":77,"line":303},[75,1486,546],{"class":248},[75,1488,325],{"class":216},[75,1490,254],{"class":216},[75,1492,553],{"class":85},[75,1494,254],{"class":216},[75,1496,558],{"class":216},[75,1498,1499],{"class":77,"line":308},[75,1500,300],{"class":216},[75,1502,1503],{"class":77,"line":831},[75,1504,119],{"emptyLinePlaceholder":30},[75,1506,1507,1509,1511,1513,1515,1517,1519,1521,1523],{"class":77,"line":1090},[75,1508,571],{"class":190},[75,1510,574],{"class":190},[75,1512,577],{"class":194},[75,1514,580],{"class":216},[75,1516,583],{"class":240},[75,1518,586],{"class":216},[75,1520,589],{"class":190},[75,1522,592],{"class":194},[75,1524,595],{"class":216},[75,1526,1527,1529,1531,1533,1535,1537,1539],{"class":77,"line":1096},[75,1528,600],{"class":190},[75,1530,592],{"class":194},[75,1532,580],{"class":216},[75,1534,607],{"class":240},[75,1536,319],{"class":216},[75,1538,612],{"class":240},[75,1540,300],{"class":216},[56,1542,1543],{},"For batch sends, use the context manager to reuse the connection:",[65,1545,1547],{"className":181,"code":1546,"language":183,"meta":70,"style":70},"async with config.provide_service() as mailer:\n    await mailer.send_messages([message1, message2, message3])\n",[72,1548,1549,1569],{"__ignoreMap":70},[75,1550,1551,1553,1555,1557,1559,1561,1563,1565,1567],{"class":77,"line":78},[75,1552,571],{"class":190},[75,1554,574],{"class":190},[75,1556,577],{"class":194},[75,1558,580],{"class":216},[75,1560,583],{"class":240},[75,1562,586],{"class":216},[75,1564,589],{"class":190},[75,1566,592],{"class":194},[75,1568,595],{"class":216},[75,1570,1571,1573,1575,1577,1580,1583,1586,1588,1591,1593,1596],{"class":77,"line":106},[75,1572,600],{"class":190},[75,1574,592],{"class":194},[75,1576,580],{"class":216},[75,1578,1579],{"class":240},"send_messages",[75,1581,1582],{"class":216},"([",[75,1584,1585],{"class":240},"message1",[75,1587,217],{"class":216},[75,1589,1590],{"class":240}," message2",[75,1592,217],{"class":216},[75,1594,1595],{"class":240}," message3",[75,1597,1598],{"class":216},"])\n",[474,1600,1602],{"id":1601},"html-email","HTML Email",[65,1604,1606],{"className":181,"code":1605,"language":183,"meta":70,"style":70},"from litestar_email import EmailMultiAlternatives\n\nmessage = EmailMultiAlternatives(\n    subject=\"Welcome!\",\n    body=\"Thanks for signing up.\",  # Plain text fallback\n    html_body=\"\u003Ch1>Welcome!\u003C\u002Fh1>\u003Cp>Thanks for signing up.\u003C\u002Fp>\",\n    to=[\"user@example.com\"],\n)\n",[72,1607,1608,1619,1623,1634,1648,1665,1681,1695],{"__ignoreMap":70},[75,1609,1610,1612,1614,1616],{"class":77,"line":78},[75,1611,191],{"class":190},[75,1613,208],{"class":194},[75,1615,198],{"class":190},[75,1617,1618],{"class":194}," EmailMultiAlternatives\n",[75,1620,1621],{"class":77,"line":106},[75,1622,119],{"emptyLinePlaceholder":30},[75,1624,1625,1627,1629,1632],{"class":77,"line":116},[75,1626,502],{"class":194},[75,1628,237],{"class":216},[75,1630,1631],{"class":240}," EmailMultiAlternatives",[75,1633,243],{"class":216},[75,1635,1636,1638,1640,1642,1644,1646],{"class":77,"line":122},[75,1637,514],{"class":248},[75,1639,237],{"class":216},[75,1641,254],{"class":216},[75,1643,521],{"class":85},[75,1645,254],{"class":216},[75,1647,262],{"class":216},[75,1649,1650,1652,1654,1656,1658,1660,1662],{"class":77,"line":128},[75,1651,530],{"class":248},[75,1653,237],{"class":216},[75,1655,254],{"class":216},[75,1657,537],{"class":85},[75,1659,254],{"class":216},[75,1661,217],{"class":216},[75,1663,1664],{"class":102},"  # Plain text fallback\n",[75,1666,1667,1670,1672,1674,1677,1679],{"class":77,"line":138},[75,1668,1669],{"class":248},"    html_body",[75,1671,237],{"class":216},[75,1673,254],{"class":216},[75,1675,1676],{"class":85},"\u003Ch1>Welcome!\u003C\u002Fh1>\u003Cp>Thanks for signing up.\u003C\u002Fp>",[75,1678,254],{"class":216},[75,1680,262],{"class":216},[75,1682,1683,1685,1687,1689,1691,1693],{"class":77,"line":143},[75,1684,546],{"class":248},[75,1686,325],{"class":216},[75,1688,254],{"class":216},[75,1690,553],{"class":85},[75,1692,254],{"class":216},[75,1694,558],{"class":216},[75,1696,1697],{"class":77,"line":149},[75,1698,300],{"class":216},[60,1700,1702],{"id":1701},"available-backends","Available Backends",[1704,1705,1706,1722],"table",{},[1707,1708,1709],"thead",{},[1710,1711,1712,1716,1719],"tr",{},[1713,1714,1715],"th",{},"Backend",[1713,1717,1718],{},"Config Class",[1713,1720,1721],{},"Use Case",[1723,1724,1725,1738,1750,1764,1779,1794,1809],"tbody",{},[1710,1726,1727,1732,1735],{},[1728,1729,1730],"td",{},[72,1731,257],{},[1728,1733,1734],{},"-",[1728,1736,1737],{},"Development (prints to stdout)",[1710,1739,1740,1745,1747],{},[1728,1741,1742],{},[72,1743,1744],{},"memory",[1728,1746,1734],{},[1728,1748,1749],{},"Testing (stores in memory)",[1710,1751,1752,1757,1761],{},[1728,1753,1754],{},[72,1755,1756],{},"smtp",[1728,1758,1759],{},[72,1760,391],{},[1728,1762,1763],{},"Production SMTP servers",[1710,1765,1766,1771,1776],{},[1728,1767,1768],{},[72,1769,1770],{},"resend",[1728,1772,1773],{},[72,1774,1775],{},"ResendConfig",[1728,1777,1778],{},"Resend HTTP API",[1710,1780,1781,1786,1791],{},[1728,1782,1783],{},[72,1784,1785],{},"sendgrid",[1728,1787,1788],{},[72,1789,1790],{},"SendGridConfig",[1728,1792,1793],{},"SendGrid HTTP API",[1710,1795,1796,1801,1806],{},[1728,1797,1798],{},[72,1799,1800],{},"mailgun",[1728,1802,1803],{},[72,1804,1805],{},"MailgunConfig",[1728,1807,1808],{},"Mailgun HTTP API",[1710,1810,1811,1816,1821],{},[1728,1812,1813],{},[72,1814,1815],{},"ses",[1728,1817,1818],{},[72,1819,1820],{},"SESConfig",[1728,1822,1823],{},"Amazon SES API v2 (SigV4-signed)",[56,1825,1826],{},"API backends (Resend, SendGrid, Mailgun, SES) support configurable HTTP transports:",[65,1828,1830],{"className":181,"code":1829,"language":183,"meta":70,"style":70},"from litestar_email import ResendConfig\n\n# Default: uses httpx (bundled with Litestar)\nconfig = ResendConfig(api_key=\"re_xxx...\")\n\n# Alternative: use aiohttp\nconfig = ResendConfig(api_key=\"re_xxx...\", http_transport=\"aiohttp\")\n",[72,1831,1832,1843,1847,1852,1877,1881,1886],{"__ignoreMap":70},[75,1833,1834,1836,1838,1840],{"class":77,"line":78},[75,1835,191],{"class":190},[75,1837,208],{"class":194},[75,1839,198],{"class":190},[75,1841,1842],{"class":194}," ResendConfig\n",[75,1844,1845],{"class":77,"line":106},[75,1846,119],{"emptyLinePlaceholder":30},[75,1848,1849],{"class":77,"line":116},[75,1850,1851],{"class":102},"# Default: uses httpx (bundled with Litestar)\n",[75,1853,1854,1856,1858,1861,1863,1866,1868,1870,1873,1875],{"class":77,"line":122},[75,1855,234],{"class":194},[75,1857,237],{"class":216},[75,1859,1860],{"class":240}," ResendConfig",[75,1862,319],{"class":216},[75,1864,1865],{"class":248},"api_key",[75,1867,237],{"class":216},[75,1869,254],{"class":216},[75,1871,1872],{"class":85},"re_xxx...",[75,1874,254],{"class":216},[75,1876,300],{"class":216},[75,1878,1879],{"class":77,"line":128},[75,1880,119],{"emptyLinePlaceholder":30},[75,1882,1883],{"class":77,"line":138},[75,1884,1885],{"class":102},"# Alternative: use aiohttp\n",[75,1887,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1911,1913,1915,1918,1920],{"class":77,"line":143},[75,1889,234],{"class":194},[75,1891,237],{"class":216},[75,1893,1860],{"class":240},[75,1895,319],{"class":216},[75,1897,1865],{"class":248},[75,1899,237],{"class":216},[75,1901,254],{"class":216},[75,1903,1872],{"class":85},[75,1905,254],{"class":216},[75,1907,217],{"class":216},[75,1909,1910],{"class":248}," http_transport",[75,1912,237],{"class":216},[75,1914,254],{"class":216},[75,1916,1917],{"class":85},"aiohttp",[75,1919,254],{"class":216},[75,1921,300],{"class":216},[60,1923,1925],{"id":1924},"testing","Testing",[56,1927,1928,1929,1932],{},"The ",[72,1930,1931],{},"InMemoryBackend"," is designed for testing:",[65,1934,1936],{"className":181,"code":1935,"language":183,"meta":70,"style":70},"from litestar_email.backends import InMemoryBackend\n\ndef test_sends_welcome_email():\n    InMemoryBackend.clear()\n\n    # ... code that sends email ...\n\n    assert len(InMemoryBackend.outbox) == 1\n    assert InMemoryBackend.outbox[0].subject == \"Welcome!\"\n",[72,1937,1938,1955,1959,1970,1983,1987,1992,1996,2021],{"__ignoreMap":70},[75,1939,1940,1942,1945,1947,1950,1952],{"class":77,"line":78},[75,1941,191],{"class":190},[75,1943,1944],{"class":194}," litestar_email",[75,1946,580],{"class":216},[75,1948,1949],{"class":194},"backends ",[75,1951,198],{"class":190},[75,1953,1954],{"class":194}," InMemoryBackend\n",[75,1956,1957],{"class":77,"line":106},[75,1958,119],{"emptyLinePlaceholder":30},[75,1960,1961,1964,1967],{"class":77,"line":116},[75,1962,1963],{"class":696},"def",[75,1965,1966],{"class":240}," test_sends_welcome_email",[75,1968,1969],{"class":216},"():\n",[75,1971,1972,1975,1977,1980],{"class":77,"line":122},[75,1973,1974],{"class":194},"    InMemoryBackend",[75,1976,580],{"class":216},[75,1978,1979],{"class":240},"clear",[75,1981,1982],{"class":216},"()\n",[75,1984,1985],{"class":77,"line":128},[75,1986,119],{"emptyLinePlaceholder":30},[75,1988,1989],{"class":77,"line":138},[75,1990,1991],{"class":102},"    # ... code that sends email ...\n",[75,1993,1994],{"class":77,"line":143},[75,1995,119],{"emptyLinePlaceholder":30},[75,1997,1998,2001,2004,2006,2008,2010,2013,2015,2018],{"class":77,"line":149},[75,1999,2000],{"class":190},"    assert",[75,2002,2003],{"class":240}," len",[75,2005,319],{"class":216},[75,2007,1931],{"class":240},[75,2009,580],{"class":216},[75,2011,2012],{"class":1104},"outbox",[75,2014,736],{"class":216},[75,2016,2017],{"class":216}," ==",[75,2019,2020],{"class":415}," 1\n",[75,2022,2023,2025,2028,2030,2032,2034,2037,2040,2042,2044,2046,2048],{"class":77,"line":297},[75,2024,2000],{"class":190},[75,2026,2027],{"class":194}," InMemoryBackend",[75,2029,580],{"class":216},[75,2031,2012],{"class":1104},[75,2033,745],{"class":216},[75,2035,2036],{"class":415},"0",[75,2038,2039],{"class":216},"].",[75,2041,1243],{"class":1104},[75,2043,2017],{"class":216},[75,2045,849],{"class":216},[75,2047,521],{"class":85},[75,2049,2050],{"class":216},"\"\n",[56,2052,2053,2054,697],{},"If you need direct backend access in tests, use ",[72,2055,2056],{},"config.get_backend()",[65,2058,2060],{"className":181,"code":2059,"language":183,"meta":70,"style":70},"from litestar_email import EmailConfig, EmailMessage\n\nconfig = EmailConfig(backend=\"memory\")\nbackend = config.get_backend()\n\nmessage = EmailMessage(subject=\"Hello\", body=\"Body\", to=[\"user@example.com\"])\nawait backend.send_messages([message])\n",[72,2061,2062,2076,2080,2103,2119,2123,2171],{"__ignoreMap":70},[75,2063,2064,2066,2068,2070,2072,2074],{"class":77,"line":78},[75,2065,191],{"class":190},[75,2067,208],{"class":194},[75,2069,198],{"class":190},[75,2071,213],{"class":194},[75,2073,217],{"class":216},[75,2075,493],{"class":194},[75,2077,2078],{"class":77,"line":106},[75,2079,119],{"emptyLinePlaceholder":30},[75,2081,2082,2084,2086,2088,2090,2093,2095,2097,2099,2101],{"class":77,"line":116},[75,2083,234],{"class":194},[75,2085,237],{"class":216},[75,2087,213],{"class":240},[75,2089,319],{"class":216},[75,2091,2092],{"class":248},"backend",[75,2094,237],{"class":216},[75,2096,254],{"class":216},[75,2098,1744],{"class":85},[75,2100,254],{"class":216},[75,2102,300],{"class":216},[75,2104,2105,2108,2110,2112,2114,2117],{"class":77,"line":122},[75,2106,2107],{"class":194},"backend ",[75,2109,237],{"class":216},[75,2111,577],{"class":194},[75,2113,580],{"class":216},[75,2115,2116],{"class":240},"get_backend",[75,2118,1982],{"class":216},[75,2120,2121],{"class":77,"line":128},[75,2122,119],{"emptyLinePlaceholder":30},[75,2124,2125,2127,2129,2131,2133,2135,2137,2139,2142,2144,2146,2148,2150,2152,2155,2157,2159,2161,2163,2165,2167,2169],{"class":77,"line":138},[75,2126,502],{"class":194},[75,2128,237],{"class":216},[75,2130,507],{"class":240},[75,2132,319],{"class":216},[75,2134,1243],{"class":248},[75,2136,237],{"class":216},[75,2138,254],{"class":216},[75,2140,2141],{"class":85},"Hello",[75,2143,254],{"class":216},[75,2145,217],{"class":216},[75,2147,1256],{"class":248},[75,2149,237],{"class":216},[75,2151,254],{"class":216},[75,2153,2154],{"class":85},"Body",[75,2156,254],{"class":216},[75,2158,217],{"class":216},[75,2160,1269],{"class":248},[75,2162,325],{"class":216},[75,2164,254],{"class":216},[75,2166,553],{"class":85},[75,2168,254],{"class":216},[75,2170,1598],{"class":216},[75,2172,2173,2176,2179,2181,2183,2185,2187],{"class":77,"line":143},[75,2174,2175],{"class":190},"await",[75,2177,2178],{"class":194}," backend",[75,2180,580],{"class":216},[75,2182,1579],{"class":240},[75,2184,1582],{"class":216},[75,2186,612],{"class":240},[75,2188,1598],{"class":216},[60,2190,2192],{"id":2191},"development","Development",[65,2194,2196],{"className":67,"code":2195,"language":69,"meta":70,"style":70},"make install    # Install dependencies\nmake test       # Run tests\nmake lint       # Run linting\nmake check-all  # Run all checks\n",[72,2197,2198,2208,2218,2228],{"__ignoreMap":70},[75,2199,2200,2203,2205],{"class":77,"line":78},[75,2201,2202],{"class":81},"make",[75,2204,86],{"class":85},[75,2206,2207],{"class":102},"    # Install dependencies\n",[75,2209,2210,2212,2215],{"class":77,"line":106},[75,2211,2202],{"class":81},[75,2213,2214],{"class":85}," test",[75,2216,2217],{"class":102},"       # Run tests\n",[75,2219,2220,2222,2225],{"class":77,"line":116},[75,2221,2202],{"class":81},[75,2223,2224],{"class":85}," lint",[75,2226,2227],{"class":102},"       # Run linting\n",[75,2229,2230,2232,2235],{"class":77,"line":122},[75,2231,2202],{"class":81},[75,2233,2234],{"class":85}," check-all",[75,2236,2237],{"class":102},"  # Run all checks\n",[60,2239,2241],{"id":2240},"license","License",[56,2243,2244],{},"MIT",[2246,2247,2248],"style",{},"html pre.shiki code .s52Pk, html code.shiki .s52Pk{--shiki-light:#E2931D;--shiki-default:#E2931D;--shiki-dark:#FFCB6B}html pre.shiki code .sGFVr, html code.shiki .sGFVr{--shiki-light:#91B859;--shiki-default:#91B859;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sWuyu, html code.shiki .sWuyu{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s8R28, html code.shiki .s8R28{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#39ADB5;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sZSNi, html code.shiki .sZSNi{--shiki-light:#90A4AE;--shiki-default:#90A4AE;--shiki-dark:#BABED8}html pre.shiki code .sDfIl, html code.shiki .sDfIl{--shiki-light:#39ADB5;--shiki-default:#39ADB5;--shiki-dark:#89DDFF}html pre.shiki code .s3cPz, html code.shiki .s3cPz{--shiki-light:#6182B8;--shiki-default:#6182B8;--shiki-dark:#82AAFF}html pre.shiki code .s1nJG, html code.shiki .s1nJG{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sYRBq, html code.shiki .sYRBq{--shiki-light:#F76D47;--shiki-default:#F76D47;--shiki-dark:#F78C6C}html pre.shiki code .smZ93, html code.shiki .smZ93{--shiki-light:#9C3EDA;--shiki-default:#9C3EDA;--shiki-dark:#C792EA}html pre.shiki code .sRlkE, html code.shiki .sRlkE{--shiki-light:#E53935;--shiki-default:#E53935;--shiki-dark:#F07178}",{"title":70,"searchDepth":106,"depth":106,"links":2250},[2251,2252,2259,2260,2261,2262],{"id":62,"depth":106,"text":63},{"id":177,"depth":106,"text":178,"children":2253},[2254,2255,2256,2257,2258],{"id":476,"depth":116,"text":477},{"id":632,"depth":116,"text":633},{"id":874,"depth":116,"text":875},{"id":1353,"depth":116,"text":1354},{"id":1601,"depth":116,"text":1602},{"id":1701,"depth":106,"text":1702},{"id":1924,"depth":106,"text":1925},{"id":2191,"depth":106,"text":2192},{"id":2240,"depth":106,"text":2241},"readmes\u002Flitestar-email","PysWPxbjq2IbvJSjM5lCQL_KrACaXB-fShQQ-1rAL7I",1785155663549]