Stacks REPL / Tinker
Key Paths
- REPL package:
storage/framework/core/repl/src/ - Tinker package:
storage/framework/core/tinker/src/ - Packages:
@stacksjs/repl,@stacksjs/tinker
API
import { startRepl } from '@stacksjs/repl'
interface ReplConfig extends TinkerConfig {
loadFile?: string // Path to file to preload before starting
}
async function startRepl(config: ReplConfig): Promise<{ exitCode: number }>
How It Works
- If
config.loadFileis specified, reads the file content - Merges file content into
config.evalfor evaluation - Starts an interactive Bun REPL session with all framework modules available
- Returns the process exit code when the session ends
Re-exports from @stacksjs/tinker
import {
startTinker, // Start a tinker session
tinkerEval, // Evaluate an expression
tinkerPrint, // Print a result
getHistoryPath, // Get REPL history file path
readHistory, // Read command history
appendHistory, // Append to command history
clearHistory, // Clear command history
} from '@stacksjs/repl'
import type { TinkerConfig } from '@stacksjs/repl'
CLI Commands
buddy tinker # Start interactive REPL session
buddy tinker --load file.ts # Preload a file before starting
Usage
Inside the REPL, all framework modules are available:
// Query the database
const users = await db.selectFrom('users').get()
// Use models
const post = await Post.find(1)
// Access config
console.log(config.app.name)
// Use faker for quick testing
const email = faker.internet.email()
Gotchas
- Tinker is the user-facing command, REPL is the engine —
buddy tinkercallsstartRepl()under the hood - All framework imports available — models, database, config, faker, etc. are preloaded
- History is persisted — REPL history is saved to disk via
getHistoryPath() - File preloading — use
loadFileto run setup code before entering interactive mode - Bun runtime — the REPL runs in Bun's JavaScript runtime, not Node.js