npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

unitfile-parser

v1.0.4

Published

Parse systemd unit files

Downloads

10

Readme

unitfile-parser

This is a small utility library to parse systemd unitfiles to and from JavaScript data structures. Three formats are available:

  1. string, which is the representation inside of a unit file,
  2. ast, which is a JS object representation of the parser AST, including comments,
  3. data, which is a normalized representation of the data, useful to do general computing. It has the following format:
{
  title: String,
  settings: {
    [key:String]: String|String[],
  }
}[]

Conversions are available in all directions between these formats, with the only external dependency being chevrotain.

This package does not know or check whether the logic of a unit file is correct (e.g. are you using the correct names for options, etc.), it only knows what the syntax is supposed to be.

Usage

For most usecases, you'll only need two functions: stringToData and dataToString:

import { readFile, writeFile } from 'fs/promises';
import { stringToData, dataToString } from 'unitfile-parser';

(async () => {
  const unitFilePath = '~/.config/systemd/user/xsettingsd.service';

  // Read the current file from disk
  const fileContents = await readFile(unitFilePath);

  // Transform it to a useful data structure
  const unit = stringToData(fileContents);

  // Change it around
  const transformedUnit = doSomeTransformation(unit);

  // Transform the changed unit back to a string
  const newFileContents = dataToString(transformedUnit);

  // Write the changed file back to disk
  await writeFile(unitFilePath, newFileContents);
})();

API

This package is written for esm5 and above, providing only JS modules (.mjs files) to work with.

stringToAst(input: String): Object

Convert a unit file string to a JS AST.

import { readFile } from 'fs/promises';
import { stringToAst } from 'unitfile-parser';

readFile('~/.config/systemd/user/xsettingsd.service')
  .then(fileContents => {
    const ast = stringToAst(fileContents);
    console.log(ast);
  });

stringToData(input: String): Array

Convert a unit file string to a normalized representation. This is equivalent to the following:

const data = astToData(stringToAst(string));

astToData(ast: Object): Array

Convert the parser ast to a normalized representation.

astToString(ast: Object): String

Convert an ast to a valid unit file string.

import { writeFile } from 'fs/promises';
import { astToString } from 'unitfile-parser';

const ast = // some ast here

const unitFile = astToString(ast);

writeFile('~/.config/systemd/user/xsettingsd.service', unitFile);

dataToAst(data: Array): Object

Convert the normalized JS representation to the parser ast.

dataToString(data: Array): String

Convert the normalized JS representation to a valid unit file string. This is equivalent to the following:

const string = astToString(dataToAst(data));

Lexer

Constructor for a lexer that extends the chevrotain Lexer.

Parser

Constructor for a parser that extends the chevrotain CSTParser.

visitorCreator(parser: Parser): ICSTVisitor

Function that takes a parser and returns a visitor for that parser that would normalize the ast to the abovementioned data format.

Motivation

There already is a systemd-unitfile package on npm, but it is unmaintained and has some bad behaviour, like not recognizing multiline values.