trptk-sanity/scripts/regenerate-release-slugs.ts
2026-02-24 12:22:46 +01:00

50 lines
1.4 KiB
TypeScript

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