93 lines
2.8 KiB
JavaScript
93 lines
2.8 KiB
JavaScript
import fs from 'fs'
|
|
import path from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
|
|
const dropsSourceDir = path.join(__dirname, '../drops')
|
|
const dropsPublicDir = path.join(__dirname, '../app/public/drops')
|
|
const outputPath = path.join(__dirname, '../app/public/manifest.json')
|
|
|
|
/**
|
|
* Get all published drops by reading their meta.json files from the source drops directory
|
|
*/
|
|
const getPublishedDrops = () => {
|
|
const drops = fs
|
|
.readdirSync(dropsSourceDir, { withFileTypes: true })
|
|
.filter((dirent) => dirent.isDirectory())
|
|
.map((dirent) => dirent.name)
|
|
|
|
const publishedDrops = drops.filter((dropName) => {
|
|
const metaPath = path.join(dropsSourceDir, dropName, 'public/meta.json')
|
|
|
|
if (!fs.existsSync(metaPath)) {
|
|
console.warn(
|
|
`Warning: meta.json not found for drop "${dropName}", skipping...`,
|
|
)
|
|
return false
|
|
}
|
|
|
|
try {
|
|
const meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8'))
|
|
return meta.published === true
|
|
} catch (err) {
|
|
console.error(
|
|
`Error reading meta.json for drop "${dropName}":`,
|
|
err.message,
|
|
)
|
|
return false
|
|
}
|
|
})
|
|
|
|
return publishedDrops
|
|
}
|
|
|
|
const publishedDrops = getPublishedDrops()
|
|
|
|
// Only include drops that are both published and actually built (exist in public/drops)
|
|
const builtPublishedDrops = publishedDrops.filter((dropName) => {
|
|
const dropDir = path.join(dropsPublicDir, dropName)
|
|
return fs.existsSync(dropDir)
|
|
})
|
|
|
|
/**
|
|
* Sort drops by date (newest first)
|
|
*/
|
|
const sortDropsByDate = (dropNames) => {
|
|
const dropsWithDates = dropNames.map((dropName) => {
|
|
const metaPath = path.join(dropsPublicDir, dropName, 'meta.json')
|
|
let date = null
|
|
|
|
if (fs.existsSync(metaPath)) {
|
|
try {
|
|
const meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8'))
|
|
date = meta.date || null
|
|
} catch (err) {
|
|
console.warn(
|
|
`Warning: Could not read date from built meta.json for "${dropName}"`,
|
|
)
|
|
}
|
|
}
|
|
|
|
return { name: dropName, date }
|
|
})
|
|
|
|
// Sort by date descending (newest first), put drops without dates at the end
|
|
dropsWithDates.sort((a, b) => {
|
|
if (!a.date && !b.date) return 0
|
|
if (!a.date) return 1
|
|
if (!b.date) return -1
|
|
return new Date(b.date) - new Date(a.date)
|
|
})
|
|
|
|
return dropsWithDates.map((drop) => drop.name)
|
|
}
|
|
|
|
const sortedDrops = sortDropsByDate(builtPublishedDrops)
|
|
|
|
fs.writeFileSync(outputPath, JSON.stringify(sortedDrops, null, 2))
|
|
|
|
console.log(
|
|
`Manifest created with ${sortedDrops.length} published drop(s) (sorted by date):`,
|
|
sortedDrops,
|
|
)
|