š¦Intermediate
Node.js Scripts
Server-side TypeScript scripts for managing your tacobase schema and data. Run migrations to create collections and seed scripts to populate sample data ā safe to run multiple times.
Node.jsTypeScriptCLIAdmin API
Two API keys
TACOBASE_API_KEY
Regular key. Read/write access subject to collection rules. Safe for client-side code (with NEXT_PUBLIC_ or VITE_ prefix).
TACOBASE_ADMIN_API_KEY
Admin key. Full access including schema changes. Server-side only. Never expose in client code or commit to git.
Setup
cp .env.example .env
# TACOBASE_URL=https://your-app.tacobase.dev
# TACOBASE_API_KEY=tbk_...
# TACOBASE_ADMIN_API_KEY=tbk_admin_...
npm install
npm run migrate # create collections
npm run seed # populate sample dataScripts
migrate.ts
Creates collections. Skips ones that already exist ā idempotent and CI-safe.
// migrate.ts ā create collections idempotently
import 'dotenv/config'
import { createClient } from '@tacobase/client'
// Admin key required for schema changes
const db = createClient(
process.env.TACOBASE_URL!,
process.env.TACOBASE_ADMIN_API_KEY!,
)
const collections = [
{
name: 'posts',
schema: [
{ name: 'title', type: 'text', required: true },
{ name: 'content', type: 'editor' },
{ name: 'published', type: 'bool' },
{ name: 'author', type: 'relation', options: { collectionId: 'users' } },
],
},
]
async function migrate() {
const existing = await db.admin.listCollections()
const existingNames = new Set(existing.map(c => c.name))
for (const col of collections) {
if (existingNames.has(col.name)) {
console.log(` ā ${col.name} (skipped)`)
continue
}
await db.admin.createCollection({ name: col.name, type: 'base', schema: col.schema })
console.log(` ā ${col.name} (created)`)
}
console.log('\nš® Wrapped. Migrations complete.')
}
migrate().catch(err => {
console.error(err.message)
if (err.fix) console.error('Fix:', err.fix)
process.exit(1)
})seed.ts
Clears existing posts and creates fresh sample data. Run after migrate.
// seed.ts ā populate sample data
import 'dotenv/config'
import { createClient } from '@tacobase/client'
// Regular key for read/write operations
const db = createClient(
process.env.TACOBASE_URL!,
process.env.TACOBASE_API_KEY!,
)
const posts = [
{ title: 'Getting Started', published: true },
{ title: 'Building Realtime Apps', published: true },
{ title: 'Draft: Auth Deep Dive', published: false },
]
async function seed() {
// Clear existing
const existing = await db.collection('posts').getFullList()
for (const post of existing) {
await db.collection('posts').delete(post.id)
}
// Create fresh data
for (const post of posts) {
await db.collection('posts').create(post)
console.log(` ā "${post.title}"`)
}
console.log('\nš® Wrapped. Seed complete.')
}
seed().catch(err => {
console.error(err.message)
process.exit(1)
})