Jsson Docs
Guides

Presets Guide

Create reusable configuration templates.

Overview

Presets define reusable configurations with @preset and apply them with @use.

@preset "defaults" {
  timeout = 30
  retries = 3
  ssl = true
}

api = @use "defaults" {
  endpoint = "/api"
}

Output:

{
  "api": {
    "timeout": 30,
    "retries": 3,
    "ssl": true,
    "endpoint": "/api"
  }
}

Overriding Values

Override any preset value:

@preset "api_config" {
  timeout = 30
  retries = 3
}

services {
  fast = @use "api_config" {
    timeout = 10        // Override
    endpoint = "/fast"
  }
  
  slow = @use "api_config" {
    timeout = 120       // Override
    endpoint = "/slow"
  }
}

Examples

Database Connections

@preset "db_base" {
  pool_size = 10
  timeout = 5000
  ssl = true
}

databases {
  primary = @use "db_base" {
    host = "db-primary.example.com"
    port = 5432
  }
  
  replica = @use "db_base" {
    host = "db-replica.example.com"
    pool_size = 5       // Smaller for replica
  }
}

API Routes

@preset "route_defaults" {
  timeout = 30
  auth = true
  rate_limit = 100
}

routes [
  template { service, path }
  
  map (r) = @use "route_defaults" {
    service = r.service
    path = r.path
  }
  
  "auth", "/auth"
  "payment", "/payment"
]

User Roles

@preset "user_base" {
  active = true
  verified = false
}

users {
  admin = @use "user_base" {
    name = "Alice"
    role = "admin"
    verified = true
  }
  
  regular = @use "user_base" {
    name = "Bob"
    role = "user"
  }
}

Best Practices

Do:

// ✅ Descriptive names
@preset "api_production_defaults" { ... }

// ✅ Focused presets
@preset "timeout_config" {
  timeout = 30
  retries = 3
}

Don't:

// ❌ Vague names
@preset "config1" { ... }

// ❌ Too many unrelated settings
@preset "everything" {
  timeout = 30
  database = "postgres"
  cache = true
  // ...
}

Troubleshooting

Preset not found:

// ❌ Used before defined
config = @use "my_preset" { ... }
@preset "my_preset" { ... }

// ✅ Define first
@preset "my_preset" { ... }
config = @use "my_preset" { ... }

On this page