šŸ“¦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 data

Scripts

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)
})