@heyputer/multiline-ini v1.0.1
Multi-Line INI Parser
multiline-ini is a fast INI parser meant to support multiline strings and other syntax. It uses a state-machine parser which makes it possible to support features missing from other ini parsers that use the naive "split-by-line then regex match" approach.
The syntax of INI files is not standardized, so our approach is to treat systemd's config parser as a reference implementation.
Installation
npm install --save @heyputer/multiline-iniUsage
// Require the module
const ini = require('@heyputer/multiline-ini');
// Example: systemd-like input
const result = ini.parse(`
[Service]
Type=simple
ExecStart=/bin/sh -c 'exec /usr/bin/my-exe \
>>/var/log/my-app/out.log \
2>>/var/log/my-app/err.log'
Environment=NODE_ENV=production-linux
`);
console.log(JSON.stringify(result, null, '  ')); /*
{
  Service: {
    Type: 'simple',
    ExecStart: "/bin/sh -c 'exec /usr/bin/my-exe >>/var/log/my-app/out.log 2>>/var/log/my-app/err.log'",
    Environment: 'NODE_ENV=production-linux'
  }
}
*/Why multiline-ini?
This INI parser was created out of a need to parse systemd unit files. INI is not a standardized file format, but there is precedent for escaping line feeds in INI values. This is supported by systemd.
The following INI parsers were tested and do not support multi-line values:
| module name | problem | is regex | complexity | 
|---|---|---|---|
| ini | subsequent lines become keys with a value of true | yes | very over-engineered | 
| ini-parser | subsequent lines ignored | yes | under 40 lines | 
| iniparser | subsequent lines ignored | yes | under 70 lines | 
| node-ini | this module contains a typo and doesn't even work | yes | moderately over-engineered | 
These parsers are all implemented using regex, and are designed to process each
line individually searching for a [section] or key=value pair.
This makes it more challenging to add multiline support to an existing parser.
Contributing
In-Scope
The following items are in scope and contributions in these areas are welcome.
- support for all INI syntax supported by systemd with zero configuration- i.e. we use systemd as a reference implementation for an INI standard
 
- plugin support for handling other INI conventions
License
Distributed under the MIT License. See ./LICENSE for more information.