import {getCliClient} from 'sanity/cli' const client = getCliClient().withConfig({apiVersion: '2024-01-01'}) function toSlug(input: string): string { return input .normalize('NFD') .replace(/[\u0300-\u036f]/g, '') // strip diacritics .toLowerCase() .replace(/[^a-z0-9\s-]/g, '') // remove non-alphanumeric .trim() .replace(/[\s-]+/g, '-') // spaces/hyphens → single hyphen } async function regenerateSlugs() { const releases = await client.fetch<{_id: string; name?: string; albumArtist?: string}[]>( `*[_type == "release"]{_id, name, albumArtist}`, ) console.log(`Found ${releases.length} releases`) const transaction = client.transaction() let count = 0 for (const release of releases) { const source = [release.albumArtist, release.name].filter(Boolean).join(' ') if (!source) { console.log(`Skipping ${release._id} — no albumArtist or name`) continue } const slug = toSlug(source) console.log(`${release._id}: "${source}" → ${slug}`) transaction.patch(release._id, (p) => p.set({slug: {_type: 'slug', current: slug}})) count++ } if (count === 0) { console.log('No documents to update.') return } const result = await transaction.commit() console.log(`Done! Updated ${result.documentIds.length} documents.`) } regenerateSlugs().catch((err) => { console.error(err) process.exit(1) })