Skip to content

Commit e8429c6

Browse files
authored
feat: expose TOKEN_ERROR_CODES and derive duplicated error code types from it (#573)
* feat: expose TOKEN_ERROR_CODES and derive duplicated error code types from it * chore: avoid repeating error codes in TokenError class declaration * test: validate TOKEN_ERROR_CODES is a record of TokenValidationErrorCodes * test: additional type tests * test: fix typo * test: do not check each key individually * test: additional type tests
1 parent ad60c83 commit e8429c6

2 files changed

Lines changed: 34 additions & 39 deletions

File tree

src/index.d.ts

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,47 +14,12 @@ export type Algorithm =
1414
| 'PS512'
1515
| 'EdDSA'
1616

17-
export type TokenValidationErrorCode =
18-
| 'FAST_JWT_INVALID_TYPE'
19-
| 'FAST_JWT_INVALID_OPTION'
20-
| 'FAST_JWT_INVALID_ALGORITHM'
21-
| 'FAST_JWT_INVALID_CLAIM_TYPE'
22-
| 'FAST_JWT_INVALID_CLAIM_VALUE'
23-
| 'FAST_JWT_INVALID_KEY'
24-
| 'FAST_JWT_INVALID_SIGNATURE'
25-
| 'FAST_JWT_INVALID_PAYLOAD'
26-
| 'FAST_JWT_MALFORMED'
27-
| 'FAST_JWT_INACTIVE'
28-
| 'FAST_JWT_EXPIRED'
29-
| 'FAST_JWT_MISSING_KEY'
30-
| 'FAST_JWT_KEY_FETCHING_ERROR'
31-
| 'FAST_JWT_SIGN_ERROR'
32-
| 'FAST_JWT_VERIFY_ERROR'
33-
| 'FAST_JWT_MISSING_REQUIRED_CLAIM'
34-
| 'FAST_JWT_MISSING_SIGNATURE'
17+
export type TokenValidationErrorCode = typeof TOKEN_ERROR_CODES[keyof typeof TOKEN_ERROR_CODES]
3518

3619
declare class TokenError extends Error {
3720
constructor(code: TokenValidationErrorCode, message?: string, additional?: { [key: string]: any });
3821
static wrap(originalError: Error, code: TokenValidationErrorCode, message: string): TokenError
39-
static codes: {
40-
invalidType: 'FAST_JWT_INVALID_TYPE'
41-
invalidOption: 'FAST_JWT_INVALID_OPTION'
42-
invalidAlgorithm: 'FAST_JWT_INVALID_ALGORITHM'
43-
invalidClaimType: 'FAST_JWT_INVALID_CLAIM_TYPE'
44-
invalidClaimValue: 'FAST_JWT_INVALID_CLAIM_VALUE'
45-
invalidKey: 'FAST_JWT_INVALID_KEY'
46-
invalidSignature: 'FAST_JWT_INVALID_SIGNATURE'
47-
invalidPayload: 'FAST_JWT_INVALID_PAYLOAD'
48-
malformed: 'FAST_JWT_MALFORMED'
49-
inactive: 'FAST_JWT_INACTIVE'
50-
expired: 'FAST_JWT_EXPIRED'
51-
missingKey: 'FAST_JWT_MISSING_KEY'
52-
keyFetchingError: 'FAST_JWT_KEY_FETCHING_ERROR'
53-
signError: 'FAST_JWT_SIGN_ERROR'
54-
verifyError: 'FAST_JWT_VERIFY_ERROR'
55-
missingRequiredClaim: 'FAST_JWT_MISSING_REQUIRED_CLAIM'
56-
missingSignature: 'FAST_JWT_MISSING_SIGNATURE'
57-
}
22+
static codes: typeof TOKEN_ERROR_CODES
5823

5924
code: TokenValidationErrorCode;
6025
[key: string]: any
@@ -149,6 +114,26 @@ export interface PrivateKey {
149114
passphrase: string | undefined
150115
}
151116

117+
export const TOKEN_ERROR_CODES: {
118+
readonly invalidType: 'FAST_JWT_INVALID_TYPE';
119+
readonly invalidOption: 'FAST_JWT_INVALID_OPTION';
120+
readonly invalidAlgorithm: 'FAST_JWT_INVALID_ALGORITHM';
121+
readonly invalidClaimType: 'FAST_JWT_INVALID_CLAIM_TYPE';
122+
readonly invalidClaimValue: 'FAST_JWT_INVALID_CLAIM_VALUE';
123+
readonly invalidKey: 'FAST_JWT_INVALID_KEY';
124+
readonly invalidSignature: 'FAST_JWT_INVALID_SIGNATURE';
125+
readonly invalidPayload: 'FAST_JWT_INVALID_PAYLOAD';
126+
readonly malformed: 'FAST_JWT_MALFORMED';
127+
readonly inactive: 'FAST_JWT_INACTIVE';
128+
readonly expired: 'FAST_JWT_EXPIRED';
129+
readonly missingKey: 'FAST_JWT_MISSING_KEY';
130+
readonly keyFetchingError: 'FAST_JWT_KEY_FETCHING_ERROR';
131+
readonly signError: 'FAST_JWT_SIGN_ERROR';
132+
readonly verifyError: 'FAST_JWT_VERIFY_ERROR';
133+
readonly missingRequiredClaim: 'FAST_JWT_MISSING_REQUIRED_CLAIM';
134+
readonly missingSignature: 'FAST_JWT_MISSING_SIGNATURE';
135+
};
136+
152137
export function createSigner<T = SignerPayload>(
153138
options?: Partial<SignerOptions & { key: Bufferable | PrivateKey }>
154139
): typeof SignerSync<T>

test/types.spec.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
DecodedJwt,
1010
JwtHeader,
1111
TokenError,
12-
TokenValidationErrorCode
12+
TokenValidationErrorCode,
13+
TOKEN_ERROR_CODES
1314
} from '..'
1415

1516
// Signing
@@ -171,9 +172,18 @@ const signerOptionsNoAlg = {
171172
}
172173
expectNotAssignable<JwtHeader>(signerOptionsNoAlg.header)
173174

174-
// Check all errors are typed correctly
175+
// Check object and class static matches their own type
176+
expectType<typeof TOKEN_ERROR_CODES>(TOKEN_ERROR_CODES)
177+
expectType<typeof TOKEN_ERROR_CODES>(TokenError.codes)
178+
179+
// Check all enum values are assignable to TokenValidationErrorCode union
180+
expectType<TokenValidationErrorCode[]>(Object.values(TOKEN_ERROR_CODES))
175181
expectType<TokenValidationErrorCode[]>(Object.values(TokenError.codes))
176182

183+
// Check enums resolve to correct string literals
184+
const code: TokenValidationErrorCode = TOKEN_ERROR_CODES.expired
185+
expectType<"FAST_JWT_EXPIRED">(code)
186+
177187
const decodedJwt: DecodedJwt = {
178188
header: { alg: 'RS256', typ: 'JWT' },
179189
payload: { sub: '12345', iss: 'iss' },

0 commit comments

Comments
 (0)