Skip to content

Annotations Reference

Experimental

The DB integrations layer is experimental. APIs and annotations described in this section may change in future releases.

Complete reference for all database annotations available in .as files. The @db.* annotations are shipped with @atscript/core — no extra packages needed. MongoDB-specific annotations require the @atscript/mongo plugin.

Tables & Columns

AnnotationApplies ToArgumentsDescription
@db.tableInterfacename? (string)Mark as database table (defaults to interface name)
@db.table.renamedInterfaceoldName (string)Previous table name for schema sync migration
@db.schemaInterfacename (string)Assign to a database schema/namespace
@db.columnFieldname (string)Override the physical column name
@db.column.renamedFieldoldName (string)Previous column name for schema sync migration
@db.jsonFieldStore as a single JSON column instead of flattening
@db.ignoreFieldExclude field from the database schema entirely
atscript
@db.table 'users'
@db.schema 'auth'
interface User {
  @db.column 'full_name'
  name: string

  @db.json
  preferences: Preferences

  @db.ignore
  computedField: string
}

Defaults

AnnotationApplies ToArgumentsDescription
@db.defaultFieldvalue (string)Static default value
@db.default.fnFieldfn (string)Generated default: 'increment', 'uuid', or 'now'

Default function values:

FunctionRequiresDescription
'increment'number typeAuto-incrementing integer
'uuid'string typeRandom UUID string
'now'number or string typeCurrent timestamp
atscript
@db.table
interface Product {
  @meta.id
  @db.default.fn 'uuid'
  id: string

  @db.default 'untitled'
  name: string

  @db.default.fn 'now'
  createdAt: number
}

Indexes

AnnotationApplies ToArgumentsDescription
@db.index.plainFieldname? (string), sort? (string)Standard index, optional name and sort direction ('asc'/'desc')
@db.index.uniqueFieldname? (string)Unique constraint index
@db.index.fulltextFieldname? (string), weight? (number)Full-text search index with optional weight

Use the same index name on multiple fields to create a composite index.

atscript
@db.table
interface Article {
  @db.index.unique
  slug: string

  @db.index.plain 'date_idx', 'desc'
  publishedAt: number

  // Composite index across two fields
  @db.index.plain 'author_cat'
  authorId: string

  @db.index.plain 'author_cat'
  category: string

  @db.index.fulltext 'search', 3
  title: string

  @db.index.fulltext 'search', 1
  body: string
}

Relations

AnnotationApplies ToArgumentsDescription
@db.rel.FKFieldalias? (string)Foreign key (field must use chain ref)
@db.rel.toFieldalias? (string)Forward navigation (N:1, FK on this table)
@db.rel.fromFieldalias? (string)Reverse navigation (1:N, FK on other table)
@db.rel.viaFieldjunction (ref)Many-to-many navigation through a junction table
@db.rel.onDeleteFieldaction (string)Referential action on parent delete
@db.rel.onUpdateFieldaction (string)Referential action on parent update
@db.rel.filterFieldcondition (expr)Static filter condition on navigation property
atscript
@db.table
interface Task {
  @db.rel.FK
  @db.rel.onDelete 'cascade'
  projectId: Project.id

  @db.rel.to
  project: Project

  @db.rel.from
  comments: Comment[]

  @db.rel.via TaskTag
  tags: Tag[]

  @db.rel.from
  @db.rel.filter `status = 'open'`
  openSubtasks: Task[]
}

Referential Action Values

For @db.rel.onDelete and @db.rel.onUpdate:

ActionDescription
'cascade'Propagate delete/update to related rows
'restrict'Prevent operation if related rows exist
'noAction'Database default behavior (no action)
'setNull'Set FK to null (field must be optional)
'setDefault'Set FK to default value (needs @db.default)

Views

AnnotationApplies ToArgumentsDescription
@db.viewInterfacename? (string)Mark as database view (defaults to interface name)
@db.view.forInterfaceentry (ref)Entry/primary table for a managed view
@db.view.joinsInterfacetarget (ref), condition (expr)Explicit join clause (repeatable)
@db.view.filterInterfacecondition (expr)View WHERE clause
@db.view.materializedInterfaceMark the view as materialized
@db.view.renamedInterfaceoldName (string)Previous view name for schema sync migration
atscript
@db.view
@db.view.for Task
@db.view.joins Project, `Project.id = Task.projectId`
@db.view.filter `Task.status = 'active'`
interface ActiveTaskView {
  taskName: Task.name
  projectName: Project.name
  dueDate: Task.dueDate
}

Schema Sync

AnnotationApplies ToArgumentsDescription
@db.sync.methodInterfacemethod (string)Sync strategy: 'drop' or 'recreate'
  • 'drop' — Drop and recreate the table on structural changes (lossy, data is deleted).
  • 'recreate' — Recreate with data preservation on structural changes.

Patch Behavior

AnnotationApplies ToArgumentsDescription
@db.patch.strategyFieldstrategy (string)'replace' (default) or 'merge'

Controls how nested objects are handled during PATCH/update operations. With 'replace', the entire nested object is overwritten. With 'merge', individual sub-fields are deep-merged.

MongoDB-Specific

These annotations require the @atscript/mongo plugin.

AnnotationApplies ToArgumentsDescription
@db.mongo.collectionInterfaceMark as MongoDB collection (auto-injects _id)
@db.mongo.cappedInterfacesize (number), max? (number)Capped collection with max byte size and optional doc limit
@db.mongo.search.dynamicInterfaceanalyzer (string), fuzzy (boolean)Dynamic Atlas Search index
@db.mongo.search.staticInterfaceanalyzer (string), fuzzy (boolean), indexName (string)Named static Atlas Search index
@db.mongo.search.textFieldanalyzer (string), indexName (string)Include field in a search index
@db.mongo.search.vectorFielddims (number), similarity (string), indexName (string)Vector search field
@db.mongo.search.filterFieldindexName (string)Pre-filter field for vector search
atscript
use '@atscript/mongo'

@db.mongo.collection
@db.mongo.search.static 'standard', true, 'main_search'
interface Product {
  @meta.id
  _id: ObjectId

  @db.mongo.search.text 'standard', 'main_search'
  name: string

  @db.mongo.search.vector 1536, 'cosine', 'vec_idx'
  embedding: number[]

  @db.mongo.search.filter 'vec_idx'
  category: string
}

These are not @db.* annotations but are commonly used alongside the database layer.

AnnotationApplies ToArgumentsDescription
@meta.idFieldMark as primary key field (multiple fields form a composite key)
@expect.array.keyFieldArray element key field for patch matching
@expect.array.uniqueItemsFieldEnforce unique items in an array
atscript
@db.table
interface OrderLine {
  // Composite primary key
  @meta.id
  orderId: Order.id

  @meta.id
  productId: Product.id

  quantity: number
}

Released under the MIT License.