@knsdev/node-utils 3.1.0 → 3.3.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 (46) hide show
  1. package/README.md +105 -16
  2. package/dist/ECApiCodes.d.ts +1 -1
  3. package/dist/ECApiCodes.d.ts.map +1 -1
  4. package/dist/FBUtils.d.ts +8 -4
  5. package/dist/FBUtils.d.ts.map +1 -1
  6. package/dist/FBUtils.js +9 -4
  7. package/dist/FBUtils.js.map +1 -1
  8. package/dist/HMACUtils.d.ts +4 -0
  9. package/dist/HMACUtils.d.ts.map +1 -1
  10. package/dist/HMACUtils.js +4 -0
  11. package/dist/HMACUtils.js.map +1 -1
  12. package/dist/JwtUtils.d.ts +2 -2
  13. package/dist/JwtUtils.js +2 -2
  14. package/dist/PassUtils.d.ts +5 -4
  15. package/dist/PassUtils.d.ts.map +1 -1
  16. package/dist/PassUtils.js +5 -4
  17. package/dist/PassUtils.js.map +1 -1
  18. package/dist/TokenUtils.d.ts +70 -0
  19. package/dist/TokenUtils.d.ts.map +1 -0
  20. package/dist/TokenUtils.js +108 -0
  21. package/dist/TokenUtils.js.map +1 -0
  22. package/dist/TurnstileValidator.d.ts +2 -2
  23. package/dist/TurnstileValidator.js +2 -2
  24. package/dist/express.d.ts +17 -0
  25. package/dist/express.d.ts.map +1 -0
  26. package/dist/express.js +23 -0
  27. package/dist/express.js.map +1 -0
  28. package/dist/getEnvv.d.ts +3 -2
  29. package/dist/getEnvv.d.ts.map +1 -1
  30. package/dist/getEnvv.js +3 -2
  31. package/dist/getEnvv.js.map +1 -1
  32. package/dist/index.d.ts +5 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +5 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/types.d.ts +1 -0
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/utils.d.ts +25 -0
  39. package/dist/utils.d.ts.map +1 -0
  40. package/dist/utils.js +22 -0
  41. package/dist/utils.js.map +1 -0
  42. package/dist/zod.d.ts +10 -0
  43. package/dist/zod.d.ts.map +1 -1
  44. package/dist/zod.js +11 -0
  45. package/dist/zod.js.map +1 -1
  46. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @knsdev/node-utils
2
2
 
3
- TypeScript utilities for Node.js APIs: JWT (HS256), bcrypt passwords, Express cookies, OAuth (Google / Facebook), Cloudflare Turnstile, HMAC, validation helpers, Zod schemas, and small math/random helpers. Published as **ES modules** (`"type": "module"`).
3
+ TypeScript utilities for Node.js APIs: JWT (HS256), access/refresh token pairs with HMAC hashes (`TokenUtils`), bcrypt passwords, Express cookies and small Express helpers, OAuth (Google / Facebook), Cloudflare Turnstile, HMAC, validation helpers, Zod schemas, pagination/sleep helpers, and math/random utilities. Published as **ES modules** (`"type": "module"`).
4
4
 
5
5
  ## Requirements
6
6
 
@@ -15,11 +15,12 @@ pnpm add @knsdev/node-utils
15
15
  npm install @knsdev/node-utils
16
16
  ```
17
17
 
18
- Build from source (for contributors):
18
+ Build from source (for contributors). `build` runs `clean` first so `dist/` never keeps stale files after renames.
19
19
 
20
20
  ```bash
21
21
  pnpm install
22
22
  pnpm run build
23
+ # optional: pnpm run clean
23
24
  ```
24
25
 
25
26
  ## How to import
@@ -58,7 +59,7 @@ const [parsed, parseErr] = tryCatch2(() => JSON.parse('{"a":1}'));
58
59
 
59
60
  ### `getEnvv`
60
61
 
61
- Read `process.env` with a small schema: `string`, `int`, `float`, `boolean`, or `appEnv` (`dev` | `test` | `prod`). Throws a single `Error` listing missing keys and value problems.
62
+ Read `process.env` with a small schema: `string`, `int`, `float`, `boolean`, or `appEnv` (`dev` | `test` | `prod`). On failure, throws one `Error` whose message has up to two sections separated by a line of `================================`: `Not found keys: …` and/or `Value errors: …`.
62
63
 
63
64
  ```ts
64
65
  import { getEnvv } from "@knsdev/node-utils/getEnvv.js";
@@ -96,6 +97,53 @@ if (signResult.error) {
96
97
  }
97
98
  ```
98
99
 
100
+ ### `TokenUtils`
101
+
102
+ Higher-level helpers on top of [`JwtUtils`](#jwtutils) and [`HMACUtils`](#hmacutils): issue an access JWT plus a **64-character Base58** refresh token, derive **HMAC-SHA256 hashes** of both for opaque storage, decode access tokens (tuple or throwing), and validate refresh token shape/length.
103
+
104
+ ```ts
105
+ import { TokenUtils } from "@knsdev/node-utils/TokenUtils.js";
106
+
107
+ type Session = { sub: string; role: string };
108
+
109
+ const issued = TokenUtils.genTokens<Session>(
110
+ process.env.JWT_SECRET!,
111
+ { sub: "user-1", role: "user" },
112
+ 15 * 60 * 1000,
113
+ );
114
+ if (issued.error) {
115
+ /* InternalServerError with JWT__ENCRYPTION_FAILED */
116
+ } else {
117
+ const { accessToken, refreshToken, accessTokenHash, refreshTokenHash } =
118
+ issued.data;
119
+ }
120
+
121
+ const access = TokenUtils.genAccessToken<Session>(
122
+ process.env.JWT_SECRET!,
123
+ payload,
124
+ 3600_000,
125
+ );
126
+
127
+ const decoded = TokenUtils.decodeAccessToken<Session>(
128
+ process.env.JWT_SECRET!,
129
+ accessToken,
130
+ );
131
+ if (decoded.error) {
132
+ /* InternalServerError with JWT__INVALID_OR_EXPIRED */
133
+ }
134
+
135
+ const user = TokenUtils.decodeAccessTokenOrThrow<Session>(
136
+ process.env.JWT_SECRET!,
137
+ accessToken,
138
+ );
139
+
140
+ const REFRESH_LEN = 64;
141
+ if (TokenUtils.validateRefreshToken(token, REFRESH_LEN)) {
142
+ /* token narrowed to string */
143
+ }
144
+ TokenUtils.validateRefreshTokenOrThrow(token, REFRESH_LEN); // throws BadRequest REFRESH_TOKEN__INVALID_OR_EXPIRED
145
+ ```
146
+
99
147
  ### `PasswordUtils`
100
148
 
101
149
  Bcrypt hash/compare and simple length checks.
@@ -110,7 +158,18 @@ if (hashResult.success) {
110
158
  console.log(hashResult.hashedPassword);
111
159
  }
112
160
 
113
- const ok = await PasswordUtils.comparePassword("plain", storedHash);
161
+ const cmp = await PasswordUtils.comparePassword("plain", storedHash);
162
+ if (cmp.success) {
163
+ /* logged in */
164
+ } else {
165
+ /* cmp.error — e.g. BadRequest for wrong password */
166
+ }
167
+
168
+ try {
169
+ await PasswordUtils.comparePasswordOrThrow("plain", storedHash); // true on match; throws on mismatch / bcrypt error
170
+ } catch (e) {
171
+ /* handle */
172
+ }
114
173
 
115
174
  if (!PasswordUtils.validateStrength(pw, 8, 128)) {
116
175
  /* reject */
@@ -147,6 +206,36 @@ function logout(res: Response) {
147
206
  }
148
207
  ```
149
208
 
209
+ ### `express` (helpers)
210
+
211
+ Typed `res.json` wrapper and async route wrapper that forwards errors to `next`.
212
+
213
+ ```ts
214
+ import type { RequestHandler } from "express";
215
+ import { CatchExpress, SendRes } from "@knsdev/node-utils/express.js";
216
+
217
+ type Health = { ok: true };
218
+
219
+ const health: RequestHandler = (req, res) => {
220
+ SendRes<Health>(res, { ok: true });
221
+ };
222
+
223
+ app.get("/health", CatchExpress(health));
224
+ ```
225
+
226
+ ### `utils`
227
+
228
+ `sleep(ms)` and `PageLimit(query)` for list endpoints (page, limit, skip, sort, optional `searchTerm`, remaining keys as `filtersData`).
229
+
230
+ ```ts
231
+ import { PageLimit, sleep } from "@knsdev/node-utils/utils.js";
232
+
233
+ await sleep(500);
234
+
235
+ const { page, limit, skip, sortBy, sortOrder, searchTerm, filtersData } =
236
+ PageLimit(req.query);
237
+ ```
238
+
150
239
  ### `HMACUtils`
151
240
 
152
241
  SHA-256 HMAC (hex) and timing-safe comparison.
@@ -222,7 +311,7 @@ const x = toNumber(unknownValue, 0);
222
311
 
223
312
  ### `HttpCodes` / `ErrorClasses` / `ECApiCodes`
224
313
 
225
- HTTP status constants and errors for APIs: `ApiError` plus `BadRequest`, `Unauthorized`, `Forbidden`, `NotFound`, `TooManyRequests`, `InternalServerError`. Messages use the `ECApiCodes` string union (machine-friendly codes for clients).
314
+ HTTP status constants and errors for APIs: `ApiError` plus `BadRequest`, `Unauthorized`, `Forbidden`, `NotFound`, `TooManyRequests`, `InternalServerError`. Error `message` values use the `ECApiCodes` string unionmachine-readable codes for clients (including auth/JWT/refresh, captcha, password and field validation, slug/username/profile fields, and simple success-style API codes such as `FETCHED` or `CREATED`).
226
315
 
227
316
  ```ts
228
317
  import { HttpCodes } from "@knsdev/node-utils/HttpCodes.js";
@@ -268,7 +357,7 @@ const fromCode = await GoogleUtils.getUserFromCode(
268
357
 
269
358
  ### `FacebookUtils`
270
359
 
271
- Validates a user access token via Graph API `debug_token`, then loads `/me` (POST bodies to avoid putting secrets in query strings). Returns normalized profile or `null`.
360
+ Validates a **Facebook user access token** (not a JWT) via Graph API `debug_token`, then loads `/me`. Requests use POST bodies so tokens and app secrets stay out of query strings. Returns `{ oauth_id, name, email, picture }` or `null`. The Graph API version used by this module is defined in code as a single constant (currently `v19.0`) for easy upgrades.
272
361
 
273
362
  ```ts
274
363
  import { FacebookUtils } from "@knsdev/node-utils/FBUtils.js";
@@ -302,7 +391,7 @@ if (failure) {
302
391
  console.log(success.hostname, success.challenge_ts);
303
392
  }
304
393
 
305
- // Or throw on any failure:
394
+ // Or throw on any failure (last arg is reserved for API stability / future use; pass your app env):
306
395
  const result = await TurnstileValidator.validateOrThrow(
307
396
  secret,
308
397
  tokenFromClient,
@@ -320,7 +409,7 @@ Bengali digit substitution and English month → Bengali month names.
320
409
  ```ts
321
410
  import { bnNum, monthToBn } from "@knsdev/node-utils/bnUtils.js";
322
411
 
323
- bnNum(2025); // Bengali digits for "2025"
412
+ bnNum(2026); // Bengali digits for "2026"
324
413
  monthToBn("january");
325
414
  monthToBn(3);
326
415
  ```
@@ -339,7 +428,7 @@ function configure(env: TAppEnvs) {
339
428
 
340
429
  ### `zod` (optional)
341
430
 
342
- Prebuilt Zod schemas aligned with `ECApiCodes` / length constants (password, email, slug, 6-digit codes, Turnstile token, etc.).
431
+ Prebuilt Zod schemas aligned with `CLengths` and machine-friendly error codes (`TZodCodes` / `ECApiCodes` style): `z_PASSWORD`, `z_GENERAL_TOKEN`, `z_CODE_6_DIGITS`, `z_SLUG`, `z_EMAIL`, `z_FIRST_NAME`, `z_LAST_NAME`, `z_TURNSTILE_TOKEN`, `z_LOGOUT_OTHER_SESSIONS`, `z_REMEMBER_ME`.
343
432
 
344
433
  ```ts
345
434
  import { z_EMAIL, z_PASSWORD } from "@knsdev/node-utils/zod.js";
@@ -355,13 +444,13 @@ const LoginBody = z.object({
355
444
 
356
445
  ## Dependencies (summary)
357
446
 
358
- | Area | Packages |
359
- | --------------- | ------------------------------ |
360
- | JWT | `jsonwebtoken` |
361
- | Google ID token | `jose` |
362
- | Passwords | `bcrypt` |
363
- | Schemas | `zod` |
364
- | Cookies | `express` (types / `Response`) |
447
+ | Area | Packages |
448
+ | ------------------------- | ------------------------------ |
449
+ | JWT | `jsonwebtoken` |
450
+ | Google ID token | `jose` |
451
+ | Passwords | `bcrypt` |
452
+ | Schemas | `zod` |
453
+ | Cookies + Express helpers | `express` (types / `Response`) |
365
454
 
366
455
  ---
367
456
 
@@ -1,2 +1,2 @@
1
- export type ECApiCodes = `API_ERROR` | `CREATED` | `UPDATED` | `DELETED` | `FETCHED` | `VALIDATED` | `AUTHENTICATED` | `SUCCESS` | `BAD_REQUEST` | `AUTHORIZED` | `UNAUTHORIZED` | `FORBIDDEN` | `NOT_FOUND` | `INVALID_PASSWORD_OR_USER_NOT_FOUND` | `INTERNAL_SERVER_ERROR` | `TOO_MANY_REQUESTS` | `JWT__ENCRYPTION_FAILED` | `JWT__INVALID_OR_EXPIRED` | `CAPTCHA__VALIDATION_FAILED` | `PASSWORD__INVALID` | `PASSWORD__MIN_LENGTH` | `PASSWORD__MAX_LENGTH` | `GENERAL_TOKEN__INVALID` | `GENERAL_TOKEN__LENGTH` | `CODE_6_DIGITS__INVALID` | `CODE_6_DIGITS__LENGTH` | `CODE_6_DIGITS__INVALID_FORMAT` | `EMAIL__INVALID` | `EMAIL__MIN_LENGTH` | `EMAIL__MAX_LENGTH` | `FIRST_NAME__INVALID` | `FIRST_NAME__MIN_LENGTH` | `FIRST_NAME__MAX_LENGTH` | `LAST_NAME__INVALID` | `LAST_NAME__MAX_LENGTH` | `TURNSTILE_TOKEN__INVALID` | `TURNSTILE_TOKEN__MIN_LENGTH` | `TURNSTILE_TOKEN__MAX_LENGTH` | `CONFIRM_PASSWORD__DONT_MATCH` | `LOGOUT_OTHER_SESSIONS__INVALID` | `REMEMBER_ME__INVALID` | `SLUG__MIN_LENGTH` | `SLUG__MAX_LENGTH` | `SLUG__NAME__MIN_LENGTH` | `SLUG__NAME__MAX_LENGTH` | `SLUG__DESCRIPTION__MIN_LENGTH` | `SLUG__DESCRIPTION__MAX_LENGTH` | `SLUG__INVALID` | `USERNAME__INVALID` | `USERNAME__MIN_LENGTH` | `USERNAME__MAX_LENGTH` | `DESIGNATION__INVALID` | `DESIGNATION_MAX_LENGTH` | `BIO__INVALID` | `BIO_MAX_LENGTH` | `PROFILE_VISIBILITY__INVALID` | `ID__INVALID`;
1
+ export type ECApiCodes = `API_ERROR` | `CREATED` | `UPDATED` | `DELETED` | `FETCHED` | `VALIDATED` | `AUTHENTICATED` | `SUCCESS` | `BAD_REQUEST` | `AUTHORIZED` | `UNAUTHORIZED` | `FORBIDDEN` | `NOT_FOUND` | `INVALID_PASSWORD_OR_USER_NOT_FOUND` | `REFRESH_TOKEN__INVALID` | `REFRESH_TOKEN__EXPIRED` | `REFRESH_TOKEN__INVALID_OR_EXPIRED` | `INTERNAL_SERVER_ERROR` | `TOO_MANY_REQUESTS` | `JWT__ENCRYPTION_FAILED` | `JWT__INVALID_OR_EXPIRED` | `CAPTCHA__VALIDATION_FAILED` | `PASSWORD__INVALID` | `PASSWORD__MIN_LENGTH` | `PASSWORD__MAX_LENGTH` | `GENERAL_TOKEN__INVALID` | `GENERAL_TOKEN__LENGTH` | `CODE_6_DIGITS__INVALID` | `CODE_6_DIGITS__LENGTH` | `CODE_6_DIGITS__INVALID_FORMAT` | `EMAIL__INVALID` | `EMAIL__MIN_LENGTH` | `EMAIL__MAX_LENGTH` | `FIRST_NAME__INVALID` | `FIRST_NAME__MIN_LENGTH` | `FIRST_NAME__MAX_LENGTH` | `LAST_NAME__INVALID` | `LAST_NAME__MAX_LENGTH` | `TURNSTILE_TOKEN__INVALID` | `TURNSTILE_TOKEN__MIN_LENGTH` | `TURNSTILE_TOKEN__MAX_LENGTH` | `CONFIRM_PASSWORD__DONT_MATCH` | `LOGOUT_OTHER_SESSIONS__INVALID` | `REMEMBER_ME__INVALID` | `SLUG__MIN_LENGTH` | `SLUG__MAX_LENGTH` | `SLUG__NAME__MIN_LENGTH` | `SLUG__NAME__MAX_LENGTH` | `SLUG__DESCRIPTION__MIN_LENGTH` | `SLUG__DESCRIPTION__MAX_LENGTH` | `SLUG__INVALID` | `USERNAME__INVALID` | `USERNAME__MIN_LENGTH` | `USERNAME__MAX_LENGTH` | `DESIGNATION__INVALID` | `DESIGNATION_MAX_LENGTH` | `BIO__INVALID` | `BIO_MAX_LENGTH` | `PROFILE_VISIBILITY__INVALID` | `ID__INVALID`;
2
2
  //# sourceMappingURL=ECApiCodes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ECApiCodes.d.ts","sourceRoot":"","sources":["../src/ECApiCodes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,WAAW,GACnC,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,eAAe,GACf,SAAS,GACT,aAAa,GACb,YAAY,GACZ,cAAc,GACd,WAAW,GACX,WAAW,GACX,oCAAoC,GACpC,uBAAuB,GACvB,mBAAmB,GACnB,wBAAwB,GACxB,yBAAyB,GACzB,4BAA4B,GAC5B,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,wBAAwB,GACxB,uBAAuB,GACvB,wBAAwB,GACxB,uBAAuB,GACvB,+BAA+B,GAC/B,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,GACpB,uBAAuB,GACvB,0BAA0B,GAC1B,6BAA6B,GAC7B,6BAA6B,GAC7B,8BAA8B,GAC9B,gCAAgC,GAChC,sBAAsB,GACtB,kBAAkB,GAClB,kBAAkB,GAClB,wBAAwB,GACxB,wBAAwB,GACxB,+BAA+B,GAC/B,+BAA+B,GAC/B,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,wBAAwB,GACxB,cAAc,GACd,gBAAgB,GAChB,6BAA6B,GAC7B,aAAa,CAAC"}
1
+ {"version":3,"file":"ECApiCodes.d.ts","sourceRoot":"","sources":["../src/ECApiCodes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,WAAW,GACnC,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,eAAe,GACf,SAAS,GACT,aAAa,GACb,YAAY,GACZ,cAAc,GACd,WAAW,GACX,WAAW,GACX,oCAAoC,GACpC,wBAAwB,GACxB,wBAAwB,GACxB,mCAAmC,GACnC,uBAAuB,GACvB,mBAAmB,GACnB,wBAAwB,GACxB,yBAAyB,GACzB,4BAA4B,GAC5B,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,wBAAwB,GACxB,uBAAuB,GACvB,wBAAwB,GACxB,uBAAuB,GACvB,+BAA+B,GAC/B,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,GACpB,uBAAuB,GACvB,0BAA0B,GAC1B,6BAA6B,GAC7B,6BAA6B,GAC7B,8BAA8B,GAC9B,gCAAgC,GAChC,sBAAsB,GACtB,kBAAkB,GAClB,kBAAkB,GAClB,wBAAwB,GACxB,wBAAwB,GACxB,+BAA+B,GAC/B,+BAA+B,GAC/B,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,wBAAwB,GACxB,cAAc,GACd,gBAAgB,GAChB,6BAA6B,GAC7B,aAAa,CAAC"}
package/dist/FBUtils.d.ts CHANGED
@@ -1,11 +1,15 @@
1
+ /**
2
+ * Facebook Graph API helpers: validate a user access token and load profile data.
3
+ * Import via: `@knsdev/node-utils/FBUtils.js`.
4
+ */
1
5
  declare class facebookUtils {
2
6
  /**
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).
7
+ * Validates a Facebook **user access token** (not a JWT) and fetches profile details.
8
+ * Calls `debug_token` then `/me` via POST so tokens and app secrets stay out of query strings (fewer access-log leaks).
5
9
  * @param token - Facebook user access token.
6
10
  * @param appId - Facebook application ID.
7
11
  * @param appSecret - Facebook application secret.
8
- * @returns Normalized user profile or `null` if token/profile lookup fails.
12
+ * @returns Normalized user profile or `null` if validation or profile lookup fails.
9
13
  */
10
14
  readonly getUserFromAccessToken: (token: string, appId: string, appSecret: string) => Promise<{
11
15
  name: string | undefined;
@@ -15,7 +19,7 @@ declare class facebookUtils {
15
19
  } | null>;
16
20
  }
17
21
  /**
18
- * Singleton instance of Facebook OAuth utilities.
22
+ * Singleton instance of {@link facebookUtils}.
19
23
  */
20
24
  export declare const FacebookUtils: facebookUtils;
21
25
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"FBUtils.d.ts","sourceRoot":"","sources":["../src/FBUtils.ts"],"names":[],"mappings":"AAYA,cAAM,aAAa;IAClB;;;;;;;OAOG;IACH,QAAQ,CAAC,sBAAsB,GAAU,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC;QAClG,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"}
1
+ {"version":3,"file":"FBUtils.d.ts","sourceRoot":"","sources":["../src/FBUtils.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,cAAM,aAAa;IAClB;;;;;;;OAOG;IACH,QAAQ,CAAC,sBAAsB,GAAU,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC;QAClG,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"}
package/dist/FBUtils.js CHANGED
@@ -1,14 +1,19 @@
1
1
  import { tryCatch } from "./tryCatch.js";
2
2
  const FORM_URLENCODED = "application/x-www-form-urlencoded";
3
+ /** Graph API version segment used in `https://graph.facebook.com/{version}/…` URLs. */
3
4
  const FB_GRAPH_API_VERSION = "v19.0";
5
+ /**
6
+ * Facebook Graph API helpers: validate a user access token and load profile data.
7
+ * Import via: `@knsdev/node-utils/FBUtils.js`.
8
+ */
4
9
  class facebookUtils {
5
10
  /**
6
- * Validates a Facebook access token and fetches user profile details.
7
- * Uses POST bodies so tokens and app secrets are not placed in request URLs (fewer access-log leaks).
11
+ * Validates a Facebook **user access token** (not a JWT) and fetches profile details.
12
+ * Calls `debug_token` then `/me` via POST so tokens and app secrets stay out of query strings (fewer access-log leaks).
8
13
  * @param token - Facebook user access token.
9
14
  * @param appId - Facebook application ID.
10
15
  * @param appSecret - Facebook application secret.
11
- * @returns Normalized user profile or `null` if token/profile lookup fails.
16
+ * @returns Normalized user profile or `null` if validation or profile lookup fails.
12
17
  */
13
18
  getUserFromAccessToken = async (token, appId, appSecret) => {
14
19
  const debugBody = new URLSearchParams({
@@ -63,7 +68,7 @@ class facebookUtils {
63
68
  };
64
69
  }
65
70
  /**
66
- * Singleton instance of Facebook OAuth utilities.
71
+ * Singleton instance of {@link facebookUtils}.
67
72
  */
68
73
  export const FacebookUtils = new facebookUtils();
69
74
  //# sourceMappingURL=FBUtils.js.map
@@ -1 +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;AAC5D,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAErC,MAAM,aAAa;IAClB;;;;;;;OAOG;IACM,sBAAsB,GAAG,KAAK,EAAE,KAAa,EAAE,KAAa,EAAE,SAAiB,EAK9E,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,8BAA8B,oBAAoB,cAAc,EAAE;YAChH,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,8BAA8B,oBAAoB,KAAK,EAAE;YACvG,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"}
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,uFAAuF;AACvF,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAErC;;;GAGG;AACH,MAAM,aAAa;IAClB;;;;;;;OAOG;IACM,sBAAsB,GAAG,KAAK,EAAE,KAAa,EAAE,KAAa,EAAE,SAAiB,EAK9E,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,8BAA8B,oBAAoB,cAAc,EAAE;YAChH,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,8BAA8B,oBAAoB,KAAK,EAAE;YACvG,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"}
@@ -34,6 +34,10 @@ declare class hMACUtils {
34
34
  */
35
35
  readonly compare: (a: string | Buffer, b: string | Buffer) => boolean;
36
36
  }
37
+ /**
38
+ * Singleton instance of HMAC utilities.
39
+ * Import via: `@knsdev/node-utils/HMACUtils.js`.
40
+ */
37
41
  export declare const HMACUtils: hMACUtils;
38
42
  export {};
39
43
  //# sourceMappingURL=HMACUtils.d.ts.map
@@ -1 +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"}
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;;;GAGG;AACH,eAAO,MAAM,SAAS,WAAkB,CAAC"}
package/dist/HMACUtils.js CHANGED
@@ -57,5 +57,9 @@ class hMACUtils {
57
57
  }
58
58
  };
59
59
  }
60
+ /**
61
+ * Singleton instance of HMAC utilities.
62
+ * Import via: `@knsdev/node-utils/HMACUtils.js`.
63
+ */
60
64
  export const HMACUtils = new hMACUtils();
61
65
  //# sourceMappingURL=HMACUtils.js.map
@@ -1 +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"}
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;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
@@ -43,8 +43,8 @@ declare class jwtUtils {
43
43
  };
44
44
  }
45
45
  /**
46
- * JWT utilities for use across projects.
47
- * Import via: @sajjat/utils/JwtUtils
46
+ * Singleton instance of JWT utilities.
47
+ * Import via: `@knsdev/node-utils/JwtUtils.js`.
48
48
  */
49
49
  export declare const JwtUtils: jwtUtils;
50
50
  export {};
package/dist/JwtUtils.js CHANGED
@@ -71,8 +71,8 @@ class jwtUtils {
71
71
  };
72
72
  }
73
73
  /**
74
- * JWT utilities for use across projects.
75
- * Import via: @sajjat/utils/JwtUtils
74
+ * Singleton instance of JWT utilities.
75
+ * Import via: `@knsdev/node-utils/JwtUtils.js`.
76
76
  */
77
77
  export const JwtUtils = new jwtUtils();
78
78
  //# sourceMappingURL=JwtUtils.js.map
@@ -24,7 +24,7 @@ declare class passwordUtils {
24
24
  * Compare plain-text password with bcrypt hash.
25
25
  * @param password - Plain-text password.
26
26
  * @param hashedPassword - BCrypt hash.
27
- * @returns `{ success: true }` if password matches hash, `{ success: false, error: Error }` if not.
27
+ * @returns `{ success: true }` when the password matches; `{ success: false, error }` when it does not (`BadRequest`) or `bcrypt.compare` throws (`InternalServerError`).
28
28
  */
29
29
  readonly comparePassword: (password: string, hashedPassword: string) => Promise<{
30
30
  success: true;
@@ -33,11 +33,12 @@ declare class passwordUtils {
33
33
  error: Error;
34
34
  }>;
35
35
  /**
36
- * Compare plain-text password with bcrypt hash and throw on failure.
36
+ * Compare plain-text password with bcrypt hash; throw when the password does not match or comparison errors.
37
37
  * @param password - Plain-text password.
38
38
  * @param hashedPassword - BCrypt hash.
39
- * @returns `true` when password matches hash, otherwise `false`.
40
- * @throws {InternalServerError} If comparison fails unexpectedly.
39
+ * @returns `true` when the password matches the hash.
40
+ * @throws {BadRequest} When the password does not match (same error as `comparePassword` failure path).
41
+ * @throws {InternalServerError} When `bcrypt.compare` throws unexpectedly.
41
42
  */
42
43
  readonly comparePasswordOrThrow: (password: string, hashedPassword: string) => Promise<boolean>;
43
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"PassUtils.d.ts","sourceRoot":"","sources":["../src/PassUtils.ts"],"names":[],"mappings":"AAKA,cAAM,aAAa;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,GACpB,UAAU,MAAM,EAChB,mBAAgC,KAC9B,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAOtF;IAEF;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,GAC3B,UAAU,MAAM,EAChB,mBAAgC,KAC9B,OAAO,CAAC,MAAM,CAAC,CAOhB;IAEF;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,GACvB,UAAU,MAAM,EAChB,gBAAgB,MAAM,KACpB,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAW9D;IAEF;;;;;;OAMG;IACH,QAAQ,CAAC,sBAAsB,GAC9B,UAAU,MAAM,EAChB,gBAAgB,MAAM,KACpB,OAAO,CAAC,OAAO,CAAC,CAMjB;IAEF;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAC/B;IAE9D;;;;OAIG;IACH,QAAQ,CAAC,YAAY,GAAI,OAAO,MAAM,KAAG,OAAO,CACI;CACpD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"PassUtils.d.ts","sourceRoot":"","sources":["../src/PassUtils.ts"],"names":[],"mappings":"AAKA,cAAM,aAAa;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,GACpB,UAAU,MAAM,EAChB,mBAAgC,KAC9B,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAOtF;IAEF;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,GAC3B,UAAU,MAAM,EAChB,mBAAgC,KAC9B,OAAO,CAAC,MAAM,CAAC,CAOhB;IAEF;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,GACvB,UAAU,MAAM,EAChB,gBAAgB,MAAM,KACpB,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAW9D;IAEF;;;;;;;OAOG;IACH,QAAQ,CAAC,sBAAsB,GAC9B,UAAU,MAAM,EAChB,gBAAgB,MAAM,KACpB,OAAO,CAAC,OAAO,CAAC,CAMjB;IAEF;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAC/B;IAE9D;;;;OAIG;IACH,QAAQ,CAAC,YAAY,GAAI,OAAO,MAAM,KAAG,OAAO,CACI;CACpD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,eAAsB,CAAC"}
package/dist/PassUtils.js CHANGED
@@ -35,7 +35,7 @@ class passwordUtils {
35
35
  * Compare plain-text password with bcrypt hash.
36
36
  * @param password - Plain-text password.
37
37
  * @param hashedPassword - BCrypt hash.
38
- * @returns `{ success: true }` if password matches hash, `{ success: false, error: Error }` if not.
38
+ * @returns `{ success: true }` when the password matches; `{ success: false, error }` when it does not (`BadRequest`) or `bcrypt.compare` throws (`InternalServerError`).
39
39
  */
40
40
  comparePassword = async (password, hashedPassword) => {
41
41
  try {
@@ -50,11 +50,12 @@ class passwordUtils {
50
50
  }
51
51
  };
52
52
  /**
53
- * Compare plain-text password with bcrypt hash and throw on failure.
53
+ * Compare plain-text password with bcrypt hash; throw when the password does not match or comparison errors.
54
54
  * @param password - Plain-text password.
55
55
  * @param hashedPassword - BCrypt hash.
56
- * @returns `true` when password matches hash, otherwise `false`.
57
- * @throws {InternalServerError} If comparison fails unexpectedly.
56
+ * @returns `true` when the password matches the hash.
57
+ * @throws {BadRequest} When the password does not match (same error as `comparePassword` failure path).
58
+ * @throws {InternalServerError} When `bcrypt.compare` throws unexpectedly.
58
59
  */
59
60
  comparePasswordOrThrow = async (password, hashedPassword) => {
60
61
  const res = await this.comparePassword(password, hashedPassword);
@@ -1 +1 @@
1
- {"version":3,"file":"PassUtils.js","sourceRoot":"","sources":["../src/PassUtils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,MAAM,aAAa;IAClB;;;;;OAKG;IACM,YAAY,GAAG,KAAK,EAC5B,QAAgB,EAChB,UAAU,GAAG,mBAAmB,EACwD,EAAE;QAC1F,IAAI,CAAC;YACJ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QACnF,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QAClD,CAAC;IACF,CAAC,CAAC;IAEF;;;;;;OAMG;IACM,mBAAmB,GAAG,KAAK,EACnC,QAAgB,EAChB,UAAU,GAAG,mBAAmB,EACd,EAAE;QACpB,IAAI,CAAC;YACJ,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,CAAC;YACN,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACjC,CAAC;IACF,CAAC,CAAC;IAEF;;;;;OAKG;IACM,eAAe,GAAG,KAAK,EAC/B,QAAgB,EAChB,cAAsB,EAC0C,EAAE;QAClE,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,oCAAoC,CAAC,EAAE,CAAC;YACxF,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,CAAC;YACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC7D,CAAC;IACF,CAAC,CAAC;IAEF;;;;;;OAMG;IACM,sBAAsB,GAAG,KAAK,EACtC,QAAgB,EAChB,cAAsB,EACH,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,CAAC;IACpB,CAAC,CAAC;IAEF;;;;;;OAMG;IACM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAE,SAAiB,EAAW,EAAE,CAC/F,QAAQ,CAAC,MAAM,IAAI,SAAS,IAAI,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC;IAE9D;;;;OAIG;IACM,YAAY,GAAG,CAAC,KAAa,EAAW,EAAE,CAClD,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"PassUtils.js","sourceRoot":"","sources":["../src/PassUtils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,MAAM,aAAa;IAClB;;;;;OAKG;IACM,YAAY,GAAG,KAAK,EAC5B,QAAgB,EAChB,UAAU,GAAG,mBAAmB,EACwD,EAAE;QAC1F,IAAI,CAAC;YACJ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QACnF,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QAClD,CAAC;IACF,CAAC,CAAC;IAEF;;;;;;OAMG;IACM,mBAAmB,GAAG,KAAK,EACnC,QAAgB,EAChB,UAAU,GAAG,mBAAmB,EACd,EAAE;QACpB,IAAI,CAAC;YACJ,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,CAAC;YACN,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACjC,CAAC;IACF,CAAC,CAAC;IAEF;;;;;OAKG;IACM,eAAe,GAAG,KAAK,EAC/B,QAAgB,EAChB,cAAsB,EAC0C,EAAE;QAClE,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,oCAAoC,CAAC,EAAE,CAAC;YACxF,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,CAAC;YACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC7D,CAAC;IACF,CAAC,CAAC;IAEF;;;;;;;OAOG;IACM,sBAAsB,GAAG,KAAK,EACtC,QAAgB,EAChB,cAAsB,EACH,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,CAAC;IACpB,CAAC,CAAC;IAEF;;;;;;OAMG;IACM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAE,SAAiB,EAAW,EAAE,CAC/F,QAAQ,CAAC,MAAM,IAAI,SAAS,IAAI,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC;IAE9D;;;;OAIG;IACM,YAAY,GAAG,CAAC,KAAa,EAAW,EAAE,CAClD,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Token utilities for use across projects.
3
+ * Import via: `@knsdev/node-utils/TokenUtils`
4
+ */
5
+ declare class tokenUtils {
6
+ private readonly BASE58_CHARS;
7
+ private readonly base;
8
+ readonly genAccessToken: <T extends string | object | Buffer<ArrayBufferLike> = "Error: a type template is required">(jwtSecret: string, data: T, expiresMs: number) => string;
9
+ readonly genTokens: <T extends string | object | Buffer<ArrayBufferLike> = "Error: a type template is required">(jwtSecret: string, data: T, expiresMs: number) => {
10
+ data: {
11
+ accessToken: string;
12
+ refreshToken: string;
13
+ accessTokenHash: string;
14
+ refreshTokenHash: string;
15
+ };
16
+ error: null;
17
+ } | {
18
+ data: null;
19
+ error: Error;
20
+ };
21
+ /**
22
+ * Decode an access token and return the user data.
23
+ * @param jwtSecret - The JWT secret.
24
+ * @param accessToken - The access token to decode.
25
+ * @returns The user data.
26
+ * @throws {InternalServerError} If the access token is invalid or expired.
27
+ */
28
+ readonly decodeAccessToken: <T extends string | object | Buffer<ArrayBufferLike> = "Error: a type template is required">(jwtSecret: string, accessToken: unknown) => {
29
+ data: T;
30
+ error: null;
31
+ } | {
32
+ data: null;
33
+ error: Error;
34
+ };
35
+ /**
36
+ * Decode an access token and return the user data.
37
+ * @param jwtSecret - The JWT secret.
38
+ * @param accessToken - The access token to decode.
39
+ * @returns The user data.
40
+ * @throws {InternalServerError} If the access token is invalid or expired.
41
+ */
42
+ readonly decodeAccessTokenOrThrow: <T extends string | object | Buffer<ArrayBufferLike> = "Error: a type template is required">(jwtSecret: string, accessToken: unknown) => T;
43
+ /**
44
+ * Generate a refresh token.
45
+ * @returns The refresh token.
46
+ */
47
+ private readonly genRefreshToken;
48
+ /**
49
+ * Validate a refresh token
50
+ * @param refreshToken - The refresh token to validate.
51
+ * @param length - The length of the refresh token.
52
+ * @returns True if the refresh token is valid, false otherwise.
53
+ */
54
+ readonly validateRefreshToken: (refreshToken: unknown, length: number) => refreshToken is string;
55
+ /**
56
+ * Validate a refresh token and throw an error if it is invalid or expired.
57
+ * @param refreshToken - The refresh token to validate.
58
+ * @param length - The length of the refresh token.
59
+ * @returns True if the refresh token is valid, false otherwise.
60
+ * @throws {BadRequest} If the refresh token is invalid or expired.
61
+ */
62
+ readonly validateRefreshTokenOrThrow: (refreshToken: unknown, length: number) => string;
63
+ }
64
+ /**
65
+ * Token utilities for use across projects.
66
+ * Import via: `@knsdev/node-utils/TokenUtils`
67
+ */
68
+ export declare const TokenUtils: tokenUtils;
69
+ export {};
70
+ //# sourceMappingURL=TokenUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenUtils.d.ts","sourceRoot":"","sources":["../src/TokenUtils.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,cAAM,UAAU;IACf,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgE;IAC7F,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IAGjD,QAAQ,CAAC,cAAc,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,oCAAoC,EACpH,WAAW,MAAM,EACjB,MAAM,CAAC,EACP,WAAW,MAAM,KACf,MAAM,CAGR;IAED,QAAQ,CAAC,SAAS,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,oCAAoC,EAC/G,WAAW,MAAM,EACjB,MAAM,CAAC,EACP,WAAW,MAAM,KACf;QACF,IAAI,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,CAAA;SAAE,CAAC;QACvG,KAAK,EAAE,IAAI,CAAA;KACX,GAAG;QACH,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,KAAK,CAAA;KACZ,CAWA;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,oCAAoC,EAAE,WAAW,MAAM,EAAE,aAAa,OAAO,KAAG;QACnK,IAAI,EAAE,CAAC,CAAC;QACR,KAAK,EAAE,IAAI,CAAA;KACX,GAAG;QACH,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,KAAK,CAAA;KACZ,CAOA;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,wBAAwB,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,oCAAoC,EAAE,WAAW,MAAM,EAAE,aAAa,OAAO,KAAG,CAAC,CAE3K;IAED;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAc/B;IAED;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,GAAI,cAAc,OAAO,EAAE,QAAQ,MAAM,KAAG,YAAY,IAAI,MAAM,CAU9F;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,2BAA2B,GAAI,cAAc,OAAO,EAAE,QAAQ,MAAM,KAAG,MAAM,CAKrF;CAED;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -0,0 +1,108 @@
1
+ import crypto from "crypto";
2
+ import { HMACUtils } from "./HMACUtils.js";
3
+ import { BadRequest, InternalServerError } from "./ErrorClasses.js";
4
+ import { JwtUtils } from "./JwtUtils.js";
5
+ /**
6
+ * Token utilities for use across projects.
7
+ * Import via: `@knsdev/node-utils/TokenUtils`
8
+ */
9
+ class tokenUtils {
10
+ BASE58_CHARS = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
11
+ base = this.BASE58_CHARS.length;
12
+ genAccessToken = (jwtSecret, data, expiresMs) => {
13
+ const nowSec = Math.floor(Date.now() / 1000);
14
+ return JwtUtils.signOrThrow(jwtSecret, data, expiresMs);
15
+ };
16
+ genTokens = (jwtSecret, data, expiresMs) => {
17
+ try {
18
+ const accessToken = this.genAccessToken(jwtSecret, data, expiresMs);
19
+ const refreshToken = this.genRefreshToken();
20
+ const accessTokenHash = HMACUtils.hashOrThrow(jwtSecret, accessToken);
21
+ const refreshTokenHash = HMACUtils.hashOrThrow(jwtSecret, refreshToken);
22
+ return { data: { accessToken, refreshToken, accessTokenHash, refreshTokenHash }, error: null };
23
+ }
24
+ catch {
25
+ return { data: null, error: new InternalServerError('JWT__ENCRYPTION_FAILED') };
26
+ }
27
+ };
28
+ /**
29
+ * Decode an access token and return the user data.
30
+ * @param jwtSecret - The JWT secret.
31
+ * @param accessToken - The access token to decode.
32
+ * @returns The user data.
33
+ * @throws {InternalServerError} If the access token is invalid or expired.
34
+ */
35
+ decodeAccessToken = (jwtSecret, accessToken) => {
36
+ try {
37
+ return { data: this.decodeAccessTokenOrThrow(jwtSecret, accessToken), error: null };
38
+ }
39
+ catch {
40
+ return { data: null, error: new InternalServerError('JWT__INVALID_OR_EXPIRED') };
41
+ }
42
+ };
43
+ /**
44
+ * Decode an access token and return the user data.
45
+ * @param jwtSecret - The JWT secret.
46
+ * @param accessToken - The access token to decode.
47
+ * @returns The user data.
48
+ * @throws {InternalServerError} If the access token is invalid or expired.
49
+ */
50
+ decodeAccessTokenOrThrow = (jwtSecret, accessToken) => {
51
+ return JwtUtils.verifyOrThrow(jwtSecret, accessToken);
52
+ };
53
+ /**
54
+ * Generate a refresh token.
55
+ * @returns The refresh token.
56
+ */
57
+ genRefreshToken = () => {
58
+ const REFRESH_TOKEN_LENGTH = 64;
59
+ const max = 256 - (256 % this.base); // avoid modulo bias (252)
60
+ let out = '';
61
+ while (out.length < REFRESH_TOKEN_LENGTH) {
62
+ const buf = crypto.randomBytes(32);
63
+ for (let i = 0; i < buf.length && out.length < REFRESH_TOKEN_LENGTH; i++) {
64
+ const v = buf[i];
65
+ if (v >= max)
66
+ continue;
67
+ out += this.BASE58_CHARS[v % this.base];
68
+ }
69
+ }
70
+ return out;
71
+ };
72
+ /**
73
+ * Validate a refresh token
74
+ * @param refreshToken - The refresh token to validate.
75
+ * @param length - The length of the refresh token.
76
+ * @returns True if the refresh token is valid, false otherwise.
77
+ */
78
+ validateRefreshToken = (refreshToken, length) => {
79
+ if (typeof refreshToken !== 'string' || refreshToken.length !== length) {
80
+ return false;
81
+ }
82
+ for (let i = 0; i < refreshToken.length; i++) {
83
+ if (!this.BASE58_CHARS.includes(refreshToken[i])) {
84
+ return false;
85
+ }
86
+ }
87
+ return true;
88
+ };
89
+ /**
90
+ * Validate a refresh token and throw an error if it is invalid or expired.
91
+ * @param refreshToken - The refresh token to validate.
92
+ * @param length - The length of the refresh token.
93
+ * @returns True if the refresh token is valid, false otherwise.
94
+ * @throws {BadRequest} If the refresh token is invalid or expired.
95
+ */
96
+ validateRefreshTokenOrThrow = (refreshToken, length) => {
97
+ if (!this.validateRefreshToken(refreshToken, length)) {
98
+ throw new BadRequest('REFRESH_TOKEN__INVALID_OR_EXPIRED');
99
+ }
100
+ return refreshToken;
101
+ };
102
+ }
103
+ /**
104
+ * Token utilities for use across projects.
105
+ * Import via: `@knsdev/node-utils/TokenUtils`
106
+ */
107
+ export const TokenUtils = new tokenUtils();
108
+ //# sourceMappingURL=TokenUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenUtils.js","sourceRoot":"","sources":["../src/TokenUtils.ts"],"names":[],"mappings":"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"}
@@ -39,9 +39,9 @@ declare class turnstileValidator {
39
39
  * @param remoteip - Optional client IP.
40
40
  * @param options - Optional expected action/hostname and idempotency key.
41
41
  * @param timeout - Request timeout in milliseconds.
42
- * @param _APP_ENV - Reserved; forwarded to `validate` for API stability.
42
+ * @param _APP_ENV - Reserved for callers (e.g. future logging policy); forwarded to `validate` for API stability; unused.
43
43
  * @returns Successful Turnstile verification payload.
44
- * @throws {BadRequest} When token validation fails.
44
+ * @throws {BadRequest} With code `CAPTCHA__VALIDATION_FAILED` when token validation fails.
45
45
  */
46
46
  readonly validateOrThrow: (secretKey: string, token: string, remoteip: string | null | undefined, options: {
47
47
  expectedAction?: string;
@@ -80,9 +80,9 @@ class turnstileValidator {
80
80
  * @param remoteip - Optional client IP.
81
81
  * @param options - Optional expected action/hostname and idempotency key.
82
82
  * @param timeout - Request timeout in milliseconds.
83
- * @param _APP_ENV - Reserved; forwarded to `validate` for API stability.
83
+ * @param _APP_ENV - Reserved for callers (e.g. future logging policy); forwarded to `validate` for API stability; unused.
84
84
  * @returns Successful Turnstile verification payload.
85
- * @throws {BadRequest} When token validation fails.
85
+ * @throws {BadRequest} With code `CAPTCHA__VALIDATION_FAILED` when token validation fails.
86
86
  */
87
87
  validateOrThrow = async (secretKey, token, remoteip, options = {}, timeout = 10000, _APP_ENV) => {
88
88
  const [result, error] = await this.validate(secretKey, token, remoteip, options, timeout, _APP_ENV);
@@ -0,0 +1,17 @@
1
+ import type { NextFunction, Request, RequestHandler, Response } from "express";
2
+ import type { NoInfer } from "./types.js";
3
+ /**
4
+ * Send JSON on the response. Requires an explicit generic payload type at the call site.
5
+ * @template T - Response body type (must be provided explicitly).
6
+ * @param res - Express `Response`.
7
+ * @param data - Serializable payload to send as JSON.
8
+ * @returns The result of `res.json(data)`.
9
+ */
10
+ export declare const SendRes: <T = "Error: A generic type parameter is required">(res: Response, data: NoInfer<T>) => Response<any, Record<string, any>>;
11
+ /**
12
+ * Wrap a route handler so rejected promises and thrown errors are passed to `next(error)`.
13
+ * @param fn - Async or sync Express `RequestHandler`.
14
+ * @returns A middleware that runs `fn` inside `try/catch` and forwards failures to `next`.
15
+ */
16
+ export declare const CatchExpress: (fn: RequestHandler) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
17
+ //# sourceMappingURL=express.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,GAAG,6CAA6C,EAAE,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,uCAAmB,CAAC;AAE9H;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,IAAI,cAAc,MAAY,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAOxH,CAAC"}
@@ -0,0 +1,23 @@
1
+ // Express helpers: typed JSON + async error forwarding. Import: `@knsdev/node-utils/express.js`.
2
+ /**
3
+ * Send JSON on the response. Requires an explicit generic payload type at the call site.
4
+ * @template T - Response body type (must be provided explicitly).
5
+ * @param res - Express `Response`.
6
+ * @param data - Serializable payload to send as JSON.
7
+ * @returns The result of `res.json(data)`.
8
+ */
9
+ export const SendRes = (res, data) => res.json(data);
10
+ /**
11
+ * Wrap a route handler so rejected promises and thrown errors are passed to `next(error)`.
12
+ * @param fn - Async or sync Express `RequestHandler`.
13
+ * @returns A middleware that runs `fn` inside `try/catch` and forwards failures to `next`.
14
+ */
15
+ export const CatchExpress = (fn) => async (req, res, next) => {
16
+ try {
17
+ await fn(req, res, next);
18
+ }
19
+ catch (error) {
20
+ next(error);
21
+ }
22
+ };
23
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAGA,iGAAiG;AAEjG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAoD,GAAa,EAAE,IAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE9H;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAkB,EAAE,EAAE,CAAC,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAiB,EAAE;IAC5H,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,CAAC;IACb,CAAC;AACF,CAAC,CAAC"}
package/dist/getEnvv.d.ts CHANGED
@@ -12,9 +12,10 @@ type ResolvedEnv<T extends EnvSchema> = {
12
12
  };
13
13
  /**
14
14
  * Resolve and validate environment variables from a schema.
15
- * @param schema - Map of env keys to expected primitive types.
15
+ * @param schema - Map of env keys to expected primitive types (`string`, `int`, `float`, `boolean`, `appEnv`).
16
16
  * @returns Parsed environment object with inferred value types.
17
- * @throws {Error} If required keys are missing or values fail validation.
17
+ * @throws {Error} When any key is missing/empty or any value fails type checks. The message is two sections joined by
18
+ * a line of `================================`: `Not found keys: …` (if applicable) and `Value errors: …` (if applicable).
18
19
  */
19
20
  export declare const getEnvv: <T extends EnvSchema>(schema: T) => ResolvedEnv<T>;
20
21
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"getEnvv.d.ts","sourceRoot":"","sources":["../src/getEnvv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,KAAK,OAAO,GAAG;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CACjB,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;AAE/C,KAAK,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI;KACtC,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,SAAS,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,CAgErE,CAAC"}
1
+ {"version":3,"file":"getEnvv.d.ts","sourceRoot":"","sources":["../src/getEnvv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,KAAK,OAAO,GAAG;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CACjB,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;AAE/C,KAAK,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI;KACtC,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,SAAS,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,CAgErE,CAAC"}
package/dist/getEnvv.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Resolve and validate environment variables from a schema.
3
- * @param schema - Map of env keys to expected primitive types.
3
+ * @param schema - Map of env keys to expected primitive types (`string`, `int`, `float`, `boolean`, `appEnv`).
4
4
  * @returns Parsed environment object with inferred value types.
5
- * @throws {Error} If required keys are missing or values fail validation.
5
+ * @throws {Error} When any key is missing/empty or any value fails type checks. The message is two sections joined by
6
+ * a line of `================================`: `Not found keys: …` (if applicable) and `Value errors: …` (if applicable).
6
7
  */
7
8
  export const getEnvv = (schema) => {
8
9
  const result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"getEnvv.js","sourceRoot":"","sources":["../src/getEnvv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getEnvv.js","sourceRoot":"","sources":["../src/getEnvv.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
+ /**
2
+ * Convenience barrel re-exporting public modules. Prefer **per-file** imports from `@knsdev/node-utils/<Module>.js` in apps (matches `package.json` `exports`).
3
+ */
1
4
  export { CookieUtils } from "./Cookies.js";
2
5
  export * from "./bnUtils.js";
3
6
  export type { ECApiCodes } from "./ECApiCodes.js";
4
7
  export * from "./ErrorClasses.js";
8
+ export { CatchExpress, SendRes } from "./express.js";
5
9
  export { FacebookUtils } from "./FBUtils.js";
6
10
  export { getEnvv } from "./getEnvv.js";
7
11
  export { GoogleUtils } from "./GoogleUtils.js";
@@ -15,5 +19,6 @@ export * from "./Rand.js";
15
19
  export { tryCatch, tryCatch2 } from "./tryCatch.js";
16
20
  export { TurnstileValidator } from "./TurnstileValidator.js";
17
21
  export type * from "./types.js";
22
+ export { PageLimit, sleep } from "./utils.js";
18
23
  export { validateUUID } from "./validators.js";
19
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,mBAAmB,YAAY,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,mBAAmB,YAAY,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,10 @@
1
+ /**
2
+ * Convenience barrel re-exporting public modules. Prefer **per-file** imports from `@knsdev/node-utils/<Module>.js` in apps (matches `package.json` `exports`).
3
+ */
1
4
  export { CookieUtils } from "./Cookies.js";
2
5
  export * from "./bnUtils.js";
3
6
  export * from "./ErrorClasses.js";
7
+ export { CatchExpress, SendRes } from "./express.js";
4
8
  export { FacebookUtils } from "./FBUtils.js";
5
9
  export { getEnvv } from "./getEnvv.js";
6
10
  export { GoogleUtils } from "./GoogleUtils.js";
@@ -13,5 +17,6 @@ export { PasswordUtils } from "./PassUtils.js";
13
17
  export * from "./Rand.js";
14
18
  export { tryCatch, tryCatch2 } from "./tryCatch.js";
15
19
  export { TurnstileValidator } from "./TurnstileValidator.js";
20
+ export { PageLimit, sleep } from "./utils.js";
16
21
  export { validateUUID } from "./validators.js";
17
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,cAAc,cAAc,CAAC;AAE7B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,cAAc,cAAc,CAAC;AAE7B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -6,4 +6,5 @@ export type TUserStatuses = 'active' | 'inactive' | 'pending' | 'blocked' | 'del
6
6
  export type TUserGenders = 'male' | 'female' | 'other' | 'prefer_not_to_say';
7
7
  export type TVisibility = 'public' | 'private' | 'protected' | 'hidden';
8
8
  export type TThemes = 'light' | 'dark' | 'system';
9
+ export type NoInfer<T> = [T][T extends unknown ? 0 : never];
9
10
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAC1J,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC1H,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC/C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC;AACxG,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AACtF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAC7E,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AACxE,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAC1J,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC1H,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC/C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC;AACxG,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AACtF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAC7E,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AACxE,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAClD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Resolve after `ms` milliseconds.
3
+ * @param ms - Delay in milliseconds.
4
+ * @returns A promise that resolves with `undefined` after the delay.
5
+ */
6
+ export declare const sleep: (ms: number) => Promise<unknown>;
7
+ /**
8
+ * Normalize common list-query parameters: page, limit, skip, sort, optional search, and remaining keys as string filters.
9
+ * @param query - Typically `req.query` or a similar flat object (values may be string, number, or undefined).
10
+ * @returns Pagination/sorting fields plus `filtersData` (all other keys coerced to string values).
11
+ */
12
+ export declare const PageLimit: (query: {
13
+ [key: string]: string | number | undefined;
14
+ }) => {
15
+ page: number;
16
+ limit: number;
17
+ skip: number;
18
+ sortBy: string;
19
+ sortOrder: string;
20
+ searchTerm?: string;
21
+ filtersData: {
22
+ [key: string]: string;
23
+ };
24
+ };
25
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,qBAAoD,CAAC;AAErF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GACrB,OAAO;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,KACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAe7I,CAAA"}
package/dist/utils.js ADDED
@@ -0,0 +1,22 @@
1
+ // Timing and list-query helpers. Import: `@knsdev/node-utils/utils.js`.
2
+ /**
3
+ * Resolve after `ms` milliseconds.
4
+ * @param ms - Delay in milliseconds.
5
+ * @returns A promise that resolves with `undefined` after the delay.
6
+ */
7
+ export const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
8
+ /**
9
+ * Normalize common list-query parameters: page, limit, skip, sort, optional search, and remaining keys as string filters.
10
+ * @param query - Typically `req.query` or a similar flat object (values may be string, number, or undefined).
11
+ * @returns Pagination/sorting fields plus `filtersData` (all other keys coerced to string values).
12
+ */
13
+ export const PageLimit = (query) => {
14
+ const { page: rawPage, limit: rawLimit, sortBy: rawSortBy, sortOrder: rawSortOrder, searchTerm, ...filtersData } = query;
15
+ const page = Number(rawPage || 1);
16
+ const limit = Number(rawLimit || 10);
17
+ const skip = (page - 1) * limit;
18
+ const sortBy = rawSortBy || "created_at";
19
+ const sortOrder = rawSortOrder || "desc";
20
+ return { page, limit, skip, sortBy, sortOrder, searchTerm, filtersData };
21
+ };
22
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAErF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACxB,KAAqD,EAC2F,EAAE;IAClJ,MAAM,EACL,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,YAAY,EACvB,UAAU,EACV,GAAG,WAAW,EACd,GAAG,KAAK,CAAC;IACV,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAChC,MAAM,MAAM,GAAG,SAAS,IAAI,YAAY,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,IAAI,MAAM,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAmJ,CAAA;AAC1N,CAAC,CAAA"}
package/dist/zod.d.ts CHANGED
@@ -1,12 +1,22 @@
1
1
  import { z } from "zod";
2
+ /** Password string within configured min/max length. */
2
3
  export declare const z_PASSWORD: z.ZodString;
4
+ /** Alphanumeric + hyphen/underscore token of fixed length (`CLengths.GENERAL_TOKEN`). */
3
5
  export declare const z_GENERAL_TOKEN: z.ZodString;
6
+ /** Exactly six decimal digits. */
4
7
  export declare const z_CODE_6_DIGITS: z.ZodString;
8
+ /** URL-safe slug: length bounds and `[a-zA-Z0-9-_]` only. */
5
9
  export declare const z_SLUG: z.ZodString;
10
+ /** Email with configured min/max length (beyond Zod’s built-in email check). */
6
11
  export declare const z_EMAIL: z.ZodEmail;
12
+ /** First name within configured length. */
7
13
  export declare const z_FIRST_NAME: z.ZodString;
14
+ /** Last name within configured length. */
8
15
  export declare const z_LAST_NAME: z.ZodString;
16
+ /** Cloudflare Turnstile response token length bounds. */
9
17
  export declare const z_TURNSTILE_TOKEN: z.ZodString;
18
+ /** Boolean flag for “log out other sessions” style fields. */
10
19
  export declare const z_LOGOUT_OTHER_SESSIONS: z.ZodBoolean;
20
+ /** Boolean flag for “remember me” style fields. */
11
21
  export declare const z_REMEMBER_ME: z.ZodBoolean;
12
22
  //# sourceMappingURL=zod.d.ts.map
package/dist/zod.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,UAAU,aAEgC,CAAC;AAExD,eAAO,MAAM,eAAe,aAE4B,CAAC;AAEzD,eAAO,MAAM,eAAe,aAE0B,CAAC;AAEvD,eAAO,MAAM,MAAM,aAG4B,CAAC;AAEhD,eAAO,MAAM,OAAO,YAE6B,CAAA;AAEjD,eAAO,MAAM,YAAY,aAEkC,CAAC;AAE5D,eAAO,MAAM,WAAW,aAEiC,CAAC;AAE1D,eAAO,MAAM,iBAAiB,aAEuC,CAAA;AAErE,eAAO,MAAM,uBAAuB,cAAiD,CAAC;AAEtF,eAAO,MAAM,aAAa,cAAuC,CAAC"}
1
+ {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,wDAAwD;AACxD,eAAO,MAAM,UAAU,aAEgC,CAAC;AAExD,yFAAyF;AACzF,eAAO,MAAM,eAAe,aAE4B,CAAC;AAEzD,kCAAkC;AAClC,eAAO,MAAM,eAAe,aAE0B,CAAC;AAEvD,6DAA6D;AAC7D,eAAO,MAAM,MAAM,aAG4B,CAAC;AAEhD,gFAAgF;AAChF,eAAO,MAAM,OAAO,YAE6B,CAAC;AAElD,2CAA2C;AAC3C,eAAO,MAAM,YAAY,aAEkC,CAAC;AAE5D,0CAA0C;AAC1C,eAAO,MAAM,WAAW,aAEiC,CAAC;AAE1D,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,aAEuC,CAAC;AAEtE,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,cAAiD,CAAC;AAEtF,mDAAmD;AACnD,eAAO,MAAM,aAAa,cAAuC,CAAC"}
package/dist/zod.js CHANGED
@@ -1,31 +1,42 @@
1
1
  import { z } from "zod";
2
2
  import { CLengths } from "./CLengths.js";
3
+ // Prebuilt schemas: `CLengths` + `TZodCodes`. Import: `@knsdev/node-utils/zod.js`.
3
4
  const k = (key) => key;
5
+ /** Password string within configured min/max length. */
4
6
  export const z_PASSWORD = z.string(k('PASSWORD__INVALID'))
5
7
  .min(CLengths.PASSWORD.min, k('PASSWORD__MIN_LENGTH'))
6
8
  .max(CLengths.PASSWORD.max, k('PASSWORD__MAX_LENGTH'));
9
+ /** Alphanumeric + hyphen/underscore token of fixed length (`CLengths.GENERAL_TOKEN`). */
7
10
  export const z_GENERAL_TOKEN = z.string(k('GENERAL_TOKEN__INVALID'))
8
11
  .length(CLengths.GENERAL_TOKEN, k('GENERAL_TOKEN__LENGTH'))
9
12
  .regex(/^[a-zA-Z0-9-_]+$/, k('GENERAL_TOKEN__INVALID'));
13
+ /** Exactly six decimal digits. */
10
14
  export const z_CODE_6_DIGITS = z.string(k('CODE_6_DIGITS__INVALID'))
11
15
  .length(CLengths.Code_6_digits, k('CODE_6_DIGITS__LENGTH'))
12
16
  .regex(/^\d{6}$/, k('CODE_6_DIGITS__INVALID_FORMAT'));
17
+ /** URL-safe slug: length bounds and `[a-zA-Z0-9-_]` only. */
13
18
  export const z_SLUG = z.string(k('SLUG__INVALID'))
14
19
  .min(CLengths.SLUG.min, k('SLUG__MIN_LENGTH'))
15
20
  .max(CLengths.SLUG.max, k('SLUG__MAX_LENGTH'))
16
21
  .regex(/^[a-zA-Z0-9-_]+$/, k('SLUG__INVALID'));
22
+ /** Email with configured min/max length (beyond Zod’s built-in email check). */
17
23
  export const z_EMAIL = z.email(k('EMAIL__INVALID'))
18
24
  .min(CLengths.EMAIL.min, k('EMAIL__MIN_LENGTH'))
19
25
  .max(CLengths.EMAIL.max, k('EMAIL__MAX_LENGTH'));
26
+ /** First name within configured length. */
20
27
  export const z_FIRST_NAME = z.string(k('FIRST_NAME__INVALID'))
21
28
  .min(CLengths.FIRST_NAME.min, k('FIRST_NAME__MIN_LENGTH'))
22
29
  .max(CLengths.FIRST_NAME.max, k('FIRST_NAME__MAX_LENGTH'));
30
+ /** Last name within configured length. */
23
31
  export const z_LAST_NAME = z.string(k('LAST_NAME__INVALID'))
24
32
  .min(CLengths.LAST_NAME.min, k('LAST_NAME__MIN_LENGTH'))
25
33
  .max(CLengths.LAST_NAME.max, k('LAST_NAME__MAX_LENGTH'));
34
+ /** Cloudflare Turnstile response token length bounds. */
26
35
  export const z_TURNSTILE_TOKEN = z.string(k('TURNSTILE_TOKEN__INVALID'))
27
36
  .min(CLengths.TURNSTILE_TOKEN.min, k('TURNSTILE_TOKEN__MIN_LENGTH'))
28
37
  .max(CLengths.TURNSTILE_TOKEN.max, k('TURNSTILE_TOKEN__MAX_LENGTH'));
38
+ /** Boolean flag for “log out other sessions” style fields. */
29
39
  export const z_LOGOUT_OTHER_SESSIONS = z.boolean(k('LOGOUT_OTHER_SESSIONS__INVALID'));
40
+ /** Boolean flag for “remember me” style fields. */
30
41
  export const z_REMEMBER_ME = z.boolean(k('REMEMBER_ME__INVALID'));
31
42
  //# sourceMappingURL=zod.js.map
package/dist/zod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,GAAG,CAAsB,GAAM,EAAE,EAAE,CAAC,GAAG,CAAC;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;KACxD,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC;KACrD,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;KAClE,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,uBAAuB,CAAC,CAAC;KAC1D,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;KAClE,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,uBAAuB,CAAC,CAAC;KAC1D,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;KAChD,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;KAC7C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;KAC7C,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;KACjD,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;KAC/C,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAA;AAEjD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;KAC5D,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,wBAAwB,CAAC,CAAC;KACzD,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;KAC1D,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,uBAAuB,CAAC,CAAC;KACvD,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;KACtE,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,6BAA6B,CAAC,CAAC;KACnE,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAA;AAErE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC;AAEtF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knsdev/node-utils",
3
- "version": "3.1.0",
3
+ "version": "3.3.0",
4
4
  "description": "",
5
5
  "exports": {
6
6
  "./*": {