A human-readable, structured data format that combines the best features of JSON, YAML, CSV, and TOON.
Features β’ Quick Start β’ Documentation β’ Examples
DAN (Data Advanced Notation) is designed for developers who want:
- π― Human-readable syntax with minimal punctuation
- π Native table support for structured data
- π¬ Comments anywhere (
#or//) - π Type inference - no explicit type declarations needed
- β‘ Fast parsing with single-pass algorithm
- π¨ Beautiful syntax that's easy to read and write
Perfect for configuration files, datasets, structured data, and any scenario where JSON/YAML/CSV fall short.
npm install @marcuwynu23/danimport { decode, encode } from "@marcuwynu23/dan";
// Parse DAN text to JavaScript object
const danText = `
name: John
age: 30
active: true
tags: [developer, javascript]
`;
const obj = decode(danText);
console.log(obj);
// { name: 'John', age: 30, active: true, tags: ['developer', 'javascript'] }
// Encode JavaScript object to DAN format
const data = {
user: {
name: "Jane",
email: "jane@example.com",
},
roles: ["admin", "user"],
};
const danOutput = encode(data);
console.log(danOutput);
// user {
// name: "Jane"
// email: "jane@example.com"
// }
// roles: [admin, user]- Features
- TypeScript Support
- API Reference
- Syntax Guide
- Examples
- Comparison with Other Formats
- Use Cases
- Documentation
- Contributing
| Feature | Description |
|---|---|
| π¨ Human-readable | Minimal syntax, easy for humans to understand |
| π¦ Nested blocks | Organize data hierarchically with {} |
| π Arrays | Simple list syntax with [] |
| π Native tables | Built-in table support with column headers |
| π¬ Comments | Inline and block comments using # or // |
| π Type inference | Automatically detects numbers, booleans, strings |
| β‘ Fast parsing | Optimized single-pass parser for performance |
| π Buffer support | Parse directly from Node.js Buffers |
| π― TypeScript | Full type definitions included |
This library includes full TypeScript support with comprehensive type definitions.
import {
decode,
encode,
type DanObject,
type DanTableRow,
} from "@marcuwynu23/dan";
// Decode with type inference
const obj: DanObject = decode(`
name: John
age: 30
active: true
`);
// Type-safe access
const name: string = obj.name as string;
const age: number = obj.age as number;
// Encode with type safety
interface Config {
user: {
name: string;
email: string;
};
roles: string[];
}
const config: Config = {
user: { name: "Jane", email: "jane@example.com" },
roles: ["admin", "user"],
};
const dan: string = encode(config as DanObject);DanObject- Represents a parsed DAN objectDanValue- Union type for all possible DAN valuesDanTableRow- Represents a row in a DAN table
Parses a DAN format string or Buffer and returns a JavaScript object.
Parameters:
text(string | Buffer): The DAN format text to parse. Can be a string or a Node.js Buffer (e.g., fromfs.readFileSync)
Returns:
DanObject: The parsed JavaScript object
Example:
// With string
const obj = decode("name: John\nage: 30");
// { name: 'John', age: 30 }
// With Buffer (from fs.readFileSync)
import fs from "fs";
const buffer = fs.readFileSync("data.dan");
const obj = decode(buffer); // Automatically converts Buffer to string
// Empty file handling (returns empty object, no error)
const emptyBuffer = fs.readFileSync("empty.dan");
const emptyObj = decode(emptyBuffer); // Returns {} for empty files
// {}TypeScript:
const obj: DanObject = decode("name: John\nage: 30");
// Or with Buffer
import fs from "fs";
const buffer = fs.readFileSync("data.dan");
const obj: DanObject = decode(buffer);Encodes a JavaScript object to DAN format string.
Parameters:
obj(DanObject): The JavaScript object to encodeindent(number, optional): Starting indentation level (default: 0)
Returns:
string: The DAN format string
Example:
const dan = encode({ name: "John", age: 30 });
// name: "John"
// age: 30TypeScript:
const dan: string = encode({ name: "John", age: 30 } as DanObject);Organize data hierarchically with nested blocks:
context {
key: value
nestedBlock {
key: value
}
}
Store lists of values:
friends: [ana, luis, sam]
numbers: [1, 2, 3, 4, 5]
mixed: [hello, 42, true, "world"]
Native table support for structured tabular data:
hikes: table(id, name, distanceKm) [
1, "Blue Lake Trail", 7.5
2, "Ridge Overlook", 9.2
]
Add documentation anywhere:
# This is a block comment
name: John # Inline comment
age: 30 // Alternative comment style
# Context for the hiking trip
context {
task: "Our favorite hikes together" # main task description
location: Boulder
season: spring_2025
// forecast for the week
weatherForecast {
monday: sunny
tuesday: cloudy
wednesday: rainy
thursday: sunny
}
}
friends: [ana, luis, sam, julia, mike] # list of friends
# Hike details table
hikes: table(id, name, distanceKm, elevationGain, companion, wasSunny, difficulty) [
1, "Blue Lake Trail", 7.5, 320, ana, true, medium
2, "Ridge Overlook", 9.2, 540, luis, false, hard
3, "Wildflower Loop", 5.1, 180, sam, true, easy
]
# Animal companions
animals: table(type, name, age, vaccinated) [
dog, Putcholo, 5, true
cat, Sebastian, 3, false
parrot, Polly, 2, true
rabbit, Fluffy, 1, false
]
games: [chess, "board games", puzzles, "escape room", sudoku] // fun activities
# Application configuration
app {
name: "My Application"
version: 1.0.0
environment: production
# Server settings
server {
host: localhost
port: 3000
ssl: false
}
# Database configuration
database {
type: postgresql
host: db.example.com
port: 5432
name: myapp
}
}
# Feature flags
features {
authentication: true
analytics: false
logging: true
}
# User roles
roles: [admin, user, guest]
# API endpoints
endpoints: table(method, path, handler, auth) [
GET, "/api/users", getUsers, true
POST, "/api/users", createUser, true
GET, "/api/public", getPublic, false
]
Check out more examples in the examples/ directory!
DAN combines the best features of multiple data formats. Here's how it compares:
| Feature | DAN | JSON | YAML | TOML | CSV | XML | INI |
|---|---|---|---|---|---|---|---|
| Comments | β
# and // |
β | β
# |
β
# |
β | β
<!-- --> |
β
# and ; |
| Type Inference | β | β | β | β | β | β | β |
| Nested Objects | β | β | β | β | β | β | β |
| Arrays | β | β | β | β | β | β | β |
| Tables | β Native | β | β | β | β | β | β |
| Minimal Syntax | β | β | β | β | β | ||
| Human Readable | β | β | β | β | β | ||
| Quotes Optional | β | β | β | β | β | β | β |
| Trailing Commas | β | β | β | β | β | N/A | N/A |
The same data structure represented in different formats:
DAN - Clean and readable
# User configuration
user {
name: John
age: 30
active: true
tags: [developer, javascript, nodejs]
}
# User roles table
roles: table(id, name, permissions) [
1, admin, [read, write, delete]
2, user, [read]
3, guest, [read]
]
JSON - Verbose, no comments
{
"user": {
"name": "John",
"age": 30,
"active": true,
"tags": ["developer", "javascript", "nodejs"]
},
"roles": [
{ "id": 1, "name": "admin", "permissions": ["read", "write", "delete"] },
{ "id": 2, "name": "user", "permissions": ["read"] },
{ "id": 3, "name": "guest", "permissions": ["read"] }
]
}Issues:
- β No comments
- β Requires quotes for all strings
- β More verbose syntax
- β Tables require verbose object arrays
YAML - Indentation-sensitive
# User configuration
user:
name: John
age: 30
active: true
tags:
- developer
- javascript
- nodejs
# User roles table
roles:
- id: 1
name: admin
permissions:
- read
- write
- delete
- id: 2
name: user
permissions:
- read
- id: 3
name: guest
permissions:
- readIssues:
β οΈ Indentation-sensitive (can be error-prone)β οΈ Tables require verbose nested structuresβ οΈ More verbose for tabular dataβ οΈ Complex syntax for simple values
Choose DAN when you need:
- β Tabular data with native table support
- β Comments for documentation
- β Minimal, readable syntax
- β Type inference without explicit typing
- β Mix of structured and tabular data
- β Fast parsing performance
Consider alternatives when:
β οΈ You need maximum compatibility (use JSON)β οΈ You need strict schema validation (use JSON Schema + JSON)β οΈ You need industry-standard format (use YAML/TOML)β οΈ You only need simple key-value pairs (use INI)
DAN is perfect for:
- π Configuration files for applications or services
- π Human-readable datasets for analytics
- π§ͺ Structured experiment results
- π Data serialization with human readability
- ποΈ Documentation with embedded data
- π Tabular data representation
DAN files use the .dan extension:
filename.dan
Example: hiking_trip.dan, config.dan, data.dan
- FEATURES.md - Comprehensive feature documentation
- CONTRIBUTING.md - Guidelines for contributing
- CHANGELOG.md - Version history and changes
- Examples - Code examples and use cases
Contributions are welcome! Please read our Contributing Guide for details on:
- Code of conduct
- Development setup
- Pull request process
- Coding standards
See our Security Policy for reporting vulnerabilities.
This project is licensed under the ISC License - see the LICENSE file for details.
DAN is inspired by the best features of JSON, YAML, CSV, and TOON, combining them into a single, powerful format.
Made with β€οΈ for developers who love clean, readable data formats
Report Bug β’ Request Feature β’ Documentation