gerardmrk / gpcl

YAML config loader for lazy people

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

npm Dependency Status Coverage Status Build Status MIT Licence

gpcl

A generic project configuration loader with a simple path-finder.

It searches for your config file and loads it.

No more someConfigLoader(resolve(__dirname, '..', '..', '..', 'config', 'main.yml')) !

Installation:

$ yarn add gpcl

Usage:

  1. Add a YAML file to your project directory (see here for default supported locations).
  2. Call loadConfigSync() in your script to access your config object.

Example:

src/backend/web/app/environments/uat/setup.js

import { loadConfigSync } from "gpcl";

const config = loadConfigSync();
// ...

.config/config.yml

IAC:
  Region: !env AWS_REGION
  Stage: !env APP_ENV

  Templates:
    Local: !path lib/blueprints
    BucketKey: infrastructure/blueprints

Development:
  ServerAddr: '0.0.0.0:4200'
  Hateoas: !path .meta/dev/docker_endpoints.json

Output:

{
  "IAC": {
    "Region": "ap-southeast-2",
    "Stage": "staging",
    "Templates": {
      "Local": "/Users/x/DevProjects/xo/lib/blueprints",
      "BucketKey": "infrastructure/blueprints"
    }
  },
  "Development": {
    "ServerAddr": "0.0.0.0:4200",
    "Hateoas": "/Users/x/DevProjects/xo/.meta/dev/docker_endpoints.json"
  }
}

API:

loadConfigSync(configPath?: string, rootDir?: string)

rootDir:

  • absolute path of your root project directory. If not specified, it will walk up the directory tree to find it. Indicators are:
    • package.json
    • node_modules

configPath:

  • absolute path of your config file. If not specified, it will look for your config file in this order (first in <rootDir>, then in <rootDir>/config and vice versa):

    • <rootDir[/.config, /config]>/config.yml
    • <rootDir[/.config, /config]>/project.yml
    • <rootDir[/.config, /config]>/settings.yml

Both params are optional. If you'd like to specify rootDir without specifying configPath, just pass in undefined as the first parameter.

Note: an error will be thrown if both values are not specified AND cannot be inferred.

Supported YAML Types:

Supports anything that is parsable by js-yaml, plus 2 additional custom types:

  1. !env type
    • for referencing an environment variable
    • I.E. process.env[!env]
    • E.G. !env NODE_ENV => 'production'
  2. !path type
    • for referencing a path relative from the root directory
    • I.E. <rootDir>/<!path>
    • E.G. !path src/app.js => /Users/xo/web/src/app.js

Type Definitions:

This comes bundled with its own type definitions for TypeScript, so you'll get auto-complete and hints if you're using the Visual Studio Code IDE.

Todos:

  • complete all tests
  • bump npm package to v1
  • write and test for Go
  • generate godocs
  • set go package version

Remarks

I created this after repetitively copy-pasting the same code across various private side-projects for loading configuration, and it became tedious to use path.resolve(__dirname, '..', '..', '..' /* etc */) on the same config file when calling it from multiple places in the codebase.

If this does not fit your needs, feel free to fork or contribute!

About

YAML config loader for lazy people

License:MIT License


Languages

Language:JavaScript 54.0%Language:TypeScript 46.0%