| name | stacks-slug |
| description | Use when generating URL slugs in Stacks — creating unique slugs with database collision detection, the uniqueSlug function with table/column configuration, or basic slugification. Covers @stacksjs/slug. |
| license | MIT |
| compatibility | Bun >= 1.3.0, TypeScript |
| allowed-tools | Read Edit Write Bash Grep Glob |
Stacks Slug
URL-friendly slug generation with database uniqueness checking.
Key Paths
- Core package:
storage/framework/core/slug/src/
Unique Slug (with Database Check)
import { uniqueSlug } from '@stacksjs/slug'
const slug = await uniqueSlug('My Blog Post Title')
const slug = await uniqueSlug('Product Name', {
table: 'products',
column: 'slug'
})
How Collision Detection Works
- Slugifies the input string
- Queries the database for existing slug
- If collision found, appends
-2, -3, etc.
- Returns the first available slug
Basic Slugify (No Database Check)
import { slugify } from '@stacksjs/slug'
slugify('Hello World!')
slugify('Ünïcödé Têxt')
slugify(' Extra Spaces ')
Re-exported from ts-slug — handles Unicode transliteration.
Model Usage
Models typically use slugs via the slug attribute:
defineModel({
name: 'Post',
attributes: {
title: { validation: { rule: schema.string() } },
slug: {
unique: true,
validation: { rule: schema.string() },
}
}
})
SlugifyOptions
interface SlugifyOptions {
table?: string
column?: string
}
Gotchas
uniqueSlug() is async — it queries the database
slugify() is sync — no database interaction
- Collision detection appends
-2, -3, etc. (not random suffixes)
- Unicode characters are transliterated (u → u, e → e, etc.)
- For string-only slugification without DB, use
slug() from @stacksjs/strings instead
- Tags and Categories both use unique slugs by default
- Slug columns should have a unique index in the database