Skip to content

Configuration

Hyperterse supports YAML-like .terse configuration file.

Every configuration file must have a name field. This name is used when exporting bundles and must follow the same naming rules as query names.

name: my-api
FieldTypeDescription
namestringConfiguration name (required) - must be lower-kebab-case or lower_snake_case

Configure the runtime server. All fields are optional.

server:
port: '8080'
log_level: 3
FieldTypeDefaultDescription
portint8080HTTP server port
log_levelint3Log verbosity

There are 4 log levels:

ValueLevelDescription
1ERROROnly errors
2WARNWarnings and errors
3INFOGeneral information (default)
4DEBUGDetailed debugging information

Adapters define database connections.

adapters:
adapter_name:
connector: postgres
connection_string: 'postgresql://user:pass@host:5432/db'
options:
key: 'value'
FieldTypeDescription
connectorstringDatabase type: postgres, mysql, or redis
connection_stringstringDatabase connection URL
FieldTypeDescription
optionsmapConnector-specific key-value options

For connector-specific options, see the adapter documentation:

Use {{ env.VARIABLE_NAME }} syntax to reference environment variables:

adapters:
production_db:
connector: postgres
connection_string: '{{ env.DATABASE_URL }}'

Queries define SQL statements that become API endpoints.

queries:
query-name:
use: adapter_name
description: 'Human-readable description'
statement: |
SELECT * FROM table WHERE id = {{ inputs.id }}
inputs:
id:
type: int
description: 'Record ID'
FieldTypeDescription
usestringAdapter name for query execution
descriptionstringHuman-readable description (used in generated docs)
statementstringSQL query with template variables
FieldTypeDescription
inputsmapInput parameter definitions

Define typed parameters for queries.

inputs:
field_name:
type: string
description: 'Field description'
optional: true
default: 'default_value'
FieldTypeDescription
typestringData type (see types below)
descriptionstringHuman-readable description
FieldTypeDefaultDescription
optionalbooleanfalseWhether input is optional
defaultPrimitiveDefault value (required if optional)
TypeDescriptionJSON Example
stringText values"hello world"
int64-bit integers42
float64-bit floating point3.14
booleanTrue/falsetrue
uuidUUID strings"550e8400-e29b-..."
datetimeISO 8601 / RFC3339"2024-01-15T10:30:00Z"

Use {{ inputs.fieldName }} to inject input values into SQL statements.

statement: |
SELECT * FROM users
WHERE email = {{ inputs.email }}
AND role = {{ inputs.role }}
LIMIT {{ inputs.limit }}

Configure export settings for deployment bundles. This is optional and can be overridden by CLI flags.

export:
out: dist
clean_dir: true
FieldTypeDefaultDescription
outstringdistOutput directory path
clean_dirbooleanfalseClean output directory before exporting

Rules:

  • The script filename is always derived from the config name field
  • CLI flags (--out/-o, --clean-dir) take precedence over config settings
  • Default is dist directory if out is not specified
  • When clean_dir is true, all contents of the output directory are removed before exporting
  • All referenced inputs must be defined in the inputs section
  • Values are escaped and formatted based on their type
  • String values are quoted automatically
  • Use lower-kebab-case or lower_snake_case
  • Must start with a lowercase letter
  • Used for export bundle script filename
  • Valid: my-api, user_service, analytics_v1
  • Invalid: MyAPI, 123service, my api
  • Use lower-kebab-case or lower_snake_case
  • Must start with a letter
  • Valid: main_db, users-db, analytics_replica
  • Invalid: MainDB, 123db, my db
  • Use lower-kebab-case or lower_snake_case
  • Must start with a lowercase letter
  • Becomes the endpoint path: /query/{query-name}
  • Valid: get-user, list_products, user-signups
  • Invalid: GetUser, 123query

Hyperterse validates configuration on startup:

RuleDescription
Configuration namename field is required and must follow naming rules
At least one adapterConfiguration must define at least one adapter
At least one queryConfiguration must define at least one query
Unique adapter namesNo duplicate adapter names
Unique query namesNo duplicate query names
Valid adapter referenceQuery use must reference a defined adapter
Defined inputsAll {{ inputs.x }} in statements must be defined
Optional defaultsOptional inputs must have default values
Valid typesAll types must be valid primitives
Export configurationexport.out specifies output directory (script filename uses config name)
name: my-api
server:
port: '8080'
log_level: 3
export:
out: dist
adapters:
main_db:
connector: postgres
connection_string: '{{ env.DATABASE_URL }}'
options:
max_connections: '10'
ssl_mode: 'require'
cache:
connector: redis
connection_string: 'redis://localhost:6379/0'
queries:
list-users:
use: main_db
description: 'List users with pagination'
statement: |
SELECT id, name, email, created_at
FROM users
ORDER BY created_at DESC
LIMIT {{ inputs.limit }}
OFFSET {{ inputs.offset }}
inputs:
limit:
type: int
description: 'Maximum results'
optional: true
default: '20'
offset:
type: int
description: 'Results to skip'
optional: true
default: '0'
data:
id:
type: int
name:
type: string
email:
type: string
created_at:
type: datetime
get-user-by-id:
use: main_db
description: 'Get a single user by ID'
statement: |
SELECT id, name, email, role, created_at
FROM users
WHERE id = {{ inputs.userId }}
inputs:
userId:
type: int
description: 'User ID'