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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@yunixos/paradoxical

v0.1.4

Published

Create Clausewitz engine mod files using JavaScript

Readme

Paradoxical

Create Clausewitz Engine mods using JavaScript or TypeScript.

Paradoxical provides an API for constructing and serialising Clausewitz mod files, allowing mods to be generated programmatically.

Features

  • Generate mod files within JS/TS.
  • Generate localisation files using JS/TS (W.I.P (soon™)).

Installation

npm install @yunixos/paradoxical

Quick Start - Create your first mod file

import { ModFile } from "@yunixos/paradoxical";

const file = new ModFile("./", "hello.txt"); // Path and filename (including extension) 

const container = file.addContainer("message"); // Add a new container object to the file

container.addClause("text", "hello world"); // Add a clause "text = "hello world"" to the container

file.write(); // Writes the file to specified location

This should output a file in the root directory called hello.txt that contains the following:

message = {
	text = "hello world"
}

Core Concepts

ModFile

A ModFile is... well, a mod file. You can add nodes to it, and write the data to the location specified once you're finished.

const file = new ModFile("./", "hello.txt");

Values

Any clause value can be either a string, number, boolean, or Keyword (string without quotes).

String vs Keyword

There is an important thing to note regarding strings in Paradoxical. A raw string used as a value will always be serialised with surrounding quotation marks. There are many occasions however where one needs to instead have the value be a "Keyword" (a string value absent quotation marks). To account for this, one can use the keyword() helper function to create a keyword value that will not have surrounding quotes.

Raw string:

file.addClause("value", "string")
value = "string"

Keyword:

file.addClause("value", keyword("keyword"))
value = keyword

Nodes

Nodes are the building blocks of Paradoxical. A node can be a container, a clause, or a unit.

Unit

A unit is the most basic node, consisting merely of a lonesome value.

const unit = file.addUnit(keyword("value"));
value

Clause

A clause is an expression involving both a key and a value.

const clause = file.addClause("name", "value");
name = "value"

Container

A container is a type of node that contains other nodes. They often will have a name, but can also be anonymous.

const container = file.addContainer("container");
const subcontainer = container.addContainer();
subcontainer.addClause("name", "value");
container = {
  {
    name = "value"
  }
}