@ooneex/jwt 0.0.18 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,49 +1,35 @@
1
1
  # @ooneex/jwt
2
2
 
3
- A JWT (JSON Web Token) generation and validation library for TypeScript applications using the JOSE library. This package provides secure token creation, verification, and payload extraction with full TypeScript support and expiration time helpers.
3
+ JWT authentication toolkit using the JOSE library -- generate, sign, verify, and decode JSON Web Tokens with support for multiple algorithms.
4
4
 
5
5
  ![Bun](https://img.shields.io/badge/Bun-Compatible-orange?style=flat-square&logo=bun)
6
- ![Deno](https://img.shields.io/badge/Deno-Compatible-blue?style=flat-square&logo=deno)
7
- ![Node.js](https://img.shields.io/badge/Node.js-Compatible-green?style=flat-square&logo=node.js)
8
6
  ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue?style=flat-square&logo=typescript)
9
7
  ![MIT License](https://img.shields.io/badge/License-MIT-yellow?style=flat-square)
10
8
 
11
9
  ## Features
12
10
 
13
- ✅ **JOSE Powered** - Built on the robust JOSE library for secure JWT operations
11
+ ✅ **JOSE Powered** - Built on the robust JOSE library for secure JWT operations with HS256 signing
14
12
 
15
- ✅ **Token Generation** - Create signed JWT tokens with custom payloads and headers
13
+ ✅ **Token Generation** - Create signed JWT tokens with custom payloads and protected headers
16
14
 
17
- ✅ **Token Validation** - Verify token signatures and expiration
15
+ ✅ **Token Validation** - Verify token signatures and expiration via jwtVerify
18
16
 
19
- ✅ **Payload Extraction** - Decode and retrieve payload data from tokens
17
+ ✅ **Payload Extraction** - Decode and retrieve payload and header data from tokens without verification
20
18
 
21
- ✅ **Flexible Expiration** - Support for various expiration formats (seconds, minutes, hours, days)
19
+ ✅ **Flexible Expiration** - Support for various expiration formats (seconds, minutes, hours, days, weeks, years)
22
20
 
23
21
  ✅ **Type-Safe** - Full TypeScript support with generic payload types
24
22
 
25
- ✅ **Environment Config** - Automatic secret loading from environment variables
23
+ ✅ **Standard Claims** - Built-in support for iss, sub, aud, exp, iat, nbf, and jti claims
26
24
 
27
- ## Installation
25
+ **Dependency Injection** - Injectable via @ooneex/container for seamless DI integration
28
26
 
29
- ### Bun
30
- ```bash
31
- bun add @ooneex/jwt
32
- ```
27
+ **Environment Config** - Automatic secret loading from JWT_SECRET environment variable
33
28
 
34
- ### pnpm
35
- ```bash
36
- pnpm add @ooneex/jwt
37
- ```
38
-
39
- ### Yarn
40
- ```bash
41
- yarn add @ooneex/jwt
42
- ```
29
+ ## Installation
43
30
 
44
- ### npm
45
31
  ```bash
46
- npm install @ooneex/jwt
32
+ bun add @ooneex/jwt
47
33
  ```
48
34
 
49
35
  ## Usage
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import*as r from"jose";import{Exception as f}from"@ooneex/exception";import{HttpStatus as T}from"@ooneex/http-status";class o extends f{constructor(e,s={}){super(e,{status:T.Code.InternalServerError,data:s});this.name="JwtException"}}class l{secret;constructor(e){if(e=e||Bun.env.JWT_SECRET||"",!e)throw new o("JWT secret is required. Please provide a secret either through the constructor options or set the JWT_SECRET environment variable.");this.secret=new TextEncoder().encode(e)}async create(e){let w=e?.payload??{},{iss:a,sub:n,aud:i,exp:c,iat:d,jti:p,nbf:u,...y}=w,t=new r.SignJWT(y).setProtectedHeader({...{alg:"HS256"},...e?.header??{}});if(a)t.setIssuer(a);if(n)t.setSubject(n);if(i)t.setAudience(i);if(c)t.setExpirationTime(c??"1h");if(d)t.setIssuedAt(d);if(u)t.setNotBefore(u);if(p)t.setJti(p);return await t.sign(this.secret)}getSecret(){return this.secret}async isValid(e){try{return await r.jwtVerify(e,this.secret),!0}catch(s){return!1}}getHeader(e){return r.decodeProtectedHeader(e)}getPayload(e){return r.decodeJwt(e)}}export{o as JwtException,l as Jwt};
2
+ var y=function(e,t,a,n){var i=arguments.length,r=i<3?t:n===null?n=Object.getOwnPropertyDescriptor(t,a):n,c;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")r=Reflect.decorate(e,t,a,n);else for(var d=e.length-1;d>=0;d--)if(c=e[d])r=(i<3?c(r):i>3?c(t,a,r):c(t,a))||r;return i>3&&r&&Object.defineProperty(t,a,r),r};var T=(e,t)=>{if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(e,t)};import{injectable as g}from"@ooneex/container";import*as s from"jose";import{Exception as w}from"@ooneex/exception";import{HttpStatus as J}from"@ooneex/http-status";class p extends w{constructor(e,t={}){super(e,{status:J.Code.InternalServerError,data:t});this.name="JwtException"}}class u{secret;constructor(e){if(e=e||Bun.env.JWT_SECRET,!e)throw new p("JWT secret is required. Please provide a secret either through the constructor options or set the JWT_SECRET environment variable.");this.secret=new TextEncoder().encode(e)}async create(e){let a=e?.payload??{},{iss:n,sub:i,aud:r,exp:c,iat:d,jti:l,nbf:f,...m}=a,o=new s.SignJWT(m).setProtectedHeader({...{alg:"HS256"},...e?.header??{}});if(n)o.setIssuer(n);if(i)o.setSubject(i);if(r)o.setAudience(r);if(c)o.setExpirationTime(c??"1h");if(d)o.setIssuedAt(d);if(f)o.setNotBefore(f);if(l)o.setJti(l);return await o.sign(this.secret)}getSecret(){return this.secret}async isValid(e){try{return await s.jwtVerify(e,this.secret),!0}catch(t){return!1}}getHeader(e){return s.decodeProtectedHeader(e)}getPayload(e){return s.decodeJwt(e)}}u=y([g(),T("design:paramtypes",[String])],u);export{p as JwtException,u as Jwt};
3
3
 
4
- //# debugId=4D91E005A55822E964756E2164756E21
4
+ //# debugId=21941014F4FC9FC464756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["src/Jwt.ts", "src/JwtException.ts"],
4
4
  "sourcesContent": [
5
- "import type { JWTHeaderParameters } from \"jose\";\nimport * as jose from \"jose\";\nimport { JwtException } from \"./JwtException\";\nimport type { IJwt, JwtDefaultPayloadType, JwtPayloadType } from \"./types\";\n\nexport class Jwt implements IJwt {\n private secret: Uint8Array<ArrayBuffer>;\n\n constructor(secret?: string) {\n secret = secret || Bun.env.JWT_SECRET || \"\";\n\n if (!secret) {\n throw new JwtException(\n \"JWT secret is required. Please provide a secret either through the constructor options or set the JWT_SECRET environment variable.\",\n );\n }\n\n this.secret = new TextEncoder().encode(secret);\n }\n public async create<T extends Record<string, unknown> = Record<string, unknown>>(config?: {\n payload?: JwtDefaultPayloadType & JwtPayloadType<T>;\n header?: JWTHeaderParameters;\n }): Promise<string> {\n const alg = \"HS256\";\n const payload: JwtDefaultPayloadType = config?.payload ?? {};\n\n const { iss, sub, aud, exp, iat, jti, nbf, ...rest } = payload;\n\n const token = new jose.SignJWT(rest).setProtectedHeader({ ...{ alg }, ...(config?.header ?? {}) });\n\n if (iss) {\n token.setIssuer(iss);\n }\n\n if (sub) {\n token.setSubject(sub);\n }\n\n if (aud) {\n token.setAudience(aud);\n }\n\n if (exp) {\n token.setExpirationTime(exp ?? \"1h\");\n }\n\n if (iat) {\n token.setIssuedAt(iat);\n }\n\n if (nbf) {\n token.setNotBefore(nbf);\n }\n\n if (jti) {\n token.setJti(jti);\n }\n\n return await token.sign(this.secret);\n }\n\n public getSecret(): Uint8Array<ArrayBuffer> {\n return this.secret;\n }\n\n public async isValid(token: string): Promise<boolean> {\n try {\n await jose.jwtVerify(token, this.secret);\n\n return true;\n } catch (_error) {\n return false;\n }\n }\n\n public getHeader<T = JWTHeaderParameters>(token: string): T {\n return jose.decodeProtectedHeader(token) as T;\n }\n\n public getPayload<T extends Record<string, unknown> = Record<string, unknown>>(token: string): JwtPayloadType<T> {\n return jose.decodeJwt(token) as JwtPayloadType<T>;\n }\n}\n",
5
+ "import { injectable } from \"@ooneex/container\";\nimport type { JWTHeaderParameters } from \"jose\";\nimport * as jose from \"jose\";\nimport { JwtException } from \"./JwtException\";\nimport type { IJwt, JwtDefaultPayloadType, JwtPayloadType } from \"./types\";\n\n@injectable()\nexport class Jwt implements IJwt {\n private secret: Uint8Array<ArrayBuffer>;\n\n constructor(secret?: string) {\n secret = secret || Bun.env.JWT_SECRET;\n\n if (!secret) {\n throw new JwtException(\n \"JWT secret is required. Please provide a secret either through the constructor options or set the JWT_SECRET environment variable.\",\n );\n }\n\n this.secret = new TextEncoder().encode(secret);\n }\n\n public async create<T extends Record<string, unknown> = Record<string, unknown>>(config?: {\n payload?: JwtDefaultPayloadType & JwtPayloadType<T>;\n header?: JWTHeaderParameters;\n }): Promise<string> {\n const alg = \"HS256\";\n const payload: JwtDefaultPayloadType = config?.payload ?? {};\n\n const { iss, sub, aud, exp, iat, jti, nbf, ...rest } = payload;\n\n const token = new jose.SignJWT(rest).setProtectedHeader({ ...{ alg }, ...(config?.header ?? {}) });\n\n if (iss) {\n token.setIssuer(iss);\n }\n\n if (sub) {\n token.setSubject(sub);\n }\n\n if (aud) {\n token.setAudience(aud);\n }\n\n if (exp) {\n token.setExpirationTime(exp ?? \"1h\");\n }\n\n if (iat) {\n token.setIssuedAt(iat);\n }\n\n if (nbf) {\n token.setNotBefore(nbf);\n }\n\n if (jti) {\n token.setJti(jti);\n }\n\n return await token.sign(this.secret);\n }\n\n public getSecret(): Uint8Array<ArrayBuffer> {\n return this.secret;\n }\n\n public async isValid(token: string): Promise<boolean> {\n try {\n await jose.jwtVerify(token, this.secret);\n\n return true;\n } catch (_error) {\n return false;\n }\n }\n\n public getHeader<T = JWTHeaderParameters>(token: string): T {\n return jose.decodeProtectedHeader(token) as T;\n }\n\n public getPayload<T extends Record<string, unknown> = Record<string, unknown>>(token: string): JwtPayloadType<T> {\n return jose.decodeJwt(token) as JwtPayloadType<T>;\n }\n}\n",
6
6
  "import { Exception } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\n\nexport class JwtException extends Exception {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, {\n status: HttpStatus.Code.InternalServerError,\n data,\n });\n\n this.name = \"JwtException\";\n }\n}\n"
7
7
  ],
8
- "mappings": ";AACA,uBCDA,oBAAS,0BACT,qBAAS,4BAEF,MAAM,UAAqB,CAAU,CAC1C,WAAW,CAAC,EAAiB,EAAgC,CAAC,EAAG,CAC/D,MAAM,EAAS,CACb,OAAQ,EAAW,KAAK,oBACxB,MACF,CAAC,EAED,KAAK,KAAO,eAEhB,CDPO,MAAM,CAAoB,CACvB,OAER,WAAW,CAAC,EAAiB,CAG3B,GAFA,EAAS,GAAU,IAAI,IAAI,YAAc,GAErC,CAAC,EACH,MAAM,IAAI,EACR,oIACF,EAGF,KAAK,OAAS,IAAI,YAAY,EAAE,OAAO,CAAM,OAElC,OAAmE,CAAC,EAG7D,CAElB,IAAM,EAAiC,GAAQ,SAAW,CAAC,GAEnD,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,SAAQ,GAAS,EAEjD,EAAQ,IAAS,UAAQ,CAAI,EAAE,mBAAmB,IAAK,CAAE,IALnD,OAKuD,KAAO,GAAQ,QAAU,CAAC,CAAG,CAAC,EAEjG,GAAI,EACF,EAAM,UAAU,CAAG,EAGrB,GAAI,EACF,EAAM,WAAW,CAAG,EAGtB,GAAI,EACF,EAAM,YAAY,CAAG,EAGvB,GAAI,EACF,EAAM,kBAAkB,GAAO,IAAI,EAGrC,GAAI,EACF,EAAM,YAAY,CAAG,EAGvB,GAAI,EACF,EAAM,aAAa,CAAG,EAGxB,GAAI,EACF,EAAM,OAAO,CAAG,EAGlB,OAAO,MAAM,EAAM,KAAK,KAAK,MAAM,EAG9B,SAAS,EAA4B,CAC1C,OAAO,KAAK,YAGD,QAAO,CAAC,EAAiC,CACpD,GAAI,CAGF,OAFA,MAAW,YAAU,EAAO,KAAK,MAAM,EAEhC,GACP,MAAO,EAAQ,CACf,MAAO,IAIJ,SAAkC,CAAC,EAAkB,CAC1D,OAAY,wBAAsB,CAAK,EAGlC,UAAuE,CAAC,EAAkC,CAC/G,OAAY,YAAU,CAAK,EAE/B",
9
- "debugId": "4D91E005A55822E964756E2164756E21",
8
+ "mappings": ";ybAAA,qBAAS,0BAET,uBCFA,oBAAS,0BACT,qBAAS,4BAEF,MAAM,UAAqB,CAAU,CAC1C,WAAW,CAAC,EAAiB,EAAgC,CAAC,EAAG,CAC/D,MAAM,EAAS,CACb,OAAQ,EAAW,KAAK,oBACxB,MACF,CAAC,EAED,KAAK,KAAO,eAEhB,CDLO,MAAM,CAAoB,CACvB,OAER,WAAW,CAAC,EAAiB,CAG3B,GAFA,EAAS,GAAU,IAAI,IAAI,WAEvB,CAAC,EACH,MAAM,IAAI,EACR,oIACF,EAGF,KAAK,OAAS,IAAI,YAAY,EAAE,OAAO,CAAM,OAGlC,OAAmE,CAAC,EAG7D,CAElB,IAAM,EAAiC,GAAQ,SAAW,CAAC,GAEnD,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,SAAQ,GAAS,EAEjD,EAAQ,IAAS,UAAQ,CAAI,EAAE,mBAAmB,IAAK,CAAE,IALnD,OAKuD,KAAO,GAAQ,QAAU,CAAC,CAAG,CAAC,EAEjG,GAAI,EACF,EAAM,UAAU,CAAG,EAGrB,GAAI,EACF,EAAM,WAAW,CAAG,EAGtB,GAAI,EACF,EAAM,YAAY,CAAG,EAGvB,GAAI,EACF,EAAM,kBAAkB,GAAO,IAAI,EAGrC,GAAI,EACF,EAAM,YAAY,CAAG,EAGvB,GAAI,EACF,EAAM,aAAa,CAAG,EAGxB,GAAI,EACF,EAAM,OAAO,CAAG,EAGlB,OAAO,MAAM,EAAM,KAAK,KAAK,MAAM,EAG9B,SAAS,EAA4B,CAC1C,OAAO,KAAK,YAGD,QAAO,CAAC,EAAiC,CACpD,GAAI,CAGF,OAFA,MAAW,YAAU,EAAO,KAAK,MAAM,EAEhC,GACP,MAAO,EAAQ,CACf,MAAO,IAIJ,SAAkC,CAAC,EAAkB,CAC1D,OAAY,wBAAsB,CAAK,EAGlC,UAAuE,CAAC,EAAkC,CAC/G,OAAY,YAAU,CAAK,EAE/B,CA9Ea,EAAN,GADN,EAAW,EACL,iCAAM",
9
+ "debugId": "21941014F4FC9FC464756E2164756E21",
10
10
  "names": []
11
11
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ooneex/jwt",
3
- "description": "JWT token generation and validation using the JOSE library for secure authentication",
4
- "version": "0.0.18",
3
+ "description": "JWT authentication toolkit using the JOSE library — generate, sign, verify, and decode JSON Web Tokens with support for multiple algorithms",
4
+ "version": "1.0.0",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
@@ -28,8 +28,9 @@
28
28
  "test": "bun test tests"
29
29
  },
30
30
  "dependencies": {
31
- "@ooneex/exception": "0.0.17",
32
- "@ooneex/http-status": "0.0.17",
31
+ "@ooneex/exception": "0.0.18",
32
+ "@ooneex/container": "0.0.19",
33
+ "@ooneex/http-status": "0.0.18",
33
34
  "jose": "^6.1.2"
34
35
  },
35
36
  "devDependencies": {},