Quick Start
This guide will walk you through creating your first Atscript file and using it in a TypeScript project.
Create Your First .as File
Let's start with a simple product model. Create a file named product.as:
// product.as
@meta.description 'Product in our catalog'
export interface Product {
@meta.id
id: string.uuid
@meta.label 'Product Name'
@expect.minLength 3
@expect.maxLength 100
name: string
@meta.label 'Price in USD'
@expect.min 0
@expect.max 1000000
price: number.positive
@meta.label 'In Stock'
inStock: boolean
createdAt: string.isoDate
}This concise example demonstrates:
- Interface annotation (
@meta.description) - Property metadata (
@meta.label,@meta.id) - Validation rules (
@expect.minLength,@expect.min) - Semantic types (
string.uuid,number.positive,string.isoDate)
Configuration
Create an atscript.config.js file in your project root:
// atscript.config.js
import { defineConfig } from '@atscript/core'
import ts from '@atscript/typescript'
export default defineConfig({
rootDir: 'src',
format: 'dts',
unknownAnnotation: 'error',
plugins: [ts()],
})Configuration Options
rootDir- Where your.asfiles are locatedformat- Default output format (dtsorjs)unknownAnnotation- How to handle unknown annotations:'error'- Treat as error (strict mode)'warn'- Show warning but continue'allow'- Accept any annotation (available in runtime)
plugins- Active plugins (TypeScript plugin for JS/TS generation)
VSCode Extension Integration
If you have the Atscript VSCode extension installed, it will:
- Automatically pick up this config file
- Generate
.d.tsfiles for each.asfile on save - Enable smooth TypeScript integration
- Provide IntelliSense and error checking
Manual Compilation (Alternative)
If you're not using the VSCode extension, use the asc CLI from @atscript/typescript:
npx asc -f dtsnpx asc -f jsImportant: Run asc -f dts at least once to generate atscript.d.ts. This file contains:
- All annotation types with proper TypeScript definitions
- Tag type definitions for IntelliSense
- Even unknown annotations (if using
'allow'mode)
Add atscript.d.ts to your tsconfig.json:
{
"include": [
"src/**/*",
"atscript.d.ts" // Add this line
]
}Bundler Integration
For build tools, install unplugin-atscript:
npm install -D unplugin-atscriptpnpm add -D unplugin-atscriptyarn add -D unplugin-atscriptThen configure your bundler:
// vite.config.js
import { defineConfig } from 'vite'
import atscript from 'unplugin-atscript'
export default defineConfig({
plugins: [
atscript.vite(),
// other plugins...
],
})// rollup.config.js
import atscript from 'unplugin-atscript'
export default {
plugins: [
atscript.rollup(),
// other plugins...
],
}// build.js
import { build } from 'esbuild'
import atscript from 'unplugin-atscript'
build({
plugins: [atscript.esbuild()],
// other options...
})// rolldown.config.js
import atscript from 'unplugin-atscript'
export default {
plugins: [
atscript.rolldown(),
// other plugins...
],
}Using Atscript in TypeScript
Import and use your Atscript types in TypeScript:
// app.ts
import { Product } from './product.as'
// 1. Use as a TypeScript type
const laptop: Product = {
id: '550e8400-e29b-41d4-a716-446655440000',
name: 'Gaming Laptop',
price: 1299.99,
inStock: true,
createdAt: '2024-01-15T10:30:00Z'
}
// 2. Access property metadata
const nameProp = Product.type.props.get('name')
const nameLabel = nameProp?.metadata.get('meta.label')
console.log(nameLabel) // 'Product Name'
// 3. Access type tags
const idProp = Product.type.props.get('id')
const idTags = idProp?.type.tags
console.log(idTags) // ['uuid', 'string']
// 4. Runtime validation with type guard
const validator = Product.validator()
function processData(data: unknown) {
// Safe validation - acts as type guard
if (validator.validate(data, true)) {
// TypeScript now knows 'data' is Product type
console.log(`Product ${data.name} costs $${data.price}`)
// data.name and data.price are fully typed!
} else {
console.log('Invalid product:', validator.errors)
}
}
// 5. Unsafe validation (throws on error)
try {
validator.validate(someData)
// If we reach here, someData is valid
} catch (error) {
console.error('Validation failed:', error.message)
}Key Points
- Type Guard: Safe validation (
validate(data, true)) acts as a TypeScript type guard - Runtime Metadata: All annotations are accessible at runtime
- Type Tags: Semantic types are preserved as tags for runtime inspection
- Automatic Validation: Semantic types like
string.emailautomatically add validation rules
TIP
Semantic types automatically add validation. For example:
string.emailadds email format validationnumber.positiveadds@expect.min 0string.uuidadds UUID format validation
Learn more on the Primitives page.
Next Steps
- Interfaces & Types - Define complex data structures
- Primitives - Explore semantic types
- Annotations - Learn the annotation system