[{"data":1,"prerenderedAt":1972},["ShallowReactive",2],{"navigation_docs":3,"-modules-notify":153,"-modules-notify-surround":1967},[4,35,50,59,144],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Local Development","\u002Fgetting-started\u002Flocal-development","1.getting-started\u002F3.local-development","i-lucide-terminal",{"title":21,"path":22,"stem":23,"icon":24},"Publishing Packages","\u002Fgetting-started\u002Fpublishing","1.getting-started\u002F4.publishing","i-lucide-package-check",{"title":26,"path":27,"stem":28,"icon":29},"Writing a Module","\u002Fgetting-started\u002Fwriting-a-module","1.getting-started\u002F5.writing-a-module","i-lucide-puzzle",{"title":31,"path":32,"stem":33,"icon":34},"UX Patterns","\u002Fgetting-started\u002Fux-patterns","1.getting-started\u002F6.ux-patterns","i-lucide-layout-template",{"title":36,"path":37,"stem":38,"children":39},"Applications","\u002Fapplications","2.applications",[40,45],{"title":41,"path":42,"stem":43,"icon":44},"Website","\u002Fapplications\u002Fwebsite","2.applications\u002F1.website","i-lucide-layout-dashboard",{"title":46,"path":47,"stem":48,"icon":49},"Docs","\u002Fapplications\u002Fdocs","2.applications\u002F2.docs","i-lucide-book-open",{"title":51,"path":52,"stem":53,"children":54},"Layers","\u002Flayers","3.layers",[55],{"title":56,"path":57,"stem":58},"Base Layer","\u002Flayers\u002Fbase","3.layers\u002F1.base",{"title":60,"path":61,"stem":62,"children":63},"Modules","\u002Fmodules","4.modules",[64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140],{"title":65,"path":66,"stem":67},"Account","\u002Fmodules\u002Faccount","4.modules\u002F01.account",{"title":69,"path":70,"stem":71},"Admin","\u002Fmodules\u002Fadmin","4.modules\u002F02.admin",{"title":73,"path":74,"stem":75},"Auth","\u002Fmodules\u002Fauth","4.modules\u002F03.auth",{"title":77,"path":78,"stem":79},"Authorization","\u002Fmodules\u002Fauthorization","4.modules\u002F04.authorization",{"title":81,"path":82,"stem":83},"Cookie Consent","\u002Fmodules\u002Fcookie-consent","4.modules\u002F05.cookie-consent",{"title":85,"path":86,"stem":87},"Events","\u002Fmodules\u002Fevents","4.modules\u002F06.events",{"title":89,"path":90,"stem":91},"Forms","\u002Fmodules\u002Fforms","4.modules\u002F07.forms",{"title":93,"path":94,"stem":95},"MCP","\u002Fmodules\u002Fmcp","4.modules\u002F08.mcp",{"title":97,"path":98,"stem":99},"Menu","\u002Fmodules\u002Fmenu","4.modules\u002F09.menu",{"title":101,"path":102,"stem":103},"Module Kit","\u002Fmodules\u002Fmodule-kit","4.modules\u002F10.module-kit",{"title":105,"path":106,"stem":107},"Notify","\u002Fmodules\u002Fnotify","4.modules\u002F11.notify",{"title":109,"path":110,"stem":111},"OAuth Server","\u002Fmodules\u002Foauth-server","4.modules\u002F12.oauth-server",{"title":113,"path":114,"stem":115},"Payments","\u002Fmodules\u002Fpayments","4.modules\u002F13.payments",{"title":117,"path":118,"stem":119},"Preferences","\u002Fmodules\u002Fpreferences","4.modules\u002F14.preferences",{"title":121,"path":122,"stem":123},"Stripe","\u002Fmodules\u002Fstripe","4.modules\u002F15.stripe",{"title":125,"path":126,"stem":127},"Subscriptions","\u002Fmodules\u002Fsubscriptions","4.modules\u002F16.subscriptions",{"title":129,"path":130,"stem":131},"UI","\u002Fmodules\u002Fui","4.modules\u002F17.ui",{"title":133,"path":134,"stem":135},"Users","\u002Fmodules\u002Fusers","4.modules\u002F18.users",{"title":137,"path":138,"stem":139},"Widget","\u002Fmodules\u002Fwidget","4.modules\u002F19.widget",{"title":141,"path":142,"stem":143},"Email Templates","\u002Fmodules\u002Femail-templates","4.modules\u002F20.email-templates",{"title":145,"path":146,"stem":147,"children":148},"Packages","\u002Fpackages","5.packages",[149],{"title":150,"path":151,"stem":152},"CLI","\u002Fpackages\u002Fcli","5.packages\u002F4.cli",{"id":154,"title":105,"body":155,"description":1961,"extension":1962,"links":1963,"meta":1964,"navigation":879,"path":106,"seo":1965,"stem":107,"__hash__":1966},"docs\u002F4.modules\u002F11.notify.md",{"type":156,"value":157,"toc":1950},"minimark",[158,176,205,210,241,394,398,405,526,532,535,554,698,702,705,787,999,1004,1032,1085,1096,1100,1111,1587,1591,1594,1681,1685,1697,1943,1946],[159,160,161,162,169,170,172,173,175],"p",{},"Notification dispatch as a ",[163,164,168],"a",{"href":165,"rel":166},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules",[167],"nofollow","Nuxt module",". Feature modules such as\n",[163,171,133],{"href":134}," and ",[163,174,73],{"href":74}," dispatch email, SMS or simple notifications without deciding how\nthey are delivered. That choice, and its configuration, belongs to the app.",[177,178,179,183,184,187,188,192,193,196,197,200,201,204],"note",{},[180,181,182],"strong",{},"Requires"," nothing else. ",[180,185,186],{},"Installs automatically"," when a module that depends on it is used (",[189,190,191],"code",{},"auth",", ",[189,194,195],{},"users",",\n",[189,198,199],{},"forms","); add it to ",[189,202,203],{},"modules"," only to configure it.",[206,207,209],"h2",{"id":208},"quick-setup","Quick setup",[211,212,217],"pre",{"className":213,"code":214,"language":215,"meta":216,"style":216},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx nuxt module add @frigear-nu\u002Fnotify\n","bash","",[189,218,219],{"__ignoreMap":216},[220,221,224,228,232,235,238],"span",{"class":222,"line":223},"line",1,[220,225,227],{"class":226},"sBMFI","npx",[220,229,231],{"class":230},"sfazB"," nuxt",[220,233,234],{"class":230}," module",[220,236,237],{"class":230}," add",[220,239,240],{"class":230}," @frigear-nu\u002Fnotify\n",[211,242,246],{"className":243,"code":244,"language":245,"meta":216,"style":216},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@frigear-nu\u002Fnotify'],\n  notify: {\n    email: { driver: 'resend' },\n    sms: { driver: '~\u002Fserver\u002Futils\u002Ftwilio-sms-driver' },\n    simple: { driver: 'log' },\n  },\n})\n","ts",[189,247,248,269,295,306,333,356,379,385],{"__ignoreMap":216},[220,249,250,254,257,261,265],{"class":222,"line":223},[220,251,253],{"class":252},"s7zQu","export",[220,255,256],{"class":252}," default",[220,258,260],{"class":259},"s2Zo4"," defineNuxtConfig",[220,262,264],{"class":263},"sTEyZ","(",[220,266,268],{"class":267},"sMK4o","{\n",[220,270,272,276,279,282,285,288,290,293],{"class":222,"line":271},2,[220,273,275],{"class":274},"swJcz","  modules",[220,277,278],{"class":267},":",[220,280,281],{"class":263}," [",[220,283,284],{"class":267},"'",[220,286,287],{"class":230},"@frigear-nu\u002Fnotify",[220,289,284],{"class":267},[220,291,292],{"class":263},"]",[220,294,196],{"class":267},[220,296,298,301,303],{"class":222,"line":297},3,[220,299,300],{"class":274},"  notify",[220,302,278],{"class":267},[220,304,305],{"class":267}," {\n",[220,307,309,312,314,317,320,322,325,328,330],{"class":222,"line":308},4,[220,310,311],{"class":274},"    email",[220,313,278],{"class":267},[220,315,316],{"class":267}," {",[220,318,319],{"class":274}," driver",[220,321,278],{"class":267},[220,323,324],{"class":267}," '",[220,326,327],{"class":230},"resend",[220,329,284],{"class":267},[220,331,332],{"class":267}," },\n",[220,334,336,339,341,343,345,347,349,352,354],{"class":222,"line":335},5,[220,337,338],{"class":274},"    sms",[220,340,278],{"class":267},[220,342,316],{"class":267},[220,344,319],{"class":274},[220,346,278],{"class":267},[220,348,324],{"class":267},[220,350,351],{"class":230},"~\u002Fserver\u002Futils\u002Ftwilio-sms-driver",[220,353,284],{"class":267},[220,355,332],{"class":267},[220,357,359,362,364,366,368,370,372,375,377],{"class":222,"line":358},6,[220,360,361],{"class":274},"    simple",[220,363,278],{"class":267},[220,365,316],{"class":267},[220,367,319],{"class":274},[220,369,278],{"class":267},[220,371,324],{"class":267},[220,373,374],{"class":230},"log",[220,376,284],{"class":267},[220,378,332],{"class":267},[220,380,382],{"class":222,"line":381},7,[220,383,384],{"class":267},"  },\n",[220,386,388,391],{"class":222,"line":387},8,[220,389,390],{"class":267},"}",[220,392,393],{"class":263},")\n",[206,395,397],{"id":396},"options","Options",[159,399,400,401,404],{},"Configured under ",[189,402,403],{},"notify",". Each notification type has its own driver; only the configured driver is loaded.",[406,407,408,427],"table",{},[409,410,411],"thead",{},[412,413,414,418,421,424],"tr",{},[415,416,417],"th",{},"Option",[415,419,420],{},"Type",[415,422,423],{},"Default",[415,425,426],{},"Purpose",[428,429,430,460,485,508],"tbody",{},[412,431,432,438,443,448],{},[433,434,435],"td",{},[189,436,437],{},"email.driver",[433,439,440],{},[189,441,442],{},"'log' | 'resend' | 'ses' | 'cloudflare' | string",[433,444,445],{},[189,446,447],{},"'log'",[433,449,450,451,454,455,459],{},"A built-in name, or a path to a file whose default export is an ",[189,452,453],{},"EmailDriver",". A built-in name only sets the runtime default (see ",[163,456,458],{"href":457},"#environment-variables","Environment variables",").",[412,461,462,467,472,476],{},[433,463,464],{},[189,465,466],{},"sms.driver",[433,468,469],{},[189,470,471],{},"'log' | string",[433,473,474],{},[189,475,447],{},[433,477,478,480,481,484],{},[189,479,447],{},", or a path to a file whose default export is an ",[189,482,483],{},"SMSDriver",".",[412,486,487,492,496,500],{},[433,488,489],{},[189,490,491],{},"simple.driver",[433,493,494],{},[189,495,471],{},[433,497,498],{},[189,499,447],{},[433,501,502,504,505,484],{},[189,503,447],{},", or a path to a file whose default export is a ",[189,506,507],{},"SimpleDriver",[412,509,510,515,520,523],{},[433,511,512],{},[189,513,514],{},"push.driver",[433,516,517],{},[189,518,519],{},"string",[433,521,522],{},"none",[433,524,525],{},"Reserved. Typed but not implemented.",[159,527,528,529,531],{},"The ",[189,530,374],{}," driver prints the notification to the console instead of sending it, a safe default for development.",[206,533,458],{"id":534},"environment-variables",[159,536,537,538,541,542,545,546,549,550,553],{},"The built-in email drivers use plain ",[189,539,540],{},"fetch"," (SES requests are signed with AWS SigV4 through Web Crypto), so they have\nno dependencies. The driver and its credentials are read at runtime from ",[189,543,544],{},"runtimeConfig.notify.email",", so you can\nswitch providers per environment without rebuilding. The env var wins over ",[189,547,548],{},"notify.email.driver"," in\n",[189,551,552],{},"nuxt.config.ts",". A missing credential fails the send with an error naming the variable to set.",[406,555,556,568],{},[409,557,558],{},[412,559,560,563,566],{},[415,561,562],{},"Variable",[415,564,565],{},"Used by",[415,567,426],{},[428,569,570,595,611,623,639,651,663,675,687],{},[412,571,572,577,580],{},[433,573,574],{},[189,575,576],{},"NUXT_NOTIFY_EMAIL_DRIVER",[433,578,579],{},"all",[433,581,582,584,585,192,587,590,591,594],{},[189,583,374],{}," (default), ",[189,586,327],{},[189,588,589],{},"ses"," or ",[189,592,593],{},"cloudflare",". Any other value throws at send time.",[412,596,597,602,605],{},[433,598,599],{},[189,600,601],{},"NUXT_NOTIFY_EMAIL_FROM",[433,603,604],{},"resend, ses, cloudflare",[433,606,607,608,484],{},"Sender address, for example ",[189,609,610],{},"Frigear \u003Cno-reply@frigear.nu>",[412,612,613,618,620],{},[433,614,615],{},[189,616,617],{},"NUXT_NOTIFY_EMAIL_RESEND_API_TOKEN",[433,619,327],{},[433,621,622],{},"API token.",[412,624,625,630,632],{},[433,626,627],{},[189,628,629],{},"NUXT_NOTIFY_EMAIL_SES_REGION",[433,631,589],{},[433,633,634,635,638],{},"AWS region, for example ",[189,636,637],{},"eu-west-1",". Uses the SES v2 API.",[412,640,641,646,648],{},[433,642,643],{},[189,644,645],{},"NUXT_NOTIFY_EMAIL_SES_ACCESS_KEY_ID",[433,647,589],{},[433,649,650],{},"Access key id.",[412,652,653,658,660],{},[433,654,655],{},[189,656,657],{},"NUXT_NOTIFY_EMAIL_SES_SECRET_ACCESS_KEY",[433,659,589],{},[433,661,662],{},"Secret access key.",[412,664,665,670,672],{},[433,666,667],{},[189,668,669],{},"NUXT_NOTIFY_EMAIL_SES_SESSION_TOKEN",[433,671,589],{},[433,673,674],{},"Optional, for temporary credentials.",[412,676,677,682,684],{},[433,678,679],{},[189,680,681],{},"NUXT_NOTIFY_EMAIL_CLOUDFLARE_ACCOUNT_ID",[433,683,593],{},[433,685,686],{},"Cloudflare account id (Email Service).",[412,688,689,694,696],{},[433,690,691],{},[189,692,693],{},"NUXT_NOTIFY_EMAIL_CLOUDFLARE_API_TOKEN",[433,695,593],{},[433,697,622],{},[206,699,701],{"id":700},"server","Server",[159,703,704],{},"Dispatch functions and definers are auto-imported in server code wherever the module is installed.",[406,706,707,717],{},[409,708,709],{},[412,710,711,714],{},[415,712,713],{},"Function",[415,715,716],{},"Signature",[428,718,719,731,743,755,771],{},[412,720,721,726],{},[433,722,723],{},[189,724,725],{},"dispatchEmailNotification",[433,727,728],{},[189,729,730],{},"(notification: EmailNotification) => Promise\u003Cvoid>",[412,732,733,738],{},[433,734,735],{},[189,736,737],{},"dispatchSMSNotification",[433,739,740],{},[189,741,742],{},"(notification: SMSNotification) => Promise\u003Cvoid>",[412,744,745,750],{},[433,746,747],{},[189,748,749],{},"dispatchSimpleNotification",[433,751,752],{},[189,753,754],{},"(notification: SimpleNotification) => Promise\u003Cvoid>",[412,756,757,768],{},[433,758,759,192,762,192,765],{},[189,760,761],{},"defineEmailNotification",[189,763,764],{},"defineSMSNotification",[189,766,767],{},"defineSimpleNotification",[433,769,770],{},"Typed identity helpers that return the notification unchanged.",[412,772,773,784],{},[433,774,775,192,778,192,781],{},[189,776,777],{},"defineEmailDriver",[189,779,780],{},"defineSMSDriver",[189,782,783],{},"defineSimpleDriver",[433,785,786],{},"Typed identity helpers that return the driver unchanged.",[211,788,790],{"className":243,"code":789,"language":245,"meta":216,"style":216},"await dispatchEmailNotification({\n  to: user.email,\n  subject: 'Welcome!',\n  body: '\u003Cp>Thanks for signing up.\u003C\u002Fp>',\n  text: 'Thanks for signing up.',\n})\n\nawait dispatchSMSNotification({\n  to: user.phone,\n  body: 'Your verification code is 123456.',\n})\n\nawait dispatchSimpleNotification({\n  title: 'New signup',\n  text: `${user.email} just signed up.`,\n})\n",[189,791,792,804,821,837,853,869,875,881,892,908,924,931,936,948,965,992],{"__ignoreMap":216},[220,793,794,797,800,802],{"class":222,"line":223},[220,795,796],{"class":252},"await",[220,798,799],{"class":259}," dispatchEmailNotification",[220,801,264],{"class":263},[220,803,268],{"class":267},[220,805,806,809,811,814,816,819],{"class":222,"line":271},[220,807,808],{"class":274},"  to",[220,810,278],{"class":267},[220,812,813],{"class":263}," user",[220,815,484],{"class":267},[220,817,818],{"class":263},"email",[220,820,196],{"class":267},[220,822,823,826,828,830,833,835],{"class":222,"line":297},[220,824,825],{"class":274},"  subject",[220,827,278],{"class":267},[220,829,324],{"class":267},[220,831,832],{"class":230},"Welcome!",[220,834,284],{"class":267},[220,836,196],{"class":267},[220,838,839,842,844,846,849,851],{"class":222,"line":308},[220,840,841],{"class":274},"  body",[220,843,278],{"class":267},[220,845,324],{"class":267},[220,847,848],{"class":230},"\u003Cp>Thanks for signing up.\u003C\u002Fp>",[220,850,284],{"class":267},[220,852,196],{"class":267},[220,854,855,858,860,862,865,867],{"class":222,"line":335},[220,856,857],{"class":274},"  text",[220,859,278],{"class":267},[220,861,324],{"class":267},[220,863,864],{"class":230},"Thanks for signing up.",[220,866,284],{"class":267},[220,868,196],{"class":267},[220,870,871,873],{"class":222,"line":358},[220,872,390],{"class":267},[220,874,393],{"class":263},[220,876,877],{"class":222,"line":381},[220,878,880],{"emptyLinePlaceholder":879},true,"\n",[220,882,883,885,888,890],{"class":222,"line":387},[220,884,796],{"class":252},[220,886,887],{"class":259}," dispatchSMSNotification",[220,889,264],{"class":263},[220,891,268],{"class":267},[220,893,895,897,899,901,903,906],{"class":222,"line":894},9,[220,896,808],{"class":274},[220,898,278],{"class":267},[220,900,813],{"class":263},[220,902,484],{"class":267},[220,904,905],{"class":263},"phone",[220,907,196],{"class":267},[220,909,911,913,915,917,920,922],{"class":222,"line":910},10,[220,912,841],{"class":274},[220,914,278],{"class":267},[220,916,324],{"class":267},[220,918,919],{"class":230},"Your verification code is 123456.",[220,921,284],{"class":267},[220,923,196],{"class":267},[220,925,927,929],{"class":222,"line":926},11,[220,928,390],{"class":267},[220,930,393],{"class":263},[220,932,934],{"class":222,"line":933},12,[220,935,880],{"emptyLinePlaceholder":879},[220,937,939,941,944,946],{"class":222,"line":938},13,[220,940,796],{"class":252},[220,942,943],{"class":259}," dispatchSimpleNotification",[220,945,264],{"class":263},[220,947,268],{"class":267},[220,949,951,954,956,958,961,963],{"class":222,"line":950},14,[220,952,953],{"class":274},"  title",[220,955,278],{"class":267},[220,957,324],{"class":267},[220,959,960],{"class":230},"New signup",[220,962,284],{"class":267},[220,964,196],{"class":267},[220,966,968,970,972,975,978,980,982,984,987,990],{"class":222,"line":967},15,[220,969,857],{"class":274},[220,971,278],{"class":267},[220,973,974],{"class":267}," `${",[220,976,977],{"class":263},"user",[220,979,484],{"class":267},[220,981,818],{"class":263},[220,983,390],{"class":267},[220,985,986],{"class":230}," just signed up.",[220,988,989],{"class":267},"`",[220,991,196],{"class":267},[220,993,995,997],{"class":222,"line":994},16,[220,996,390],{"class":267},[220,998,393],{"class":263},[1000,1001,1003],"h3",{"id":1002},"templates","Templates",[159,1005,1006,1007,1009,1010,1013,1014,1017,1018,1020,1021,1024,1025,172,1028,1031],{},"Notify does not render templates itself. ",[189,1008,725],{}," calls the ",[189,1011,1012],{},"notify:email"," Nitro hook before the\ndriver runs, and listeners may replace ",[189,1015,1016],{},"ctx.notification",". ",[163,1019,141],{"href":142}," uses it to\nrender ",[189,1022,1023],{},"notification.template"," with Vue. Without a renderer the notification is sent as built, so ",[189,1026,1027],{},"subject",[189,1029,1030],{},"body","\nare always the fallback.",[406,1033,1034,1047],{},[409,1035,1036],{},[412,1037,1038,1041,1044],{},[415,1039,1040],{},"Hook",[415,1042,1043],{},"When",[415,1045,1046],{},"Payload",[428,1048,1049,1065],{},[412,1050,1051,1056,1059],{},[433,1052,1053,1055],{},[189,1054,1012],{}," (Nitro)",[433,1057,1058],{},"An email is about to be handed to the driver",[433,1060,1061,1064],{},[189,1062,1063],{},"{ notification }",", replaceable",[412,1066,1067,1073,1076],{},[433,1068,1069,1072],{},[189,1070,1071],{},"notify:email:templates"," (Nuxt)",[433,1074,1075],{},"A renderer collects the template directories modules ship",[433,1077,1078,1081,1082],{},[189,1079,1080],{},"EmailTemplateSource[]",": push ",[189,1083,1084],{},"{ dir }",[159,1086,1087,1088,1095],{},"In-app toasts are not part of this module: use ",[163,1089,1092],{"href":1090,"rel":1091},"https:\u002F\u002Fui.nuxt.com\u002Fcomposables\u002Fuse-toast",[167],[189,1093,1094],{},"useToast()"," from Nuxt UI.",[1000,1097,1099],{"id":1098},"types","Types",[159,1101,1102,1103,1106,1107,1110],{},"Exported from ",[189,1104,1105],{},"@frigear-nu\u002Fnotify\u002Ftypes",". The root package also re-exports the notification, driver and\n",[189,1108,1109],{},"ModuleOptions"," types.",[211,1112,1114],{"className":243,"code":1113,"language":245,"meta":216,"style":216},"interface EmailNotification\u003CM = NotificationMeta> {\n  to: string | string[]\n  subject: string\n  \u002F** HTML body. *\u002F\n  body: string\n  \u002F** Optional plain-text body. *\u002F\n  text?: string\n  \u002F** Address replies go to (the `Reply-To` header). *\u002F\n  replyTo?: string\n  \u002F** Template to render instead of subject\u002Fbody\u002Ftext, when a renderer is installed. *\u002F\n  template?: { name: string, props?: Record\u003Cstring, unknown>, locale?: string }\n  meta?: M\n}\n\ninterface SMSNotification\u003CM = NotificationMeta> {\n  to: string | string[]\n  body: string\n  meta?: M\n}\n\ninterface SimpleNotification\u003CM = Record\u003Cstring, unknown>> {\n  title: string\n  text: string\n  \u002F** Optional URL to open when the notification is clicked. *\u002F\n  url?: string\n  meta?: M\n}\n\ntype NotificationMeta\u003CAdditionalMeta = Record\u003Cstring, unknown>> = { driver?: string } & AdditionalMeta\n\ntype EmailDriver = (notification: EmailNotification) => Promise\u003Cvoid> | void\ntype SMSDriver = (notification: SMSNotification) => Promise\u003Cvoid> | void\ntype SimpleDriver = (notification: SimpleNotification) => Promise\u003Cvoid> | void\n",[189,1115,1116,1142,1159,1168,1174,1182,1187,1196,1201,1210,1215,1264,1274,1279,1283,1302,1316,1325,1334,1339,1344,1373,1382,1391,1397,1407,1416,1421,1426,1472,1477,1519,1553],{"__ignoreMap":216},[220,1117,1118,1122,1125,1128,1131,1134,1137,1140],{"class":222,"line":223},[220,1119,1121],{"class":1120},"spNyl","interface",[220,1123,1124],{"class":226}," EmailNotification",[220,1126,1127],{"class":267},"\u003C",[220,1129,1130],{"class":226},"M",[220,1132,1133],{"class":267}," =",[220,1135,1136],{"class":226}," NotificationMeta",[220,1138,1139],{"class":267},">",[220,1141,305],{"class":267},[220,1143,1144,1146,1148,1151,1154,1156],{"class":222,"line":271},[220,1145,808],{"class":274},[220,1147,278],{"class":267},[220,1149,1150],{"class":226}," string",[220,1152,1153],{"class":267}," |",[220,1155,1150],{"class":226},[220,1157,1158],{"class":263},"[]\n",[220,1160,1161,1163,1165],{"class":222,"line":297},[220,1162,825],{"class":274},[220,1164,278],{"class":267},[220,1166,1167],{"class":226}," string\n",[220,1169,1170],{"class":222,"line":308},[220,1171,1173],{"class":1172},"sHwdD","  \u002F** HTML body. *\u002F\n",[220,1175,1176,1178,1180],{"class":222,"line":335},[220,1177,841],{"class":274},[220,1179,278],{"class":267},[220,1181,1167],{"class":226},[220,1183,1184],{"class":222,"line":358},[220,1185,1186],{"class":1172},"  \u002F** Optional plain-text body. *\u002F\n",[220,1188,1189,1191,1194],{"class":222,"line":381},[220,1190,857],{"class":274},[220,1192,1193],{"class":267},"?:",[220,1195,1167],{"class":226},[220,1197,1198],{"class":222,"line":387},[220,1199,1200],{"class":1172},"  \u002F** Address replies go to (the `Reply-To` header). *\u002F\n",[220,1202,1203,1206,1208],{"class":222,"line":894},[220,1204,1205],{"class":274},"  replyTo",[220,1207,1193],{"class":267},[220,1209,1167],{"class":226},[220,1211,1212],{"class":222,"line":910},[220,1213,1214],{"class":1172},"  \u002F** Template to render instead of subject\u002Fbody\u002Ftext, when a renderer is installed. *\u002F\n",[220,1216,1217,1220,1222,1224,1227,1229,1231,1234,1237,1239,1242,1244,1246,1248,1251,1254,1257,1259,1261],{"class":222,"line":926},[220,1218,1219],{"class":274},"  template",[220,1221,1193],{"class":267},[220,1223,316],{"class":267},[220,1225,1226],{"class":274}," name",[220,1228,278],{"class":267},[220,1230,1150],{"class":226},[220,1232,1233],{"class":267},",",[220,1235,1236],{"class":274}," props",[220,1238,1193],{"class":267},[220,1240,1241],{"class":226}," Record",[220,1243,1127],{"class":267},[220,1245,519],{"class":226},[220,1247,1233],{"class":267},[220,1249,1250],{"class":226}," unknown",[220,1252,1253],{"class":267},">,",[220,1255,1256],{"class":274}," locale",[220,1258,1193],{"class":267},[220,1260,1150],{"class":226},[220,1262,1263],{"class":267}," }\n",[220,1265,1266,1269,1271],{"class":222,"line":933},[220,1267,1268],{"class":274},"  meta",[220,1270,1193],{"class":267},[220,1272,1273],{"class":226}," M\n",[220,1275,1276],{"class":222,"line":938},[220,1277,1278],{"class":267},"}\n",[220,1280,1281],{"class":222,"line":950},[220,1282,880],{"emptyLinePlaceholder":879},[220,1284,1285,1287,1290,1292,1294,1296,1298,1300],{"class":222,"line":967},[220,1286,1121],{"class":1120},[220,1288,1289],{"class":226}," SMSNotification",[220,1291,1127],{"class":267},[220,1293,1130],{"class":226},[220,1295,1133],{"class":267},[220,1297,1136],{"class":226},[220,1299,1139],{"class":267},[220,1301,305],{"class":267},[220,1303,1304,1306,1308,1310,1312,1314],{"class":222,"line":994},[220,1305,808],{"class":274},[220,1307,278],{"class":267},[220,1309,1150],{"class":226},[220,1311,1153],{"class":267},[220,1313,1150],{"class":226},[220,1315,1158],{"class":263},[220,1317,1319,1321,1323],{"class":222,"line":1318},17,[220,1320,841],{"class":274},[220,1322,278],{"class":267},[220,1324,1167],{"class":226},[220,1326,1328,1330,1332],{"class":222,"line":1327},18,[220,1329,1268],{"class":274},[220,1331,1193],{"class":267},[220,1333,1273],{"class":226},[220,1335,1337],{"class":222,"line":1336},19,[220,1338,1278],{"class":267},[220,1340,1342],{"class":222,"line":1341},20,[220,1343,880],{"emptyLinePlaceholder":879},[220,1345,1347,1349,1352,1354,1356,1358,1360,1362,1364,1366,1368,1371],{"class":222,"line":1346},21,[220,1348,1121],{"class":1120},[220,1350,1351],{"class":226}," SimpleNotification",[220,1353,1127],{"class":267},[220,1355,1130],{"class":226},[220,1357,1133],{"class":267},[220,1359,1241],{"class":226},[220,1361,1127],{"class":267},[220,1363,519],{"class":226},[220,1365,1233],{"class":267},[220,1367,1250],{"class":226},[220,1369,1370],{"class":267},">>",[220,1372,305],{"class":267},[220,1374,1376,1378,1380],{"class":222,"line":1375},22,[220,1377,953],{"class":274},[220,1379,278],{"class":267},[220,1381,1167],{"class":226},[220,1383,1385,1387,1389],{"class":222,"line":1384},23,[220,1386,857],{"class":274},[220,1388,278],{"class":267},[220,1390,1167],{"class":226},[220,1392,1394],{"class":222,"line":1393},24,[220,1395,1396],{"class":1172},"  \u002F** Optional URL to open when the notification is clicked. *\u002F\n",[220,1398,1400,1403,1405],{"class":222,"line":1399},25,[220,1401,1402],{"class":274},"  url",[220,1404,1193],{"class":267},[220,1406,1167],{"class":226},[220,1408,1410,1412,1414],{"class":222,"line":1409},26,[220,1411,1268],{"class":274},[220,1413,1193],{"class":267},[220,1415,1273],{"class":226},[220,1417,1419],{"class":222,"line":1418},27,[220,1420,1278],{"class":267},[220,1422,1424],{"class":222,"line":1423},28,[220,1425,880],{"emptyLinePlaceholder":879},[220,1427,1429,1432,1434,1436,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1466,1469],{"class":222,"line":1428},29,[220,1430,1431],{"class":1120},"type",[220,1433,1136],{"class":226},[220,1435,1127],{"class":267},[220,1437,1438],{"class":226},"AdditionalMeta",[220,1440,1133],{"class":267},[220,1442,1241],{"class":226},[220,1444,1127],{"class":267},[220,1446,519],{"class":226},[220,1448,1233],{"class":267},[220,1450,1250],{"class":226},[220,1452,1370],{"class":267},[220,1454,1133],{"class":267},[220,1456,316],{"class":267},[220,1458,319],{"class":274},[220,1460,1193],{"class":267},[220,1462,1150],{"class":226},[220,1464,1465],{"class":267}," }",[220,1467,1468],{"class":267}," &",[220,1470,1471],{"class":226}," AdditionalMeta\n",[220,1473,1475],{"class":222,"line":1474},30,[220,1476,880],{"emptyLinePlaceholder":879},[220,1478,1480,1482,1485,1487,1490,1494,1496,1498,1501,1504,1507,1509,1512,1514,1516],{"class":222,"line":1479},31,[220,1481,1431],{"class":1120},[220,1483,1484],{"class":226}," EmailDriver",[220,1486,1133],{"class":267},[220,1488,1489],{"class":267}," (",[220,1491,1493],{"class":1492},"sHdIc","notification",[220,1495,278],{"class":267},[220,1497,1124],{"class":226},[220,1499,1500],{"class":267},")",[220,1502,1503],{"class":1120}," =>",[220,1505,1506],{"class":226}," Promise",[220,1508,1127],{"class":267},[220,1510,1511],{"class":226},"void",[220,1513,1139],{"class":267},[220,1515,1153],{"class":267},[220,1517,1518],{"class":226}," void\n",[220,1520,1522,1524,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551],{"class":222,"line":1521},32,[220,1523,1431],{"class":1120},[220,1525,1526],{"class":226}," SMSDriver",[220,1528,1133],{"class":267},[220,1530,1489],{"class":267},[220,1532,1493],{"class":1492},[220,1534,278],{"class":267},[220,1536,1289],{"class":226},[220,1538,1500],{"class":267},[220,1540,1503],{"class":1120},[220,1542,1506],{"class":226},[220,1544,1127],{"class":267},[220,1546,1511],{"class":226},[220,1548,1139],{"class":267},[220,1550,1153],{"class":267},[220,1552,1518],{"class":226},[220,1554,1556,1558,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585],{"class":222,"line":1555},33,[220,1557,1431],{"class":1120},[220,1559,1560],{"class":226}," SimpleDriver",[220,1562,1133],{"class":267},[220,1564,1489],{"class":267},[220,1566,1493],{"class":1492},[220,1568,278],{"class":267},[220,1570,1351],{"class":226},[220,1572,1500],{"class":267},[220,1574,1503],{"class":1120},[220,1576,1506],{"class":226},[220,1578,1127],{"class":267},[220,1580,1511],{"class":226},[220,1582,1139],{"class":267},[220,1584,1153],{"class":267},[220,1586,1518],{"class":226},[1000,1588,1590],{"id":1589},"custom-driver","Custom driver",[159,1592,1593],{},"A driver is a function that delivers one notification. Point the driver option at a file whose default export is that\nfunction:",[211,1595,1597],{"className":243,"code":1596,"language":245,"meta":216,"style":216},"\u002F\u002F server\u002Futils\u002Fresend-email-driver.ts\nimport type { EmailDriver } from '@frigear-nu\u002Fnotify\u002Ftypes'\n\nconst sendWithResend: EmailDriver = async (notification) => {\n  \u002F\u002F call your provider with notification.to \u002F subject \u002F body \u002F text \u002F replyTo\n}\n\nexport default sendWithResend\n",[189,1598,1599,1604,1628,1632,1659,1664,1668,1672],{"__ignoreMap":216},[220,1600,1601],{"class":222,"line":223},[220,1602,1603],{"class":1172},"\u002F\u002F server\u002Futils\u002Fresend-email-driver.ts\n",[220,1605,1606,1609,1612,1614,1616,1618,1621,1623,1625],{"class":222,"line":271},[220,1607,1608],{"class":252},"import",[220,1610,1611],{"class":252}," type",[220,1613,316],{"class":267},[220,1615,1484],{"class":263},[220,1617,1465],{"class":267},[220,1619,1620],{"class":252}," from",[220,1622,324],{"class":267},[220,1624,1105],{"class":230},[220,1626,1627],{"class":267},"'\n",[220,1629,1630],{"class":222,"line":297},[220,1631,880],{"emptyLinePlaceholder":879},[220,1633,1634,1637,1640,1642,1644,1646,1649,1651,1653,1655,1657],{"class":222,"line":308},[220,1635,1636],{"class":1120},"const",[220,1638,1639],{"class":263}," sendWithResend",[220,1641,278],{"class":267},[220,1643,1484],{"class":226},[220,1645,1133],{"class":267},[220,1647,1648],{"class":1120}," async",[220,1650,1489],{"class":267},[220,1652,1493],{"class":1492},[220,1654,1500],{"class":267},[220,1656,1503],{"class":1120},[220,1658,305],{"class":267},[220,1660,1661],{"class":222,"line":335},[220,1662,1663],{"class":1172},"  \u002F\u002F call your provider with notification.to \u002F subject \u002F body \u002F text \u002F replyTo\n",[220,1665,1666],{"class":222,"line":358},[220,1667,1278],{"class":267},[220,1669,1670],{"class":222,"line":381},[220,1671,880],{"emptyLinePlaceholder":879},[220,1673,1674,1676,1678],{"class":222,"line":387},[220,1675,253],{"class":252},[220,1677,256],{"class":252},[220,1679,1680],{"class":263}," sendWithResend\n",[1000,1682,1684],{"id":1683},"store-types","Store types",[159,1686,1687,1689,1690,172,1693,1696],{},[189,1688,1105],{}," also exports ",[189,1691,1692],{},"StoredNotification",[189,1694,1695],{},"NotificationStore",", a small persistence contract:",[211,1698,1700],{"className":243,"code":1699,"language":245,"meta":216,"style":216},"type StoredNotification = {\n  id: string\n  type: 'email' | 'sms' | 'simple' | string\n  data: EmailNotification | SMSNotification | SimpleNotification\n  error?: string\n  sentAt?: Date\n  createdAt: Date\n  updatedAt?: Date\n}\n\ntype NotificationStore\u003CS = StoredNotification> = {\n  put(notification: S): Promise\u003Cvoid>\n  get(id: string): Promise\u003CS | null>\n  list(): Promise\u003CS[]>\n  delete(id: string): Promise\u003Cvoid>\n}\n",[189,1701,1702,1713,1722,1757,1775,1784,1794,1803,1812,1816,1820,1842,1868,1897,1916,1939],{"__ignoreMap":216},[220,1703,1704,1706,1709,1711],{"class":222,"line":223},[220,1705,1431],{"class":1120},[220,1707,1708],{"class":226}," StoredNotification",[220,1710,1133],{"class":267},[220,1712,305],{"class":267},[220,1714,1715,1718,1720],{"class":222,"line":271},[220,1716,1717],{"class":274},"  id",[220,1719,278],{"class":267},[220,1721,1167],{"class":226},[220,1723,1724,1727,1729,1731,1733,1735,1737,1739,1742,1744,1746,1748,1751,1753,1755],{"class":222,"line":297},[220,1725,1726],{"class":274},"  type",[220,1728,278],{"class":267},[220,1730,324],{"class":267},[220,1732,818],{"class":230},[220,1734,284],{"class":267},[220,1736,1153],{"class":267},[220,1738,324],{"class":267},[220,1740,1741],{"class":230},"sms",[220,1743,284],{"class":267},[220,1745,1153],{"class":267},[220,1747,324],{"class":267},[220,1749,1750],{"class":230},"simple",[220,1752,284],{"class":267},[220,1754,1153],{"class":267},[220,1756,1167],{"class":226},[220,1758,1759,1762,1764,1766,1768,1770,1772],{"class":222,"line":308},[220,1760,1761],{"class":274},"  data",[220,1763,278],{"class":267},[220,1765,1124],{"class":226},[220,1767,1153],{"class":267},[220,1769,1289],{"class":226},[220,1771,1153],{"class":267},[220,1773,1774],{"class":226}," SimpleNotification\n",[220,1776,1777,1780,1782],{"class":222,"line":335},[220,1778,1779],{"class":274},"  error",[220,1781,1193],{"class":267},[220,1783,1167],{"class":226},[220,1785,1786,1789,1791],{"class":222,"line":358},[220,1787,1788],{"class":274},"  sentAt",[220,1790,1193],{"class":267},[220,1792,1793],{"class":226}," Date\n",[220,1795,1796,1799,1801],{"class":222,"line":381},[220,1797,1798],{"class":274},"  createdAt",[220,1800,278],{"class":267},[220,1802,1793],{"class":226},[220,1804,1805,1808,1810],{"class":222,"line":387},[220,1806,1807],{"class":274},"  updatedAt",[220,1809,1193],{"class":267},[220,1811,1793],{"class":226},[220,1813,1814],{"class":222,"line":894},[220,1815,1278],{"class":267},[220,1817,1818],{"class":222,"line":910},[220,1819,880],{"emptyLinePlaceholder":879},[220,1821,1822,1824,1827,1829,1832,1834,1836,1838,1840],{"class":222,"line":926},[220,1823,1431],{"class":1120},[220,1825,1826],{"class":226}," NotificationStore",[220,1828,1127],{"class":267},[220,1830,1831],{"class":226},"S",[220,1833,1133],{"class":267},[220,1835,1708],{"class":226},[220,1837,1139],{"class":267},[220,1839,1133],{"class":267},[220,1841,305],{"class":267},[220,1843,1844,1847,1849,1851,1853,1856,1859,1861,1863,1865],{"class":222,"line":933},[220,1845,1846],{"class":274},"  put",[220,1848,264],{"class":267},[220,1850,1493],{"class":1492},[220,1852,278],{"class":267},[220,1854,1855],{"class":226}," S",[220,1857,1858],{"class":267},"):",[220,1860,1506],{"class":226},[220,1862,1127],{"class":267},[220,1864,1511],{"class":226},[220,1866,1867],{"class":267},">\n",[220,1869,1870,1873,1875,1878,1880,1882,1884,1886,1888,1890,1892,1895],{"class":222,"line":938},[220,1871,1872],{"class":274},"  get",[220,1874,264],{"class":267},[220,1876,1877],{"class":1492},"id",[220,1879,278],{"class":267},[220,1881,1150],{"class":226},[220,1883,1858],{"class":267},[220,1885,1506],{"class":226},[220,1887,1127],{"class":267},[220,1889,1831],{"class":226},[220,1891,1153],{"class":267},[220,1893,1894],{"class":226}," null",[220,1896,1867],{"class":267},[220,1898,1899,1902,1905,1907,1909,1911,1914],{"class":222,"line":950},[220,1900,1901],{"class":274},"  list",[220,1903,1904],{"class":267},"():",[220,1906,1506],{"class":226},[220,1908,1127],{"class":267},[220,1910,1831],{"class":226},[220,1912,1913],{"class":263},"[]",[220,1915,1867],{"class":267},[220,1917,1918,1921,1923,1925,1927,1929,1931,1933,1935,1937],{"class":222,"line":967},[220,1919,1920],{"class":274},"  delete",[220,1922,264],{"class":267},[220,1924,1877],{"class":1492},[220,1926,278],{"class":267},[220,1928,1150],{"class":226},[220,1930,1858],{"class":267},[220,1932,1506],{"class":226},[220,1934,1127],{"class":267},[220,1936,1511],{"class":226},[220,1938,1867],{"class":267},[220,1940,1941],{"class":222,"line":994},[220,1942,1278],{"class":267},[159,1944,1945],{},"Nothing in the module uses a store yet: dispatch does not record notifications.",[1947,1948,1949],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":216,"searchDepth":271,"depth":271,"links":1951},[1952,1953,1954,1955],{"id":208,"depth":271,"text":209},{"id":396,"depth":271,"text":397},{"id":534,"depth":271,"text":458},{"id":700,"depth":271,"text":701,"children":1956},[1957,1958,1959,1960],{"id":1002,"depth":297,"text":1003},{"id":1098,"depth":297,"text":1099},{"id":1589,"depth":297,"text":1590},{"id":1683,"depth":297,"text":1684},"Email, SMS and generic notification dispatch with pluggable drivers, shared across Frigear modules.","md",null,{},{"title":105,"description":1961},"9f7GsTMSWKEYQgU1doxRKeNpmXnE61EQ7pZHF2H_XVg",[1968,1970],{"title":101,"path":102,"stem":103,"description":1969,"children":-1},"Helpers for building Frigear Nuxt modules - pages, URLs, translations, menu sources, virtual registries and extendable database tables.",{"title":109,"path":110,"stem":111,"description":1971,"children":-1},"Let users sign in to your applications through an OAuth 2.0 \u002F OpenID Connect server, with roles and claims supplied by the host app.",1792824490205]