Skip to content

JS library and a CLI tool to convert nginx configuration from YAML or JSON to nginx config format

License

Notifications You must be signed in to change notification settings

jirutka/nginx-jsconf

Repository files navigation

nginx-jsconf

Build Status npm Version

This project provides a JavaScript library and a CLI tool to convert nginx configuration from YAML or JSON format to nginx configuration format, as well as functions to traverse and transform the configuration.

See jirutka/nginx-json-schema for description of the YAML/JSON format.

Install CLI

Using npm

npm install --global nginx-jsconf

Download from Releases

nginx-jsconf is also provided as a single JavaScript file with bundled dependencies, requiring only Node.js (version 18 or later) on the system.

curl -LO  https://github.com/jirutka/nginx-jsconf/releases/download/v0.1.2/nginx-jsconf.cjs
curl -fsSL https://github.com/jirutka/nginx-jsconf/releases/download/v0.1.2/checksums.txt | sha256sum -c --ignore-missing
install -D -m755 nginx-jsconf.cjs /usr/local/bin/nginx-jsconf

Examples

CLI: Convert configuration from YAML to nginx format

nginx-jsconf --context main --out nginx.conf nginx.yml

JavaScript: Convert JS(ON) object to nginx format

import { stringify } from 'nginx-jsconf'

const config = {
  server: [
    {
      listen: '443 http2 ssl',
      server_name: 'example.org',
      allow: [
        '127.0.0.1/8',
        '10.12.0.0/16',
      ],
      deny: 'all',
      location: {
        '/': {
          proxy_pass: 'http://1.2.3.4',
          proxy_set_header: {
            Host: '$http_host',
            'X-Forwarded-For': '$proxy_add_x_forwarded_for',
            'X-Forwarded-Host': '$host',
          },
          proxy_buffering: false,
        },
        '~ \\.(?:css|js)$': {
          add_header: {
            'Cache-Control': '"max-age=31556952, public"',
          }
        }
      }
    }
  ]
}

console.log(stringify('http', config, { indentation: 4 }))

JavaScript: Transform configuration

import { transform } from 'nginx-jsconf'

const addProxyHeadersTransformer = {
  name: ['server', 'location', 'if'],
  block: true,
  if: context => 'proxy_pass' in context,
  transform: context => ({
    ...context,
    proxy_set_header: {
      ...context.proxy_set_header,
      'X-Forwarded-For': '$proxy_add_x_forwarded_for',
      'X-Forwarded-Host': '$host',
    }
  })
}

const adjustIncludePathTransformer = {
  name: 'include',
  context: ['server', 'location'],
  block: false,
  transform: value => {
    const values = Array.isArray(value) ? value : [value]
    return values.map(name => `/etc/nginx/incl/${name}.conf`)
  }
}

const newConfig = transform('main', config, [
  addProxyHeadersTransformer,
  adjustIncludePathTransformer,
])

License

This project is licensed under MIT License.

About

JS library and a CLI tool to convert nginx configuration from YAML or JSON to nginx config format

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project