1.0.0 • Published 5 years ago

injectable-config v1.0.0

Weekly downloads
2
License
ISC
Repository
github
Last release
5 years ago

Injectable Config

Inyectar una configuración y otra dependiendo de las variables de entorno. Por defecto, si se usa en NodeJS, es valor se obtendra de process.env.NODE_ENV, pero tambien se puede pasar por parametro la variable que contiene el nombre del entorno.

Para establecer la variable con la que se determina el entorno, se hace pasando el parametro a la anotacion @Configurable

@Configurable() // se tomara el valor de process.env.NODE_ENV
export class ConfigStartUp {}

o 

@Configurable(AppSethings.env) // se tomara el valor que contenga AppSethings.env en ese momento
export class ConfigStartUp {}

Para definir la configuración de cada entorno, se hace con la anotacion @Config y recibe por parametro el string con el nombre del entorno que debe coincidir con los valores que puede tomar process.env.NODE_ENV o la variable que se haya pasado por parametro en la anotacion @Configurable.
En el siguiente ejemplo se asume que process.env.NODE_ENV podria tener los valores dev o st.(lo ideal seria no pasar un string si no que los entornos esten definidos de una enumeracion, pero por ejemplo practico se dejo asi).

@Configurable()
export class ConfigStartUp {
    
    @Config("dev")
    public configDev() {
      return {
        a:"2"
      }
    }
    
    @Config("st")
    public configst() {
      return {
        a:"3"
      }
    }
    
    @Config("prod")
    ...
}

Para definir una configuracion compartida por todos los entornos se hace con la anotacion @SharedConfig.
El objeto que retorne la funcion correspondiente al entorno, sera fucionado con el objeto que retorne la funcion con la anotacion @SharedConfig. Suponiendo que NODE_ENV tiene como valor dev el objeto configuracion de resultado, sera:

{
    "host":"http...",
    "port":"123",
    "shared":"info",
    "any":"value"
}
@Configurable()
export class ConfigStartUp {
    
    @Config("dev")
    public configDev() {
      return {
        host:"http...",
        port:"123"
      }
    }
    
    @SharedConfig
    public configGeneral() {
      return {
        shared:"info",
        any:"value"
      }
    }
}

En accion!

export class AnyClass {
    
  @InjectConfig
  private readonly config
  
  constructor(){
    console.log(this.config)
  }    
}

Una ultima cosa, para que todo funcione, se debe instanciar la clase con la anotacion @Configurable en el boostrap de la aplicacion

export class MainClass {
  
  constructor(){
    new ConfigStartUp() //eso es todo! 
  }    
  ...
}

Eso es todo. ahora un ejemplo completo.

Ejemplo completo

Asumiendo que NODE_ENV vale st

Config.ts

enum Environment {
  DEV = "dev",
  ST = "st",
  PROD = "prod"
}

export interface IConfig {
  url: string 
  port: number
}

@Configurable()
export class ConfigStartUp {

  @SharedConfig
  public share(): Partial<IConfig>{
    return {
      port:8080
    }
  }

  @Config(Environment.DEV)
  public configDev(): Partial<IConfig> {
    return {
      url:"host-dev"
    }
  }

  @Config(Environment.ST)
  public configst(): Partial<IConfig> {
    return {
      url:"host-st"
    }
  }
}

app.component.ts

// Asumiendo que por esta clase inicia nuestra aplicacion, instanciamos la clase ConfigStartUp

export class AppComponent { 

  @InjectConfig
  public readonly config: IConfig

  constructor(){
    new ConfigStartUp()
    console.log(this.config) // { url:"host-dev" , port: 8080 }
  }
  ...
}