@yobytechautomation/config-lib 0.1.3

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.
@@ -0,0 +1,54 @@
1
+ import { TypeOrmModuleOptions } from '@nestjs/typeorm';
2
+ import type { BaseConfigService } from './base-config.service';
3
+ import type { ProcessEnv } from './types';
4
+ export declare abstract class AbstractConfigService implements BaseConfigService {
5
+ protected readonly env: ProcessEnv;
6
+ constructor();
7
+ getDatabaseConfig(): TypeOrmModuleOptions;
8
+ abstract getPort(): number;
9
+ abstract getMode(): string;
10
+ /**
11
+ * Per-service hooks for DB config
12
+ */
13
+ protected abstract getDatabaseEntities(): any[];
14
+ protected getDatabaseMigrations(): string[];
15
+ protected getDatabaseSynchronize(): boolean;
16
+ protected getDatabaseLogging(): boolean;
17
+ getConsulConfig(): {
18
+ host: string;
19
+ port: number;
20
+ secure: boolean;
21
+ serviceName: string;
22
+ serviceHost: string;
23
+ servicePort: number;
24
+ };
25
+ getRedisConfig(): {
26
+ host: string;
27
+ port: number;
28
+ password: string | undefined;
29
+ username: string | undefined;
30
+ db: number;
31
+ };
32
+ getJWTConfig(): {
33
+ accessTokenSecret: string;
34
+ accessTokenExpIn: number;
35
+ refreshTokenSecret: string;
36
+ refreshTokenExpIn: number;
37
+ };
38
+ getJUtilConfig(): {
39
+ accessLogMaxAgeDays: number;
40
+ accessLogMaxSizeMb: number;
41
+ authServiceUrl: string;
42
+ };
43
+ getMailConfig(): {
44
+ mailPort: number;
45
+ mailSecure: string;
46
+ mailHost: string;
47
+ mailUser: string;
48
+ mailPass: string;
49
+ mailFrom: string;
50
+ mailDir: string;
51
+ mailOrigin: string;
52
+ };
53
+ getKAFKAConfig(): any;
54
+ }
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractConfigService = void 0;
4
+ const env_utils_1 = require("./env-utils");
5
+ class AbstractConfigService {
6
+ constructor() {
7
+ this.env = (0, env_utils_1.loadEnv)();
8
+ }
9
+ getDatabaseConfig() {
10
+ const sslEnabled = (0, env_utils_1.getEnvValue)(this.env, 'POSTGRES_SSL_ENABLED', false) === 'true';
11
+ return {
12
+ type: 'postgres',
13
+ host: (0, env_utils_1.getEnvValue)(this.env, 'POSTGRES_HOST'),
14
+ port: parseInt((0, env_utils_1.getEnvValue)(this.env, 'POSTGRES_PORT', false) || '5432', 10),
15
+ username: (0, env_utils_1.getEnvValue)(this.env, 'POSTGRES_USER'),
16
+ password: (0, env_utils_1.getEnvValue)(this.env, 'POSTGRES_PASSWORD'),
17
+ database: (0, env_utils_1.getEnvValue)(this.env, 'POSTGRES_DATABASE'),
18
+ entities: this.getDatabaseEntities(),
19
+ migrations: this.getDatabaseMigrations(),
20
+ synchronize: this.getDatabaseSynchronize(),
21
+ logging: this.getDatabaseLogging(),
22
+ ssl: sslEnabled ? { rejectUnauthorized: false } : undefined,
23
+ };
24
+ }
25
+ getDatabaseMigrations() {
26
+ return [__dirname + '/../migration/*{.ts,.js}'];
27
+ }
28
+ getDatabaseSynchronize() {
29
+ return false;
30
+ }
31
+ getDatabaseLogging() {
32
+ return true;
33
+ }
34
+ getConsulConfig() {
35
+ return {
36
+ host: (0, env_utils_1.getEnvValue)(this.env, 'CONSUL_HOST', false) || '127.0.0.1',
37
+ port: parseInt((0, env_utils_1.getEnvValue)(this.env, 'CONSUL_PORT', false) || '8500', 10),
38
+ secure: (0, env_utils_1.getEnvValue)(this.env, 'CONSUL_SECURE', false) === 'true',
39
+ serviceName: (0, env_utils_1.getEnvValue)(this.env, 'SERVICE_NAME', false) || 'sdc-user-service',
40
+ serviceHost: (0, env_utils_1.getEnvValue)(this.env, 'SERVICE_HOST', false) || '127.0.0.1',
41
+ servicePort: parseInt((0, env_utils_1.getEnvValue)(this.env, 'SERVICE_PORT', false) || '3000', 10),
42
+ };
43
+ }
44
+ getRedisConfig() {
45
+ return {
46
+ host: (0, env_utils_1.getEnvValue)(this.env, 'REDIS_HOST', false) || 'localhost',
47
+ port: parseInt((0, env_utils_1.getEnvValue)(this.env, 'REDIS_PORT') || '6379', 10),
48
+ password: (0, env_utils_1.getEnvValue)(this.env, 'REDIS_PASSWORD', false) || undefined,
49
+ username: (0, env_utils_1.getEnvValue)(this.env, 'REDIS_USERNAME', false) || undefined,
50
+ db: parseInt((0, env_utils_1.getEnvValue)(this.env, 'REDIS_DB', false) || '0'),
51
+ };
52
+ }
53
+ getJWTConfig() {
54
+ return {
55
+ accessTokenSecret: (0, env_utils_1.getEnvValue)(this.env, 'JWT_ACCESS_TOKEN_SECRET', false) || '',
56
+ accessTokenExpIn: parseInt((0, env_utils_1.getEnvValue)(this.env, 'JWT_ACCESS_TOKEN_EXP', false) || '3600', 10),
57
+ refreshTokenSecret: (0, env_utils_1.getEnvValue)(this.env, 'JWT_REFRESH_TOKEN_SECRET', false) || '',
58
+ refreshTokenExpIn: parseInt((0, env_utils_1.getEnvValue)(this.env, 'JWT_REFRESH_TOKEN_EXP', false) || '86400', 10),
59
+ };
60
+ }
61
+ getJUtilConfig() {
62
+ return {
63
+ accessLogMaxAgeDays: parseInt((0, env_utils_1.getEnvValue)(this.env, 'ACCESS_LOG_MAX_AGE_DAYS', false) || '7', 10),
64
+ accessLogMaxSizeMb: parseInt((0, env_utils_1.getEnvValue)(this.env, 'ACCESS_LOG_MAX_SIZE_MB', false) || '10', 10),
65
+ authServiceUrl: (0, env_utils_1.getEnvValue)(this.env, 'AUTH_SERVICE_URL', false) ||
66
+ 'http://localhost:3000',
67
+ };
68
+ }
69
+ getMailConfig() {
70
+ return {
71
+ mailPort: parseInt((0, env_utils_1.getEnvValue)(this.env, 'MAIL_PORT', false) || '0', 10),
72
+ mailSecure: (0, env_utils_1.getEnvValue)(this.env, 'MAIL_SECURE', false) || '',
73
+ mailHost: (0, env_utils_1.getEnvValue)(this.env, 'MAIL_HOST', false) || '',
74
+ mailUser: (0, env_utils_1.getEnvValue)(this.env, 'MAIL_USER', false) || '',
75
+ mailPass: (0, env_utils_1.getEnvValue)(this.env, 'MAIL_PASS', false) || '',
76
+ mailFrom: (0, env_utils_1.getEnvValue)(this.env, 'MAIL_FROM', false) || '',
77
+ mailDir: (0, env_utils_1.getEnvValue)(this.env, 'MAIL_DIR', false) || '',
78
+ mailOrigin: (0, env_utils_1.getEnvValue)(this.env, 'MAIL_ORIGIN', false) || '',
79
+ };
80
+ }
81
+ getKAFKAConfig() {
82
+ const config = {
83
+ brokers: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_BROKERS', false)
84
+ ? (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_BROKERS', false)
85
+ .split(',')
86
+ .map((b) => b.trim())
87
+ : ['202.137.208.36:9095'],
88
+ clientId: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_CLIENT_ID', false) || 'sdc-dev-client',
89
+ groupId: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_GROUP_ID', false) || 'sdc-dev-group',
90
+ topicName: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_TOPIC_NAME', false) || 'sdc-dev-topic',
91
+ };
92
+ const sslEnabled = (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SSL_ENABLED', false) === 'true';
93
+ if (sslEnabled) {
94
+ const fs = require('fs');
95
+ config.ssl = {
96
+ rejectUnauthorized: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SSL_REJECT_UNAUTHORIZED', false) !==
97
+ 'false',
98
+ };
99
+ const caPath = (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SSL_CA_PATH', false);
100
+ if (caPath) {
101
+ config.ssl.ca = fs.readFileSync(caPath, 'utf8');
102
+ }
103
+ const certPath = (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SSL_CERT_PATH', false);
104
+ if (certPath) {
105
+ config.ssl.cert = fs.readFileSync(certPath, 'utf8');
106
+ }
107
+ const keyPath = (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SSL_KEY_PATH', false);
108
+ if (keyPath) {
109
+ config.ssl.key = fs.readFileSync(keyPath, 'utf8');
110
+ }
111
+ }
112
+ const saslEnabled = (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SASL_ENABLED', false) === 'true';
113
+ if (saslEnabled) {
114
+ config.sasl = {
115
+ mechanism: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SASL_MECHANISM', false) || 'plain',
116
+ username: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SASL_USERNAME', false) || '',
117
+ password: (0, env_utils_1.getEnvValue)(this.env, 'KAFKA_SASL_PASSWORD', false) || '',
118
+ };
119
+ }
120
+ return config;
121
+ }
122
+ }
123
+ exports.AbstractConfigService = AbstractConfigService;
@@ -0,0 +1,60 @@
1
+ import { TypeOrmModuleOptions } from '@nestjs/typeorm';
2
+ export interface BaseConfigService {
3
+ getDatabaseConfig(): TypeOrmModuleOptions;
4
+ getPort(): number;
5
+ getMode(): string;
6
+ getConsulConfig(): {
7
+ host: string;
8
+ port: number;
9
+ secure: boolean;
10
+ serviceName: string;
11
+ serviceHost: string;
12
+ servicePort: number;
13
+ };
14
+ getRedisConfig(): {
15
+ host: string;
16
+ port: number;
17
+ password?: string;
18
+ username?: string;
19
+ db?: number;
20
+ };
21
+ getJWTConfig(): {
22
+ accessTokenSecret: string;
23
+ accessTokenExpIn: number;
24
+ refreshTokenSecret: string;
25
+ refreshTokenExpIn: number;
26
+ };
27
+ getJUtilConfig(): {
28
+ accessLogMaxAgeDays: number;
29
+ accessLogMaxSizeMb: number;
30
+ authServiceUrl: string;
31
+ };
32
+ getMailConfig(): {
33
+ mailPort: number;
34
+ mailSecure: string;
35
+ mailHost: string;
36
+ mailUser: string;
37
+ mailPass: string;
38
+ mailFrom: string;
39
+ mailDir: string;
40
+ mailOrigin: string;
41
+ };
42
+ getKAFKAConfig(): {
43
+ clientId: string;
44
+ brokers: string[];
45
+ groupId: string;
46
+ topicName: string;
47
+ ssl?: {
48
+ rejectUnauthorized: boolean;
49
+ ca?: string;
50
+ cert?: string;
51
+ key?: string;
52
+ };
53
+ sasl?: {
54
+ mechanism: string;
55
+ username: string;
56
+ password: string;
57
+ };
58
+ };
59
+ }
60
+ export declare const BASE_CONFIG_SERVICE: unique symbol;
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BASE_CONFIG_SERVICE = void 0;
4
+ exports.BASE_CONFIG_SERVICE = Symbol('BASE_CONFIG_SERVICE');
@@ -0,0 +1,9 @@
1
+ import type { ProcessEnv } from './types';
2
+ export type Mode = 'local' | 'dev' | 'uat' | 'prod' | string;
3
+ export declare function resolveMode(defaultMode?: Mode): Mode;
4
+ export declare function loadEnv(mode?: Mode): ProcessEnv;
5
+ export declare function getEnvValue(env: ProcessEnv, key: string, throwOnMissing?: boolean): string;
6
+ export declare function getPostgresSSLConfig(env: ProcessEnv, sslEnabledKey?: string): {
7
+ ca: string;
8
+ rejectUnauthorized: boolean;
9
+ } | undefined;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.resolveMode = resolveMode;
37
+ exports.loadEnv = loadEnv;
38
+ exports.getEnvValue = getEnvValue;
39
+ exports.getPostgresSSLConfig = getPostgresSSLConfig;
40
+ const dotenv = __importStar(require("dotenv"));
41
+ const path = __importStar(require("node:path"));
42
+ const fs = __importStar(require("node:fs"));
43
+ function resolveMode(defaultMode = 'dev') {
44
+ const mode = process.env.MODE || process.env.NODE_ENV || defaultMode;
45
+ return mode.toLowerCase();
46
+ }
47
+ function loadEnv(mode = resolveMode()) {
48
+ const envFile = path.resolve(process.cwd(), `.env.${mode.toLowerCase()}`);
49
+ dotenv.config({ path: envFile });
50
+ return process.env;
51
+ }
52
+ function getEnvValue(env, key, throwOnMissing = true) {
53
+ const value = env[key];
54
+ if (!value && throwOnMissing) {
55
+ throw new Error(`Missing env var: ${key}`);
56
+ }
57
+ return value !== null && value !== void 0 ? value : '';
58
+ }
59
+ function getPostgresSSLConfig(env, sslEnabledKey = 'POSTGRES_SSL_ENABLED') {
60
+ var _a;
61
+ const sslEnabled = ((_a = getEnvValue(env, sslEnabledKey, false)) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'true';
62
+ return sslEnabled
63
+ ? {
64
+ ca: fs
65
+ .readFileSync(getEnvValue(env, 'POSTGRES_SSL_CA_PATH'))
66
+ .toString(),
67
+ rejectUnauthorized: true,
68
+ }
69
+ : undefined;
70
+ }
@@ -0,0 +1,4 @@
1
+ export * from './env-utils';
2
+ export * from './base-config.service';
3
+ export * from './abstract-config.service';
4
+ export * from './nest-config-provider';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./env-utils"), exports);
18
+ __exportStar(require("./base-config.service"), exports);
19
+ __exportStar(require("./abstract-config.service"), exports);
20
+ __exportStar(require("./nest-config-provider"), exports);
@@ -0,0 +1,14 @@
1
+ import { Provider } from '@nestjs/common';
2
+ import { BaseConfigService } from './base-config.service';
3
+ import { Mode } from './env-utils';
4
+ export type ConfigServiceFactory<T extends BaseConfigService> = () => T;
5
+ export interface ConfigProviderOptions<T extends BaseConfigService> {
6
+ modeFactories: Partial<Record<Mode, ConfigServiceFactory<T>>> & {
7
+ local?: ConfigServiceFactory<T>;
8
+ dev?: ConfigServiceFactory<T>;
9
+ uat?: ConfigServiceFactory<T>;
10
+ prod?: ConfigServiceFactory<T>;
11
+ };
12
+ defaultMode?: Mode;
13
+ }
14
+ export declare function createBaseConfigProvider<T extends BaseConfigService>(options: ConfigProviderOptions<T>): Provider<T>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBaseConfigProvider = createBaseConfigProvider;
4
+ const base_config_service_1 = require("./base-config.service");
5
+ const env_utils_1 = require("./env-utils");
6
+ function createBaseConfigProvider(options) {
7
+ const mode = (0, env_utils_1.resolveMode)(options.defaultMode);
8
+ return {
9
+ provide: base_config_service_1.BASE_CONFIG_SERVICE,
10
+ useFactory: () => {
11
+ var _a, _b;
12
+ const factory = (_b = (_a = options.modeFactories[mode]) !== null && _a !== void 0 ? _a : options.modeFactories[mode.toLowerCase()]) !== null && _b !== void 0 ? _b : options.modeFactories[(0, env_utils_1.resolveMode)(options.defaultMode)];
13
+ if (!factory) {
14
+ throw new Error(`No BaseConfigService factory configured for mode: ${mode}`);
15
+ }
16
+ return factory();
17
+ },
18
+ };
19
+ }
@@ -0,0 +1 @@
1
+ export type ProcessEnv = Record<string, string | undefined>;
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@yobytechautomation/config-lib",
3
+ "version": "0.1.3",
4
+ "description": "Shared multi-environment configuration helpers for SDC NestJS services",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc -p tsconfig.json",
9
+ "clean": "rimraf dist",
10
+ "prepublishOnly": "npm run clean && npm run build"
11
+ },
12
+ "license": "MIT",
13
+ "keywords": [
14
+ "nest",
15
+ "nestjs",
16
+ "config",
17
+ "env",
18
+ "sdc"
19
+ ],
20
+ "peerDependencies": {
21
+ "@nestjs/common": "^11.0.0 || ^10.0.0 || ^9.0.0",
22
+ "@nestjs/typeorm": "^11.0.0 || ^10.0.0 || ^9.0.0",
23
+ "dotenv": "^16.0.0",
24
+ "typeorm": "^0.3.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^24.10.1",
28
+ "rimraf": "^6.0.0",
29
+ "typescript": "^5.0.0"
30
+ }
31
+ }