@konker.dev/neverthrow-r-auth-utils 0.0.1

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.
Files changed (67) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +3 -0
  3. package/dist/aws-authorizer.d.ts +7 -0
  4. package/dist/aws-authorizer.d.ts.map +1 -0
  5. package/dist/aws-authorizer.js +28 -0
  6. package/dist/aws-authorizer.js.map +1 -0
  7. package/dist/basic-auth.d.ts +25 -0
  8. package/dist/basic-auth.d.ts.map +1 -0
  9. package/dist/basic-auth.js +37 -0
  10. package/dist/basic-auth.js.map +1 -0
  11. package/dist/helpers.d.ts +4 -0
  12. package/dist/helpers.d.ts.map +1 -0
  13. package/dist/helpers.js +13 -0
  14. package/dist/helpers.js.map +1 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/jwt/common.d.ts +16 -0
  20. package/dist/jwt/common.d.ts.map +1 -0
  21. package/dist/jwt/common.js +22 -0
  22. package/dist/jwt/common.js.map +1 -0
  23. package/dist/jwt/common.test.d.ts +2 -0
  24. package/dist/jwt/common.test.d.ts.map +1 -0
  25. package/dist/jwt/common.test.js +53 -0
  26. package/dist/jwt/common.test.js.map +1 -0
  27. package/dist/jwt/index.d.ts +16 -0
  28. package/dist/jwt/index.d.ts.map +1 -0
  29. package/dist/jwt/index.js +23 -0
  30. package/dist/jwt/index.js.map +1 -0
  31. package/dist/jwt/index.test.d.ts +4 -0
  32. package/dist/jwt/index.test.d.ts.map +1 -0
  33. package/dist/jwt/index.test.js +73 -0
  34. package/dist/jwt/index.test.js.map +1 -0
  35. package/dist/jwt/rsa.d.ts +15 -0
  36. package/dist/jwt/rsa.d.ts.map +1 -0
  37. package/dist/jwt/rsa.js +22 -0
  38. package/dist/jwt/rsa.js.map +1 -0
  39. package/dist/jwt/rsa.test.d.ts +2 -0
  40. package/dist/jwt/rsa.test.d.ts.map +1 -0
  41. package/dist/jwt/rsa.test.js +64 -0
  42. package/dist/jwt/rsa.test.js.map +1 -0
  43. package/dist/lib/toError.d.ts +2 -0
  44. package/dist/lib/toError.d.ts.map +1 -0
  45. package/dist/lib/toError.js +2 -0
  46. package/dist/lib/toError.js.map +1 -0
  47. package/dist/lib/toError.test.d.ts +2 -0
  48. package/dist/lib/toError.test.d.ts.map +1 -0
  49. package/dist/lib/toError.test.js +14 -0
  50. package/dist/lib/toError.test.js.map +1 -0
  51. package/dist/test/fixtures/jwt.d.ts +16 -0
  52. package/dist/test/fixtures/jwt.d.ts.map +1 -0
  53. package/dist/test/fixtures/jwt.js +13 -0
  54. package/dist/test/fixtures/jwt.js.map +1 -0
  55. package/dist/test/fixtures/test-jwt-rsa-keys.d.ts +4 -0
  56. package/dist/test/fixtures/test-jwt-rsa-keys.d.ts.map +1 -0
  57. package/dist/test/fixtures/test-jwt-rsa-keys.js +78 -0
  58. package/dist/test/fixtures/test-jwt-rsa-keys.js.map +1 -0
  59. package/dist/test/fixtures/test-jwt-tokens-rsa.d.ts +7 -0
  60. package/dist/test/fixtures/test-jwt-tokens-rsa.d.ts.map +1 -0
  61. package/dist/test/fixtures/test-jwt-tokens-rsa.js +7 -0
  62. package/dist/test/fixtures/test-jwt-tokens-rsa.js.map +1 -0
  63. package/dist/test/fixtures/test-jwt-tokens.d.ts +7 -0
  64. package/dist/test/fixtures/test-jwt-tokens.d.ts.map +1 -0
  65. package/dist/test/fixtures/test-jwt-tokens.js +7 -0
  66. package/dist/test/fixtures/test-jwt-tokens.js.map +1 -0
  67. package/package.json +138 -0
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 Konrad Markus <mail@konker.dev>
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
12
+ SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
14
+ OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
15
+ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @konker.dev/neverthrow-r-auth-utils
2
+
3
+ Auth utils for `neverthrow` and `@konker.dev/neverthrow-r`.
@@ -0,0 +1,7 @@
1
+ import { type ResultR } from '@konker.dev/neverthrow-r';
2
+ import type { APIGatewayAuthorizerResult } from 'aws-lambda';
3
+ export declare function transformLambdaAuthorizerArn(arn: string): ResultR<unknown, string, Error>;
4
+ export declare const generateLambdaAuthResult: (effect: "Allow" | "Deny") => (principalId: string, lambdaArn: string) => APIGatewayAuthorizerResult;
5
+ export declare const generateLambdaAuthResultAllow: (principalId: string, lambdaArn: string) => APIGatewayAuthorizerResult;
6
+ export declare const generateLambdaAuthResultDeny: (principalId: string, lambdaArn: string) => APIGatewayAuthorizerResult;
7
+ //# sourceMappingURL=aws-authorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-authorizer.d.ts","sourceRoot":"","sources":["../src/aws-authorizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG7D,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAOzF;AAED,eAAO,MAAM,wBAAwB,GAClC,QAAQ,OAAO,GAAG,MAAM,MACxB,aAAa,MAAM,EAAE,WAAW,MAAM,KAAG,0BAexC,CAAC;AAEL,eAAO,MAAM,6BAA6B,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,0BACrD,CAAC;AAEpC,eAAO,MAAM,4BAA4B,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,0BACrD,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { fromResult } from '@konker.dev/neverthrow-r';
2
+ import { err, ok } from 'neverthrow';
3
+ export function transformLambdaAuthorizerArn(arn) {
4
+ const arnRe = /^(arn:aws:execute-api:[\w-]+:\d{12}:\w+\/[$\w]+\/)([\S/]+)+$/;
5
+ if (!arnRe.test(arn)) {
6
+ return fromResult(err(new Error('Invalid arn')));
7
+ }
8
+ return fromResult(ok(arn.replace(arnRe, '$1*')));
9
+ }
10
+ export const generateLambdaAuthResult = (effect) => (principalId, lambdaArn) => ({
11
+ principalId,
12
+ policyDocument: {
13
+ Version: '2012-10-17',
14
+ Statement: [
15
+ {
16
+ Action: 'execute-api:Invoke',
17
+ Effect: effect,
18
+ Resource: lambdaArn,
19
+ },
20
+ ],
21
+ },
22
+ context: {
23
+ principalId,
24
+ },
25
+ });
26
+ export const generateLambdaAuthResultAllow = generateLambdaAuthResult('Allow');
27
+ export const generateLambdaAuthResultDeny = generateLambdaAuthResult('Deny');
28
+ //# sourceMappingURL=aws-authorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-authorizer.js","sourceRoot":"","sources":["../src/aws-authorizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,4BAA4B,CAAC,GAAW;IACtD,MAAM,KAAK,GAAG,8DAA8D,CAAC;IAC7E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GACnC,CAAC,MAAwB,EAAE,EAAE,CAC7B,CAAC,WAAmB,EAAE,SAAiB,EAA8B,EAAE,CAAC,CAAC;IACvE,WAAW;IACX,cAAc,EAAE;QACd,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE;YACT;gBACE,MAAM,EAAE,oBAAoB;gBAC5B,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,SAAS;aACpB;SACF;KACF;IACD,OAAO,EAAE;QACP,WAAW;KACZ;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,6BAA6B,GACxC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,4BAA4B,GACvC,wBAAwB,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type ResultR } from '@konker.dev/neverthrow-r';
2
+ export declare const BASIC_AUTH_WILDCARD_USERNAME = "*";
3
+ export type BasicAuthCredentials = {
4
+ readonly username: string;
5
+ readonly password: string;
6
+ };
7
+ export type NonEmptyStringArray = readonly [string, ...Array<string>];
8
+ export type ValidBasicAuthCredentials = {
9
+ readonly username: string;
10
+ readonly passwords: NonEmptyStringArray;
11
+ };
12
+ export type ValidBasicAuthCredentialSet = Array<ValidBasicAuthCredentials>;
13
+ export type BasicAuthUserContext = {
14
+ readonly verified: false;
15
+ } | {
16
+ readonly verified: true;
17
+ readonly userId?: string;
18
+ };
19
+ export declare function BasicAuthUserContext(verified: false): BasicAuthUserContext;
20
+ export declare function BasicAuthUserContext(verified: true, userId: string): BasicAuthUserContext;
21
+ export declare const basicAuthCredentialMatch: (basicAuth: BasicAuthCredentials) => (valid: ValidBasicAuthCredentials) => boolean;
22
+ export declare function basicAuthDecodeHeaderValue(basicAuthHeaderValue: string | undefined): ResultR<unknown, BasicAuthCredentials, Error>;
23
+ export declare function basicAuthEncodeHeaderValue(basicAuthCredentials: BasicAuthCredentials): ResultR<unknown, string, never>;
24
+ export declare const basicAuthVerifyCredentials: (valid: ValidBasicAuthCredentialSet) => (basicAuth: BasicAuthCredentials) => ResultR<unknown, BasicAuthUserContext, never>;
25
+ //# sourceMappingURL=basic-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-auth.d.ts","sourceRoot":"","sources":["../src/basic-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGpE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAEtE,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAE3E,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;CAAE,GAC5B;IACE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,KAAK,GAAG,oBAAoB,CAAC;AAC5E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAAC;AAS3F,eAAO,MAAM,wBAAwB,GAAI,WAAW,oBAAoB,MAAM,OAAO,yBAAyB,YAEhE,CAAC;AAW/C,wBAAgB,0BAA0B,CACxC,oBAAoB,EAAE,MAAM,GAAG,SAAS,GACvC,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAa/C;AAED,wBAAgB,0BAA0B,CACxC,oBAAoB,EAAE,oBAAoB,GACzC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAMjC;AAED,eAAO,MAAM,0BAA0B,GACpC,OAAO,2BAA2B,MAClC,WAAW,oBAAoB,KAAG,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,CAO5E,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { fromResult } from '@konker.dev/neverthrow-r';
2
+ import { err, ok } from 'neverthrow';
3
+ export const BASIC_AUTH_WILDCARD_USERNAME = '*';
4
+ export function BasicAuthUserContext(verified, userId) {
5
+ return verified
6
+ ? userId !== undefined && userId !== ''
7
+ ? { verified: true, userId }
8
+ : { verified: true }
9
+ : { verified: false };
10
+ }
11
+ export const basicAuthCredentialMatch = (basicAuth) => (valid) => (valid.username === BASIC_AUTH_WILDCARD_USERNAME || valid.username === basicAuth.username) &&
12
+ valid.passwords.includes(basicAuth.password);
13
+ function decodeBase64String(value) {
14
+ const base64Re = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
15
+ if (!value || !base64Re.test(value)) {
16
+ return err(new Error('Invalid base64 input'));
17
+ }
18
+ return ok(Buffer.from(value, 'base64').toString('utf8'));
19
+ }
20
+ export function basicAuthDecodeHeaderValue(basicAuthHeaderValue) {
21
+ return fromResult(decodeBase64String(basicAuthHeaderValue).andThen((decoded) => {
22
+ const parts = decoded.split(':');
23
+ return parts.length === 2
24
+ ? ok({
25
+ username: parts[0],
26
+ password: parts[1],
27
+ })
28
+ : err(new Error('Invalid basic auth payload'));
29
+ }));
30
+ }
31
+ export function basicAuthEncodeHeaderValue(basicAuthCredentials) {
32
+ return fromResult(ok(`Basic ${Buffer.from(`${basicAuthCredentials.username}:${basicAuthCredentials.password}`, 'utf8').toString('base64')}`));
33
+ }
34
+ export const basicAuthVerifyCredentials = (valid) => (basicAuth) => fromResult(ok(valid.some(basicAuthCredentialMatch(basicAuth))
35
+ ? BasicAuthUserContext(true, basicAuth.username)
36
+ : BasicAuthUserContext(false)));
37
+ //# sourceMappingURL=basic-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-auth.js","sourceRoot":"","sources":["../src/basic-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,YAAY,CAAC;AAElD,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAyBhD,MAAM,UAAU,oBAAoB,CAAC,QAAiB,EAAE,MAAe;IACrE,OAAO,QAAQ;QACb,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;YACrC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;YAC5B,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;QACtB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,SAA+B,EAAE,EAAE,CAAC,CAAC,KAAgC,EAAE,EAAE,CAChH,CAAC,KAAK,CAAC,QAAQ,KAAK,4BAA4B,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAC;IAC1F,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE/C,SAAS,kBAAkB,CAAC,KAAyB;IACnD,MAAM,QAAQ,GAAG,kEAAkE,CAAC;IACpF,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,oBAAwC;IAExC,OAAO,UAAU,CACf,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAe,EAAE,EAAE;QACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,CAAC,EAAE,CAAC;gBACD,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAE;gBACnB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAE;aACpB,CAAC;YACJ,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,oBAA0C;IAE1C,OAAO,UAAU,CACf,EAAE,CACA,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CACvH,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GACrC,CAAC,KAAkC,EAAE,EAAE,CACvC,CAAC,SAA+B,EAAiD,EAAE,CACjF,UAAU,CACR,EAAE,CACA,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;IAChD,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAChC,CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ResultR } from '@konker.dev/neverthrow-r';
2
+ export declare function extractBearerToken(authorization?: string): ResultR<unknown, string, Error>;
3
+ export declare function extractBasicAuthHeaderValue(authorization?: string): ResultR<unknown, string, Error>;
4
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGpE,wBAAgB,kBAAkB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAK1F;AAED,wBAAgB,2BAA2B,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAKnG"}
@@ -0,0 +1,13 @@
1
+ import { fromResult } from '@konker.dev/neverthrow-r';
2
+ import { err, ok } from 'neverthrow';
3
+ export function extractBearerToken(authorization) {
4
+ const bearerRe = /^Bearer (\S+)$/;
5
+ const match = authorization?.match(bearerRe);
6
+ return fromResult(match?.[1] ? ok(match[1]) : err(new Error('No token found')));
7
+ }
8
+ export function extractBasicAuthHeaderValue(authorization) {
9
+ const basicAuthRe = /^Basic (\S+)$/;
10
+ const match = authorization?.match(basicAuthRe);
11
+ return fromResult(match?.[1] ? ok(match[1]) : err(new Error('No token found')));
12
+ }
13
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,kBAAkB,CAAC,aAAsB;IACvD,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAClC,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE7C,OAAO,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,aAAsB;IAChE,MAAM,WAAW,GAAG,eAAe,CAAC;IACpC,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAEhD,OAAO,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './aws-authorizer.js';
2
+ export * from './basic-auth.js';
3
+ export * from './helpers.js';
4
+ export * from './jwt/common.js';
5
+ export * from './jwt/index.js';
6
+ export * from './jwt/rsa.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from './aws-authorizer.js';
2
+ export * from './basic-auth.js';
3
+ export * from './helpers.js';
4
+ export * from './jwt/common.js';
5
+ export * from './jwt/index.js';
6
+ export * from './jwt/rsa.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type ResultR } from '@konker.dev/neverthrow-r';
2
+ import type * as jwt from 'jsonwebtoken';
3
+ export type JwtPayloadSubIss = jwt.JwtPayload & {
4
+ readonly sub: string;
5
+ readonly iss: string;
6
+ };
7
+ export type JwtUserContext = {
8
+ readonly verified: false;
9
+ } | ({
10
+ readonly verified: true;
11
+ readonly userId: string;
12
+ } & JwtPayloadSubIss);
13
+ export declare function JwtUserContext(verified: false): JwtUserContext;
14
+ export declare function JwtUserContext(verified: true, jwtPayload: JwtPayloadSubIss): JwtUserContext;
15
+ export declare function checkJwtPayloadIssSub(payload: jwt.JwtPayload | string | null): ResultR<unknown, JwtPayloadSubIss, Error>;
16
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/jwt/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAGzC,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,GAAG;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;CAAE,GAC5B,CAAC;IACC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,gBAAgB,CAAC,CAAC;AAE1B,wBAAgB,cAAc,CAAC,QAAQ,EAAE,KAAK,GAAG,cAAc,CAAC;AAChE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,GAAG,cAAc,CAAC;AAO7F,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,GAAG,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,GACtC,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAe3C"}
@@ -0,0 +1,22 @@
1
+ import { fromResult } from '@konker.dev/neverthrow-r';
2
+ import { err, ok } from 'neverthrow';
3
+ export function JwtUserContext(verified, jwtPayload) {
4
+ return verified && jwtPayload
5
+ ? { verified: true, userId: jwtPayload.sub, ...jwtPayload }
6
+ : { verified: false };
7
+ }
8
+ export function checkJwtPayloadIssSub(payload) {
9
+ if (!payload) {
10
+ return fromResult(err(new Error('Invalid token payload: null')));
11
+ }
12
+ if (typeof payload === 'string') {
13
+ return fromResult(err(new Error('Invalid token payload: string')));
14
+ }
15
+ const sub = payload.sub;
16
+ const iss = payload.iss;
17
+ if (!sub || !iss) {
18
+ return fromResult(err(new Error('Invalid token payload: missing iss or sub')));
19
+ }
20
+ return fromResult(ok({ ...payload, sub, iss }));
21
+ }
22
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/jwt/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAgBrC,MAAM,UAAU,cAAc,CAAC,QAAiB,EAAE,UAA6B;IAC7E,OAAO,QAAQ,IAAI,UAAU;QAC3B,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAa,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE;QACpE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAc,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAuC;IAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=common.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.test.d.ts","sourceRoot":"","sources":["../../src/jwt/common.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import { provide } from '@konker.dev/neverthrow-r';
2
+ import * as jwt from 'jsonwebtoken';
3
+ import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';
4
+ import { TEST_JWT_ISS, TEST_JWT_NOW_MS, TEST_JWT_SUB, TEST_SIGNED_PAYLOAD } from '../test/fixtures/jwt.js';
5
+ import { TEST_TOKEN, TEST_TOKEN_STRING_PAYLOAD } from '../test/fixtures/test-jwt-tokens.js';
6
+ import * as unit from './common.js';
7
+ describe('jwt/common', () => {
8
+ beforeAll(() => {
9
+ vi.spyOn(Date, 'now').mockReturnValue(TEST_JWT_NOW_MS);
10
+ });
11
+ afterAll(() => {
12
+ vi.restoreAllMocks();
13
+ });
14
+ describe('JwtUserContext', () => {
15
+ it('should work as expected in the true case', () => {
16
+ expect(unit.JwtUserContext(true, { iss: TEST_JWT_ISS, sub: TEST_JWT_SUB, aud: 'some-aud' })).toStrictEqual({
17
+ verified: true,
18
+ userId: TEST_JWT_SUB,
19
+ iss: TEST_JWT_ISS,
20
+ sub: TEST_JWT_SUB,
21
+ aud: 'some-aud',
22
+ });
23
+ });
24
+ it('should work as expected in the false case', () => {
25
+ expect(unit.JwtUserContext(false)).toStrictEqual({
26
+ verified: false,
27
+ });
28
+ });
29
+ });
30
+ describe('checkJwtPayloadIssSub', () => {
31
+ it('should verify a valid token', () => {
32
+ const actual = unit.checkJwtPayloadIssSub(jwt.decode(TEST_TOKEN));
33
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual(TEST_SIGNED_PAYLOAD);
34
+ });
35
+ it('should return an error if the token is invalid, missing issuer', () => {
36
+ const actual = unit.checkJwtPayloadIssSub({ foo: 'bar', sub: TEST_JWT_SUB });
37
+ expect(provide(actual, undefined)._unsafeUnwrapErr().message).toBe('Invalid token payload: missing iss or sub');
38
+ });
39
+ it('should return an error if the token is invalid, missing subject', () => {
40
+ const actual = unit.checkJwtPayloadIssSub({ foo: 'bar', iss: TEST_JWT_ISS });
41
+ expect(provide(actual, undefined)._unsafeUnwrapErr().message).toBe('Invalid token payload: missing iss or sub');
42
+ });
43
+ it('should return an error if the token is invalid, string payload', () => {
44
+ const actual = unit.checkJwtPayloadIssSub(jwt.decode(TEST_TOKEN_STRING_PAYLOAD));
45
+ expect(provide(actual, undefined)._unsafeUnwrapErr().message).toBe('Invalid token payload: string');
46
+ });
47
+ it('should return an error if the token is invalid, null', () => {
48
+ const actual = unit.checkJwtPayloadIssSub(jwt.decode('banana'));
49
+ expect(provide(actual, undefined)._unsafeUnwrapErr().message).toBe('Invalid token payload: null');
50
+ });
51
+ });
52
+ });
53
+ //# sourceMappingURL=common.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.test.js","sourceRoot":"","sources":["../../src/jwt/common.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ResultR } from '@konker.dev/neverthrow-r';
2
+ import * as jwt from 'jsonwebtoken';
3
+ import type { JwtUserContext as JwtUserContextT } from './common.js';
4
+ export type JwtSigningConfig = {
5
+ signingSecret: string;
6
+ issuer: string;
7
+ maxTtlSec: number;
8
+ };
9
+ export type JwtVerificationConfig = {
10
+ signingSecret: string;
11
+ issuer: string;
12
+ };
13
+ export declare function jwtDecodeToken(token: string): ResultR<unknown, jwt.JwtPayload, Error>;
14
+ export declare function jwtSignToken(payload: jwt.JwtPayload, config: JwtSigningConfig): ResultR<unknown, string, Error>;
15
+ export declare function jwtVerifyToken(token: string, config: JwtVerificationConfig): ResultR<unknown, JwtUserContextT, never>;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jwt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAIpC,OAAO,KAAK,EAAoB,cAAc,IAAI,eAAe,EAAE,MAAM,aAAa,CAAC;AAGvF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAMrF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAW/G;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,CAarH"}
@@ -0,0 +1,23 @@
1
+ import { fromResult } from '@konker.dev/neverthrow-r';
2
+ import * as jwt from 'jsonwebtoken';
3
+ import { err, ok, Result } from 'neverthrow';
4
+ import { toError } from '../lib/toError.js';
5
+ import { checkJwtPayloadIssSub, JwtUserContext } from './common.js';
6
+ export function jwtDecodeToken(token) {
7
+ return fromResult(Result.fromThrowable(() => jwt.decode(token), toError)().andThen((decoded) => !decoded || typeof decoded === 'string' ? err(new Error('Invalid token payload')) : ok(decoded)));
8
+ }
9
+ export function jwtSignToken(payload, config) {
10
+ return fromResult(Result.fromThrowable(() => jwt.sign(payload, config.signingSecret, {
11
+ issuer: config.issuer,
12
+ expiresIn: config.maxTtlSec,
13
+ }), toError)());
14
+ }
15
+ export function jwtVerifyToken(token, config) {
16
+ return fromResult(Result.fromThrowable(() => jwt.verify(token, config.signingSecret, {
17
+ issuer: config.issuer,
18
+ }), toError)()
19
+ .andThen((payload) => checkJwtPayloadIssSub(payload)({}))
20
+ .map((jwtPayload) => JwtUserContext(true, jwtPayload))
21
+ .orElse(() => ok(JwtUserContext(false))));
22
+ }
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jwt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAapE,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,UAAU,CACf,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3E,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAChG,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAuB,EAAE,MAAwB;IAC5E,OAAO,UAAU,CACf,MAAM,CAAC,aAAa,CAClB,GAAG,EAAE,CACH,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,EACJ,OAAO,CACR,EAAE,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,MAA6B;IACzE,OAAO,UAAU,CACf,MAAM,CAAC,aAAa,CAClB,GAAG,EAAE,CACH,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,EACJ,OAAO,CACR,EAAE;SACA,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;SACxD,GAAG,CAAC,CAAC,UAA4B,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;SACvE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import * as unit from './index.js';
2
+ export declare const TEST_SIGNING_CONFIG: unit.JwtSigningConfig;
3
+ export declare const TEST_VERIFICATION_CONFIG: unit.JwtVerificationConfig;
4
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/jwt/index.test.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,eAAO,MAAM,mBAAmB,EAAE,IAAI,CAAC,gBAItC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,IAAI,CAAC,qBAG3C,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { provide } from '@konker.dev/neverthrow-r';
2
+ import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';
3
+ import { TEST_JWT_ISS, TEST_JWT_NOW_MS, TEST_JWT_PAYLOAD, TEST_JWT_SIGNING_SECRET, TEST_SIGNED_PAYLOAD, } from '../test/fixtures/jwt.js';
4
+ import { TEST_TOKEN, TEST_TOKEN_EXPIRED, TEST_TOKEN_MISSING_ISSUER, TEST_TOKEN_MISSING_SUBJECT, TEST_TOKEN_OTHER_ISSUER, TEST_TOKEN_STRING_PAYLOAD, } from '../test/fixtures/test-jwt-tokens.js';
5
+ import * as unit from './index.js';
6
+ export const TEST_SIGNING_CONFIG = {
7
+ signingSecret: TEST_JWT_SIGNING_SECRET,
8
+ issuer: TEST_JWT_ISS,
9
+ maxTtlSec: 3600,
10
+ };
11
+ export const TEST_VERIFICATION_CONFIG = {
12
+ signingSecret: TEST_JWT_SIGNING_SECRET,
13
+ issuer: TEST_JWT_ISS,
14
+ };
15
+ describe('jwt', () => {
16
+ beforeAll(() => {
17
+ vi.spyOn(Date, 'now').mockReturnValue(TEST_JWT_NOW_MS);
18
+ });
19
+ afterAll(() => {
20
+ vi.restoreAllMocks();
21
+ });
22
+ describe('jwtDecodeToken', () => {
23
+ it('should decode a token', () => {
24
+ const actual = unit.jwtDecodeToken(TEST_TOKEN);
25
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual(TEST_SIGNED_PAYLOAD);
26
+ });
27
+ it('should fail to decode a token with a string payload', () => {
28
+ const actual = unit.jwtDecodeToken(TEST_TOKEN_STRING_PAYLOAD);
29
+ expect(provide(actual, undefined)._unsafeUnwrapErr().message).toBe('Invalid token payload');
30
+ });
31
+ });
32
+ describe('jwtSignToken', () => {
33
+ it('should sign a token', () => {
34
+ const actual = unit.jwtSignToken(TEST_JWT_PAYLOAD, TEST_SIGNING_CONFIG);
35
+ expect(provide(actual, undefined)._unsafeUnwrap()).toBe(TEST_TOKEN);
36
+ });
37
+ });
38
+ describe('jwtVerifyToken', () => {
39
+ it('should verify a valid token', () => {
40
+ const actual = unit.jwtVerifyToken(TEST_TOKEN, TEST_VERIFICATION_CONFIG);
41
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({
42
+ userId: 'test-sub',
43
+ verified: true,
44
+ ...TEST_SIGNED_PAYLOAD,
45
+ });
46
+ });
47
+ it('should return verified false if the token is invalid, wrong secret', () => {
48
+ const actual = unit.jwtVerifyToken(TEST_TOKEN, Object.assign({}, TEST_VERIFICATION_CONFIG, { signingSecret: 'wrong' }));
49
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
50
+ });
51
+ it('should return verified false if the token is invalid, expired', () => {
52
+ const actual = unit.jwtVerifyToken(TEST_TOKEN_EXPIRED, TEST_VERIFICATION_CONFIG);
53
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
54
+ });
55
+ it('should return verified false if the token is invalid, wrong issuer', () => {
56
+ const actual = unit.jwtVerifyToken(TEST_TOKEN_OTHER_ISSUER, TEST_VERIFICATION_CONFIG);
57
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
58
+ });
59
+ it('should return verified false if the token is invalid, missing issuer', () => {
60
+ const actual = unit.jwtVerifyToken(TEST_TOKEN_MISSING_ISSUER, TEST_VERIFICATION_CONFIG);
61
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
62
+ });
63
+ it('should return verified false if the token is invalid, missing subject', () => {
64
+ const actual = unit.jwtVerifyToken(TEST_TOKEN_MISSING_SUBJECT, TEST_VERIFICATION_CONFIG);
65
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
66
+ });
67
+ it('should return verified false if the token is invalid, string payload', () => {
68
+ const actual = unit.jwtVerifyToken(TEST_TOKEN_STRING_PAYLOAD, TEST_VERIFICATION_CONFIG);
69
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
70
+ });
71
+ });
72
+ });
73
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/jwt/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ResultR } from '@konker.dev/neverthrow-r';
2
+ import * as jwt from 'jsonwebtoken';
3
+ import type { JwtUserContext as JwtUserContextT } from './common.js';
4
+ export type JwtSigningConfigRsa = {
5
+ rsaPrivateKey: string;
6
+ issuer: string;
7
+ maxTtlSec: number;
8
+ };
9
+ export type JwtVerificationConfigRsa = {
10
+ rsaPublicKey: string;
11
+ issuer: string;
12
+ };
13
+ export declare function jwtSignTokenRsa(payload: jwt.JwtPayload, config: JwtSigningConfigRsa): ResultR<unknown, string, Error>;
14
+ export declare function jwtVerifyTokenRsa(token: string, config: JwtVerificationConfigRsa): ResultR<unknown, JwtUserContextT, never>;
15
+ //# sourceMappingURL=rsa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsa.d.ts","sourceRoot":"","sources":["../../src/jwt/rsa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAIpC,OAAO,KAAK,EAAoB,cAAc,IAAI,eAAe,EAAE,MAAM,aAAa,CAAC;AAGvF,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAYrH;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,CAc1C"}
@@ -0,0 +1,22 @@
1
+ import { fromResult } from '@konker.dev/neverthrow-r';
2
+ import * as jwt from 'jsonwebtoken';
3
+ import { ok, Result } from 'neverthrow';
4
+ import { toError } from '../lib/toError.js';
5
+ import { checkJwtPayloadIssSub, JwtUserContext } from './common.js';
6
+ export function jwtSignTokenRsa(payload, config) {
7
+ return fromResult(Result.fromThrowable(() => jwt.sign(payload, config.rsaPrivateKey, {
8
+ issuer: config.issuer,
9
+ expiresIn: config.maxTtlSec,
10
+ algorithm: 'RS256',
11
+ }), toError)());
12
+ }
13
+ export function jwtVerifyTokenRsa(token, config) {
14
+ return fromResult(Result.fromThrowable(() => jwt.verify(token, config.rsaPublicKey, {
15
+ issuer: config.issuer,
16
+ algorithms: ['RS256'],
17
+ }), toError)()
18
+ .andThen((payload) => checkJwtPayloadIssSub(payload)({}))
19
+ .map((jwtPayload) => JwtUserContext(true, jwtPayload))
20
+ .orElse(() => ok(JwtUserContext(false))));
21
+ }
22
+ //# sourceMappingURL=rsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsa.js","sourceRoot":"","sources":["../../src/jwt/rsa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAapE,MAAM,UAAU,eAAe,CAAC,OAAuB,EAAE,MAA2B;IAClF,OAAO,UAAU,CACf,MAAM,CAAC,aAAa,CAClB,GAAG,EAAE,CACH,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,OAAO;KACnB,CAAC,EACJ,OAAO,CACR,EAAE,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,MAAgC;IAEhC,OAAO,UAAU,CACf,MAAM,CAAC,aAAa,CAClB,GAAG,EAAE,CACH,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,CAAC,OAAO,CAAC;KACtB,CAAC,EACJ,OAAO,CACR,EAAE;SACA,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;SACxD,GAAG,CAAC,CAAC,UAA4B,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;SACvE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rsa.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsa.test.d.ts","sourceRoot":"","sources":["../../src/jwt/rsa.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import { provide } from '@konker.dev/neverthrow-r';
2
+ import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';
3
+ import { TEST_JWT_ISS, TEST_JWT_NOW_MS, TEST_JWT_PAYLOAD, TEST_JWT_SUB, TEST_SIGNED_PAYLOAD, } from '../test/fixtures/jwt.js';
4
+ import { TEST_RSA_KEY_PRIVATE, TEST_RSA_KEY_PUBLIC, TEST_RSA_KEY_PUBLIC_OTHER, } from '../test/fixtures/test-jwt-rsa-keys.js';
5
+ import { TEST_TOKEN_RSA, TEST_TOKEN_RSA_EXPIRED, TEST_TOKEN_RSA_MISSING_ISSUER, TEST_TOKEN_RSA_MISSING_SUBJECT, TEST_TOKEN_RSA_OTHER_ISSUER, TEST_TOKEN_RSA_STRING_PAYLOAD, } from '../test/fixtures/test-jwt-tokens-rsa.js';
6
+ import * as unit from './rsa.js';
7
+ const TEST_SIGNING_CONFIG = {
8
+ rsaPrivateKey: TEST_RSA_KEY_PRIVATE,
9
+ issuer: TEST_JWT_ISS,
10
+ maxTtlSec: 3600,
11
+ };
12
+ const TEST_VERIFICATION_CONFIG = {
13
+ rsaPublicKey: TEST_RSA_KEY_PUBLIC,
14
+ issuer: TEST_JWT_ISS,
15
+ };
16
+ describe('jwt/rsa', () => {
17
+ beforeAll(() => {
18
+ vi.spyOn(Date, 'now').mockReturnValue(TEST_JWT_NOW_MS);
19
+ });
20
+ afterAll(() => {
21
+ vi.restoreAllMocks();
22
+ });
23
+ describe('jwtSignTokenRsa', () => {
24
+ it('should sign a token', () => {
25
+ const actual = unit.jwtSignTokenRsa(TEST_JWT_PAYLOAD, TEST_SIGNING_CONFIG);
26
+ expect(provide(actual, undefined)._unsafeUnwrap()).toBe(TEST_TOKEN_RSA);
27
+ });
28
+ });
29
+ describe('jwtVerifyTokenRsa', () => {
30
+ it('should verify a valid token', () => {
31
+ const actual = unit.jwtVerifyTokenRsa(TEST_TOKEN_RSA, TEST_VERIFICATION_CONFIG);
32
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({
33
+ verified: true,
34
+ userId: TEST_JWT_SUB,
35
+ ...TEST_SIGNED_PAYLOAD,
36
+ });
37
+ });
38
+ it('should return verified false if the token is invalid, wrong key', () => {
39
+ const actual = unit.jwtVerifyTokenRsa(TEST_TOKEN_RSA, Object.assign({}, TEST_VERIFICATION_CONFIG, { rsaPublicKey: TEST_RSA_KEY_PUBLIC_OTHER }));
40
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
41
+ });
42
+ it('should return verified false if the token is invalid, expired', () => {
43
+ const actual = unit.jwtVerifyTokenRsa(TEST_TOKEN_RSA_EXPIRED, TEST_VERIFICATION_CONFIG);
44
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
45
+ });
46
+ it('should return verified false if the token is invalid, wrong issuer', () => {
47
+ const actual = unit.jwtVerifyTokenRsa(TEST_TOKEN_RSA_OTHER_ISSUER, TEST_VERIFICATION_CONFIG);
48
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
49
+ });
50
+ it('should return verified false if the token is invalid, missing issuer', () => {
51
+ const actual = unit.jwtVerifyTokenRsa(TEST_TOKEN_RSA_MISSING_ISSUER, TEST_VERIFICATION_CONFIG);
52
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
53
+ });
54
+ it('should return verified false if the token is invalid, missing subject', () => {
55
+ const actual = unit.jwtVerifyTokenRsa(TEST_TOKEN_RSA_MISSING_SUBJECT, TEST_VERIFICATION_CONFIG);
56
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
57
+ });
58
+ it('should return verified false if the token is invalid, string payload', () => {
59
+ const actual = unit.jwtVerifyTokenRsa(TEST_TOKEN_RSA_STRING_PAYLOAD, TEST_VERIFICATION_CONFIG);
60
+ expect(provide(actual, undefined)._unsafeUnwrap()).toStrictEqual({ verified: false });
61
+ });
62
+ });
63
+ });
64
+ //# sourceMappingURL=rsa.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsa.test.js","sourceRoot":"","sources":["../../src/jwt/rsa.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEvE,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,6BAA6B,EAC7B,8BAA8B,EAC9B,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,IAAI,MAAM,UAAU,CAAC;AAEjC,MAAM,mBAAmB,GAA6B;IACpD,aAAa,EAAE,oBAAoB;IACnC,MAAM,EAAE,YAAY;IACpB,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,wBAAwB,GAAkC;IAC9D,YAAY,EAAE,mBAAmB;IACjC,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;YAC3E,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YAChF,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC;gBAC/D,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,YAAY;gBACpB,GAAG,mBAAmB;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CACnC,cAAc,EACd,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,wBAAwB,EAAE,EAAE,YAAY,EAAE,yBAAyB,EAAE,CAAC,CACzF,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;YACxF,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,2BAA2B,EAAE,wBAAwB,CAAC,CAAC;YAC7F,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,6BAA6B,EAAE,wBAAwB,CAAC,CAAC;YAC/F,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,8BAA8B,EAAE,wBAAwB,CAAC,CAAC;YAChG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,6BAA6B,EAAE,wBAAwB,CAAC,CAAC;YAC/F,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const toError: (error: unknown) => Error;
2
+ //# sourceMappingURL=toError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toError.d.ts","sourceRoot":"","sources":["../../src/lib/toError.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAoE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const toError = (error) => (error instanceof Error ? error : new Error(String(error)));
2
+ //# sourceMappingURL=toError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toError.js","sourceRoot":"","sources":["../../src/lib/toError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAS,EAAE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=toError.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toError.test.d.ts","sourceRoot":"","sources":["../../src/lib/toError.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { toError } from './toError.js';
3
+ describe('toError', () => {
4
+ it('returns Error instances unchanged', () => {
5
+ const error = new Error('boom');
6
+ expect(toError(error)).toBe(error);
7
+ });
8
+ it('converts non-Error values into Error instances', () => {
9
+ const actual = toError('boom');
10
+ expect(actual).toBeInstanceOf(Error);
11
+ expect(actual.message).toBe('boom');
12
+ });
13
+ });
14
+ //# sourceMappingURL=toError.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toError.test.js","sourceRoot":"","sources":["../../src/lib/toError.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare const TEST_JWT_NOW_MS = 1671573808123;
2
+ export declare const TEST_JWT_ISS = "test-iss";
3
+ export declare const TEST_JWT_SUB = "test-sub";
4
+ export declare const TEST_JWT_SIGNING_SECRET = "shhhhh";
5
+ export declare const TEST_JWT_PAYLOAD: {
6
+ foo: string;
7
+ sub: string;
8
+ };
9
+ export declare const TEST_SIGNED_PAYLOAD: {
10
+ foo: string;
11
+ iat: number;
12
+ exp: number;
13
+ iss: string;
14
+ sub: string;
15
+ };
16
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../../src/test/fixtures/jwt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAC7C,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,gBAAgB;;;CAAkC,CAAC;AAChE,eAAO,MAAM,mBAAmB;;;;;;CAM/B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export const TEST_JWT_NOW_MS = 1671573808123;
2
+ export const TEST_JWT_ISS = 'test-iss';
3
+ export const TEST_JWT_SUB = 'test-sub';
4
+ export const TEST_JWT_SIGNING_SECRET = 'shhhhh';
5
+ export const TEST_JWT_PAYLOAD = { foo: 'bar', sub: 'test-sub' };
6
+ export const TEST_SIGNED_PAYLOAD = {
7
+ foo: 'bar',
8
+ iat: Math.floor(TEST_JWT_NOW_MS / 1000),
9
+ exp: Math.floor(TEST_JWT_NOW_MS / 1000) + 3600,
10
+ iss: TEST_JWT_ISS,
11
+ sub: TEST_JWT_SUB,
12
+ };
13
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/test/fixtures/jwt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AACvC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AACvC,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;IACvC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,IAAI;IAC9C,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,YAAY;CAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const TEST_RSA_KEY_PUBLIC: string;
2
+ export declare const TEST_RSA_KEY_PUBLIC_OTHER: string;
3
+ export declare const TEST_RSA_KEY_PRIVATE: string;
4
+ //# sourceMappingURL=test-jwt-rsa-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-jwt-rsa-keys.d.ts","sourceRoot":"","sources":["../../../src/test/fixtures/test-jwt-rsa-keys.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,QAaE,CAAC;AAEnC,eAAO,MAAM,yBAAyB,QAaJ,CAAC;AAEnC,eAAO,MAAM,oBAAoB,QAmDE,CAAC"}
@@ -0,0 +1,78 @@
1
+ export const TEST_RSA_KEY_PUBLIC = '-----BEGIN RSA PUBLIC KEY-----\n' +
2
+ 'MIICCgKCAgEAsDMuBtC+IOyLVvuHrupVmrSPS3YVMOAoTLwIbRSOjWMSUc56iqKv\n' +
3
+ '7Umblpzk4CBEgZfHQWkoQaPetSmAxHbq3QH/qcirEGe1XtXukTqELHX+Awj3jvkt\n' +
4
+ 'TMHUbX9K4HYBXTy2t93jrVCqN7JoMJw29TaFVrGq+H151W72WoMvVVCbBIQukJ6p\n' +
5
+ '8Huwi01IHCEPW5gHCYzkLb0LjO/XwfcZ1GmM0nude4OispJw/PefMdqgAiDn2egq\n' +
6
+ 'W26goGrxreCTzUTkzT/ptrWoLF/O3NLNQ+Tp5ja7nqgl2HV86ZODHjjtO2vlwu71\n' +
7
+ '/lI/GJNbVQYT9NVp41WHn3bgvpE+9ZXpgCtxM28oYYC1Yv0x9TU7jeHaDIip0Bu4\n' +
8
+ 'grsZ3LhJC97UKgvnyhjacUP5/0Dxpmfnbd/6ieybqCO7t6lzS1BohLH1/OmKutn2\n' +
9
+ '/Oh7MJLeHSfysObSrMW11IWo6KlUGPl8gkLary/rBFeWiDIW22gr9iSs0j67St4C\n' +
10
+ 'rMNEob+PmV0Gu6GK5uAHoD4jAJl76EnIe+juQ472HkbCVw/tja8WdytczgKL5S90\n' +
11
+ 'c+kwXx6qiQ7N/SNoKPwjOOBek9Go7QFcOMpJoi377qGRINfwjmD3UVw7FnWCjAMy\n' +
12
+ 'gB7oQvS7eLAg6ZpYQXBPtYVYFTsPbD8vO10esTBQZTqNGHZ1z2UCH5MCAwEAAQ==\n' +
13
+ '-----END RSA PUBLIC KEY-----\n';
14
+ export const TEST_RSA_KEY_PUBLIC_OTHER = '-----BEGIN RSA PUBLIC KEY-----\n' +
15
+ 'MIICCgKCAgEAoBKxVWIjiJ06/mX1UL5/ELedioMZqeipudC8QlXN+4l6RrFgC3tu\n' +
16
+ 'B8q6CXSnuuk27xABXsAKjNAOH11FzdgzSERxP08JCVzVUDcIAz9flkmIC9Yc0AUz\n' +
17
+ 'hYUNQfgGSUSzZILaS7l24jpKYICyA9ChnqDfsq5hRr63klqaez+hvMrVSIJiMfrw\n' +
18
+ 'RjtFsmtKYHoAZ7nK5CMVAWG2XUh6B9w4NCJ0m8SCpLKF9EjYqe26T3bmHn8dp490\n' +
19
+ '9oA6tCNrd+6vha848ytH6uiyGRzDSpyttNPzXagI9cOBYy1eM7WwmWkCgT6h9oFm\n' +
20
+ '9MjYtSo69wBLGngmgTec8hxTLB4bXPPAEwDfjGOAktU8w1afqycIPxsEpJE2C89u\n' +
21
+ 'C4NW/U0TLDXQ6SQpCFdx4Mg2dCojMDAi8zGrARNlB3bB03hikd5ZSOMqtp40tx4E\n' +
22
+ 'kLroFfUB8n/oW9ksV1VTK7CPOh7lRy0iIPl0ohQ5wx2KRPYwvhOI5nzbBnU/D6Pc\n' +
23
+ '+nG14GAbx++b5kB/CYcZihTMsYDSWu/vtq7AbnjWaWxutzg26UfPnL2qY+jEef9g\n' +
24
+ 'vNZ5ZLutatrHeFoqrCQ0cSLKYO3G8jaWJk2H5w+Aq/tI2bva4YwU3/Q3HIefD7X/\n' +
25
+ 'V0S2AAKJpgelvz4/f5cZ1aYOtZJY83MSOpZoKHkGl3+nEzYvsPX2EsUCAwEAAQ==\n' +
26
+ '-----END RSA PUBLIC KEY-----\n';
27
+ export const TEST_RSA_KEY_PRIVATE = '-----BEGIN RSA PRIVATE KEY-----\n' +
28
+ 'MIIJKQIBAAKCAgEAsDMuBtC+IOyLVvuHrupVmrSPS3YVMOAoTLwIbRSOjWMSUc56\n' +
29
+ 'iqKv7Umblpzk4CBEgZfHQWkoQaPetSmAxHbq3QH/qcirEGe1XtXukTqELHX+Awj3\n' +
30
+ 'jvktTMHUbX9K4HYBXTy2t93jrVCqN7JoMJw29TaFVrGq+H151W72WoMvVVCbBIQu\n' +
31
+ 'kJ6p8Huwi01IHCEPW5gHCYzkLb0LjO/XwfcZ1GmM0nude4OispJw/PefMdqgAiDn\n' +
32
+ '2egqW26goGrxreCTzUTkzT/ptrWoLF/O3NLNQ+Tp5ja7nqgl2HV86ZODHjjtO2vl\n' +
33
+ 'wu71/lI/GJNbVQYT9NVp41WHn3bgvpE+9ZXpgCtxM28oYYC1Yv0x9TU7jeHaDIip\n' +
34
+ '0Bu4grsZ3LhJC97UKgvnyhjacUP5/0Dxpmfnbd/6ieybqCO7t6lzS1BohLH1/OmK\n' +
35
+ 'utn2/Oh7MJLeHSfysObSrMW11IWo6KlUGPl8gkLary/rBFeWiDIW22gr9iSs0j67\n' +
36
+ 'St4CrMNEob+PmV0Gu6GK5uAHoD4jAJl76EnIe+juQ472HkbCVw/tja8WdytczgKL\n' +
37
+ '5S90c+kwXx6qiQ7N/SNoKPwjOOBek9Go7QFcOMpJoi377qGRINfwjmD3UVw7FnWC\n' +
38
+ 'jAMygB7oQvS7eLAg6ZpYQXBPtYVYFTsPbD8vO10esTBQZTqNGHZ1z2UCH5MCAwEA\n' +
39
+ 'AQKCAgAMjTDHqoIIvWD1qshRFP9RHHCiuwAqcaVdRf3Bq3e2KasJ6c//5TPsDtTH\n' +
40
+ 'B1kkgBfxNVsr1S5Zcq9wL0stc50qbjSEpzdMXV7lqQ6sCMOWmTclhzN/W0+3So1z\n' +
41
+ '2V//mlhhiGwpr+RCmd7uRca3Q8GEeURJVzGrLuEJa7Sf4P1zseDBExtwEOVhLKZ4\n' +
42
+ 'XeJ3ooFCEJPbwc4VVgSnHwS7G/uajoRKECU5QbjKyLTEyGzuM7k3PZnWg3vU9I37\n' +
43
+ 'r3KU5M0Sj8hOuLFQ4yLeOlr1jwyxO/LPg/GcjTTY9RGXX/s0oXCAzaBZ4QTj/37g\n' +
44
+ 'JMsaROsSA0veNl8JZIIBAT6/ZtTxvnntiMz6IHs9mH6r4c3kpT5jLAVJw1b0FBc4\n' +
45
+ 'pD0IYRNMl9zZeak3FzT5xOBoquQUtk2ubNnQkIyg1a2BKc4PbQsMr4IoXoZW5cnk\n' +
46
+ 'Cj4Md6no9sz7ud+yKYQiCswpYfBhRFDI+aA2MfFjAtLFF+JbFihGkWHk3GTZvU60\n' +
47
+ 'tFKZVmb0FG1aHNL6BjbJpPj0Aq55QW6lnHdRvvM26Wtn/rO+9WfVHpVoPC8bSfPq\n' +
48
+ 'CxpXMb59r+SHNqAu43kcHkYYpH/yCCjJXVVaIs04hicoCDL5BwYh7xy2K3bL02x6\n' +
49
+ 'YHoThOiHb9soAoxiF23qt37G28p11i3zkx+DuliG0Qc5RfVz6QKCAQEA68cdUQka\n' +
50
+ '/J/MVPjPOq1bPJ5dSJ9Qpgpt1Kz9fUPvfRe+yjYy/icCldPOrTgy60u654zufo+s\n' +
51
+ 'aEMY0OP9D5A3p+pSbACr5OfLBeQwDtP4Zhna9bHr1/e4qMd8EQrUfXxUvzsIks7v\n' +
52
+ 'WHWlhF+Wgi5tBl0l9FPaGUllO3fgvIoDkZ60QGlrfOvKxr1esx5Mlj0k9fiAjD/V\n' +
53
+ 'SeL0qEoMVieefnKqHw6ohiEvyHJrH3CzOV7cP93Yfft/+qkvCmumjr9UWx7kSpCV\n' +
54
+ 'KRojDA73RZyCKsDqekA+mIyGyvL8rPvtBHx9HubYhcoP7lkeCddZxIm9zy5VTK02\n' +
55
+ 'noH5bpy0xT1m+wKCAQEAv0/vo1E1DZeEaU/pcQpEIWgUIBL0VbLwZ5L4Ue6DHD/g\n' +
56
+ 'ybBrkHMtu1VgifQ0fdsVWhGbnrpIbWbxPz+OVtJdtB6ZYOVy25OnjieV4XJ79iq5\n' +
57
+ 'xbN2/Z8t+W8IsC7vwgLohS8AqJ1r7hHx/l0YuEmmJzO/1LOYA9PzGjbAIgPES4qM\n' +
58
+ 'f9erzB0vhf5beghW/CXCmLS5b4J7M9HuCU3UTsZzftY0wVM+KhaCgAj+74ye6UZA\n' +
59
+ 'lxZw5GbdWrpS6INHBKmjzgPcrAYD1hq9dClqLVAoqGEkQ381lLWIBop+PhKDFuzs\n' +
60
+ 'xsEs8TDA74cPPhQNn1dlxop14I/OTGh/UaeSJ9umSQKCAQB2cAI5B8Lnrfn9oTKv\n' +
61
+ '/g87xy2C4oynq8t6Lx/zAeJWy0vK1ikNZFk3HDvQ5c8mRVdxI2lWaCOqCDJ6FFy1\n' +
62
+ 'qbNbhSi8GiY/CXUB05uUh0RbPZexHhwj08uN9Q9MnE0bcA4+NZBb9tlibU6kzUOU\n' +
63
+ 'x2965+W98zU2yJiyo8hfzVB3oOpZBNu619N3u/7LKWg9fB+J87fXO+WPhRNzSici\n' +
64
+ 'TCqgyEbO7RUYs6kGHvvSwlE1e4JWDsHGn0StjLkVmfgD8vaUA1OYZUKYcAm07/uk\n' +
65
+ 'mzcD9P6URJttFAJOBnuJBdANFd/gWwPfSR5xk5C0TtpIEQ0o+tRcfRJX02CSAOQJ\n' +
66
+ 'xItrAoIBAQCtCFSbJ1jPuUoGokNmfT2P5X3GYL5jQJvVYgV8vTgSdegPI6S2Gqaz\n' +
67
+ 'OA4/2AMeDegq9aAGGUBmyuPKK+bGujAMOFzLWdvfo5W5qi4SoaRiytQJbz9hNvaz\n' +
68
+ 'Eu0NxPYPSOgbhZ6X4wH6anqwcG1qSRqhfFm1vNXyKGJJRFnUqgmBtYdMHboBvCf+\n' +
69
+ 'jkcYgbCDEHgH+/V4WNCr1uTvv1gWA8H0ZzOB45NnJ8LSoNBLw6j7HhJPVPm4ax0r\n' +
70
+ '8TgJmqrCGdjQ/Yc6g5o2rSrLhKXG5ChR2sKc1dKVdPbZy6tQ4xdzxciGH7RRVaI7\n' +
71
+ 'QrHTmPmVM8wWnabt+8NAModtSB2WNUEZAoIBAQCioTmED/UnuOrHi7RNt2PLR3X6\n' +
72
+ 'p6C0wNch9DTRgl39f6e96eVwTanqen+Sl+7oW7Tbg+2+A4pPgBYSkXtUTpHXbblf\n' +
73
+ 'oz1uHY833qyJqpnmu307s8/8uUOMWZmAiLKd3WRu7jk2osU2hy7f/AOpU6L3cYJT\n' +
74
+ 'CoB5kNQHE3xLZEWcpq28hNEu4O4ul7ciAA8QFvE90/HfsqxdwU38fZiztdEufgM9\n' +
75
+ '+dpx+o4OIO6K79HruLa66naP7rarAuIErAV1zFZ4P5NNrExRIgJqTFrpsxpPzpl9\n' +
76
+ '8bf2miCj2aPbMjxK2tY/FzWNGurTVSw4W7xmqFDT6gMHPcdWsiAVi/Pc/GUj\n' +
77
+ '-----END RSA PRIVATE KEY-----\n';
78
+ //# sourceMappingURL=test-jwt-rsa-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-jwt-rsa-keys.js","sourceRoot":"","sources":["../../../src/test/fixtures/test-jwt-rsa-keys.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAC9B,kCAAkC;IAClC,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,gCAAgC,CAAC;AAEnC,MAAM,CAAC,MAAM,yBAAyB,GACpC,kCAAkC;IAClC,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,gCAAgC,CAAC;AAEnC,MAAM,CAAC,MAAM,oBAAoB,GAC/B,mCAAmC;IACnC,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,gEAAgE;IAChE,iCAAiC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const TEST_TOKEN_RSA = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4LCJpc3MiOiJ0ZXN0LWlzcyJ9.L_iuofq2Jt-DAmhwsMuoC4YqpcerPB8p6FHrWd8c7iAA25TiCCMPfFJ-sei0ES44qccfS1-aRKRCnthWKnUhtAsV8acwPE3x017nCoSrw_10tU3m2XrLwvz7QOvrBQYsu9-IhcRSCApJ0a9xy2To_oGjlGa9jcVO_E8MbL50Stf5XWHX6Jjt6MmQ7tVQLvcLAguWazCM7C0w3LNsG9GlGQnf4--wo_IDPok9ELkGR1rYok9p88QGrFjaYRkzV6so4L5RQUsfV_36EsiNekIFeUBJr_b3YoezIFZ-F_YxlZ1EaBtJ3O8rfySLcOQmiQR-iQ5jbs_WSPGrbw1ItPuxbjQwDVfEc3zn2GlwHYjaSaff6DyG_4tRmN96rqb4CGLFb9Nidc2FEeJc9RThc1Ygp65hxGQKM4I12k4jt7BzTfxhxmeRO7IJGFfH3-yJ-wGy1Vf9VWTi4SvjLa8jiF_9sWIaorifRSvvqaHqHjcI54EXlkmEG5BWfF5m4JrVoZhxLFohdlFW0HAP_oA3mKnI_QZUc1XVOtxpJwvo6ByM0A6A1pPdThWljfhZx7r56PSc2J5ZLkHKkavvMTjGaub1a1oLxsK0azX-xSg1fI8oy7yadVjyqY_0ArOhIYy22C1mwyBSLsSVylqig6go54PjVWh4JXepvMibmZQqZToayHA";
2
+ export declare const TEST_TOKEN_RSA_EXPIRED = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTcxMzA4LCJpc3MiOiJ0ZXN0LWlzcyJ9.kVjkHPUhqd1UNOGeE8ovzegjqrFVymidv1tSzJoTkpmr_E9NELLsSRxppm4LQSFw5tDIzeqkI0zjmYxpCLuEwpAIxphF9JDEiViNGw_LjWVMh84lppUmJx0YU_cdLd5Xs71U0OgTHlWyz_amnQP3A7j0-pvbRY96E6s1NMp_lydQVeRxAWYRMficXALpJh7uZB8uq516nH1yGfWrGJyG1AUpgCP2VZbxavPHcYX5rGNmT0evbaxUxPM_NhSw10OqpZl7EbGEUEbjCSUW5crJxO5t6egG-bMZiQ868U2epCgRrpviCSduHlEiFOvTYa4yQFcgDexK1B9KuUXKttsdR60weGFmZZhiClEhN151fLdlj1HOH3JE8C8tDE0Eo0s7WAzPyWO52RFdGL_8ybzf8fawFhoUpCkRa6RlmVFj7XMHSW6i-KIPXJ1bMu7Z2Jf3MH_mNkzK_h_gh_me0OjjWLFVdKc3Ul0Di9AFk96zLjI9EEJ9bziXTOp6PoGEM-cC_vSf5tJqYqUjiGW6BPOfwvV8aHfUifc2ctf3qDXZjqVXtiPoZllEqxVV_M59AYcGYWTHo8t_JpX1N0FOcrx7kbR2huWPADTeZGHs4EM2-mbKjt06CQ9IrIlewNBsYAaHsmlMrsabJULAyOHSYtm-i5abP-qeMFpOqYlljiUwwGs";
3
+ export declare const TEST_TOKEN_RSA_OTHER_ISSUER = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4LCJpc3MiOiJvdGhlci1pc3N1ZXIifQ.mwesZ-awkidNWD6rr0NuRYx9LmdPvfdyLOnEsEJAGaLiMdk9nz6FyXuNZfslGSU_Y8T8y8QqN100i-MxbJUeOJT8o00p2O0mkjkMyQJFeuaCazDoaWPyUqpfqKanj_D-saUeXlN1HXKgL2GNgAjc7LfIIT6lpZILpS7jqaGCyKprSer4ftNxgJOe47Exx6JlepOZ_Q-RreOd9vhjcWp06I4-hBBmz5BMzHf2oLCBR35NqLReNIuebIu_1CX95VVXK0Sv_9CMRKSXd8xtEIKmXqUXSPBx41oniC2ue0fe_vtGrpNAtles8kyWiNV5aR1cYpArCXeFnV8HoBZKDqNetCrMvN0N8EXX44rIRydXJP33R4UQTkt_Ap0Af6I4aFY9CIxK53Qtv9f9Os_0Xc8vs-KCf_zA46_jf34g-7wl68FnTMcpX04VwYjffaeLF-1EkplIu7f-vMPJmUvMA0ukC2yjBA7QjaUCOmOPZNmtxzlSov_D90W67UXea5neRCvDzOhPC5gdo7l8qjs7xXuuNf0QlVIqyfWWUeMNbYJcTaWZn_DmEGx_AMRTPwhXhLL-fIWoJQajbw_1PBbWohY_eONfD49SQtAE1tiE7PweG9mX-A3-bCp8Kx8SCTGs2iVZ2HgLOzPOleexxmpHIwvrnpsGMb3LGXuwTJ27RKe7Mnk";
4
+ export declare const TEST_TOKEN_RSA_MISSING_ISSUER = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4fQ.kxDTeu4qZnCyandR-Z9k5xAsdtGCQT33w22FibCK3C8DMTLSRpRgHcjaN8gPOAjxkvPxvcF50mjNjxXP1I1yGt4zcBY3aMaRaCj44O1iUWv4K695sF3NOfHt244n5KKo4IG2mowGRRjQMjSNY95U6IkLt_2QKvpfEAIUxoU544jbXMXxkugiAbIH58uLAteMPqqLqn2OSpDucVC1pJgOpIFvfBQsrCaSLuANvtcj4AYgds2FnUtI_FqRTVIYQzg4gSxOQ9pDfOYZO_o2gg5LM4bgF-tXQN06avWENKO55b5QtigC3LeFXOqGXNRPLv-gQk06Hjm5C5tcY1mAkLI-eN7qg9ZrAXapBWpyrRnbhlI0oSqs1DjJkcm1yn71HgWL3P9LZZ6mrVxDOVnAFqkijMQum3L7fZ5MN6mKNXl9b2heXIGwoVG9I6NmuI36El40GGsN7X_Kq1wT2xBNpgo9r8TYgFlYYwFtH7ggGHc3y_KbVRpGGSO8AyTv_qxF7G7cKcZrRY_K_YfG84FL2x9R7rVb65xQSMuGX4b4GUvpats6r-29sVQ-NFWDD7NFNp5omwC-iwmQ0EoVtgs-yXK9H_kDgZBfxakHZNvqLA8XxMl6nk0kE7lgxCKFSwFRFRJVnJgx62qawSihUh7tMkdUxM5_XcsWLLrdFSlsSGAF0Gc";
5
+ export declare const TEST_TOKEN_RSA_MISSING_SUBJECT = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzM4MDgsImV4cCI6MTY3MTU3NzQwOCwiaXNzIjoidGVzdC1pc3MifQ.FXa6cgr8lKaZmGu3ObMoMJKwD9pYLuH-x0hPn1-Q56u2k1sAJMswcmY9viFGYdK2kh4130kSFrih-VxZ8sd_gawPQPJzty5OIHm27tky5971GYLGsonvjAsDyB-dlvenfFQ9POujq04GxNgvjzutQYrQIgok9wJ8eLjYUhACZOeOd659zhHKe_aONfc07YDAZFNyQFs_v68pEQOr1gGwpxEKw3pBkTLXAmsOtQdkS-Ngc1NPMs_5NkEGJO5IJ1DcdlzCP1QU9wnrK7q_IxsYaFPVmjmstzyhsJ1eD-ZQVFQStCz6wItNRBX2VKwSXyA0t7CXUwa6SNFRFtvOjIvxjZp1CP4pcO1qWGzX9Udibhvj9_pvga1J96GqNH2KY-ZU5PRaCCnrZ0Je_2Mea1-6XKP5ZcF38z6rp1xJ0jVZNVVQ0mdU9sCQLDmk0Q1Ao35Y7LyKXyDowFlVWqe91jqVdntBuf_QCL5OnFWoUT5w3G7mssqOFv_Az8mN-ADTQALVjhZDNIE8rVL_xazPAHWSdTyvSrqrXuhz5at-unO9DY7nOkl7f6QEPJPQvzNyAcBbc0XYkrtY2RwySuNHhH4vS4oqsPyfsP2bbw4y0K4QuWGh08gO_pzDtpFcBdVLo3IDoiSdlP1UGaOqDppRoXUxKVmXFUJPUtgKa55oHt3vHSs";
6
+ export declare const TEST_TOKEN_RSA_STRING_PAYLOAD = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4fQ.kxDTeu4qZnCyandR-Z9k5xAsdtGCQT33w22FibCK3C8DMTLSRpRgHcjaN8gPOAjxkvPxvcF50mjNjxXP1I1yGt4zcBY3aMaRaCj44O1iUWv4K695sF3NOfHt244n5KKo4IG2mowGRRjQMjSNY95U6IkLt_2QKvpfEAIUxoU544jbXMXxkugiAbIH58uLAteMPqqLqn2OSpDucVC1pJgOpIFvfBQsrCaSLuANvtcj4AYgds2FnUtI_FqRTVIYQzg4gSxOQ9pDfOYZO_o2gg5LM4bgF-tXQN06avWENKO55b5QtigC3LeFXOqGXNRPLv-gQk06Hjm5C5tcY1mAkLI-eN7qg9ZrAXapBWpyrRnbhlI0oSqs1DjJkcm1yn71HgWL3P9LZZ6mrVxDOVnAFqkijMQum3L7fZ5MN6mKNXl9b2heXIGwoVG9I6NmuI36El40GGsN7X_Kq1wT2xBNpgo9r8TYgFlYYwFtH7ggGHc3y_KbVRpGGSO8AyTv_qxF7G7cKcZrRY_K_YfG84FL2x9R7rVb65xQSMuGX4b4GUvpats6r-29sVQ-NFWDD7NFNp5omwC-iwmQ0EoVtgs-yXK9H_kDgZBfxakHZNvqLA8XxMl6nk0kE7lgxCKFSwFRFRJVnJgx62qawSihUh7tMkdUxM5_XcsWLLrdFSlsSGAF0Gc";
7
+ //# sourceMappingURL=test-jwt-tokens-rsa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-jwt-tokens-rsa.d.ts","sourceRoot":"","sources":["../../../src/test/fixtures/test-jwt-tokens-rsa.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,k0BACsyB,CAAC;AACl0B,eAAO,MAAM,sBAAsB,k0BAC8xB,CAAC;AACl0B,eAAO,MAAM,2BAA2B,w0BAC+xB,CAAC;AACx0B,eAAO,MAAM,6BAA6B,4yBACiwB,CAAC;AAC5yB,eAAO,MAAM,8BAA8B,4yBACgwB,CAAC;AAC5yB,eAAO,MAAM,6BAA6B,4yBACiwB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const TEST_TOKEN_RSA = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4LCJpc3MiOiJ0ZXN0LWlzcyJ9.L_iuofq2Jt-DAmhwsMuoC4YqpcerPB8p6FHrWd8c7iAA25TiCCMPfFJ-sei0ES44qccfS1-aRKRCnthWKnUhtAsV8acwPE3x017nCoSrw_10tU3m2XrLwvz7QOvrBQYsu9-IhcRSCApJ0a9xy2To_oGjlGa9jcVO_E8MbL50Stf5XWHX6Jjt6MmQ7tVQLvcLAguWazCM7C0w3LNsG9GlGQnf4--wo_IDPok9ELkGR1rYok9p88QGrFjaYRkzV6so4L5RQUsfV_36EsiNekIFeUBJr_b3YoezIFZ-F_YxlZ1EaBtJ3O8rfySLcOQmiQR-iQ5jbs_WSPGrbw1ItPuxbjQwDVfEc3zn2GlwHYjaSaff6DyG_4tRmN96rqb4CGLFb9Nidc2FEeJc9RThc1Ygp65hxGQKM4I12k4jt7BzTfxhxmeRO7IJGFfH3-yJ-wGy1Vf9VWTi4SvjLa8jiF_9sWIaorifRSvvqaHqHjcI54EXlkmEG5BWfF5m4JrVoZhxLFohdlFW0HAP_oA3mKnI_QZUc1XVOtxpJwvo6ByM0A6A1pPdThWljfhZx7r56PSc2J5ZLkHKkavvMTjGaub1a1oLxsK0azX-xSg1fI8oy7yadVjyqY_0ArOhIYy22C1mwyBSLsSVylqig6go54PjVWh4JXepvMibmZQqZToayHA';
2
+ export const TEST_TOKEN_RSA_EXPIRED = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTcxMzA4LCJpc3MiOiJ0ZXN0LWlzcyJ9.kVjkHPUhqd1UNOGeE8ovzegjqrFVymidv1tSzJoTkpmr_E9NELLsSRxppm4LQSFw5tDIzeqkI0zjmYxpCLuEwpAIxphF9JDEiViNGw_LjWVMh84lppUmJx0YU_cdLd5Xs71U0OgTHlWyz_amnQP3A7j0-pvbRY96E6s1NMp_lydQVeRxAWYRMficXALpJh7uZB8uq516nH1yGfWrGJyG1AUpgCP2VZbxavPHcYX5rGNmT0evbaxUxPM_NhSw10OqpZl7EbGEUEbjCSUW5crJxO5t6egG-bMZiQ868U2epCgRrpviCSduHlEiFOvTYa4yQFcgDexK1B9KuUXKttsdR60weGFmZZhiClEhN151fLdlj1HOH3JE8C8tDE0Eo0s7WAzPyWO52RFdGL_8ybzf8fawFhoUpCkRa6RlmVFj7XMHSW6i-KIPXJ1bMu7Z2Jf3MH_mNkzK_h_gh_me0OjjWLFVdKc3Ul0Di9AFk96zLjI9EEJ9bziXTOp6PoGEM-cC_vSf5tJqYqUjiGW6BPOfwvV8aHfUifc2ctf3qDXZjqVXtiPoZllEqxVV_M59AYcGYWTHo8t_JpX1N0FOcrx7kbR2huWPADTeZGHs4EM2-mbKjt06CQ9IrIlewNBsYAaHsmlMrsabJULAyOHSYtm-i5abP-qeMFpOqYlljiUwwGs';
3
+ export const TEST_TOKEN_RSA_OTHER_ISSUER = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4LCJpc3MiOiJvdGhlci1pc3N1ZXIifQ.mwesZ-awkidNWD6rr0NuRYx9LmdPvfdyLOnEsEJAGaLiMdk9nz6FyXuNZfslGSU_Y8T8y8QqN100i-MxbJUeOJT8o00p2O0mkjkMyQJFeuaCazDoaWPyUqpfqKanj_D-saUeXlN1HXKgL2GNgAjc7LfIIT6lpZILpS7jqaGCyKprSer4ftNxgJOe47Exx6JlepOZ_Q-RreOd9vhjcWp06I4-hBBmz5BMzHf2oLCBR35NqLReNIuebIu_1CX95VVXK0Sv_9CMRKSXd8xtEIKmXqUXSPBx41oniC2ue0fe_vtGrpNAtles8kyWiNV5aR1cYpArCXeFnV8HoBZKDqNetCrMvN0N8EXX44rIRydXJP33R4UQTkt_Ap0Af6I4aFY9CIxK53Qtv9f9Os_0Xc8vs-KCf_zA46_jf34g-7wl68FnTMcpX04VwYjffaeLF-1EkplIu7f-vMPJmUvMA0ukC2yjBA7QjaUCOmOPZNmtxzlSov_D90W67UXea5neRCvDzOhPC5gdo7l8qjs7xXuuNf0QlVIqyfWWUeMNbYJcTaWZn_DmEGx_AMRTPwhXhLL-fIWoJQajbw_1PBbWohY_eONfD49SQtAE1tiE7PweG9mX-A3-bCp8Kx8SCTGs2iVZ2HgLOzPOleexxmpHIwvrnpsGMb3LGXuwTJ27RKe7Mnk';
4
+ export const TEST_TOKEN_RSA_MISSING_ISSUER = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4fQ.kxDTeu4qZnCyandR-Z9k5xAsdtGCQT33w22FibCK3C8DMTLSRpRgHcjaN8gPOAjxkvPxvcF50mjNjxXP1I1yGt4zcBY3aMaRaCj44O1iUWv4K695sF3NOfHt244n5KKo4IG2mowGRRjQMjSNY95U6IkLt_2QKvpfEAIUxoU544jbXMXxkugiAbIH58uLAteMPqqLqn2OSpDucVC1pJgOpIFvfBQsrCaSLuANvtcj4AYgds2FnUtI_FqRTVIYQzg4gSxOQ9pDfOYZO_o2gg5LM4bgF-tXQN06avWENKO55b5QtigC3LeFXOqGXNRPLv-gQk06Hjm5C5tcY1mAkLI-eN7qg9ZrAXapBWpyrRnbhlI0oSqs1DjJkcm1yn71HgWL3P9LZZ6mrVxDOVnAFqkijMQum3L7fZ5MN6mKNXl9b2heXIGwoVG9I6NmuI36El40GGsN7X_Kq1wT2xBNpgo9r8TYgFlYYwFtH7ggGHc3y_KbVRpGGSO8AyTv_qxF7G7cKcZrRY_K_YfG84FL2x9R7rVb65xQSMuGX4b4GUvpats6r-29sVQ-NFWDD7NFNp5omwC-iwmQ0EoVtgs-yXK9H_kDgZBfxakHZNvqLA8XxMl6nk0kE7lgxCKFSwFRFRJVnJgx62qawSihUh7tMkdUxM5_XcsWLLrdFSlsSGAF0Gc';
5
+ export const TEST_TOKEN_RSA_MISSING_SUBJECT = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzM4MDgsImV4cCI6MTY3MTU3NzQwOCwiaXNzIjoidGVzdC1pc3MifQ.FXa6cgr8lKaZmGu3ObMoMJKwD9pYLuH-x0hPn1-Q56u2k1sAJMswcmY9viFGYdK2kh4130kSFrih-VxZ8sd_gawPQPJzty5OIHm27tky5971GYLGsonvjAsDyB-dlvenfFQ9POujq04GxNgvjzutQYrQIgok9wJ8eLjYUhACZOeOd659zhHKe_aONfc07YDAZFNyQFs_v68pEQOr1gGwpxEKw3pBkTLXAmsOtQdkS-Ngc1NPMs_5NkEGJO5IJ1DcdlzCP1QU9wnrK7q_IxsYaFPVmjmstzyhsJ1eD-ZQVFQStCz6wItNRBX2VKwSXyA0t7CXUwa6SNFRFtvOjIvxjZp1CP4pcO1qWGzX9Udibhvj9_pvga1J96GqNH2KY-ZU5PRaCCnrZ0Je_2Mea1-6XKP5ZcF38z6rp1xJ0jVZNVVQ0mdU9sCQLDmk0Q1Ao35Y7LyKXyDowFlVWqe91jqVdntBuf_QCL5OnFWoUT5w3G7mssqOFv_Az8mN-ADTQALVjhZDNIE8rVL_xazPAHWSdTyvSrqrXuhz5at-unO9DY7nOkl7f6QEPJPQvzNyAcBbc0XYkrtY2RwySuNHhH4vS4oqsPyfsP2bbw4y0K4QuWGh08gO_pzDtpFcBdVLo3IDoiSdlP1UGaOqDppRoXUxKVmXFUJPUtgKa55oHt3vHSs';
6
+ export const TEST_TOKEN_RSA_STRING_PAYLOAD = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4fQ.kxDTeu4qZnCyandR-Z9k5xAsdtGCQT33w22FibCK3C8DMTLSRpRgHcjaN8gPOAjxkvPxvcF50mjNjxXP1I1yGt4zcBY3aMaRaCj44O1iUWv4K695sF3NOfHt244n5KKo4IG2mowGRRjQMjSNY95U6IkLt_2QKvpfEAIUxoU544jbXMXxkugiAbIH58uLAteMPqqLqn2OSpDucVC1pJgOpIFvfBQsrCaSLuANvtcj4AYgds2FnUtI_FqRTVIYQzg4gSxOQ9pDfOYZO_o2gg5LM4bgF-tXQN06avWENKO55b5QtigC3LeFXOqGXNRPLv-gQk06Hjm5C5tcY1mAkLI-eN7qg9ZrAXapBWpyrRnbhlI0oSqs1DjJkcm1yn71HgWL3P9LZZ6mrVxDOVnAFqkijMQum3L7fZ5MN6mKNXl9b2heXIGwoVG9I6NmuI36El40GGsN7X_Kq1wT2xBNpgo9r8TYgFlYYwFtH7ggGHc3y_KbVRpGGSO8AyTv_qxF7G7cKcZrRY_K_YfG84FL2x9R7rVb65xQSMuGX4b4GUvpats6r-29sVQ-NFWDD7NFNp5omwC-iwmQ0EoVtgs-yXK9H_kDgZBfxakHZNvqLA8XxMl6nk0kE7lgxCKFSwFRFRJVnJgx62qawSihUh7tMkdUxM5_XcsWLLrdFSlsSGAF0Gc';
7
+ //# sourceMappingURL=test-jwt-tokens-rsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-jwt-tokens-rsa.js","sourceRoot":"","sources":["../../../src/test/fixtures/test-jwt-tokens-rsa.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GACzB,+zBAA+zB,CAAC;AACl0B,MAAM,CAAC,MAAM,sBAAsB,GACjC,+zBAA+zB,CAAC;AACl0B,MAAM,CAAC,MAAM,2BAA2B,GACtC,q0BAAq0B,CAAC;AACx0B,MAAM,CAAC,MAAM,6BAA6B,GACxC,yyBAAyyB,CAAC;AAC5yB,MAAM,CAAC,MAAM,8BAA8B,GACzC,yyBAAyyB,CAAC;AAC5yB,MAAM,CAAC,MAAM,6BAA6B,GACxC,yyBAAyyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const TEST_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4LCJpc3MiOiJ0ZXN0LWlzcyJ9.IfZ_IlbKl2S7pkKBqTis0kyBmDuXGbBkCdCkrDdLq_Q";
2
+ export declare const TEST_TOKEN_EXPIRED = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzM4MDAsImV4cCI6MTY3MTU3MzgwMSwiaXNzIjoib3RoZXIifQ.hqHdbRzB4HqiYA1FRADQwR7RUE22N7vMsPGwDsvwdMo";
3
+ export declare const TEST_TOKEN_OTHER_ISSUER = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzQ0MzYsImV4cCI6MTY3MTU4NDQzNiwiaXNzIjoib3RoZXIifQ.lW7nOIQNHlFAv5dfzivR-V-ufHiZ4MTNo1IPyQXoZ8k";
4
+ export declare const TEST_TOKEN_MISSING_ISSUER = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzQ0MzYsImV4cCI6MTY3MTU4NDQzNiwiaXNzIjoib3RoZXIifQ.lW7nOIQNHlFAv5dfzivR-V-ufHiZ4MTNo1IPyQXoZ8k";
5
+ export declare const TEST_TOKEN_MISSING_SUBJECT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzM4MDgsImV4cCI6MTY3MTU3NzQwOCwiaXNzIjoidGVzdC1pc3MifQ.G5yi_IPSIj5GZp2jz4aV3DfdTotwUy3xivHlU79_ppc";
6
+ export declare const TEST_TOKEN_STRING_PAYLOAD = "eyJhbGciOiJIUzI1NiJ9.anVzdCBhIHN0cmluZw.WY-fOyNQW58U_kiDUfXPP5m_Bsl2_0Jj0AvVgsrRwWE";
7
+ //# sourceMappingURL=test-jwt-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-jwt-tokens.d.ts","sourceRoot":"","sources":["../../../src/test/fixtures/test-jwt-tokens.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,kMAC0K,CAAC;AAClM,eAAO,MAAM,kBAAkB,wKACwI,CAAC;AACxK,eAAO,MAAM,uBAAuB,wKACmI,CAAC;AACxK,eAAO,MAAM,yBAAyB,wKACiI,CAAC;AACxK,eAAO,MAAM,0BAA0B,4KACoI,CAAC;AAC5K,eAAO,MAAM,yBAAyB,wFACiD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const TEST_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJzdWIiOiJ0ZXN0LXN1YiIsImlhdCI6MTY3MTU3MzgwOCwiZXhwIjoxNjcxNTc3NDA4LCJpc3MiOiJ0ZXN0LWlzcyJ9.IfZ_IlbKl2S7pkKBqTis0kyBmDuXGbBkCdCkrDdLq_Q';
2
+ export const TEST_TOKEN_EXPIRED = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzM4MDAsImV4cCI6MTY3MTU3MzgwMSwiaXNzIjoib3RoZXIifQ.hqHdbRzB4HqiYA1FRADQwR7RUE22N7vMsPGwDsvwdMo';
3
+ export const TEST_TOKEN_OTHER_ISSUER = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzQ0MzYsImV4cCI6MTY3MTU4NDQzNiwiaXNzIjoib3RoZXIifQ.lW7nOIQNHlFAv5dfzivR-V-ufHiZ4MTNo1IPyQXoZ8k';
4
+ export const TEST_TOKEN_MISSING_ISSUER = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzQ0MzYsImV4cCI6MTY3MTU4NDQzNiwiaXNzIjoib3RoZXIifQ.lW7nOIQNHlFAv5dfzivR-V-ufHiZ4MTNo1IPyQXoZ8k';
5
+ export const TEST_TOKEN_MISSING_SUBJECT = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE2NzE1NzM4MDgsImV4cCI6MTY3MTU3NzQwOCwiaXNzIjoidGVzdC1pc3MifQ.G5yi_IPSIj5GZp2jz4aV3DfdTotwUy3xivHlU79_ppc';
6
+ export const TEST_TOKEN_STRING_PAYLOAD = 'eyJhbGciOiJIUzI1NiJ9.anVzdCBhIHN0cmluZw.WY-fOyNQW58U_kiDUfXPP5m_Bsl2_0Jj0AvVgsrRwWE';
7
+ //# sourceMappingURL=test-jwt-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-jwt-tokens.js","sourceRoot":"","sources":["../../../src/test/fixtures/test-jwt-tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GACrB,+LAA+L,CAAC;AAClM,MAAM,CAAC,MAAM,kBAAkB,GAC7B,qKAAqK,CAAC;AACxK,MAAM,CAAC,MAAM,uBAAuB,GAClC,qKAAqK,CAAC;AACxK,MAAM,CAAC,MAAM,yBAAyB,GACpC,qKAAqK,CAAC;AACxK,MAAM,CAAC,MAAM,0BAA0B,GACrC,yKAAyK,CAAC;AAC5K,MAAM,CAAC,MAAM,yBAAyB,GACpC,qFAAqF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,138 @@
1
+ {
2
+ "name": "@konker.dev/neverthrow-r-auth-utils",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "author": "Konrad Markus <mail@konker.dev>",
6
+ "license": "ISC",
7
+ "description": "Auth utils for neverthrow and @konker.dev/neverthrow-r.",
8
+ "homepage": "https://konker.dev/",
9
+ "keywords": [
10
+ "node",
11
+ "neverthrow",
12
+ "neverthrow-r",
13
+ "typescript",
14
+ "functional-programming"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/konker/konker.dev/packages/neverthrow-r-auth-utils"
19
+ },
20
+ "exports": {
21
+ "./package.json": "./package.json",
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ },
26
+ "./jwt/common": {
27
+ "types": "./dist/jwt/common.d.ts",
28
+ "import": "./dist/jwt/common.js"
29
+ },
30
+ "./jwt": {
31
+ "types": "./dist/jwt/index.d.ts",
32
+ "import": "./dist/jwt/index.js"
33
+ },
34
+ "./jwt/rsa": {
35
+ "types": "./dist/jwt/rsa.d.ts",
36
+ "import": "./dist/jwt/rsa.js"
37
+ },
38
+ "./lib/toError": {
39
+ "types": "./dist/lib/toError.d.ts",
40
+ "import": "./dist/lib/toError.js"
41
+ },
42
+ "./test/fixtures/jwt": {
43
+ "types": "./dist/test/fixtures/jwt.d.ts",
44
+ "import": "./dist/test/fixtures/jwt.js"
45
+ },
46
+ "./test/fixtures/test-jwt-rsa-keys": {
47
+ "types": "./dist/test/fixtures/test-jwt-rsa-keys.d.ts",
48
+ "import": "./dist/test/fixtures/test-jwt-rsa-keys.js"
49
+ },
50
+ "./test/fixtures/test-jwt-tokens-rsa": {
51
+ "types": "./dist/test/fixtures/test-jwt-tokens-rsa.d.ts",
52
+ "import": "./dist/test/fixtures/test-jwt-tokens-rsa.js"
53
+ },
54
+ "./test/fixtures/test-jwt-tokens": {
55
+ "types": "./dist/test/fixtures/test-jwt-tokens.d.ts",
56
+ "import": "./dist/test/fixtures/test-jwt-tokens.js"
57
+ },
58
+ "./aws-authorizer": {
59
+ "types": "./dist/aws-authorizer.d.ts",
60
+ "import": "./dist/aws-authorizer.js"
61
+ },
62
+ "./basic-auth": {
63
+ "types": "./dist/basic-auth.d.ts",
64
+ "import": "./dist/basic-auth.js"
65
+ },
66
+ "./helpers": {
67
+ "types": "./dist/helpers.d.ts",
68
+ "import": "./dist/helpers.js"
69
+ }
70
+ },
71
+ "files": [
72
+ "dist/**/*",
73
+ "!dist/**/*.test.*"
74
+ ],
75
+ "main": "dist/index.js",
76
+ "peerDependencies": {
77
+ "aws-lambda": "^1.0.7",
78
+ "jsonwebtoken": "^9.0.2"
79
+ },
80
+ "devDependencies": {
81
+ "@arethetypeswrong/cli": "^0.18.2",
82
+ "@effect/language-service": "^0.86.1",
83
+ "@eslint/compat": "^2.0.1",
84
+ "@eslint/js": "^9.39.2",
85
+ "@konker.dev/common-config": "^0.8.0",
86
+ "@types/aws-lambda": "^8.10.159",
87
+ "@types/jsonwebtoken": "^9.0.10",
88
+ "@types/node": "^25.8.0",
89
+ "@vitest/coverage-istanbul": "^4.1.6",
90
+ "aws-lambda": "^1.0.7",
91
+ "aws-sdk-client-mock": "^4.1.0",
92
+ "aws-sdk-client-mock-vitest": "^7.0.1",
93
+ "eslint": "^9.39.2",
94
+ "eslint-plugin-fp": "^2.3.0",
95
+ "eslint-plugin-prettier": "^5.5.5",
96
+ "eslint-plugin-simple-import-sort": "^12.1.1",
97
+ "eslint-plugin-sort-destructure-keys": "^2.0.0",
98
+ "jsonwebtoken": "^9.0.3",
99
+ "leasot": "^14.4.0",
100
+ "madge": "^8.0.0",
101
+ "prettier": "^3.8.3",
102
+ "tsx": "^4.22.1",
103
+ "type-coverage": "^2.29.7",
104
+ "typedoc": "^0.28.15",
105
+ "typedoc-plugin-markdown": "^4.4.0",
106
+ "typescript": "^5.9.3",
107
+ "typescript-eslint": "^8.52.0",
108
+ "vitest": "^4.1.6",
109
+ "zod": "^3.23.0"
110
+ },
111
+ "dependencies": {
112
+ "neverthrow": "^8.2.0",
113
+ "@konker.dev/neverthrow-r": "0.0.1"
114
+ },
115
+ "scripts": {
116
+ "test": "vitest run --coverage",
117
+ "clean": "rm -rf dist && rm -f tsconfig.tsbuildinfo",
118
+ "typecheck": "tsc --noEmit",
119
+ "build": "pnpm run clean && tsc",
120
+ "type-coverage-check": "type-coverage --detail --at-least 97",
121
+ "circular-check": "madge --extensions ts --circular --no-color --no-spinner --warning src",
122
+ "eslint-check": "eslint --max-warnings=0 '**/*.{ts,js,json}'",
123
+ "eslint-fix": "npx eslint --fix||true",
124
+ "generated-exports-check": "npx --package=@konker.dev/common-config generate-exports-verify `pwd`",
125
+ "docs-generate": "typedoc",
126
+ "generated-docs-check": "pnpm run docs-generate && git diff --exit-code docs/reference",
127
+ "exports-check": "NPM_CONFIG_CACHE=.npm-cache attw --pack . --ignore-rules=cjs-resolves-to-esm --profile=esm-only",
128
+ "fixme-check": "leasot --exit-nicely --skip-unsupported src",
129
+ "prettier-check": "npx prettier --check --ignore-path .gitignore --ignore-path .prettierignore '**/*.{css,html,js,ts,json,md,yaml,yml}'",
130
+ "prettier-fix": "pnpm run prettier-check --write",
131
+ "lint-check": "pnpm run eslint-check && pnpm run prettier-check && pnpm run circular-check && pnpm run fixme-check",
132
+ "lint-fix": "pnpm run eslint-fix && pnpm run prettier-fix",
133
+ "pre-push": "pnpm run lint-check && pnpm run typecheck",
134
+ "codecov": "npx --package=@konker.dev/common-config codecov-upload `pwd` '@konker.dev/neverthrow-r-auth-utils'",
135
+ "ci": "pnpm run lint-check && pnpm run typecheck && pnpm run type-coverage-check && pnpm run test && pnpm run build && pnpm run generated-exports-check && pnpm run generated-docs-check && pnpm run exports-check && pnpm run fixme-check",
136
+ "cd": "pnpm run build && npx --package=@konker.dev/common-config npm-publish-if-version-not-exists `pwd`"
137
+ }
138
+ }