50 lines
1.4 KiB
TypeScript
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)
|
|
})
|