Skip to content

Configuration

Environment-based configuration with @galaxy-stack/orbit-config.

Setup

typescript
import { Module } from '@galaxy-stack/orbit-common';
import { ConfigModule } from '@galaxy-stack/orbit-config';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
      isGlobal: true,
    }),
  ],
})
export class AppModule {}

Using ConfigService

typescript
import { Injectable } from '@galaxy-stack/orbit-common';
import { ConfigService } from '@galaxy-stack/orbit-config';

@Injectable()
export class DatabaseService {
  constructor(private config: ConfigService) {}

  connect() {
    const url = this.config.get<string>('DATABASE_URL');
    const poolSize = this.config.get<number>('DB_POOL_SIZE', 10);
  }
}

Typed Configuration

typescript
import { z } from 'zod';

const configSchema = z.object({
  NODE_ENV: z.enum(['development', 'production', 'test']),
  PORT: z.coerce.number().default(3000),
  DATABASE_URL: z.string().url(),
  JWT_SECRET: z.string().min(32),
  REDIS_URL: z.string().optional(),
});

type Config = z.infer<typeof configSchema>;

@Module({
  imports: [
    ConfigModule.forRoot({
      validate: (config) => configSchema.parse(config),
    }),
  ],
})
export class AppModule {}

Configuration Namespaces

typescript
// config/database.config.ts
export default () => ({
  database: {
    host: process.env.DB_HOST || 'localhost',
    port: parseInt(process.env.DB_PORT, 10) || 5432,
    name: process.env.DB_NAME,
  },
});

@Module({
  imports: [
    ConfigModule.forRoot({
      load: [databaseConfig, redisConfig, authConfig],
    }),
  ],
})
export class AppModule {}

// Usage
const dbHost = this.config.get<string>('database.host');

Environment Expansion

bash
# .env
BASE_URL=https://api.example.com
API_URL=${BASE_URL}/v1
CALLBACK_URL=${BASE_URL}/auth/callback

Released under the MIT License.