toml.min
v1.0.0
Published
🔧 Faster and lightweight TOML v1.1.0 parser for JavaScript and TypeScript.
Downloads
1,155
Maintainers
Readme
🔧 Faster and lightweight TOML v1.1.0 parser for JavaScript and TypeScript.
- Zero runtime dependencies
- Single-file hand-written recursive-descent parser
- Compatible with Node.js (18+), Bun, and Deno
Install
# Node.js
npm i toml.min# Bun
bun add toml.min# Deno
deno add npm:toml.minUsage
Import
ES Modules
import { parse } from 'toml.min';CommonJS
const { parse } = require('toml.min');Quickstart
import { parse } from 'toml.min';
const data = parse(`
title = "TOML Example"
[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00Z
[database]
ports = [8001, 8001, 8003]
enabled = true
`);
data.title; // "TOML Example"
data.owner.name; // "Tom Preston-Werner"
data.owner.dob; // Date object
data.database.ports; // [8001, 8001, 8003]
data.database.enabled; // trueSupported Types
Strings
Basic, literal, multiline, and all escape sequences:
basic = "hello\nworld"
literal = 'no \escapes'
multiline = """
line one
line two"""
multiline_literal = '''
raw content
preserved'''Escape sequences: \b, \t, \n, \f, \r, \\, \", \e, \uXXXX, \UXXXXXXXX, \xHH.
Integers
decimal = 42
positive = +99
negative = -17
with_separator = 1_000_000
hex = 0xDEADBEEF
octal = 0o755
binary = 0b11010110Floats
pi = 3.14159
scientific = 6.626e-34
positive_inf = inf
negative_inf = -inf
not_a_number = nanBooleans
enabled = true
disabled = falseDates and Times
Offset date-times are returned as JavaScript Date objects. Local date-times, local dates, and local times are returned as strings:
odt = 1979-05-27T07:32:00Z # Date object
ldt = 1979-05-27T07:32:00 # string: "1979-05-27T07:32:00"
ld = 1979-05-27 # string: "1979-05-27"
lt = 07:32:00 # string: "07:32:00"Tables
[server]
host = "localhost"
port = 8080
[server.tls]
enabled = trueInline Tables
point = { x = 1, y = 2 }
name = { first = "Tom", last = "Preston-Werner" }Arrays
ports = [8001, 8002, 8003]
mixed = [1, "two", 3.0, true]
nested = [[1, 2], [3, 4]]Array of Tables
[[products]]
name = "Hammer"
sku = 738594937
[[products]]
name = "Nail"
sku = 284758393Dotted Keys
fruit.apple.color = "red"
fruit.apple.taste.sweet = trueError Handling
Parse errors include line and column properties:
import { parse } from 'toml.min';
try {
parse('key = "unterminated');
} catch (error) {
console.error(
`Error on line ${error.line}, column ${error.column}: ${error.message}`
);
}TypeScript
The parse function accepts a generic type parameter:
import { parse } from 'toml.min';
type Config = {
database: {
host: string;
port: number;
};
};
const config = parse<Config>(`
[database]
host = "localhost"
port = 5432
`);
config.database.host; // string
config.database.port; // numberBenchmark
Measured with hyperfine parsing the same TOML payload:
| Parser | Times slower than toml.min | Package Size | | --------------------------------------------------------------------- | ------------------------------ | ------------------------------------------------------ | | ✨ toml.min | 1.00x (baseline) | | | smol-toml | 1.39x ↓ | | | toml-eslint-parser | 2.95x ↓ | | | @decimalturn/toml-patch | 3.43x ↓ | | | toml | 6.42x ↓ | |
- Each benchmark parses the same TOML snapshot 5,000 times per run, with 10 measured runs and 5 warmup runs via hyperfine. See the benchmark directory for details.
Security Policy
Please check the SECURITY.md.
Contributing
See the Contributing Guide and please follow our Code of Conduct
Acknowledgements
- toml.min is inspired by toml-node, reimplemented as a hand-written recursive-descent parser for performance and zero dependencies.
License
toml.min is under the MIT License. Copyright © 2026-present Weslley Araujo and toml.min contributors.
