@shabados/database
Version:
A digital representation of Sikh Bani and other Panthic texts.
72 lines (54 loc) • 2.18 kB
text/typescript
import { Glob } from 'bun'
import { readFile } from 'node:fs/promises'
import Ajv from 'ajv/dist/2020.js'
import consola from 'consola'
import dedent from 'dedent'
import { parse } from 'smol-toml'
const ajv = new Ajv({
allErrors: true,
})
const SCHEMA_PATH = './collections/$schemas'
const commonSchema = JSON.parse(await readFile(`${SCHEMA_PATH}/common.json`, 'utf-8'))
ajv.addSchema(commonSchema, 'common.json')
const validateCollection = async (schemaFile: string, collectionName: string) => {
consola.start(`Validating ${collectionName} using ${schemaFile} schema`)
const schemaContent = JSON.parse(await readFile(`${SCHEMA_PATH}/${schemaFile}`, 'utf-8'))
const validate = ajv.compile(schemaContent)
const collectionPath = `./collections/${collectionName}`
const glob = new Glob(`${collectionPath}/**/*.toml`)
const collection = glob.scan()
let hasErrors = false
for await (const filePath of collection) {
const data = parse(await readFile(filePath, 'utf-8'))
const isValid = validate(data)
const fileName = filePath.replace(`${collectionPath}/`, '')
if (!isValid) {
hasErrors = true
consola.error(
dedent`Invalid ${collectionName} document: ${fileName}
${validate.errors?.map((error) => `- ${error.instancePath || '/'} ${error.message}`).join('\n')}
`,
)
}
}
if (!hasErrors) {
consola.success(`Validated ${collectionName}\n`)
}
return !hasErrors
}
const validationConfigs = [
{ schemaFile: 'assets.json', collectionName: 'assets' },
{ schemaFile: 'authors.json', collectionName: 'authors' },
{ schemaFile: 'sources.json', collectionName: 'sources' },
{ schemaFile: 'sections.json', collectionName: 'sections' },
{ schemaFile: 'banis.json', collectionName: 'banis' },
{ schemaFile: 'line-groups.json', collectionName: 'line-groups' },
{ schemaFile: 'lines.json', collectionName: 'lines' },
]
consola.box('Validating collections')
let allSuccess = true
for (const config of validationConfigs) {
const success = await validateCollection(config.schemaFile, config.collectionName)
if (!success) allSuccess = false
}
process.exit(allSuccess ? 0 : 1)