@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.
- package/README.md +105 -16
- package/dist/ECApiCodes.d.ts +1 -1
- package/dist/ECApiCodes.d.ts.map +1 -1
- package/dist/FBUtils.d.ts +8 -4
- package/dist/FBUtils.d.ts.map +1 -1
- package/dist/FBUtils.js +9 -4
- package/dist/FBUtils.js.map +1 -1
- package/dist/HMACUtils.d.ts +4 -0
- package/dist/HMACUtils.d.ts.map +1 -1
- package/dist/HMACUtils.js +4 -0
- package/dist/HMACUtils.js.map +1 -1
- package/dist/JwtUtils.d.ts +2 -2
- package/dist/JwtUtils.js +2 -2
- package/dist/PassUtils.d.ts +5 -4
- package/dist/PassUtils.d.ts.map +1 -1
- package/dist/PassUtils.js +5 -4
- package/dist/PassUtils.js.map +1 -1
- package/dist/TokenUtils.d.ts +70 -0
- package/dist/TokenUtils.d.ts.map +1 -0
- package/dist/TokenUtils.js +108 -0
- package/dist/TokenUtils.js.map +1 -0
- package/dist/TurnstileValidator.d.ts +2 -2
- package/dist/TurnstileValidator.js +2 -2
- package/dist/express.d.ts +17 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +23 -0
- package/dist/express.js.map +1 -0
- package/dist/getEnvv.d.ts +3 -2
- package/dist/getEnvv.d.ts.map +1 -1
- package/dist/getEnvv.js +3 -2
- package/dist/getEnvv.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +25 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +22 -0
- package/dist/utils.js.map +1 -0
- package/dist/zod.d.ts +10 -0
- package/dist/zod.d.ts.map +1 -1
- package/dist/zod.js +11 -0
- package/dist/zod.js.map +1 -1
- 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
|
|
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`).
|
|
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
|
|
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`.
|
|
314
|
+
HTTP status constants and errors for APIs: `ApiError` plus `BadRequest`, `Unauthorized`, `Forbidden`, `NotFound`, `TooManyRequests`, `InternalServerError`. Error `message` values use the `ECApiCodes` string union—machine-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
|
|
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(
|
|
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 `
|
|
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
|
|
359
|
-
|
|
|
360
|
-
| JWT
|
|
361
|
-
| Google ID token
|
|
362
|
-
| Passwords
|
|
363
|
-
| Schemas
|
|
364
|
-
| Cookies
|
|
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
|
|
package/dist/ECApiCodes.d.ts
CHANGED
|
@@ -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
|
package/dist/ECApiCodes.d.ts.map
CHANGED
|
@@ -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
|
|
4
|
-
*
|
|
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
|
|
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
|
|
22
|
+
* Singleton instance of {@link facebookUtils}.
|
|
19
23
|
*/
|
|
20
24
|
export declare const FacebookUtils: facebookUtils;
|
|
21
25
|
export {};
|
package/dist/FBUtils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FBUtils.d.ts","sourceRoot":"","sources":["../src/FBUtils.ts"],"names":[],"mappings":"
|
|
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
|
|
7
|
-
*
|
|
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
|
|
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
|
|
71
|
+
* Singleton instance of {@link facebookUtils}.
|
|
67
72
|
*/
|
|
68
73
|
export const FacebookUtils = new facebookUtils();
|
|
69
74
|
//# sourceMappingURL=FBUtils.js.map
|
package/dist/FBUtils.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/HMACUtils.d.ts
CHANGED
|
@@ -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
|
package/dist/HMACUtils.d.ts.map
CHANGED
|
@@ -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
package/dist/HMACUtils.js.map
CHANGED
|
@@ -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"}
|
package/dist/JwtUtils.d.ts
CHANGED
|
@@ -43,8 +43,8 @@ declare class jwtUtils {
|
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
47
|
-
* Import via:
|
|
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
|
-
*
|
|
75
|
-
* Import via:
|
|
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
|
package/dist/PassUtils.d.ts
CHANGED
|
@@ -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 }`
|
|
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
|
|
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
|
|
40
|
-
* @throws {
|
|
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
|
/**
|
package/dist/PassUtils.d.ts.map
CHANGED
|
@@ -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
|
|
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 }`
|
|
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
|
|
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
|
|
57
|
-
* @throws {
|
|
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);
|
package/dist/PassUtils.js.map
CHANGED
|
@@ -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
|
|
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}
|
|
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}
|
|
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"}
|
package/dist/express.js
ADDED
|
@@ -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}
|
|
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 {};
|
package/dist/getEnvv.d.ts.map
CHANGED
|
@@ -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
|
|
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}
|
|
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 = {};
|
package/dist/getEnvv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getEnvv.js","sourceRoot":"","sources":["../src/getEnvv.ts"],"names":[],"mappings":"AAgBA
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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;
|
|
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,
|
|
1
|
+
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"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"}
|