@xfilecom/backend-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.module.d.ts +40 -0
- package/dist/core.module.js +195 -0
- package/dist/core.module.js.map +1 -0
- package/dist/database/database.constants.d.ts +2 -0
- package/dist/database/database.constants.js +6 -0
- package/dist/database/database.constants.js.map +1 -0
- package/dist/database/database.module.d.ts +19 -0
- package/dist/database/database.module.js +56 -0
- package/dist/database/database.module.js.map +1 -0
- package/dist/database/database.query.d.ts +103 -0
- package/dist/database/database.query.js +369 -0
- package/dist/database/database.query.js.map +1 -0
- package/dist/database/database.service.d.ts +18 -0
- package/dist/database/database.service.js +110 -0
- package/dist/database/database.service.js.map +1 -0
- package/dist/decorators/public.decorator.d.ts +2 -0
- package/dist/decorators/public.decorator.js +8 -0
- package/dist/decorators/public.decorator.js.map +1 -0
- package/dist/decorators/roles.decorator.d.ts +2 -0
- package/dist/decorators/roles.decorator.js +8 -0
- package/dist/decorators/roles.decorator.js.map +1 -0
- package/dist/decorators/user.decorator.d.ts +7 -0
- package/dist/decorators/user.decorator.js +10 -0
- package/dist/decorators/user.decorator.js.map +1 -0
- package/dist/filters/exception.filter.d.ts +36 -0
- package/dist/filters/exception.filter.js +201 -0
- package/dist/filters/exception.filter.js.map +1 -0
- package/dist/filters/i18n-exception.filter.d.ts +18 -0
- package/dist/filters/i18n-exception.filter.js +227 -0
- package/dist/filters/i18n-exception.filter.js.map +1 -0
- package/dist/filters/microservice-gateway-exception.filter.d.ts +4 -0
- package/dist/filters/microservice-gateway-exception.filter.js +64 -0
- package/dist/filters/microservice-gateway-exception.filter.js.map +1 -0
- package/dist/filters/rpc-response-exception.filter.d.ts +6 -0
- package/dist/filters/rpc-response-exception.filter.js +24 -0
- package/dist/filters/rpc-response-exception.filter.js.map +1 -0
- package/dist/guards/jwt-auth.guard.d.ts +14 -0
- package/dist/guards/jwt-auth.guard.js +103 -0
- package/dist/guards/jwt-auth.guard.js.map +1 -0
- package/dist/guards/roles.guard.d.ts +7 -0
- package/dist/guards/roles.guard.js +47 -0
- package/dist/guards/roles.guard.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/database-check.interceptor.d.ts +12 -0
- package/dist/interceptors/database-check.interceptor.js +60 -0
- package/dist/interceptors/database-check.interceptor.js.map +1 -0
- package/dist/interceptors/error-handling.interceptor.d.ts +8 -0
- package/dist/interceptors/error-handling.interceptor.js +33 -0
- package/dist/interceptors/error-handling.interceptor.js.map +1 -0
- package/dist/interceptors/logging.interceptor.d.ts +22 -0
- package/dist/interceptors/logging.interceptor.js +178 -0
- package/dist/interceptors/logging.interceptor.js.map +1 -0
- package/dist/interceptors/response-transform.interceptor.d.ts +5 -0
- package/dist/interceptors/response-transform.interceptor.js +32 -0
- package/dist/interceptors/response-transform.interceptor.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/auth-lookup.utils.d.ts +23 -0
- package/dist/utils/auth-lookup.utils.js +61 -0
- package/dist/utils/auth-lookup.utils.js.map +1 -0
- package/dist/utils/auth.helpers.d.ts +19 -0
- package/dist/utils/auth.helpers.js +77 -0
- package/dist/utils/auth.helpers.js.map +1 -0
- package/dist/utils/config-loader.utils.d.ts +22 -0
- package/dist/utils/config-loader.utils.js +77 -0
- package/dist/utils/config-loader.utils.js.map +1 -0
- package/dist/utils/config-secret.utils.d.ts +9 -0
- package/dist/utils/config-secret.utils.js +26 -0
- package/dist/utils/config-secret.utils.js.map +1 -0
- package/dist/utils/config.validator.d.ts +13 -0
- package/dist/utils/config.validator.js +82 -0
- package/dist/utils/config.validator.js.map +1 -0
- package/dist/utils/controller.helpers.d.ts +59 -0
- package/dist/utils/controller.helpers.js +117 -0
- package/dist/utils/controller.helpers.js.map +1 -0
- package/dist/utils/crypto.utils.d.ts +12 -0
- package/dist/utils/crypto.utils.js +53 -0
- package/dist/utils/crypto.utils.js.map +1 -0
- package/dist/utils/env.utils.d.ts +8 -0
- package/dist/utils/env.utils.js +27 -0
- package/dist/utils/env.utils.js.map +1 -0
- package/dist/utils/error.utils.d.ts +7 -0
- package/dist/utils/error.utils.js +72 -0
- package/dist/utils/error.utils.js.map +1 -0
- package/dist/utils/hash-verification.utils.d.ts +35 -0
- package/dist/utils/hash-verification.utils.js +133 -0
- package/dist/utils/hash-verification.utils.js.map +1 -0
- package/dist/utils/logger.helpers.d.ts +71 -0
- package/dist/utils/logger.helpers.js +293 -0
- package/dist/utils/logger.helpers.js.map +1 -0
- package/dist/utils/logging.config.d.ts +6 -0
- package/dist/utils/logging.config.js +42 -0
- package/dist/utils/logging.config.js.map +1 -0
- package/dist/utils/rpc-exception.utils.d.ts +7 -0
- package/dist/utils/rpc-exception.utils.js +53 -0
- package/dist/utils/rpc-exception.utils.js.map +1 -0
- package/dist/utils/service.helpers.d.ts +22 -0
- package/dist/utils/service.helpers.js +73 -0
- package/dist/utils/service.helpers.js.map +1 -0
- package/dist/utils/yaml-config.loader.d.ts +15 -0
- package/dist/utils/yaml-config.loader.js +219 -0
- package/dist/utils/yaml-config.loader.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type DrizzleDb = {
|
|
2
|
+
select: (cols?: any) => {
|
|
3
|
+
from: (table: any) => {
|
|
4
|
+
where: (cond: any) => {
|
|
5
|
+
limit: (n: number) => Promise<any[]>;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export interface FindUserByLookupHashOptions {
|
|
11
|
+
identifier: string;
|
|
12
|
+
encryptionKey: string;
|
|
13
|
+
lookupFieldMap?: Record<string, string>;
|
|
14
|
+
plainColumn?: string;
|
|
15
|
+
normalizer?: (s: string) => string;
|
|
16
|
+
useSha256Variant?: boolean;
|
|
17
|
+
keyDerivation?: 'none' | 'sha256';
|
|
18
|
+
}
|
|
19
|
+
export declare function findUserByLookupHash(db: DrizzleDb, table: Record<string, any>, options: FindUserByLookupHashOptions): Promise<Record<string, unknown> | null>;
|
|
20
|
+
export interface AuthenticateWithHashLookupOptions extends FindUserByLookupHashOptions {
|
|
21
|
+
passwordColumn?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function authenticateWithHashLookup(db: DrizzleDb, table: Record<string, any>, identifier: string, password: string, options: AuthenticateWithHashLookupOptions): Promise<Record<string, unknown> | null>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findUserByLookupHash = findUserByLookupHash;
|
|
4
|
+
exports.authenticateWithHashLookup = authenticateWithHashLookup;
|
|
5
|
+
const crypto = require("crypto");
|
|
6
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
7
|
+
const hash_verification_utils_1 = require("./hash-verification.utils");
|
|
8
|
+
const crypto_utils_1 = require("./crypto.utils");
|
|
9
|
+
async function findUserByLookupHash(db, table, options) {
|
|
10
|
+
const normalized = options.normalizer ? options.normalizer(options.identifier) : options.identifier;
|
|
11
|
+
if (options.lookupFieldMap && Object.keys(options.lookupFieldMap).length > 0) {
|
|
12
|
+
const plainKey = Object.keys(options.lookupFieldMap)[0];
|
|
13
|
+
const hashColumnName = options.lookupFieldMap[plainKey];
|
|
14
|
+
const hashColumn = table[hashColumnName];
|
|
15
|
+
if (!hashColumn) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const hashes = [
|
|
19
|
+
(0, hash_verification_utils_1.lookupHash)(normalized, options.encryptionKey, {
|
|
20
|
+
keyDerivation: options.keyDerivation ?? 'sha256',
|
|
21
|
+
}),
|
|
22
|
+
];
|
|
23
|
+
if (options.useSha256Variant) {
|
|
24
|
+
hashes.push(crypto.createHash('sha256').update(normalized).digest('hex'));
|
|
25
|
+
}
|
|
26
|
+
const rows = await db
|
|
27
|
+
.select()
|
|
28
|
+
.from(table)
|
|
29
|
+
.where((0, drizzle_orm_1.inArray)(hashColumn, hashes))
|
|
30
|
+
.limit(1);
|
|
31
|
+
const row = rows?.[0];
|
|
32
|
+
return row != null ? row : null;
|
|
33
|
+
}
|
|
34
|
+
if (options.plainColumn) {
|
|
35
|
+
const col = table[options.plainColumn];
|
|
36
|
+
if (!col)
|
|
37
|
+
return null;
|
|
38
|
+
const rows = await db
|
|
39
|
+
.select()
|
|
40
|
+
.from(table)
|
|
41
|
+
.where((0, drizzle_orm_1.eq)(col, normalized))
|
|
42
|
+
.limit(1);
|
|
43
|
+
const row = rows?.[0];
|
|
44
|
+
return row != null ? row : null;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
async function authenticateWithHashLookup(db, table, identifier, password, options) {
|
|
49
|
+
const row = await findUserByLookupHash(db, table, options);
|
|
50
|
+
if (!row)
|
|
51
|
+
return null;
|
|
52
|
+
const passwordColumn = options.passwordColumn ?? 'password';
|
|
53
|
+
const stored = row[passwordColumn];
|
|
54
|
+
if (stored == null || typeof stored !== 'string')
|
|
55
|
+
return null;
|
|
56
|
+
if (!(0, crypto_utils_1.pbkdf2VerifyPassword)(password, stored))
|
|
57
|
+
return null;
|
|
58
|
+
const { [passwordColumn]: _, ...rest } = row;
|
|
59
|
+
return rest;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=auth-lookup.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-lookup.utils.js","sourceRoot":"","sources":["../../src/utils/auth-lookup.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface JwtPayload {
|
|
2
|
+
sub: string | number;
|
|
3
|
+
email?: string;
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}
|
|
6
|
+
export declare class AuthHelpers {
|
|
7
|
+
private readonly logger;
|
|
8
|
+
private readonly jwtSecret;
|
|
9
|
+
private readonly jwtExpiresIn;
|
|
10
|
+
private readonly saltRounds;
|
|
11
|
+
constructor(jwtSecret?: string, jwtExpiresIn?: string, saltRounds?: number);
|
|
12
|
+
hashPassword(password: string): Promise<string>;
|
|
13
|
+
comparePassword(password: string, hashedPassword: string): Promise<boolean>;
|
|
14
|
+
generateToken(payload: JwtPayload): string;
|
|
15
|
+
verifyToken(token: string): JwtPayload | null;
|
|
16
|
+
decodeToken(token: string): JwtPayload | null;
|
|
17
|
+
generateRefreshToken(payload: JwtPayload, expiresIn?: string): string;
|
|
18
|
+
getUserIdFromToken(token: string): string | number | null;
|
|
19
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var AuthHelpers_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.AuthHelpers = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const bcrypt = require("bcrypt");
|
|
19
|
+
const jwt = require("jsonwebtoken");
|
|
20
|
+
let AuthHelpers = AuthHelpers_1 = class AuthHelpers {
|
|
21
|
+
constructor(jwtSecret, jwtExpiresIn, saltRounds) {
|
|
22
|
+
this.logger = new common_1.Logger(AuthHelpers_1.name);
|
|
23
|
+
this.jwtSecret = jwtSecret || process.env.JWT_SECRET || 'your-secret-key';
|
|
24
|
+
this.jwtExpiresIn = jwtExpiresIn || process.env.JWT_EXPIRES_IN || '7d';
|
|
25
|
+
this.saltRounds = saltRounds || parseInt(process.env.BCRYPT_SALT_ROUNDS || '10', 10);
|
|
26
|
+
}
|
|
27
|
+
async hashPassword(password) {
|
|
28
|
+
return await bcrypt.hash(password, this.saltRounds);
|
|
29
|
+
}
|
|
30
|
+
async comparePassword(password, hashedPassword) {
|
|
31
|
+
return await bcrypt.compare(password, hashedPassword);
|
|
32
|
+
}
|
|
33
|
+
generateToken(payload) {
|
|
34
|
+
return jwt.sign(payload, this.jwtSecret, {
|
|
35
|
+
expiresIn: this.jwtExpiresIn,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
verifyToken(token) {
|
|
39
|
+
try {
|
|
40
|
+
return jwt.verify(token, this.jwtSecret);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.logger.warn(`Token verification failed: ${error.message}`);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
decodeToken(token) {
|
|
48
|
+
try {
|
|
49
|
+
return jwt.decode(token);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.logger.warn(`Token decode failed: ${error.message}`);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
generateRefreshToken(payload, expiresIn = '30d') {
|
|
57
|
+
return jwt.sign(payload, this.jwtSecret, {
|
|
58
|
+
expiresIn,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
getUserIdFromToken(token) {
|
|
62
|
+
const payload = this.verifyToken(token);
|
|
63
|
+
return payload?.sub || null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
exports.AuthHelpers = AuthHelpers;
|
|
67
|
+
exports.AuthHelpers = AuthHelpers = AuthHelpers_1 = __decorate([
|
|
68
|
+
(0, common_1.Injectable)(),
|
|
69
|
+
__param(0, (0, common_1.Optional)()),
|
|
70
|
+
__param(0, (0, common_1.Inject)('JWT_SECRET')),
|
|
71
|
+
__param(1, (0, common_1.Optional)()),
|
|
72
|
+
__param(1, (0, common_1.Inject)('JWT_EXPIRES_IN')),
|
|
73
|
+
__param(2, (0, common_1.Optional)()),
|
|
74
|
+
__param(2, (0, common_1.Inject)('BCRYPT_SALT_ROUNDS')),
|
|
75
|
+
__metadata("design:paramtypes", [String, String, Number])
|
|
76
|
+
], AuthHelpers);
|
|
77
|
+
//# sourceMappingURL=auth.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.helpers.js","sourceRoot":"","sources":["../../src/utils/auth.helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAsE;AACtE,iCAAiC;AACjC,oCAAoC;AAgB7B,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAMtB,YACoC,SAAkB,EACd,YAAqB,EACjB,UAAmB;QAR9C,WAAM,GAAG,IAAI,eAAM,CAAC,aAAW,CAAC,IAAI,CAAC,CAAC;QAUrD,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,iBAAiB,CAAC;QAC1E,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC;QACvE,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IAKD,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAKD,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,cAAsB;QAC5D,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IAKD,aAAa,CAAC,OAAmB;QAC/B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE;YACvC,SAAS,EAAE,IAAI,CAAC,YAAY;SACV,CAAC,CAAC;IACxB,CAAC;IAKD,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAe,CAAC;QACzD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAKD,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAe,CAAC;QACzC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAKD,oBAAoB,CAAC,OAAmB,EAAE,YAAoB,KAAK;QACjE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE;YACvC,SAAS;SACS,CAAC,CAAC;IACxB,CAAC;IAKD,kBAAkB,CAAC,KAAa;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC;IAC9B,CAAC;CACF,CAAA;AA/EY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,YAAY,CAAC,CAAA;IAChC,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,gBAAgB,CAAC,CAAA;IACpC,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,oBAAoB,CAAC,CAAA;;GAThC,WAAW,CA+EvB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type LoadApplicationYamlOptions } from './yaml-config.loader';
|
|
2
|
+
export declare const DEFAULT_CONFIG_ROOT_CANDIDATES: readonly ["libs/config/config", "../../libs/config/config", "../libs/config/config", "."];
|
|
3
|
+
export interface ResolveConfigRootDirOptions {
|
|
4
|
+
cwd?: string;
|
|
5
|
+
candidates?: string[];
|
|
6
|
+
configFilenames?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function resolveConfigRootDir(options?: ResolveConfigRootDirOptions): string;
|
|
9
|
+
export interface CreateConfigLoaderOptions {
|
|
10
|
+
rootDir?: string;
|
|
11
|
+
env?: string;
|
|
12
|
+
syncEnvKeys?: Record<string, string>;
|
|
13
|
+
globalKey?: string;
|
|
14
|
+
loadOptions?: Omit<LoadApplicationYamlOptions, 'rootDir' | 'env' | 'syncEnvKeys'>;
|
|
15
|
+
}
|
|
16
|
+
export interface GetServiceConfigOverrides {
|
|
17
|
+
portEnvKey?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function createConfigLoader(options?: CreateConfigLoaderOptions): {
|
|
20
|
+
getFullConfig: () => Record<string, unknown>;
|
|
21
|
+
getServiceConfig: (serviceKey: string, overrides?: GetServiceConfigOverrides) => Record<string, unknown>;
|
|
22
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_CONFIG_ROOT_CANDIDATES = void 0;
|
|
4
|
+
exports.resolveConfigRootDir = resolveConfigRootDir;
|
|
5
|
+
exports.createConfigLoader = createConfigLoader;
|
|
6
|
+
const fs = require("fs");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const yaml_config_loader_1 = require("./yaml-config.loader");
|
|
9
|
+
exports.DEFAULT_CONFIG_ROOT_CANDIDATES = [
|
|
10
|
+
'libs/config/config',
|
|
11
|
+
'../../libs/config/config',
|
|
12
|
+
'../libs/config/config',
|
|
13
|
+
'.',
|
|
14
|
+
];
|
|
15
|
+
function resolveConfigRootDir(options = {}) {
|
|
16
|
+
const cwd = path.resolve(options.cwd ?? (typeof process !== 'undefined' ? process.cwd() : '.'));
|
|
17
|
+
const candidates = options.candidates ?? [...exports.DEFAULT_CONFIG_ROOT_CANDIDATES];
|
|
18
|
+
const configFilenames = options.configFilenames ?? yaml_config_loader_1.DEFAULT_CONFIG_FILENAMES;
|
|
19
|
+
for (const candidate of candidates) {
|
|
20
|
+
const dir = path.isAbsolute(candidate) ? candidate : path.join(cwd, candidate);
|
|
21
|
+
const resolved = path.resolve(dir);
|
|
22
|
+
for (const filename of configFilenames) {
|
|
23
|
+
const filePath = path.join(resolved, filename);
|
|
24
|
+
try {
|
|
25
|
+
if (fs.existsSync(filePath)) {
|
|
26
|
+
return resolved;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return cwd;
|
|
34
|
+
}
|
|
35
|
+
const globalConfigCache = new Map();
|
|
36
|
+
function createConfigLoader(options = {}) {
|
|
37
|
+
const rootDir = options.rootDir ??
|
|
38
|
+
resolveConfigRootDir({ cwd: typeof process !== 'undefined' ? process.cwd() : '.' });
|
|
39
|
+
const globalKey = options.globalKey ?? 'default';
|
|
40
|
+
const load = () => {
|
|
41
|
+
const cached = globalConfigCache.get(globalKey);
|
|
42
|
+
if (cached)
|
|
43
|
+
return cached;
|
|
44
|
+
const config = (0, yaml_config_loader_1.loadApplicationYamlSync)({
|
|
45
|
+
rootDir,
|
|
46
|
+
env: options.env,
|
|
47
|
+
syncEnvKeys: options.syncEnvKeys,
|
|
48
|
+
...options.loadOptions,
|
|
49
|
+
});
|
|
50
|
+
globalConfigCache.set(globalKey, config);
|
|
51
|
+
return config;
|
|
52
|
+
};
|
|
53
|
+
function getFullConfig() {
|
|
54
|
+
return load();
|
|
55
|
+
}
|
|
56
|
+
function getServiceConfig(serviceKey, overrides) {
|
|
57
|
+
const full = getFullConfig();
|
|
58
|
+
const common = full.common ?? {};
|
|
59
|
+
const service = full[serviceKey] ?? {};
|
|
60
|
+
const merged = { ...common, ...service };
|
|
61
|
+
if (overrides?.portEnvKey && typeof process !== 'undefined') {
|
|
62
|
+
const portStr = process.env[overrides.portEnvKey];
|
|
63
|
+
if (portStr != null && portStr !== '') {
|
|
64
|
+
const port = parseInt(portStr, 10);
|
|
65
|
+
if (!Number.isNaN(port)) {
|
|
66
|
+
merged.server = {
|
|
67
|
+
...merged.server,
|
|
68
|
+
port,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return merged;
|
|
74
|
+
}
|
|
75
|
+
return { getFullConfig, getServiceConfig };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=config-loader.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.utils.js","sourceRoot":"","sources":["../../src/utils/config-loader.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ConfigGetter {
|
|
2
|
+
get<T = unknown>(key: string): T;
|
|
3
|
+
}
|
|
4
|
+
export interface GetOptionalSecretOptions {
|
|
5
|
+
keys: string[];
|
|
6
|
+
envKey: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getOptionalSecret(config: ConfigGetter | null | undefined, options: GetOptionalSecretOptions): string | undefined;
|
|
9
|
+
export declare function getEncryptionKey(config: ConfigGetter | null | undefined, serviceKey?: string): string | undefined;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getOptionalSecret = getOptionalSecret;
|
|
4
|
+
exports.getEncryptionKey = getEncryptionKey;
|
|
5
|
+
function getOptionalSecret(config, options) {
|
|
6
|
+
const { keys, envKey } = options;
|
|
7
|
+
for (const key of keys) {
|
|
8
|
+
const value = config?.get?.(key);
|
|
9
|
+
if (value != null && typeof value === 'string' && value.trim() !== '') {
|
|
10
|
+
return value.trim();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const envVal = typeof process !== 'undefined' ? process.env[envKey] : undefined;
|
|
14
|
+
if (envVal != null && typeof envVal === 'string' && envVal.trim() !== '') {
|
|
15
|
+
return envVal.trim();
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
function getEncryptionKey(config, serviceKey) {
|
|
20
|
+
const keys = ['encryptionKey'];
|
|
21
|
+
if (serviceKey) {
|
|
22
|
+
keys.push(`${serviceKey}.encryptionKey`);
|
|
23
|
+
}
|
|
24
|
+
return getOptionalSecret(config, { keys, envKey: 'ENCRYPTION_KEY' });
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=config-secret.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-secret.utils.js","sourceRoot":"","sources":["../../src/utils/config-secret.utils.ts"],"names":[],"mappings":";;AAiCA,8CAgBC;AAgBD,4CASC;AAzCD,SAAgB,iBAAiB,CAC/B,MAAuC,EACvC,OAAiC;IAEjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACzE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAgBD,SAAgB,gBAAgB,CAC9B,MAAuC,EACvC,UAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,gBAAgB,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,iBAAiB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class ConfigValidator {
|
|
2
|
+
private static readonly logger;
|
|
3
|
+
static validateRequired(requiredVars: string[], throwOnMissing?: boolean): void;
|
|
4
|
+
static validateDatabaseConfig(throwOnMissing?: boolean): void;
|
|
5
|
+
static validateJwtConfig(throwOnMissing?: boolean, jwtOptions?: {
|
|
6
|
+
secret?: string;
|
|
7
|
+
expiresIn?: string;
|
|
8
|
+
}): void;
|
|
9
|
+
static validatePort(port: string | undefined, defaultPort: number): number;
|
|
10
|
+
static parseBoolean(value: string | undefined, defaultValue?: boolean): boolean;
|
|
11
|
+
static parseArray(value: string | undefined): string[];
|
|
12
|
+
static parseNumber(value: string | undefined, defaultValue: number, min?: number, max?: number): number;
|
|
13
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigValidator = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
class ConfigValidator {
|
|
6
|
+
static validateRequired(requiredVars, throwOnMissing = false) {
|
|
7
|
+
const missing = [];
|
|
8
|
+
for (const varName of requiredVars) {
|
|
9
|
+
if (!process.env[varName]) {
|
|
10
|
+
missing.push(varName);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if (missing.length > 0) {
|
|
14
|
+
const message = `Missing required environment variables: ${missing.join(', ')}`;
|
|
15
|
+
if (throwOnMissing) {
|
|
16
|
+
throw new Error(message);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.logger.warn(message);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
static validateDatabaseConfig(throwOnMissing = false) {
|
|
24
|
+
this.validateRequired(['DB_HOST', 'DB_PORT', 'DB_USER', 'DB_NAME'], throwOnMissing);
|
|
25
|
+
if (!process.env.DB_PASSWORD) {
|
|
26
|
+
this.logger.warn('DB_PASSWORD is not set. Database connection may fail if password is required.');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
static validateJwtConfig(throwOnMissing = false, jwtOptions) {
|
|
30
|
+
if (jwtOptions?.secret != null && String(jwtOptions.secret).trim() !== '') {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.validateRequired(['JWT_SECRET'], throwOnMissing);
|
|
34
|
+
}
|
|
35
|
+
static validatePort(port, defaultPort) {
|
|
36
|
+
if (!port) {
|
|
37
|
+
return defaultPort;
|
|
38
|
+
}
|
|
39
|
+
const portNum = parseInt(port, 10);
|
|
40
|
+
if (isNaN(portNum) || portNum < 1 || portNum > 65535) {
|
|
41
|
+
this.logger.warn(`Invalid port number: ${port}. Using default: ${defaultPort}`);
|
|
42
|
+
return defaultPort;
|
|
43
|
+
}
|
|
44
|
+
return portNum;
|
|
45
|
+
}
|
|
46
|
+
static parseBoolean(value, defaultValue = false) {
|
|
47
|
+
if (!value) {
|
|
48
|
+
return defaultValue;
|
|
49
|
+
}
|
|
50
|
+
return value.toLowerCase() === 'true' || value === '1';
|
|
51
|
+
}
|
|
52
|
+
static parseArray(value) {
|
|
53
|
+
if (value == null || value === '')
|
|
54
|
+
return [];
|
|
55
|
+
return value
|
|
56
|
+
.split(',')
|
|
57
|
+
.map((s) => s.trim())
|
|
58
|
+
.filter(Boolean);
|
|
59
|
+
}
|
|
60
|
+
static parseNumber(value, defaultValue, min, max) {
|
|
61
|
+
if (!value) {
|
|
62
|
+
return defaultValue;
|
|
63
|
+
}
|
|
64
|
+
const num = parseInt(value, 10);
|
|
65
|
+
if (isNaN(num)) {
|
|
66
|
+
this.logger.warn(`Invalid number: ${value}. Using default: ${defaultValue}`);
|
|
67
|
+
return defaultValue;
|
|
68
|
+
}
|
|
69
|
+
if (min !== undefined && num < min) {
|
|
70
|
+
this.logger.warn(`Number ${num} is less than minimum ${min}. Using minimum value.`);
|
|
71
|
+
return min;
|
|
72
|
+
}
|
|
73
|
+
if (max !== undefined && num > max) {
|
|
74
|
+
this.logger.warn(`Number ${num} is greater than maximum ${max}. Using maximum value.`);
|
|
75
|
+
return max;
|
|
76
|
+
}
|
|
77
|
+
return num;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.ConfigValidator = ConfigValidator;
|
|
81
|
+
ConfigValidator.logger = new common_1.Logger(ConfigValidator.name);
|
|
82
|
+
//# sourceMappingURL=config.validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.validator.js","sourceRoot":"","sources":["../../src/utils/config.validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
export interface PaginationMeta {
|
|
3
|
+
total: number;
|
|
4
|
+
page: number;
|
|
5
|
+
limit: number;
|
|
6
|
+
totalPages: number;
|
|
7
|
+
hasNext: boolean;
|
|
8
|
+
hasPrev: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ResponseMeta {
|
|
11
|
+
message?: string | object;
|
|
12
|
+
pagination?: PaginationMeta;
|
|
13
|
+
}
|
|
14
|
+
export declare class CommonResponseDto {
|
|
15
|
+
code: number;
|
|
16
|
+
data: any[] | Record<string, any>;
|
|
17
|
+
meta?: ResponseMeta;
|
|
18
|
+
error: null | {
|
|
19
|
+
message: string | object;
|
|
20
|
+
};
|
|
21
|
+
constructor(data?: any[] | Record<string, any>, meta?: ResponseMeta);
|
|
22
|
+
}
|
|
23
|
+
export declare class CommonErrorDto {
|
|
24
|
+
code: number;
|
|
25
|
+
data: any[];
|
|
26
|
+
error: {
|
|
27
|
+
message: string;
|
|
28
|
+
} | null;
|
|
29
|
+
constructor(code: number, message: string, data?: any[]);
|
|
30
|
+
}
|
|
31
|
+
export interface AuditContext {
|
|
32
|
+
userId?: number;
|
|
33
|
+
userEmail?: string;
|
|
34
|
+
userRole?: string;
|
|
35
|
+
ipAddress?: string;
|
|
36
|
+
userAgent?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface PaginationParams {
|
|
39
|
+
page: number;
|
|
40
|
+
limit: number;
|
|
41
|
+
offset: number;
|
|
42
|
+
}
|
|
43
|
+
export interface SortParams {
|
|
44
|
+
field: string;
|
|
45
|
+
order: 'asc' | 'desc';
|
|
46
|
+
}
|
|
47
|
+
export declare class ControllerHelpers {
|
|
48
|
+
extractAuditContext(req: Request & {
|
|
49
|
+
user?: any;
|
|
50
|
+
}): AuditContext;
|
|
51
|
+
success<T>(data: T | T[], message?: string | object, pagination?: PaginationMeta): CommonResponseDto;
|
|
52
|
+
error(code: number, message: string | object, data?: any[]): CommonErrorDto;
|
|
53
|
+
private static normalizeErrorMessage;
|
|
54
|
+
parsePagination(query: any): PaginationParams;
|
|
55
|
+
parseSort(query: any, defaultField?: string): SortParams;
|
|
56
|
+
parseFilters(query: any): Record<string, any>;
|
|
57
|
+
checkService<T>(service: T | undefined | null, serviceName: string): T;
|
|
58
|
+
private getErrorCode;
|
|
59
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var ControllerHelpers_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ControllerHelpers = exports.CommonErrorDto = exports.CommonResponseDto = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
class CommonResponseDto {
|
|
13
|
+
constructor(data = [], meta) {
|
|
14
|
+
this.code = 0;
|
|
15
|
+
this.data = data;
|
|
16
|
+
this.meta = meta;
|
|
17
|
+
this.error = null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.CommonResponseDto = CommonResponseDto;
|
|
21
|
+
class CommonErrorDto {
|
|
22
|
+
constructor(code, message, data = []) {
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.data = data;
|
|
25
|
+
this.error = { message };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.CommonErrorDto = CommonErrorDto;
|
|
29
|
+
let ControllerHelpers = ControllerHelpers_1 = class ControllerHelpers {
|
|
30
|
+
extractAuditContext(req) {
|
|
31
|
+
const user = req.user || {};
|
|
32
|
+
return {
|
|
33
|
+
userId: user.id || user.sub,
|
|
34
|
+
userEmail: user.email,
|
|
35
|
+
userRole: user.role || user.adminRole,
|
|
36
|
+
ipAddress: req.ip ||
|
|
37
|
+
req.headers['x-forwarded-for'] ||
|
|
38
|
+
req.connection?.remoteAddress,
|
|
39
|
+
userAgent: req.headers['user-agent'],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
success(data, message, pagination) {
|
|
43
|
+
const meta = (message || pagination) ? {
|
|
44
|
+
...(message && { message }),
|
|
45
|
+
...(pagination && { pagination }),
|
|
46
|
+
} : undefined;
|
|
47
|
+
const normalized = Array.isArray(data) ? data : [data];
|
|
48
|
+
const responseData = normalized.length <= 1 ? (normalized[0] ?? {}) : normalized;
|
|
49
|
+
return new CommonResponseDto(responseData, meta);
|
|
50
|
+
}
|
|
51
|
+
error(code, message, data = []) {
|
|
52
|
+
const errorCode = code === 0 ? 500 : code;
|
|
53
|
+
const messageStr = ControllerHelpers_1.normalizeErrorMessage(message);
|
|
54
|
+
return new CommonErrorDto(errorCode, messageStr, data);
|
|
55
|
+
}
|
|
56
|
+
static normalizeErrorMessage(message) {
|
|
57
|
+
if (typeof message === 'string')
|
|
58
|
+
return message;
|
|
59
|
+
if (message && typeof message === 'object' && 'message' in message) {
|
|
60
|
+
const m = message.message;
|
|
61
|
+
if (typeof m === 'string')
|
|
62
|
+
return m;
|
|
63
|
+
if (Array.isArray(m) && m.length > 0 && typeof m[0] === 'string')
|
|
64
|
+
return m[0];
|
|
65
|
+
}
|
|
66
|
+
return typeof message === 'object' ? JSON.stringify(message) : String(message);
|
|
67
|
+
}
|
|
68
|
+
parsePagination(query) {
|
|
69
|
+
const page = Math.max(1, parseInt(query.page || '1', 10));
|
|
70
|
+
const limit = Math.min(100, Math.max(1, parseInt(query.limit || '10', 10)));
|
|
71
|
+
return {
|
|
72
|
+
page,
|
|
73
|
+
limit,
|
|
74
|
+
offset: (page - 1) * limit,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
parseSort(query, defaultField = 'id') {
|
|
78
|
+
const sort = query.sort || defaultField;
|
|
79
|
+
const isDesc = sort.startsWith('-');
|
|
80
|
+
const field = isDesc ? sort.substring(1) : sort;
|
|
81
|
+
const order = isDesc ? 'desc' : 'asc';
|
|
82
|
+
return { field, order };
|
|
83
|
+
}
|
|
84
|
+
parseFilters(query) {
|
|
85
|
+
const filters = {};
|
|
86
|
+
Object.keys(query).forEach(key => {
|
|
87
|
+
if (!['page', 'limit', 'sort', 'offset'].includes(key)) {
|
|
88
|
+
filters[key] = query[key];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return filters;
|
|
92
|
+
}
|
|
93
|
+
checkService(service, serviceName) {
|
|
94
|
+
if (!service) {
|
|
95
|
+
throw new Error(`${serviceName} is not available`);
|
|
96
|
+
}
|
|
97
|
+
return service;
|
|
98
|
+
}
|
|
99
|
+
getErrorCode(statusCode) {
|
|
100
|
+
const codes = {
|
|
101
|
+
400: 'BAD_REQUEST',
|
|
102
|
+
401: 'UNAUTHORIZED',
|
|
103
|
+
403: 'FORBIDDEN',
|
|
104
|
+
404: 'NOT_FOUND',
|
|
105
|
+
409: 'CONFLICT',
|
|
106
|
+
422: 'UNPROCESSABLE_ENTITY',
|
|
107
|
+
500: 'INTERNAL_SERVER_ERROR',
|
|
108
|
+
503: 'SERVICE_UNAVAILABLE',
|
|
109
|
+
};
|
|
110
|
+
return codes[statusCode] || 'UNKNOWN_ERROR';
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
exports.ControllerHelpers = ControllerHelpers;
|
|
114
|
+
exports.ControllerHelpers = ControllerHelpers = ControllerHelpers_1 = __decorate([
|
|
115
|
+
(0, common_1.Injectable)()
|
|
116
|
+
], ControllerHelpers);
|
|
117
|
+
//# sourceMappingURL=controller.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.helpers.js","sourceRoot":"","sources":["../../src/utils/controller.helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const PBKDF2_DEFAULT_ITERATIONS = 100000;
|
|
2
|
+
export declare const PBKDF2_DEFAULT_KEYLEN = 64;
|
|
3
|
+
export declare const PBKDF2_DEFAULT_DIGEST = "sha512";
|
|
4
|
+
export declare const PBKDF2_SALT_BYTES = 32;
|
|
5
|
+
export interface Pbkdf2Options {
|
|
6
|
+
iterations?: number;
|
|
7
|
+
keylen?: number;
|
|
8
|
+
digest?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function pbkdf2HashPassword(password: string, salt?: Buffer | string, options?: Pbkdf2Options): string;
|
|
11
|
+
export declare function pbkdf2VerifyPassword(plainPassword: string, stored: string, options?: Pbkdf2Options): boolean;
|
|
12
|
+
export declare function deriveKeySha256(secret: string): Buffer;
|