Getting Started

Installation

Install via npm:

Global Install

Install globally to use nsc directly:

npm install -g noshift.js@latest

Local Install

Install as a dev dependency and use via npx:

npm install -D noshift.js@latest

Create a Project

Scaffold a new NoShift.js project:

# Global
nsc create my-project

# Local
npx nsc create my-project

This creates a project directory with nsjsconfig.json, src/ folder, and installs dependencies.

Configuration

The project config file nsjsconfig.json controls compiler options:

{
  "compileroptions": {
    "rootdir": "src",
    "outdir": "dist",
    "warnuppercase": true,
    "capitalizeinstrings": true
  }
}
  • rootdir Source file directory (default: src)
  • outdir Output directory (default: dist)
  • warnuppercase Warn about uppercase characters in source code (default: true)
  • capitalizeinstrings Enable ^3 capitalize modifier inside string literals (default: true)

Compile & Run

Compile all .nsjs files:

nsc

With local install, prefix commands with npx:

npx nsc

Or run a file directly without compiling:

# Global
nsc run src/index.nsjs

# Local
npx nsc run src/index.nsjs

File Extension

NoShift.js files use the .nsjs extension. Files prefixed with _ (e.g. _helper.nsjs) are ignored by the compiler.

Programmatic API

You can also use NoShift.js as a library in your code.

ESM

import { compile } from "noshift.js";

const result = compile('console.log^8^2^3hello^2^9;');
console.log(result.outputText);
// => console.log("Hello");

CJS

const { compile } = require("noshift.js");

const result = compile('console.log^8^2^3hello^2^9;');
console.log(result.outputText);
// => console.log("Hello");

Options

Pass options as the second argument:

const result = compile(source, {
  capitalizeInStrings: false, // Disable ^3 inside strings
});

Syntax Diagnostics

Use diagnose() to check for syntax errors before compiling:

import { diagnose } from "noshift.js";

const errors = diagnose(source);
if (errors.length > 0) {
  for (const e of errors) {
    console.error(`Line ${e.line}:${e.column} - ${e.message}`);
  }
}