@knsdev/node-utils 1.0.1 → 3.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.
Files changed (94) hide show
  1. package/README.md +375 -0
  2. package/dist/CLengths.d.ts +60 -0
  3. package/dist/CLengths.d.ts.map +1 -0
  4. package/dist/CLengths.js +60 -0
  5. package/dist/CLengths.js.map +1 -0
  6. package/dist/Cookies.d.ts +33 -0
  7. package/dist/Cookies.d.ts.map +1 -0
  8. package/dist/Cookies.js +54 -0
  9. package/dist/Cookies.js.map +1 -0
  10. package/dist/ECApiCodes.d.ts +2 -0
  11. package/dist/ECApiCodes.d.ts.map +1 -0
  12. package/dist/ECApiCodes.js +2 -0
  13. package/dist/ECApiCodes.js.map +1 -0
  14. package/dist/ErrorClasses.d.ts +78 -0
  15. package/dist/ErrorClasses.d.ts.map +1 -0
  16. package/dist/ErrorClasses.js +118 -0
  17. package/dist/ErrorClasses.js.map +1 -0
  18. package/dist/FBUtils.d.ts +22 -0
  19. package/dist/FBUtils.d.ts.map +1 -0
  20. package/dist/FBUtils.js +68 -0
  21. package/dist/FBUtils.js.map +1 -0
  22. package/dist/GoogleUtils.d.ts +43 -0
  23. package/dist/GoogleUtils.d.ts.map +1 -0
  24. package/dist/GoogleUtils.js +79 -0
  25. package/dist/GoogleUtils.js.map +1 -0
  26. package/dist/HMACUtils.d.ts +40 -0
  27. package/dist/HMACUtils.d.ts.map +1 -0
  28. package/dist/HMACUtils.js +62 -0
  29. package/dist/HMACUtils.js.map +1 -0
  30. package/dist/HttpCodes.d.ts +26 -0
  31. package/dist/HttpCodes.d.ts.map +1 -0
  32. package/dist/HttpCodes.js +25 -0
  33. package/dist/HttpCodes.js.map +1 -0
  34. package/dist/IDUtils.d.ts +28 -0
  35. package/dist/IDUtils.d.ts.map +1 -0
  36. package/dist/IDUtils.js +47 -0
  37. package/dist/IDUtils.js.map +1 -0
  38. package/dist/JwtUtils.d.ts +51 -0
  39. package/dist/JwtUtils.d.ts.map +1 -0
  40. package/dist/JwtUtils.js +78 -0
  41. package/dist/JwtUtils.js.map +1 -0
  42. package/dist/Nums.d.ts +101 -0
  43. package/dist/Nums.d.ts.map +1 -0
  44. package/dist/Nums.js +141 -0
  45. package/dist/Nums.js.map +1 -0
  46. package/dist/PassUtils.d.ts +59 -0
  47. package/dist/PassUtils.d.ts.map +1 -0
  48. package/dist/PassUtils.js +84 -0
  49. package/dist/PassUtils.js.map +1 -0
  50. package/dist/Rand.d.ts +44 -0
  51. package/dist/Rand.d.ts.map +1 -0
  52. package/dist/Rand.js +72 -0
  53. package/dist/Rand.js.map +1 -0
  54. package/dist/TurnstileValidator.d.ts +57 -0
  55. package/dist/TurnstileValidator.d.ts.map +1 -0
  56. package/dist/TurnstileValidator.js +99 -0
  57. package/dist/TurnstileValidator.js.map +1 -0
  58. package/dist/bnUtils.d.ts +15 -0
  59. package/dist/bnUtils.d.ts.map +1 -0
  60. package/dist/bnUtils.js +67 -0
  61. package/dist/bnUtils.js.map +1 -0
  62. package/dist/getEnvv.d.ts +21 -0
  63. package/dist/getEnvv.d.ts.map +1 -0
  64. package/dist/getEnvv.js +68 -0
  65. package/dist/getEnvv.js.map +1 -0
  66. package/dist/index.d.ts +19 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +17 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/tryCatch.d.ts +23 -0
  71. package/dist/tryCatch.d.ts.map +1 -0
  72. package/dist/tryCatch.js +29 -0
  73. package/dist/tryCatch.js.map +1 -0
  74. package/dist/types.d.ts +9 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +2 -0
  77. package/dist/types.js.map +1 -0
  78. package/dist/validators.d.ts +7 -0
  79. package/dist/validators.d.ts.map +1 -0
  80. package/dist/validators.js +11 -0
  81. package/dist/validators.js.map +1 -0
  82. package/dist/zod.d.ts +12 -0
  83. package/dist/zod.d.ts.map +1 -0
  84. package/dist/zod.js +33 -0
  85. package/dist/zod.js.map +1 -0
  86. package/dist/zodTypes.d.ts +2 -0
  87. package/dist/zodTypes.d.ts.map +1 -0
  88. package/dist/zodTypes.js +2 -0
  89. package/dist/zodTypes.js.map +1 -0
  90. package/package.json +2 -3
  91. package/dist/l.d.ts +0 -2
  92. package/dist/l.d.ts.map +0 -1
  93. package/dist/l.js +0 -2
  94. package/dist/l.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorClasses.d.ts","sourceRoot":"","sources":["../src/ErrorClasses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;GAGG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,UAAU,CAAC;IACpB,cAAc,EAAE,IAAI,GAAG,SAAS,CAAC;IAEjC;;;;;OAKG;gBACS,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,SAAK,EAAE,cAAc,CAAC,EAAE,IAAI;CAQnF;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;IAChD;;;OAGG;gBACS,OAAO,GAAE,UAAoC,EAAE,KAAK,SAAK;CAKrE;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC5C;;;OAGG;gBACS,OAAO,GAAE,UAAgC,EAAE,cAAc,CAAC,EAAE,IAAI;CAG5E;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,QAAQ;IACvC;;;OAGG;gBACS,OAAO,GAAE,UAA0B,EAAE,KAAK,SAAK;CAK3D;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,QAAQ;IACtC;;;OAGG;gBACS,OAAO,GAAE,UAAwB,EAAE,KAAK,SAAK;CAKzD;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACzC;;;OAGG;gBACS,OAAO,GAAE,UAA2B,EAAE,KAAK,SAAK;CAK5D;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,QAAQ;IACrC;;;OAGG;gBACS,OAAO,GAAE,UAAwB,EAAE,KAAK,SAAK;CAKzD"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Base error type for API responses.
3
+ * Extends {@link Error} with an HTTP status code and an API error code.
4
+ */
5
+ export class ApiError extends Error {
6
+ status;
7
+ message;
8
+ retryAfterDate;
9
+ /**
10
+ * @param status - HTTP status code associated with the error.
11
+ * @param message - API error code (defaults to `API_ERROR`).
12
+ * @param stack - Optional stack trace override (empty string means "use default").
13
+ * @param retryAfterDate - Optional date used for rate-limit responses (e.g. `429`).
14
+ */
15
+ constructor(status, message, stack = "", retryAfterDate) {
16
+ super(message || 'API_ERROR');
17
+ this.status = status;
18
+ this.message = message || 'API_ERROR';
19
+ this.retryAfterDate = retryAfterDate;
20
+ if (stack)
21
+ this.stack = stack;
22
+ else
23
+ Error.captureStackTrace(this, this.constructor);
24
+ }
25
+ }
26
+ /**
27
+ * 500 Internal Server Error.
28
+ */
29
+ export class InternalServerError extends ApiError {
30
+ /**
31
+ * @param message - API error code (defaults to `INTERNAL_SERVER_ERROR`).
32
+ * @param stack - Optional stack trace override (empty string means "use default").
33
+ */
34
+ constructor(message = 'INTERNAL_SERVER_ERROR', stack = "") {
35
+ super(500, message);
36
+ if (stack)
37
+ this.stack = stack;
38
+ else
39
+ Error.captureStackTrace(this, this.constructor);
40
+ }
41
+ }
42
+ /**
43
+ * 429 Too Many Requests.
44
+ */
45
+ export class TooManyRequests extends ApiError {
46
+ /**
47
+ * @param message - API error code (defaults to `TOO_MANY_REQUESTS`).
48
+ * @param retryAfterDate - Optional date when clients may retry.
49
+ */
50
+ constructor(message = 'TOO_MANY_REQUESTS', retryAfterDate) {
51
+ super(429, message, undefined, retryAfterDate);
52
+ }
53
+ }
54
+ /**
55
+ * 400 Bad Request.
56
+ */
57
+ export class BadRequest extends ApiError {
58
+ /**
59
+ * @param message - API error code (defaults to `BAD_REQUEST`).
60
+ * @param stack - Optional stack trace override (empty string means "use default").
61
+ */
62
+ constructor(message = 'BAD_REQUEST', stack = "") {
63
+ super(400, message);
64
+ if (stack)
65
+ this.stack = stack;
66
+ else
67
+ Error.captureStackTrace(this, this.constructor);
68
+ }
69
+ }
70
+ /**
71
+ * 403 Forbidden.
72
+ */
73
+ export class Forbidden extends ApiError {
74
+ /**
75
+ * @param message - API error code (defaults to `FORBIDDEN`).
76
+ * @param stack - Optional stack trace override (empty string means "use default").
77
+ */
78
+ constructor(message = 'FORBIDDEN', stack = "") {
79
+ super(403, message);
80
+ if (stack)
81
+ this.stack = stack;
82
+ else
83
+ Error.captureStackTrace(this, this.constructor);
84
+ }
85
+ }
86
+ /**
87
+ * 401 Unauthorized.
88
+ */
89
+ export class Unauthorized extends ApiError {
90
+ /**
91
+ * @param message - API error code (defaults to `UNAUTHORIZED`).
92
+ * @param stack - Optional stack trace override (empty string means "use default").
93
+ */
94
+ constructor(message = 'UNAUTHORIZED', stack = "") {
95
+ super(401, message);
96
+ if (stack)
97
+ this.stack = stack;
98
+ else
99
+ Error.captureStackTrace(this, this.constructor);
100
+ }
101
+ }
102
+ /**
103
+ * 404 Not Found.
104
+ */
105
+ export class NotFound extends ApiError {
106
+ /**
107
+ * @param message - API error code (defaults to `NOT_FOUND`).
108
+ * @param stack - Optional stack trace override (empty string means "use default").
109
+ */
110
+ constructor(message = 'NOT_FOUND', stack = "") {
111
+ super(404, message);
112
+ if (stack)
113
+ this.stack = stack;
114
+ else
115
+ Error.captureStackTrace(this, this.constructor);
116
+ }
117
+ }
118
+ //# sourceMappingURL=ErrorClasses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorClasses.js","sourceRoot":"","sources":["../src/ErrorClasses.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAClC,MAAM,CAAS;IACf,OAAO,CAAa;IACpB,cAAc,CAAmB;IAEjC;;;;;OAKG;IACH,YAAY,MAAc,EAAE,OAAoB,EAAE,KAAK,GAAG,EAAE,EAAE,cAAqB;QAClF,KAAK,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,WAAW,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;YACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAChD;;;OAGG;IACH,YAAY,UAAsB,uBAAuB,EAAE,KAAK,GAAG,EAAE;QACpE,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpB,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;YACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC5C;;;OAGG;IACH,YAAY,UAAsB,mBAAmB,EAAE,cAAqB;QAC3E,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAChD,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACvC;;;OAGG;IACH,YAAY,UAAsB,aAAa,EAAE,KAAK,GAAG,EAAE;QAC1D,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpB,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;YACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACtC;;;OAGG;IACH,YAAY,UAAsB,WAAW,EAAE,KAAK,GAAG,EAAE;QACxD,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpB,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;YACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACzC;;;OAGG;IACH,YAAY,UAAsB,cAAc,EAAE,KAAK,GAAG,EAAE;QAC3D,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpB,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;YACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,QAAQ;IACrC;;;OAGG;IACH,YAAY,UAAsB,WAAW,EAAE,KAAK,GAAG,EAAE;QACxD,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpB,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;YACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;CACD"}
@@ -0,0 +1,22 @@
1
+ declare class facebookUtils {
2
+ /**
3
+ * Validates a Facebook access token and fetches user profile details.
4
+ * Uses POST bodies so tokens and app secrets are not placed in request URLs (fewer access-log leaks).
5
+ * @param token - Facebook user access token.
6
+ * @param appId - Facebook application ID.
7
+ * @param appSecret - Facebook application secret.
8
+ * @returns Normalized user profile or `null` if token/profile lookup fails.
9
+ */
10
+ readonly getUserFromJwt: (token: string, appId: string, appSecret: string) => Promise<{
11
+ name: string | undefined;
12
+ email: string | undefined;
13
+ picture: string | undefined;
14
+ oauth_id: string;
15
+ } | null>;
16
+ }
17
+ /**
18
+ * Singleton instance of Facebook OAuth utilities.
19
+ */
20
+ export declare const FacebookUtils: facebookUtils;
21
+ export {};
22
+ //# sourceMappingURL=FBUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FBUtils.d.ts","sourceRoot":"","sources":["../src/FBUtils.ts"],"names":[],"mappings":"AAWA,cAAM,aAAa;IAClB;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,GAAU,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC;QAC1F,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC,CA4DR;CACD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { tryCatch } from "./tryCatch.js";
2
+ const FORM_URLENCODED = "application/x-www-form-urlencoded";
3
+ class facebookUtils {
4
+ /**
5
+ * Validates a Facebook access token and fetches user profile details.
6
+ * Uses POST bodies so tokens and app secrets are not placed in request URLs (fewer access-log leaks).
7
+ * @param token - Facebook user access token.
8
+ * @param appId - Facebook application ID.
9
+ * @param appSecret - Facebook application secret.
10
+ * @returns Normalized user profile or `null` if token/profile lookup fails.
11
+ */
12
+ getUserFromJwt = async (token, appId, appSecret) => {
13
+ const debugBody = new URLSearchParams({
14
+ input_token: token,
15
+ access_token: `${appId}|${appSecret}`,
16
+ });
17
+ const [response, error] = await tryCatch(fetch("https://graph.facebook.com/v19.0/debug_token", {
18
+ method: "POST",
19
+ headers: { "Content-Type": FORM_URLENCODED },
20
+ body: debugBody.toString(),
21
+ }));
22
+ if (error) {
23
+ return null;
24
+ }
25
+ if (!response.ok) {
26
+ return null;
27
+ }
28
+ const data = (await response.json());
29
+ if (!data.data?.is_valid || data.data.app_id !== appId) {
30
+ return null;
31
+ }
32
+ // `expires_at === 0` is treated as non-expiring (avoid rejecting valid long-lived tokens).
33
+ const nowSec = Date.now() / 1000;
34
+ if (data.data.expires_at !== 0 && data.data.expires_at < nowSec) {
35
+ return null;
36
+ }
37
+ const meBody = new URLSearchParams({
38
+ fields: "id,name,email,picture.type(large)",
39
+ access_token: token,
40
+ });
41
+ const [user, userError] = await tryCatch(fetch("https://graph.facebook.com/v19.0/me", {
42
+ method: "POST",
43
+ headers: { "Content-Type": FORM_URLENCODED },
44
+ body: meBody.toString(),
45
+ }));
46
+ if (userError) {
47
+ return null;
48
+ }
49
+ if (!user.ok) {
50
+ return null;
51
+ }
52
+ const userData = (await user.json());
53
+ if (!userData.id) {
54
+ return null;
55
+ }
56
+ return {
57
+ oauth_id: userData.id,
58
+ name: userData.name ?? 'Anonymous',
59
+ email: userData.email,
60
+ picture: userData.picture?.data?.url ?? ``,
61
+ };
62
+ };
63
+ }
64
+ /**
65
+ * Singleton instance of Facebook OAuth utilities.
66
+ */
67
+ export const FacebookUtils = new facebookUtils();
68
+ //# sourceMappingURL=FBUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FBUtils.js","sourceRoot":"","sources":["../src/FBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAE5D,MAAM,aAAa;IAClB;;;;;;;OAOG;IACM,cAAc,GAAG,KAAK,EAAE,KAAa,EAAE,KAAa,EAAE,SAAiB,EAKtE,EAAE;QAEX,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;YACrC,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,GAAG,KAAK,IAAI,SAAS,EAAE;SACrC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,8CAA8C,EAAE;YAC9F,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;YAC5C,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAC,CAAC;QACJ,IAAI,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyE,CAAC;QAC7G,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QACb,CAAC;QAED,2FAA2F;QAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YAClC,MAAM,EAAE,mCAAmC;YAC3C,YAAY,EAAE,KAAK;SACnB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,qCAAqC,EAAE;YACrF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;YAC5C,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;SACvB,CAAC,CAAC,CAAC;QACJ,IAAI,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAkB,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO;YACN,QAAQ,EAAE,QAAQ,CAAC,EAAE;YACrB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,WAAW;YAClC,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE;SAC1C,CAAC;IACH,CAAC,CAAA;CACD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,43 @@
1
+ declare class googleUtils {
2
+ /**
3
+ * Verifies a Google ID token and returns normalized user info.
4
+ * @param jwtToken - Google ID token.
5
+ * @param client_id - OAuth client ID expected in token audience.
6
+ * @returns Normalized user object, or `null` when verification fails.
7
+ */
8
+ readonly getUserFromJwt: (jwtToken: string, client_id: string) => Promise<{
9
+ name: string;
10
+ email: string | undefined;
11
+ picture: string;
12
+ oauth_id: string;
13
+ } | null>;
14
+ /**
15
+ * Exchanges an authorization code for an ID token, then resolves user info.
16
+ * @param code - Google OAuth authorization code.
17
+ * @param client_id - OAuth client ID.
18
+ * @param client_secret - OAuth client secret.
19
+ * @param redirect_uri - Redirect URI used for the OAuth flow.
20
+ * @returns Normalized user object, or `null` on failure.
21
+ */
22
+ readonly getUserFromCode: (code: string, client_id: string, client_secret: string, redirect_uri: string) => Promise<{
23
+ name: string | undefined;
24
+ email: string | undefined;
25
+ picture: string | undefined;
26
+ oauth_id: string;
27
+ } | null>;
28
+ /**
29
+ * Exchange Google OAuth authorization code for an ID token.
30
+ * @param code - Google OAuth authorization code.
31
+ * @param client_id - OAuth client ID.
32
+ * @param client_secret - OAuth client secret.
33
+ * @param redirect_uri - Redirect URI used for the OAuth flow.
34
+ * @returns ID token string, or `null` on failure.
35
+ */
36
+ private readonly jwtFromCode;
37
+ }
38
+ /**
39
+ * Singleton instance of Google OAuth utilities.
40
+ */
41
+ export declare const GoogleUtils: googleUtils;
42
+ export {};
43
+ //# sourceMappingURL=GoogleUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleUtils.d.ts","sourceRoot":"","sources":["../src/GoogleUtils.ts"],"names":[],"mappings":"AA6BA,cAAM,WAAW;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,GAAU,UAAU,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC;QAC9E,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC,CAeR;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,eAAe,GAAU,MAAM,MAAM,EAAE,WAAW,MAAM,EAAE,eAAe,MAAM,EAAE,cAAc,MAAM,KAAG,OAAO,CAAC;QACxH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC,CAIR;IAGD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAqB3B;CACD;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { createRemoteJWKSet } from "jose/jwks/remote";
2
+ import { tryCatch } from "./tryCatch.js";
3
+ import { jwtVerify } from "jose";
4
+ const Google_JWK = createRemoteJWKSet(new URL("https://www.googleapis.com/oauth2/v3/certs"));
5
+ class googleUtils {
6
+ /**
7
+ * Verifies a Google ID token and returns normalized user info.
8
+ * @param jwtToken - Google ID token.
9
+ * @param client_id - OAuth client ID expected in token audience.
10
+ * @returns Normalized user object, or `null` when verification fails.
11
+ */
12
+ getUserFromJwt = async (jwtToken, client_id) => {
13
+ if (!Google_JWK)
14
+ return null;
15
+ const [data, error] = await tryCatch(jwtVerify(jwtToken, Google_JWK, {
16
+ issuer: "https://accounts.google.com",
17
+ audience: client_id,
18
+ }));
19
+ if (error)
20
+ return null;
21
+ return {
22
+ name: data.payload.name ?? 'Anonymous',
23
+ email: data.payload.email,
24
+ picture: data.payload.picture ?? ``,
25
+ oauth_id: data.payload.sub,
26
+ };
27
+ };
28
+ /**
29
+ * Exchanges an authorization code for an ID token, then resolves user info.
30
+ * @param code - Google OAuth authorization code.
31
+ * @param client_id - OAuth client ID.
32
+ * @param client_secret - OAuth client secret.
33
+ * @param redirect_uri - Redirect URI used for the OAuth flow.
34
+ * @returns Normalized user object, or `null` on failure.
35
+ */
36
+ getUserFromCode = async (code, client_id, client_secret, redirect_uri) => {
37
+ const id_token = await this.jwtFromCode(code, client_id, client_secret, redirect_uri);
38
+ if (!id_token)
39
+ return null;
40
+ return await this.getUserFromJwt(id_token, client_id);
41
+ };
42
+ /**
43
+ * Exchange Google OAuth authorization code for an ID token.
44
+ * @param code - Google OAuth authorization code.
45
+ * @param client_id - OAuth client ID.
46
+ * @param client_secret - OAuth client secret.
47
+ * @param redirect_uri - Redirect URI used for the OAuth flow.
48
+ * @returns ID token string, or `null` on failure.
49
+ */
50
+ jwtFromCode = async (code, client_id, client_secret, redirect_uri) => {
51
+ const [resData, error] = await tryCatch(fetch(`https://oauth2.googleapis.com/token`, {
52
+ method: 'POST',
53
+ headers: {
54
+ 'Content-Type': 'application/json',
55
+ 'Accept': 'application/json',
56
+ },
57
+ body: JSON.stringify({
58
+ code,
59
+ client_id,
60
+ client_secret,
61
+ redirect_uri,
62
+ grant_type: 'authorization_code'
63
+ })
64
+ }));
65
+ if (error)
66
+ return null;
67
+ if (!resData.ok)
68
+ return null;
69
+ const data = await resData.json();
70
+ if (!data.id_token)
71
+ return null;
72
+ return data.id_token;
73
+ };
74
+ }
75
+ /**
76
+ * Singleton instance of Google OAuth utilities.
77
+ */
78
+ export const GoogleUtils = new googleUtils();
79
+ //# sourceMappingURL=GoogleUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleUtils.js","sourceRoot":"","sources":["../src/GoogleUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAuBjC,MAAM,UAAU,GAAG,kBAAkB,CACpC,IAAI,GAAG,CAAC,4CAA4C,CAAC,CACrD,CAAC;AAEF,MAAM,WAAW;IAChB;;;;;OAKG;IACM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAAE,SAAiB,EAK1D,EAAE;QACX,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAoB,QAAQ,EAAE,UAAU,EAAE;YACvF,MAAM,EAAE,6BAA6B;YACrC,QAAQ,EAAE,SAAS;SACnB,CAAC,CAAC,CAAC;QAEJ,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW;YACtC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;YACnC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;SAC1B,CAAC;IACH,CAAC,CAAA;IAED;;;;;;;OAOG;IACM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,SAAiB,EAAE,aAAqB,EAAE,YAAoB,EAKpG,EAAE;QACX,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC,CAAA;IAGD;;;;;;;OAOG;IACc,WAAW,GAAG,KAAK,EAAE,IAAY,EAAE,SAAiB,EAAE,aAAqB,EAAE,YAAoB,EAA0B,EAAE;QAC7I,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,qCAAqC,EAAE;YACpF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,QAAQ,EAAE,kBAAkB;aAC5B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,IAAI;gBACJ,SAAS;gBACT,aAAa;gBACb,YAAY;gBACZ,UAAU,EAAE,oBAAoB;aAChC,CAAC;SACF,CAAC,CAAC,CAAC;QAEJ,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAgC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC,CAAA;CACD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * HMAC utilities for use across projects.
3
+ * Import via: @sajjat/utils/HMACUtils
4
+ */
5
+ declare class hMACUtils {
6
+ /**
7
+ * Hash a token using a secret key.
8
+ * @param secret - The secret key to use for hashing.
9
+ * @param token - The token to hash.
10
+ * @returns The hashed token.
11
+ */
12
+ readonly hash: (secret: string, token: string) => {
13
+ data: string;
14
+ error: null;
15
+ } | {
16
+ data: null;
17
+ error: Error;
18
+ };
19
+ /**
20
+ * Hash a token using a secret key.
21
+ * @param secret - The secret key to use for hashing.
22
+ * @param token - The token to hash.
23
+ * @returns The hashed token.
24
+ *
25
+ * @throws {Error} If the hashing fails.
26
+ */
27
+ readonly hashOrThrow: (secret: string, token: string) => string;
28
+ /**
29
+ * Timing-safe comparison of two strings or buffers.
30
+ * Prevents timing attacks by comparing the full length of the values.
31
+ * @param a - First value.
32
+ * @param b - Second value.
33
+ * @returns True if values match, false otherwise.
34
+ */
35
+ readonly compare: (a: string | Buffer, b: string | Buffer) => boolean;
36
+ }
37
+ export declare const HMACUtils: hMACUtils;
38
+ export declare const aaa = 1;
39
+ export {};
40
+ //# sourceMappingURL=HMACUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HMACUtils.d.ts","sourceRoot":"","sources":["../src/HMACUtils.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,cAAM,SAAS;IAEd;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAa5G;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,CAE7D;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,GAAI,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,KAAG,OAAO,CAcnE;CACD;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC;AAEzC,eAAO,MAAM,GAAG,IAAI,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { createHmac, timingSafeEqual } from "crypto";
2
+ /**
3
+ * HMAC utilities for use across projects.
4
+ * Import via: @sajjat/utils/HMACUtils
5
+ */
6
+ class hMACUtils {
7
+ /**
8
+ * Hash a token using a secret key.
9
+ * @param secret - The secret key to use for hashing.
10
+ * @param token - The token to hash.
11
+ * @returns The hashed token.
12
+ */
13
+ hash = (secret, token) => {
14
+ try {
15
+ return {
16
+ data: this.hashOrThrow(secret, token),
17
+ error: null
18
+ };
19
+ }
20
+ catch (error) {
21
+ return {
22
+ data: null,
23
+ error: error
24
+ };
25
+ }
26
+ };
27
+ /**
28
+ * Hash a token using a secret key.
29
+ * @param secret - The secret key to use for hashing.
30
+ * @param token - The token to hash.
31
+ * @returns The hashed token.
32
+ *
33
+ * @throws {Error} If the hashing fails.
34
+ */
35
+ hashOrThrow = (secret, token) => {
36
+ return createHmac("sha256", secret).update(token, "utf8").digest("hex");
37
+ };
38
+ /**
39
+ * Timing-safe comparison of two strings or buffers.
40
+ * Prevents timing attacks by comparing the full length of the values.
41
+ * @param a - First value.
42
+ * @param b - Second value.
43
+ * @returns True if values match, false otherwise.
44
+ */
45
+ compare = (a, b) => {
46
+ try {
47
+ const aBuf = Buffer.isBuffer(a) ? a : Buffer.from(a, 'utf8');
48
+ const bBuf = Buffer.isBuffer(b) ? b : Buffer.from(b, 'utf8');
49
+ // timingSafeEqual throws if lengths do not match
50
+ if (aBuf.length !== bBuf.length) {
51
+ return false;
52
+ }
53
+ return timingSafeEqual(aBuf, bBuf);
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ };
59
+ }
60
+ export const HMACUtils = new hMACUtils();
61
+ export const aaa = 1;
62
+ //# sourceMappingURL=HMACUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HMACUtils.js","sourceRoot":"","sources":["../src/HMACUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAGrD;;;GAGG;AACH,MAAM,SAAS;IAEd;;;;;OAKG;IACM,IAAI,GAAG,CAAC,MAAc,EAAE,KAAa,EAAgE,EAAE;QAC/G,IAAI,CAAC;YACJ,OAAO;gBACN,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;gBACrC,KAAK,EAAE,IAAI;aACX,CAAC;QACH,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACd,OAAO;gBACN,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAc;aACrB,CAAC;QACH,CAAC;IACF,CAAC,CAAA;IAED;;;;;;;OAOG;IACM,WAAW,GAAG,CAAC,MAAc,EAAE,KAAa,EAAU,EAAE;QAChE,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC,CAAA;IAED;;;;;;OAMG;IACM,OAAO,GAAG,CAAC,CAAkB,EAAE,CAAkB,EAAW,EAAE;QACtE,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAE7D,iDAAiD;YACjD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO,KAAK,CAAC;YACd,CAAC;YAED,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC,CAAA;CACD;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAEzC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ export declare const HttpCodes: {
2
+ readonly UNKNOWN_ERROR: 0;
3
+ readonly OK: 200;
4
+ readonly CREATED: 201;
5
+ readonly NO_CONTENT: 204;
6
+ readonly BAD_REQUEST: 400;
7
+ readonly UNAUTHORIZED: 401;
8
+ readonly FORBIDDEN: 403;
9
+ readonly NOT_FOUND: 404;
10
+ readonly INTERNAL_SERVER_ERROR: 500;
11
+ readonly SERVICE_UNAVAILABLE: 503;
12
+ readonly BAD_GATEWAY: 502;
13
+ readonly TIMEOUT: 504;
14
+ readonly ACCEPTED: 202;
15
+ readonly PARTIAL_CONTENT: 206;
16
+ readonly MOVED_PERMANENTLY: 301;
17
+ readonly FOUND: 302;
18
+ readonly SEE_OTHER: 303;
19
+ readonly NOT_MODIFIED: 304;
20
+ readonly USE_PROXY: 305;
21
+ readonly TEMPORARY_REDIRECT: 307;
22
+ readonly PERMANENT_REDIRECT: 308;
23
+ readonly TOO_MANY_REQUESTS: 429;
24
+ };
25
+ export type THttpCodes = typeof HttpCodes;
26
+ //# sourceMappingURL=HttpCodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpCodes.d.ts","sourceRoot":"","sources":["../src/HttpCodes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;CAuBZ,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,OAAO,SAAS,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const HttpCodes = {
2
+ UNKNOWN_ERROR: 0,
3
+ OK: 200,
4
+ CREATED: 201,
5
+ NO_CONTENT: 204,
6
+ BAD_REQUEST: 400,
7
+ UNAUTHORIZED: 401,
8
+ FORBIDDEN: 403,
9
+ NOT_FOUND: 404,
10
+ INTERNAL_SERVER_ERROR: 500,
11
+ SERVICE_UNAVAILABLE: 503,
12
+ BAD_GATEWAY: 502,
13
+ TIMEOUT: 504,
14
+ ACCEPTED: 202,
15
+ PARTIAL_CONTENT: 206,
16
+ MOVED_PERMANENTLY: 301,
17
+ FOUND: 302,
18
+ SEE_OTHER: 303,
19
+ NOT_MODIFIED: 304,
20
+ USE_PROXY: 305,
21
+ TEMPORARY_REDIRECT: 307,
22
+ PERMANENT_REDIRECT: 308,
23
+ TOO_MANY_REQUESTS: 429,
24
+ };
25
+ //# sourceMappingURL=HttpCodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpCodes.js","sourceRoot":"","sources":["../src/HttpCodes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,aAAa,EAAE,CAAC;IAChB,EAAE,EAAE,GAAG;IACP,OAAO,EAAE,GAAG;IACZ,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;IACd,qBAAqB,EAAE,GAAG;IAC1B,mBAAmB,EAAE,GAAG;IACxB,WAAW,EAAE,GAAG;IAChB,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,eAAe,EAAE,GAAG;IACpB,iBAAiB,EAAE,GAAG;IACtB,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,kBAAkB,EAAE,GAAG;IACvB,kBAAkB,EAAE,GAAG;IACvB,iBAAiB,EAAE,GAAG;CACb,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Utilities for generating and validating IDs.
3
+ */
4
+ declare class idUtils {
5
+ /**
6
+ * Generates a crypto-random RFC4122 v4 UUID.
7
+ * @returns A UUID string (e.g. `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`).
8
+ */
9
+ readonly gen: () => string;
10
+ /**
11
+ * Validates a UUID.
12
+ * @param id - The UUID to validate.
13
+ * @returns True if the UUID is valid, false otherwise.
14
+ */
15
+ readonly validateOrThrow: (id: unknown) => id is string;
16
+ /**
17
+ * Validates that the provided value is a UUID string.
18
+ * @param id - Value to validate.
19
+ * @returns `true` when `id` is a valid UUID string.
20
+ */
21
+ readonly validate: (id: unknown) => id is string;
22
+ }
23
+ /**
24
+ * Singleton instance of ID utilities.
25
+ */
26
+ export declare const IDUtils: idUtils;
27
+ export {};
28
+ //# sourceMappingURL=IDUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IDUtils.d.ts","sourceRoot":"","sources":["../src/IDUtils.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,cAAM,OAAO;IAEZ;;;OAGG;IACH,SAAgB,GAAG,eAElB;IAED;;;;OAIG;IACH,SAAgB,eAAe,GAAI,IAAI,OAAO,KAAG,EAAE,IAAI,MAAM,CAO5D;IAED;;;;OAIG;IACH,SAAgB,QAAQ,GAAI,IAAI,OAAO,KAAG,EAAE,IAAI,MAAM,CAUrD;CACD;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,SAAgB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { BadRequest } from "./ErrorClasses.js";
2
+ import { randUuid } from "./Rand.js";
3
+ import { validateUUID } from "./validators.js";
4
+ /**
5
+ * Utilities for generating and validating IDs.
6
+ */
7
+ class idUtils {
8
+ /**
9
+ * Generates a crypto-random RFC4122 v4 UUID.
10
+ * @returns A UUID string (e.g. `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`).
11
+ */
12
+ gen = () => {
13
+ return randUuid();
14
+ };
15
+ /**
16
+ * Validates a UUID.
17
+ * @param id - The UUID to validate.
18
+ * @returns True if the UUID is valid, false otherwise.
19
+ */
20
+ validateOrThrow = (id) => {
21
+ if (this.validate(id)) {
22
+ return true;
23
+ }
24
+ else {
25
+ throw new BadRequest('ID__INVALID');
26
+ }
27
+ };
28
+ /**
29
+ * Validates that the provided value is a UUID string.
30
+ * @param id - Value to validate.
31
+ * @returns `true` when `id` is a valid UUID string.
32
+ */
33
+ validate = (id) => {
34
+ if (typeof id === 'string' &&
35
+ validateUUID(id)) {
36
+ return true;
37
+ }
38
+ else {
39
+ return false;
40
+ }
41
+ };
42
+ }
43
+ /**
44
+ * Singleton instance of ID utilities.
45
+ */
46
+ export const IDUtils = new idUtils();
47
+ //# sourceMappingURL=IDUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IDUtils.js","sourceRoot":"","sources":["../src/IDUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;GAEG;AACH,MAAM,OAAO;IAEZ;;;OAGG;IACa,GAAG,GAAG,GAAG,EAAE;QAC1B,OAAO,QAAQ,EAAE,CAAC;IACnB,CAAC,CAAA;IAED;;;;OAIG;IACa,eAAe,GAAG,CAAC,EAAW,EAAgB,EAAE;QAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACb,CAAC;aACI,CAAC;YACL,MAAM,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;IACF,CAAC,CAAA;IAED;;;;OAIG;IACa,QAAQ,GAAG,CAAC,EAAW,EAAgB,EAAE;QACxD,IACC,OAAO,EAAE,KAAK,QAAQ;YACtB,YAAY,CAAC,EAAE,CAAC,EACf,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;aACI,CAAC;YACL,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC,CAAA;CACD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"}