[{"data":1,"prerenderedAt":2034},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fpackages\u002Fjwt":176,"\u002Fdocs\u002Fpackages\u002Fjwt-surround":2029},[4,21,86,158],{"title":5,"path":6,"stem":7,"children":8,"status":11,"icon":20},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,16],{"title":10,"path":6,"stem":7,"status":11},"Introduction",null,{"title":13,"path":14,"stem":15,"status":11},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation",{"title":17,"path":18,"stem":19,"status":11},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","1.docs\u002F1.getting-started\u002F3.quick-start",false,{"title":22,"path":23,"stem":24,"children":25,"status":11,"icon":20},"Core Concepts","\u002Fdocs\u002Fcore-concepts","1.docs\u002F2.core-concepts\u002F1.index",[26,28,32,36,46,50,54,58,62,66,70,74,78,82],{"title":27,"path":23,"stem":24,"status":11},"Overview",{"title":29,"path":30,"stem":31,"status":11},"Response","\u002Fdocs\u002Fcore-concepts\u002Fresponse","1.docs\u002F2.core-concepts\u002F10.response",{"title":33,"path":34,"stem":35,"status":11},"Testing","\u002Fdocs\u002Fcore-concepts\u002Ftesting","1.docs\u002F2.core-concepts\u002F12.testing",{"title":37,"path":38,"stem":39,"children":40,"status":11,"icon":20,"defaultOpen":20},"Decorators","\u002Fdocs\u002Fcore-concepts\u002Fdecorators","1.docs\u002F2.core-concepts\u002F13.decorators\u002F1.index",[41,42],{"title":27,"path":38,"stem":39,"status":11},{"title":43,"path":44,"stem":45,"status":11},"Custom","\u002Fdocs\u002Fcore-concepts\u002Fdecorators\u002Fcustom","1.docs\u002F2.core-concepts\u002F13.decorators\u002F2.custom",{"title":47,"path":48,"stem":49,"status":11},"Discovery Service","\u002Fdocs\u002Fcore-concepts\u002Fdiscovery","1.docs\u002F2.core-concepts\u002F14.discovery",{"title":51,"path":52,"stem":53,"status":11},"Application Lifecycle","\u002Fdocs\u002Fcore-concepts\u002Fapp-lifecycle","1.docs\u002F2.core-concepts\u002F15.app-lifecycle",{"title":55,"path":56,"stem":57,"status":11},"Controllers","\u002Fdocs\u002Fcore-concepts\u002Fcontrollers","1.docs\u002F2.core-concepts\u002F2.controllers",{"title":59,"path":60,"stem":61,"status":11},"Routing","\u002Fdocs\u002Fcore-concepts\u002Frouting","1.docs\u002F2.core-concepts\u002F3.routing",{"title":63,"path":64,"stem":65,"status":11},"Providers","\u002Fdocs\u002Fcore-concepts\u002Fproviders","1.docs\u002F2.core-concepts\u002F4.providers",{"title":67,"path":68,"stem":69,"status":11},"Modules","\u002Fdocs\u002Fcore-concepts\u002Fmodules","1.docs\u002F2.core-concepts\u002F5.modules",{"title":71,"path":72,"stem":73,"status":11},"Configuration","\u002Fdocs\u002Fcore-concepts\u002Fconfiguration","1.docs\u002F2.core-concepts\u002F6.configuration",{"title":75,"path":76,"stem":77,"status":11},"Middleware","\u002Fdocs\u002Fcore-concepts\u002Fmiddleware","1.docs\u002F2.core-concepts\u002F7.middleware",{"title":79,"path":80,"stem":81,"status":11},"Guards","\u002Fdocs\u002Fcore-concepts\u002Fguards","1.docs\u002F2.core-concepts\u002F8.guards",{"title":83,"path":84,"stem":85,"status":11},"Exceptions","\u002Fdocs\u002Fcore-concepts\u002Fexceptions","1.docs\u002F2.core-concepts\u002F9.exceptions",{"title":87,"path":88,"stem":89,"children":90,"status":11,"icon":20},"Packages","\u002Fdocs\u002Fpackages","1.docs\u002F3.packages\u002F1.index",[91,92,97,108,112,130,134,138,142,146,150,154],{"title":27,"path":88,"stem":89,"status":11},{"title":93,"path":94,"stem":95,"status":96},"CLI","\u002Fdocs\u002Fpackages\u002Fcli","1.docs\u002F3.packages\u002F10.cli","experimental",{"title":98,"path":99,"stem":100,"children":101,"status":11,"icon":20,"defaultOpen":20},"Events","\u002Fdocs\u002Fpackages\u002Fmessaging","1.docs\u002F3.packages\u002F11.messaging\u002F1.index",[102,104],{"title":27,"path":99,"stem":100,"status":103},"beta",{"title":105,"path":106,"stem":107,"status":96},"Redis","\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis","1.docs\u002F3.packages\u002F11.messaging\u002F2.redis",{"title":109,"path":110,"stem":111,"status":103},"Serve Static","\u002Fdocs\u002Fpackages\u002Fserve-static","1.docs\u002F3.packages\u002F12.serve-static",{"title":113,"path":114,"stem":115,"children":116,"status":11,"icon":20,"defaultOpen":20},"Auth","\u002Fdocs\u002Fpackages\u002Fauth","1.docs\u002F3.packages\u002F2.auth\u002F1.index",[117,118,122,126],{"title":27,"path":114,"stem":115,"status":103},{"title":119,"path":120,"stem":121,"status":103},"JWT Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Fjwt","1.docs\u002F3.packages\u002F2.auth\u002F2.jwt",{"title":123,"path":124,"stem":125,"status":103},"Local Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Flocal","1.docs\u002F3.packages\u002F2.auth\u002F3.local",{"title":127,"path":128,"stem":129,"status":96},"OAuth2 Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Foauth2","1.docs\u002F3.packages\u002F2.auth\u002F4.oauth2",{"title":131,"path":132,"stem":133,"status":103},"JWT","\u002Fdocs\u002Fpackages\u002Fjwt","1.docs\u002F3.packages\u002F3.jwt",{"title":135,"path":136,"stem":137,"status":103},"Drizzle","\u002Fdocs\u002Fpackages\u002Fdrizzle","1.docs\u002F3.packages\u002F4.drizzle",{"title":139,"path":140,"stem":141,"status":103},"Papr","\u002Fdocs\u002Fpackages\u002Fpapr","1.docs\u002F3.packages\u002F5.papr",{"title":143,"path":144,"stem":145,"status":103},"Mongoose","\u002Fdocs\u002Fpackages\u002Fmongoose","1.docs\u002F3.packages\u002F6.mongoose",{"title":147,"path":148,"stem":149,"status":103},"Swagger","\u002Fdocs\u002Fpackages\u002Fswagger","1.docs\u002F3.packages\u002F7.swagger",{"title":151,"path":152,"stem":153,"status":103},"Node Server","\u002Fdocs\u002Fpackages\u002Fnode-server","1.docs\u002F3.packages\u002F8.node-server",{"title":155,"path":156,"stem":157,"status":103},"uWS Server","\u002Fdocs\u002Fpackages\u002Fuws-server","1.docs\u002F3.packages\u002F9.uws-server",{"title":159,"path":160,"stem":161,"children":162,"status":11,"icon":20},"Roadmap","\u002Fdocs\u002Froadmap","1.docs\u002F4.roadmap\u002F1.index",[163,164,168,172],{"title":27,"path":160,"stem":161,"status":11},{"title":165,"path":166,"stem":167,"status":11},"Short term (0-3 months)","\u002Fdocs\u002Froadmap\u002Fshort-term","1.docs\u002F4.roadmap\u002F2.short-term",{"title":169,"path":170,"stem":171,"status":11},"Mid term (3-9 months)","\u002Fdocs\u002Froadmap\u002Fmid-term","1.docs\u002F4.roadmap\u002F3.mid-term",{"title":173,"path":174,"stem":175,"status":11},"Long term (9-12+ months)","\u002Fdocs\u002Froadmap\u002Flong-term","1.docs\u002F4.roadmap\u002F4.long-term",{"id":177,"title":131,"body":178,"description":2024,"extension":2025,"meta":2026,"navigation":378,"path":132,"seo":2027,"status":103,"stem":133,"__hash__":2028},"docs\u002F1.docs\u002F3.packages\u002F3.jwt.md",{"type":179,"value":180,"toc":2009},"minimark",[181,213,225,229,309,314,317,525,528,635,640,782,785,1053,1057,1060,1094,1234,1238,1241,1278,1378,1382,1401,1404,1454,1458,1461,1601,1604,1608,1611,1734,1744,1747,1754,1920,1924,2005],[182,183,184,188,189,196,197,200,201,204,205,208,209,212],"p",{},[185,186,187],"code",{},"@miiajs\u002Fjwt"," is a tiny, injectable JWT service for MiiaJS. It wraps ",[190,191,195],"a",{"href":192,"rel":193},"https:\u002F\u002Fgithub.com\u002Fpanva\u002Fjose",[194],"nofollow","jose"," and exposes a single ",[185,198,199],{},"JwtService"," with ",[185,202,203],{},"sign()",", ",[185,206,207],{},"verify()",", and a configurable ",[185,210,211],{},"JwtModule",".",[182,214,215,216,221,222,224],{},"It intentionally does not provide auth strategies, guards, or middleware - those live in ",[190,217,218],{"href":114},[185,219,220],{},"@miiajs\u002Fauth",", with a ready-made ",[190,223,119],{"href":120}," recipe to build on top of.",[226,227,13],"h2",{"id":228},"installation",[230,231,232,260,277,293],"code-group",{},[233,234,240],"pre",{"className":235,"code":236,"filename":237,"language":238,"meta":239,"style":239},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add @miiajs\u002Fjwt jose\n","bun","bash","",[185,241,242],{"__ignoreMap":239},[243,244,247,250,254,257],"span",{"class":245,"line":246},"line",1,[243,248,237],{"class":249},"sBMFI",[243,251,253],{"class":252},"sfazB"," add",[243,255,256],{"class":252}," @miiajs\u002Fjwt",[243,258,259],{"class":252}," jose\n",[233,261,264],{"className":235,"code":262,"filename":263,"language":238,"meta":239,"style":239},"npm install @miiajs\u002Fjwt jose\n","npm",[185,265,266],{"__ignoreMap":239},[243,267,268,270,273,275],{"class":245,"line":246},[243,269,263],{"class":249},[243,271,272],{"class":252}," install",[243,274,256],{"class":252},[243,276,259],{"class":252},[233,278,281],{"className":235,"code":279,"filename":280,"language":238,"meta":239,"style":239},"pnpm add @miiajs\u002Fjwt jose\n","pnpm",[185,282,283],{"__ignoreMap":239},[243,284,285,287,289,291],{"class":245,"line":246},[243,286,280],{"class":249},[243,288,253],{"class":252},[243,290,256],{"class":252},[243,292,259],{"class":252},[233,294,297],{"className":235,"code":295,"filename":296,"language":238,"meta":239,"style":239},"yarn add @miiajs\u002Fjwt jose\n","yarn",[185,298,299],{"__ignoreMap":239},[243,300,301,303,305,307],{"class":245,"line":246},[243,302,296],{"class":249},[243,304,253],{"class":252},[243,306,256],{"class":252},[243,308,259],{"class":252},[182,310,311,313],{},[185,312,195],{}," is a required peer dependency.",[226,315,71],{"id":316},"configuration",[233,318,322],{"className":319,"code":320,"language":321,"meta":239,"style":239},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module } from '@miiajs\u002Fcore'\nimport { JwtModule } from '@miiajs\u002Fjwt'\n\n@Module({\n  imports: [\n    JwtModule.configure({\n      secret: process.env.JWT_SECRET!,\n      algorithm: 'HS256',\n      expiresIn: '1h',\n    }),\n  ],\n})\nclass AppModule {}\n","typescript",[185,323,324,353,373,380,396,409,424,448,467,484,495,503,512],{"__ignoreMap":239},[243,325,326,330,334,338,341,344,347,350],{"class":245,"line":246},[243,327,329],{"class":328},"s7zQu","import",[243,331,333],{"class":332},"sMK4o"," {",[243,335,337],{"class":336},"sTEyZ"," Module",[243,339,340],{"class":332}," }",[243,342,343],{"class":328}," from",[243,345,346],{"class":332}," '",[243,348,349],{"class":252},"@miiajs\u002Fcore",[243,351,352],{"class":332},"'\n",[243,354,356,358,360,363,365,367,369,371],{"class":245,"line":355},2,[243,357,329],{"class":328},[243,359,333],{"class":332},[243,361,362],{"class":336}," JwtModule",[243,364,340],{"class":332},[243,366,343],{"class":328},[243,368,346],{"class":332},[243,370,187],{"class":252},[243,372,352],{"class":332},[243,374,376],{"class":245,"line":375},3,[243,377,379],{"emptyLinePlaceholder":378},true,"\n",[243,381,383,386,390,393],{"class":245,"line":382},4,[243,384,385],{"class":332},"@",[243,387,389],{"class":388},"s2Zo4","Module",[243,391,392],{"class":336},"(",[243,394,395],{"class":332},"{\n",[243,397,399,403,406],{"class":245,"line":398},5,[243,400,402],{"class":401},"swJcz","  imports",[243,404,405],{"class":332},":",[243,407,408],{"class":336}," [\n",[243,410,412,415,417,420,422],{"class":245,"line":411},6,[243,413,414],{"class":336},"    JwtModule",[243,416,212],{"class":332},[243,418,419],{"class":388},"configure",[243,421,392],{"class":336},[243,423,395],{"class":332},[243,425,427,430,432,435,437,440,442,445],{"class":245,"line":426},7,[243,428,429],{"class":401},"      secret",[243,431,405],{"class":332},[243,433,434],{"class":336}," process",[243,436,212],{"class":332},[243,438,439],{"class":336},"env",[243,441,212],{"class":332},[243,443,444],{"class":336},"JWT_SECRET",[243,446,447],{"class":332},"!,\n",[243,449,451,454,456,458,461,464],{"class":245,"line":450},8,[243,452,453],{"class":401},"      algorithm",[243,455,405],{"class":332},[243,457,346],{"class":332},[243,459,460],{"class":252},"HS256",[243,462,463],{"class":332},"'",[243,465,466],{"class":332},",\n",[243,468,470,473,475,477,480,482],{"class":245,"line":469},9,[243,471,472],{"class":401},"      expiresIn",[243,474,405],{"class":332},[243,476,346],{"class":332},[243,478,479],{"class":252},"1h",[243,481,463],{"class":332},[243,483,466],{"class":332},[243,485,487,490,493],{"class":245,"line":486},10,[243,488,489],{"class":332},"    }",[243,491,492],{"class":336},")",[243,494,466],{"class":332},[243,496,498,501],{"class":245,"line":497},11,[243,499,500],{"class":336},"  ]",[243,502,466],{"class":332},[243,504,506,509],{"class":245,"line":505},12,[243,507,508],{"class":332},"}",[243,510,511],{"class":336},")\n",[243,513,515,519,522],{"class":245,"line":514},13,[243,516,518],{"class":517},"spNyl","class",[243,520,521],{"class":249}," AppModule",[243,523,524],{"class":332}," {}\n",[182,526,527],{},"With a factory function for accessing other services from the container:",[233,529,531],{"className":319,"code":530,"language":321,"meta":239,"style":239},"import { ConfigService } from '@miiajs\u002Fconfig'\n\nJwtModule.configure((resolve) => ({\n  secret: resolve(ConfigService).getOrThrow('JWT_SECRET'),\n  expiresIn: '1h',\n}))\n",[185,532,533,553,557,583,613,628],{"__ignoreMap":239},[243,534,535,537,539,542,544,546,548,551],{"class":245,"line":246},[243,536,329],{"class":328},[243,538,333],{"class":332},[243,540,541],{"class":336}," ConfigService",[243,543,340],{"class":332},[243,545,343],{"class":328},[243,547,346],{"class":332},[243,549,550],{"class":252},"@miiajs\u002Fconfig",[243,552,352],{"class":332},[243,554,555],{"class":245,"line":355},[243,556,379],{"emptyLinePlaceholder":378},[243,558,559,561,563,565,567,569,573,575,578,581],{"class":245,"line":375},[243,560,211],{"class":336},[243,562,212],{"class":332},[243,564,419],{"class":388},[243,566,392],{"class":336},[243,568,392],{"class":332},[243,570,572],{"class":571},"sHdIc","resolve",[243,574,492],{"class":332},[243,576,577],{"class":517}," =>",[243,579,580],{"class":336}," (",[243,582,395],{"class":332},[243,584,585,588,590,593,596,598,601,603,605,607,609,611],{"class":245,"line":382},[243,586,587],{"class":401},"  secret",[243,589,405],{"class":332},[243,591,592],{"class":388}," resolve",[243,594,595],{"class":336},"(ConfigService)",[243,597,212],{"class":332},[243,599,600],{"class":388},"getOrThrow",[243,602,392],{"class":336},[243,604,463],{"class":332},[243,606,444],{"class":252},[243,608,463],{"class":332},[243,610,492],{"class":336},[243,612,466],{"class":332},[243,614,615,618,620,622,624,626],{"class":245,"line":398},[243,616,617],{"class":401},"  expiresIn",[243,619,405],{"class":332},[243,621,346],{"class":332},[243,623,479],{"class":252},[243,625,463],{"class":332},[243,627,466],{"class":332},[243,629,630,632],{"class":245,"line":411},[243,631,508],{"class":332},[243,633,634],{"class":336},"))\n",[636,637,639],"h3",{"id":638},"options","Options",[641,642,643,659],"table",{},[644,645,646],"thead",{},[647,648,649,653,656],"tr",{},[650,651,652],"th",{},"Field",[650,654,655],{},"Type",[650,657,658],{},"Description",[660,661,662,678,693,707,727,748,766],"tbody",{},[647,663,664,670,675],{},[665,666,667],"td",{},[185,668,669],{},"secret",[665,671,672],{},[185,673,674],{},"string",[665,676,677],{},"HMAC secret (required for HS algorithms)",[647,679,680,685,690],{},[665,681,682],{},[185,683,684],{},"publicKey",[665,686,687],{},[185,688,689],{},"string | CryptoKey",[665,691,692],{},"Public key for RS\u002FES\u002FEdDSA verification",[647,694,695,700,704],{},[665,696,697],{},[185,698,699],{},"privateKey",[665,701,702],{},[185,703,689],{},[665,705,706],{},"Private key for RS\u002FES\u002FEdDSA signing",[647,708,709,714,718],{},[665,710,711],{},[185,712,713],{},"algorithm",[665,715,716],{},[185,717,674],{},[665,719,720,721,204,723,726],{},"Default algorithm (",[185,722,460],{},[185,724,725],{},"RS256",", ...)",[647,728,729,734,739],{},[665,730,731],{},[185,732,733],{},"expiresIn",[665,735,736],{},[185,737,738],{},"string | number",[665,740,741,742,204,745,492],{},"Default expiration (e.g. ",[185,743,744],{},"'1h'",[185,746,747],{},"3600",[647,749,750,755,759],{},[665,751,752],{},[185,753,754],{},"issuer",[665,756,757],{},[185,758,674],{},[665,760,761,762,765],{},"Default ",[185,763,764],{},"iss"," claim",[647,767,768,773,777],{},[665,769,770],{},[185,771,772],{},"audience",[665,774,775],{},[185,776,674],{},[665,778,761,779,765],{},[185,780,781],{},"aud",[226,783,199],{"id":784},"jwtservice",[233,786,788],{"className":319,"code":787,"language":321,"meta":239,"style":239},"import { Injectable, inject } from '@miiajs\u002Fcore'\nimport { JwtService } from '@miiajs\u002Fjwt'\n\n@Injectable()\nexport class AuthService {\n  private jwtService = inject(JwtService)\n\n  async issueToken(user: { id: number; email: string }) {\n    return this.jwtService.sign({ sub: user.id, email: user.email })\n  }\n\n  async readToken(token: string) {\n    return this.jwtService.verify\u003C{ sub: number; email: string }>(token)\n  }\n}\n",[185,789,790,815,834,838,848,862,878,882,923,974,979,983,1003,1042,1047],{"__ignoreMap":239},[243,791,792,794,796,799,802,805,807,809,811,813],{"class":245,"line":246},[243,793,329],{"class":328},[243,795,333],{"class":332},[243,797,798],{"class":336}," Injectable",[243,800,801],{"class":332},",",[243,803,804],{"class":336}," inject",[243,806,340],{"class":332},[243,808,343],{"class":328},[243,810,346],{"class":332},[243,812,349],{"class":252},[243,814,352],{"class":332},[243,816,817,819,821,824,826,828,830,832],{"class":245,"line":355},[243,818,329],{"class":328},[243,820,333],{"class":332},[243,822,823],{"class":336}," JwtService",[243,825,340],{"class":332},[243,827,343],{"class":328},[243,829,346],{"class":332},[243,831,187],{"class":252},[243,833,352],{"class":332},[243,835,836],{"class":245,"line":375},[243,837,379],{"emptyLinePlaceholder":378},[243,839,840,842,845],{"class":245,"line":382},[243,841,385],{"class":332},[243,843,844],{"class":388},"Injectable",[243,846,847],{"class":336},"()\n",[243,849,850,853,856,859],{"class":245,"line":398},[243,851,852],{"class":328},"export",[243,854,855],{"class":517}," class",[243,857,858],{"class":249}," AuthService",[243,860,861],{"class":332}," {\n",[243,863,864,867,870,873,875],{"class":245,"line":411},[243,865,866],{"class":517},"  private",[243,868,869],{"class":401}," jwtService",[243,871,872],{"class":332}," =",[243,874,804],{"class":401},[243,876,877],{"class":336},"(JwtService)\n",[243,879,880],{"class":245,"line":426},[243,881,379],{"emptyLinePlaceholder":378},[243,883,884,887,890,892,895,897,899,902,904,907,910,913,915,918,921],{"class":245,"line":450},[243,885,886],{"class":517},"  async",[243,888,889],{"class":401}," issueToken",[243,891,392],{"class":332},[243,893,894],{"class":571},"user",[243,896,405],{"class":332},[243,898,333],{"class":332},[243,900,901],{"class":401}," id",[243,903,405],{"class":332},[243,905,906],{"class":249}," number",[243,908,909],{"class":332},";",[243,911,912],{"class":401}," email",[243,914,405],{"class":332},[243,916,917],{"class":249}," string",[243,919,920],{"class":332}," })",[243,922,861],{"class":332},[243,924,925,928,931,934,936,939,941,944,947,949,952,954,957,959,961,963,965,967,970,972],{"class":245,"line":469},[243,926,927],{"class":328},"    return",[243,929,930],{"class":332}," this.",[243,932,933],{"class":336},"jwtService",[243,935,212],{"class":332},[243,937,938],{"class":388},"sign",[243,940,392],{"class":401},[243,942,943],{"class":332},"{",[243,945,946],{"class":401}," sub",[243,948,405],{"class":332},[243,950,951],{"class":336}," user",[243,953,212],{"class":332},[243,955,956],{"class":336},"id",[243,958,801],{"class":332},[243,960,912],{"class":401},[243,962,405],{"class":332},[243,964,951],{"class":336},[243,966,212],{"class":332},[243,968,969],{"class":336},"email",[243,971,340],{"class":332},[243,973,511],{"class":401},[243,975,976],{"class":245,"line":486},[243,977,978],{"class":332},"  }\n",[243,980,981],{"class":245,"line":497},[243,982,379],{"emptyLinePlaceholder":378},[243,984,985,987,990,992,995,997,999,1001],{"class":245,"line":505},[243,986,886],{"class":517},[243,988,989],{"class":401}," readToken",[243,991,392],{"class":332},[243,993,994],{"class":571},"token",[243,996,405],{"class":332},[243,998,917],{"class":249},[243,1000,492],{"class":332},[243,1002,861],{"class":332},[243,1004,1005,1007,1009,1011,1013,1016,1019,1021,1023,1025,1027,1029,1031,1033,1036,1038,1040],{"class":245,"line":514},[243,1006,927],{"class":328},[243,1008,930],{"class":332},[243,1010,933],{"class":336},[243,1012,212],{"class":332},[243,1014,1015],{"class":388},"verify",[243,1017,1018],{"class":332},"\u003C{",[243,1020,946],{"class":401},[243,1022,405],{"class":332},[243,1024,906],{"class":249},[243,1026,909],{"class":332},[243,1028,912],{"class":401},[243,1030,405],{"class":332},[243,1032,917],{"class":249},[243,1034,1035],{"class":332}," }>",[243,1037,392],{"class":401},[243,1039,994],{"class":336},[243,1041,511],{"class":401},[243,1043,1045],{"class":245,"line":1044},14,[243,1046,978],{"class":332},[243,1048,1050],{"class":245,"line":1049},15,[243,1051,1052],{"class":332},"}\n",[636,1054,1056],{"id":1055},"signpayload-options","sign(payload, options?)",[182,1058,1059],{},"Signs a JWT and returns it as a compact string. Per-call options override module defaults.",[233,1061,1063],{"className":319,"code":1062,"language":321,"meta":239,"style":239},"sign(payload: JwtPayload, options?: JwtSignOptions): Promise\u003Cstring>\n",[185,1064,1065],{"__ignoreMap":239},[243,1066,1067,1069,1072,1074,1077,1080,1083,1086,1089,1091],{"class":245,"line":246},[243,1068,938],{"class":388},[243,1070,1071],{"class":336},"(payload: JwtPayload",[243,1073,801],{"class":332},[243,1075,1076],{"class":336}," options",[243,1078,1079],{"class":332},"?:",[243,1081,1082],{"class":336}," JwtSignOptions): ",[243,1084,1085],{"class":249},"Promise",[243,1087,1088],{"class":332},"\u003C",[243,1090,674],{"class":336},[243,1092,1093],{"class":332},">\n",[233,1095,1097],{"className":319,"code":1096,"language":321,"meta":239,"style":239},"await jwt.sign({ sub: userId }, {\n  expiresIn: '7d',     \u002F\u002F override module default\n  algorithm: 'HS384',  \u002F\u002F override module default\n  issuer: 'my-app',\n  audience: 'my-api',\n  subject: String(userId),\n  notBefore: '30s',\n})\n",[185,1098,1099,1127,1146,1165,1181,1197,1212,1228],{"__ignoreMap":239},[243,1100,1101,1104,1107,1109,1111,1113,1115,1117,1119,1122,1125],{"class":245,"line":246},[243,1102,1103],{"class":328},"await",[243,1105,1106],{"class":336}," jwt",[243,1108,212],{"class":332},[243,1110,938],{"class":388},[243,1112,392],{"class":336},[243,1114,943],{"class":332},[243,1116,946],{"class":401},[243,1118,405],{"class":332},[243,1120,1121],{"class":336}," userId ",[243,1123,1124],{"class":332},"},",[243,1126,861],{"class":332},[243,1128,1129,1131,1133,1135,1138,1140,1142],{"class":245,"line":355},[243,1130,617],{"class":401},[243,1132,405],{"class":332},[243,1134,346],{"class":332},[243,1136,1137],{"class":252},"7d",[243,1139,463],{"class":332},[243,1141,801],{"class":332},[243,1143,1145],{"class":1144},"sHwdD","     \u002F\u002F override module default\n",[243,1147,1148,1151,1153,1155,1158,1160,1162],{"class":245,"line":375},[243,1149,1150],{"class":401},"  algorithm",[243,1152,405],{"class":332},[243,1154,346],{"class":332},[243,1156,1157],{"class":252},"HS384",[243,1159,463],{"class":332},[243,1161,801],{"class":332},[243,1163,1164],{"class":1144},"  \u002F\u002F override module default\n",[243,1166,1167,1170,1172,1174,1177,1179],{"class":245,"line":382},[243,1168,1169],{"class":401},"  issuer",[243,1171,405],{"class":332},[243,1173,346],{"class":332},[243,1175,1176],{"class":252},"my-app",[243,1178,463],{"class":332},[243,1180,466],{"class":332},[243,1182,1183,1186,1188,1190,1193,1195],{"class":245,"line":398},[243,1184,1185],{"class":401},"  audience",[243,1187,405],{"class":332},[243,1189,346],{"class":332},[243,1191,1192],{"class":252},"my-api",[243,1194,463],{"class":332},[243,1196,466],{"class":332},[243,1198,1199,1202,1204,1207,1210],{"class":245,"line":411},[243,1200,1201],{"class":401},"  subject",[243,1203,405],{"class":332},[243,1205,1206],{"class":388}," String",[243,1208,1209],{"class":336},"(userId)",[243,1211,466],{"class":332},[243,1213,1214,1217,1219,1221,1224,1226],{"class":245,"line":426},[243,1215,1216],{"class":401},"  notBefore",[243,1218,405],{"class":332},[243,1220,346],{"class":332},[243,1222,1223],{"class":252},"30s",[243,1225,463],{"class":332},[243,1227,466],{"class":332},[243,1229,1230,1232],{"class":245,"line":450},[243,1231,508],{"class":332},[243,1233,511],{"class":336},[636,1235,1237],{"id":1236},"verifytoken-options","verify(token, options?)",[182,1239,1240],{},"Verifies and decodes a JWT. Rejects if the token is expired, the signature is invalid, or the algorithm is outside the whitelist.",[233,1242,1244],{"className":319,"code":1243,"language":321,"meta":239,"style":239},"verify\u003CT>(token: string, options?: JwtVerifyOptions): Promise\u003CT>\n",[185,1245,1246],{"__ignoreMap":239},[243,1247,1248,1250,1252,1255,1258,1261,1263,1265,1267,1270,1272,1274,1276],{"class":245,"line":246},[243,1249,1015],{"class":388},[243,1251,1088],{"class":332},[243,1253,1254],{"class":249},"T",[243,1256,1257],{"class":332},">",[243,1259,1260],{"class":336},"(token: string",[243,1262,801],{"class":332},[243,1264,1076],{"class":336},[243,1266,1079],{"class":332},[243,1268,1269],{"class":336}," JwtVerifyOptions): ",[243,1271,1085],{"class":249},[243,1273,1088],{"class":332},[243,1275,1254],{"class":336},[243,1277,1093],{"class":332},[233,1279,1281],{"className":319,"code":1280,"language":321,"meta":239,"style":239},"const payload = await jwt.verify\u003C{ sub: number }>(token, {\n  algorithms: ['HS256'],   \u002F\u002F override whitelist\n  issuer: 'my-app',\n  audience: 'my-api',\n})\n",[185,1282,1283,1320,1344,1358,1372],{"__ignoreMap":239},[243,1284,1285,1288,1291,1294,1297,1299,1301,1303,1305,1307,1309,1311,1313,1316,1318],{"class":245,"line":246},[243,1286,1287],{"class":517},"const",[243,1289,1290],{"class":336}," payload ",[243,1292,1293],{"class":332},"=",[243,1295,1296],{"class":328}," await",[243,1298,1106],{"class":336},[243,1300,212],{"class":332},[243,1302,1015],{"class":388},[243,1304,1018],{"class":332},[243,1306,946],{"class":401},[243,1308,405],{"class":332},[243,1310,906],{"class":249},[243,1312,1035],{"class":332},[243,1314,1315],{"class":336},"(token",[243,1317,801],{"class":332},[243,1319,861],{"class":332},[243,1321,1322,1325,1327,1330,1332,1334,1336,1339,1341],{"class":245,"line":355},[243,1323,1324],{"class":401},"  algorithms",[243,1326,405],{"class":332},[243,1328,1329],{"class":336}," [",[243,1331,463],{"class":332},[243,1333,460],{"class":252},[243,1335,463],{"class":332},[243,1337,1338],{"class":336},"]",[243,1340,801],{"class":332},[243,1342,1343],{"class":1144},"   \u002F\u002F override whitelist\n",[243,1345,1346,1348,1350,1352,1354,1356],{"class":245,"line":375},[243,1347,1169],{"class":401},[243,1349,405],{"class":332},[243,1351,346],{"class":332},[243,1353,1176],{"class":252},[243,1355,463],{"class":332},[243,1357,466],{"class":332},[243,1359,1360,1362,1364,1366,1368,1370],{"class":245,"line":382},[243,1361,1185],{"class":401},[243,1363,405],{"class":332},[243,1365,346],{"class":332},[243,1367,1192],{"class":252},[243,1369,463],{"class":332},[243,1371,466],{"class":332},[243,1373,1374,1376],{"class":245,"line":398},[243,1375,508],{"class":332},[243,1377,511],{"class":336},[636,1379,1381],{"id":1380},"algorithm-safety","Algorithm safety",[182,1383,1384,1386,1387,1389,1390,1392,1393,1395,1396,1398,1399,212],{},[185,1385,207],{}," enforces an algorithm whitelist. By default, only the module's configured ",[185,1388,713],{}," (or ",[185,1391,460],{}," for symmetric keys \u002F ",[185,1394,725],{}," for asymmetric) is accepted. Tokens signed with a different algorithm are rejected - this prevents algorithm confusion attacks where an attacker swaps ",[185,1397,725],{}," for ",[185,1400,460],{},[182,1402,1403],{},"Override the whitelist explicitly when you need to accept multiple algorithms:",[233,1405,1407],{"className":319,"code":1406,"language":321,"meta":239,"style":239},"await jwt.verify(token, { algorithms: ['RS256', 'ES256'] })\n",[185,1408,1409],{"__ignoreMap":239},[243,1410,1411,1413,1415,1417,1419,1421,1423,1425,1428,1430,1432,1434,1436,1438,1440,1442,1445,1447,1450,1452],{"class":245,"line":246},[243,1412,1103],{"class":328},[243,1414,1106],{"class":336},[243,1416,212],{"class":332},[243,1418,1015],{"class":388},[243,1420,1315],{"class":336},[243,1422,801],{"class":332},[243,1424,333],{"class":332},[243,1426,1427],{"class":401}," algorithms",[243,1429,405],{"class":332},[243,1431,1329],{"class":336},[243,1433,463],{"class":332},[243,1435,725],{"class":252},[243,1437,463],{"class":332},[243,1439,801],{"class":332},[243,1441,346],{"class":332},[243,1443,1444],{"class":252},"ES256",[243,1446,463],{"class":332},[243,1448,1449],{"class":336},"] ",[243,1451,508],{"class":332},[243,1453,511],{"class":336},[226,1455,1457],{"id":1456},"beyond-auth","Beyond auth",[182,1459,1460],{},"The same service powers non-HTTP use cases - anywhere you need a self-contained, signed, time-bounded token:",[233,1462,1464],{"className":319,"code":1463,"language":321,"meta":239,"style":239},"@Injectable()\nclass EmailTokens {\n  private jwtService = inject(JwtService)\n\n  async sendVerification(email: string) {\n    const token = await this.jwtService.sign(\n      { email, purpose: 'verify-email' },\n      { expiresIn: '24h' },\n    )\n    \u002F\u002F include `token` in the verification link sent to the user\n  }\n}\n",[185,1465,1466,1474,1483,1495,1499,1518,1541,1565,1583,1588,1593,1597],{"__ignoreMap":239},[243,1467,1468,1470,1472],{"class":245,"line":246},[243,1469,385],{"class":332},[243,1471,844],{"class":388},[243,1473,847],{"class":336},[243,1475,1476,1478,1481],{"class":245,"line":355},[243,1477,518],{"class":517},[243,1479,1480],{"class":249}," EmailTokens",[243,1482,861],{"class":332},[243,1484,1485,1487,1489,1491,1493],{"class":245,"line":375},[243,1486,866],{"class":517},[243,1488,869],{"class":401},[243,1490,872],{"class":332},[243,1492,804],{"class":401},[243,1494,877],{"class":336},[243,1496,1497],{"class":245,"line":382},[243,1498,379],{"emptyLinePlaceholder":378},[243,1500,1501,1503,1506,1508,1510,1512,1514,1516],{"class":245,"line":398},[243,1502,886],{"class":517},[243,1504,1505],{"class":401}," sendVerification",[243,1507,392],{"class":332},[243,1509,969],{"class":571},[243,1511,405],{"class":332},[243,1513,917],{"class":249},[243,1515,492],{"class":332},[243,1517,861],{"class":332},[243,1519,1520,1523,1526,1528,1530,1532,1534,1536,1538],{"class":245,"line":411},[243,1521,1522],{"class":517},"    const",[243,1524,1525],{"class":336}," token",[243,1527,872],{"class":332},[243,1529,1296],{"class":328},[243,1531,930],{"class":332},[243,1533,933],{"class":336},[243,1535,212],{"class":332},[243,1537,938],{"class":388},[243,1539,1540],{"class":401},"(\n",[243,1542,1543,1546,1548,1550,1553,1555,1557,1560,1562],{"class":245,"line":426},[243,1544,1545],{"class":332},"      {",[243,1547,912],{"class":336},[243,1549,801],{"class":332},[243,1551,1552],{"class":401}," purpose",[243,1554,405],{"class":332},[243,1556,346],{"class":332},[243,1558,1559],{"class":252},"verify-email",[243,1561,463],{"class":332},[243,1563,1564],{"class":332}," },\n",[243,1566,1567,1569,1572,1574,1576,1579,1581],{"class":245,"line":450},[243,1568,1545],{"class":332},[243,1570,1571],{"class":401}," expiresIn",[243,1573,405],{"class":332},[243,1575,346],{"class":332},[243,1577,1578],{"class":252},"24h",[243,1580,463],{"class":332},[243,1582,1564],{"class":332},[243,1584,1585],{"class":245,"line":469},[243,1586,1587],{"class":401},"    )\n",[243,1589,1590],{"class":245,"line":486},[243,1591,1592],{"class":1144},"    \u002F\u002F include `token` in the verification link sent to the user\n",[243,1594,1595],{"class":245,"line":497},[243,1596,978],{"class":332},[243,1598,1599],{"class":245,"line":505},[243,1600,1052],{"class":332},[182,1602,1603],{},"Common patterns: email verification links, password reset tokens, signed download URLs, CSRF double-submit cookies, webhook signatures.",[226,1605,1607],{"id":1606},"standalone-usage","Standalone usage",[182,1609,1610],{},"For scripts and workers that don't run inside a MiiaJS container, construct the service directly with options:",[233,1612,1614],{"className":319,"code":1613,"language":321,"meta":239,"style":239},"import { JwtService } from '@miiajs\u002Fjwt'\n\nconst jwt = new JwtService({\n  secret: process.env.JWT_SECRET!,\n  expiresIn: '1h',\n})\n\nconst token = await jwt.sign({ sub: 'cron-bot' })\n",[185,1615,1616,1634,1638,1656,1674,1688,1694,1698],{"__ignoreMap":239},[243,1617,1618,1620,1622,1624,1626,1628,1630,1632],{"class":245,"line":246},[243,1619,329],{"class":328},[243,1621,333],{"class":332},[243,1623,823],{"class":336},[243,1625,340],{"class":332},[243,1627,343],{"class":328},[243,1629,346],{"class":332},[243,1631,187],{"class":252},[243,1633,352],{"class":332},[243,1635,1636],{"class":245,"line":355},[243,1637,379],{"emptyLinePlaceholder":378},[243,1639,1640,1642,1645,1647,1650,1652,1654],{"class":245,"line":375},[243,1641,1287],{"class":517},[243,1643,1644],{"class":336}," jwt ",[243,1646,1293],{"class":332},[243,1648,1649],{"class":332}," new",[243,1651,823],{"class":388},[243,1653,392],{"class":336},[243,1655,395],{"class":332},[243,1657,1658,1660,1662,1664,1666,1668,1670,1672],{"class":245,"line":382},[243,1659,587],{"class":401},[243,1661,405],{"class":332},[243,1663,434],{"class":336},[243,1665,212],{"class":332},[243,1667,439],{"class":336},[243,1669,212],{"class":332},[243,1671,444],{"class":336},[243,1673,447],{"class":332},[243,1675,1676,1678,1680,1682,1684,1686],{"class":245,"line":398},[243,1677,617],{"class":401},[243,1679,405],{"class":332},[243,1681,346],{"class":332},[243,1683,479],{"class":252},[243,1685,463],{"class":332},[243,1687,466],{"class":332},[243,1689,1690,1692],{"class":245,"line":411},[243,1691,508],{"class":332},[243,1693,511],{"class":336},[243,1695,1696],{"class":245,"line":426},[243,1697,379],{"emptyLinePlaceholder":378},[243,1699,1700,1702,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1725,1728,1730,1732],{"class":245,"line":450},[243,1701,1287],{"class":517},[243,1703,1704],{"class":336}," token ",[243,1706,1293],{"class":332},[243,1708,1296],{"class":328},[243,1710,1106],{"class":336},[243,1712,212],{"class":332},[243,1714,938],{"class":388},[243,1716,392],{"class":336},[243,1718,943],{"class":332},[243,1720,946],{"class":401},[243,1722,405],{"class":332},[243,1724,346],{"class":332},[243,1726,1727],{"class":252},"cron-bot",[243,1729,463],{"class":332},[243,1731,340],{"class":332},[243,1733,511],{"class":336},[182,1735,1736,1737,1739,1740,1743],{},"When constructed without options, ",[185,1738,199],{}," resolves ",[185,1741,1742],{},"JWT_OPTIONS"," from the active container - that's the normal DI path.",[226,1745,33],{"id":1746},"testing",[182,1748,1749,1750,1753],{},"Use ",[185,1751,1752],{},"TestApp"," to resolve the service:",[233,1755,1757],{"className":319,"code":1756,"language":321,"meta":239,"style":239},"const app = await TestApp.create(AppModule).compile()\nconst jwt = app.resolve(JwtService)\nconst token = await jwt.sign({ sub: '1' })\n\nconst res = await app.request('GET', '\u002Fapi\u002Fme', {\n  headers: { authorization: `Bearer ${token}` },\n})\n",[185,1758,1759,1788,1805,1840,1844,1884,1914],{"__ignoreMap":239},[243,1760,1761,1763,1766,1768,1770,1773,1775,1778,1781,1783,1786],{"class":245,"line":246},[243,1762,1287],{"class":517},[243,1764,1765],{"class":336}," app ",[243,1767,1293],{"class":332},[243,1769,1296],{"class":328},[243,1771,1772],{"class":336}," TestApp",[243,1774,212],{"class":332},[243,1776,1777],{"class":388},"create",[243,1779,1780],{"class":336},"(AppModule)",[243,1782,212],{"class":332},[243,1784,1785],{"class":388},"compile",[243,1787,847],{"class":336},[243,1789,1790,1792,1794,1796,1799,1801,1803],{"class":245,"line":355},[243,1791,1287],{"class":517},[243,1793,1644],{"class":336},[243,1795,1293],{"class":332},[243,1797,1798],{"class":336}," app",[243,1800,212],{"class":332},[243,1802,572],{"class":388},[243,1804,877],{"class":336},[243,1806,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1834,1836,1838],{"class":245,"line":375},[243,1808,1287],{"class":517},[243,1810,1704],{"class":336},[243,1812,1293],{"class":332},[243,1814,1296],{"class":328},[243,1816,1106],{"class":336},[243,1818,212],{"class":332},[243,1820,938],{"class":388},[243,1822,392],{"class":336},[243,1824,943],{"class":332},[243,1826,946],{"class":401},[243,1828,405],{"class":332},[243,1830,346],{"class":332},[243,1832,1833],{"class":252},"1",[243,1835,463],{"class":332},[243,1837,340],{"class":332},[243,1839,511],{"class":336},[243,1841,1842],{"class":245,"line":382},[243,1843,379],{"emptyLinePlaceholder":378},[243,1845,1846,1848,1851,1853,1855,1857,1859,1862,1864,1866,1869,1871,1873,1875,1878,1880,1882],{"class":245,"line":398},[243,1847,1287],{"class":517},[243,1849,1850],{"class":336}," res ",[243,1852,1293],{"class":332},[243,1854,1296],{"class":328},[243,1856,1798],{"class":336},[243,1858,212],{"class":332},[243,1860,1861],{"class":388},"request",[243,1863,392],{"class":336},[243,1865,463],{"class":332},[243,1867,1868],{"class":252},"GET",[243,1870,463],{"class":332},[243,1872,801],{"class":332},[243,1874,346],{"class":332},[243,1876,1877],{"class":252},"\u002Fapi\u002Fme",[243,1879,463],{"class":332},[243,1881,801],{"class":332},[243,1883,861],{"class":332},[243,1885,1886,1889,1891,1893,1896,1898,1901,1904,1907,1909,1912],{"class":245,"line":411},[243,1887,1888],{"class":401},"  headers",[243,1890,405],{"class":332},[243,1892,333],{"class":332},[243,1894,1895],{"class":401}," authorization",[243,1897,405],{"class":332},[243,1899,1900],{"class":332}," `",[243,1902,1903],{"class":252},"Bearer ",[243,1905,1906],{"class":332},"${",[243,1908,994],{"class":336},[243,1910,1911],{"class":332},"}`",[243,1913,1564],{"class":332},[243,1915,1916,1918],{"class":245,"line":426},[243,1917,508],{"class":332},[243,1919,511],{"class":336},[226,1921,1923],{"id":1922},"exports","Exports",[233,1925,1927],{"className":319,"code":1926,"language":321,"meta":239,"style":239},"import {\n  JwtModule,\n  JwtService,\n  JWT_OPTIONS,\n  type JwtOptions,\n  type JwtPayload,\n  type JwtSignOptions,\n  type JwtVerifyOptions,\n} from '@miiajs\u002Fjwt'\n",[185,1928,1929,1935,1942,1949,1956,1966,1975,1984,1993],{"__ignoreMap":239},[243,1930,1931,1933],{"class":245,"line":246},[243,1932,329],{"class":328},[243,1934,861],{"class":332},[243,1936,1937,1940],{"class":245,"line":355},[243,1938,1939],{"class":336},"  JwtModule",[243,1941,466],{"class":332},[243,1943,1944,1947],{"class":245,"line":375},[243,1945,1946],{"class":336},"  JwtService",[243,1948,466],{"class":332},[243,1950,1951,1954],{"class":245,"line":382},[243,1952,1953],{"class":336},"  JWT_OPTIONS",[243,1955,466],{"class":332},[243,1957,1958,1961,1964],{"class":245,"line":398},[243,1959,1960],{"class":328},"  type",[243,1962,1963],{"class":336}," JwtOptions",[243,1965,466],{"class":332},[243,1967,1968,1970,1973],{"class":245,"line":411},[243,1969,1960],{"class":328},[243,1971,1972],{"class":336}," JwtPayload",[243,1974,466],{"class":332},[243,1976,1977,1979,1982],{"class":245,"line":426},[243,1978,1960],{"class":328},[243,1980,1981],{"class":336}," JwtSignOptions",[243,1983,466],{"class":332},[243,1985,1986,1988,1991],{"class":245,"line":450},[243,1987,1960],{"class":328},[243,1989,1990],{"class":336}," JwtVerifyOptions",[243,1992,466],{"class":332},[243,1994,1995,1997,1999,2001,2003],{"class":245,"line":469},[243,1996,508],{"class":332},[243,1998,343],{"class":328},[243,2000,346],{"class":332},[243,2002,187],{"class":252},[243,2004,352],{"class":332},[2006,2007,2008],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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}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}",{"title":239,"searchDepth":355,"depth":355,"links":2010},[2011,2012,2015,2020,2021,2022,2023],{"id":228,"depth":355,"text":13},{"id":316,"depth":355,"text":71,"children":2013},[2014],{"id":638,"depth":375,"text":639},{"id":784,"depth":355,"text":199,"children":2016},[2017,2018,2019],{"id":1055,"depth":375,"text":1056},{"id":1236,"depth":375,"text":1237},{"id":1380,"depth":375,"text":1381},{"id":1456,"depth":355,"text":1457},{"id":1606,"depth":355,"text":1607},{"id":1746,"depth":355,"text":33},{"id":1922,"depth":355,"text":1923},"Injectable JwtService for signing and verifying JSON Web Tokens - a thin wrapper around jose.","md",{},{"title":131,"description":2024},"MNO1YAn0_KyKKZQrPeb6WhyUEYcUrTnHA6pINL_vPOk",[2030,2032],{"title":127,"path":128,"stem":129,"description":2031,"children":-1},"GitHub login as both a server-side redirect flow and an AuthProvider that verifies external access tokens.",{"title":135,"path":136,"stem":137,"description":2033,"children":-1},"Drizzle ORM integration for PostgreSQL, MySQL, and SQLite.",1778575273891]