Some checks failed
Test and deploy staging / staging (push) Has been cancelled
44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
import { db } from '$lib/server/db';
|
|
import { blogArticles, lists } from '$lib/server/db/schema';
|
|
import { eq } from 'drizzle-orm';
|
|
|
|
export function slugify(title: string, fallback = 'article'): string {
|
|
return (
|
|
title
|
|
.toLowerCase()
|
|
.trim()
|
|
.replace(/[^a-z0-9]+/g, '-')
|
|
.replace(/^-+|-+$/g, '') || fallback
|
|
);
|
|
}
|
|
|
|
export async function uniqueSlug(title: string): Promise<string> {
|
|
const base = slugify(title);
|
|
let slug = base;
|
|
let suffix = 2;
|
|
|
|
while (
|
|
(await db.select({ id: blogArticles.id }).from(blogArticles).where(eq(blogArticles.slug, slug)))
|
|
.length > 0
|
|
) {
|
|
slug = `${base}-${suffix}`;
|
|
suffix += 1;
|
|
}
|
|
|
|
return slug;
|
|
}
|
|
|
|
export async function uniqueListSlug(name: string): Promise<string> {
|
|
const base = slugify(name, 'list');
|
|
let slug = base;
|
|
let suffix = 2;
|
|
while ((await db.select({ id: lists.id }).from(lists).where(eq(lists.slug, slug))).length > 0) {
|
|
slug = `${base}-${suffix++}`;
|
|
}
|
|
return slug;
|
|
}
|
|
|
|
export function validSlug(slug: string): boolean {
|
|
return slug.length <= 120 && /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug);
|
|
}
|