cletus/node_modules/minecraft-data/typings/generate-typings.js
2025-05-09 15:53:19 -05:00

69 lines
2.4 KiB
JavaScript

const { compileFromFile } = require('json-schema-to-typescript')
const path = require('path')
const fs = require('fs')
const features = require('../minecraft-data/data/pc/common/features.json')
const templateTypings = fs.readFileSync(path.resolve(__dirname, './index-template.d.ts'), 'utf8')
// Recursively get path of all files in a directory
function walkSync (dir, fileList = []) {
const files = fs.readdirSync(dir)
files.forEach((file) => {
if (fs.statSync(path.join(dir, file)).isDirectory()) {
fileList = walkSync(path.join(dir, file), fileList)
} else {
fileList.push(path.join(dir, file))
}
})
return fileList
}
async function generate () {
let typingString = 'declare namespace MinecraftData {\n\n'
typingString += (
await Promise.all(
walkSync(path.resolve(__dirname, '../minecraft-data/schemas')).map(async (schemaPath) => {
if (schemaPath.includes('protocol_types')) return
return (await compileFromFile(schemaPath, { bannerComment: '' })).replace(/export /g, '')
})
)
)
.join('\n\n')
.split('\n')
.map((line) => ' ' + line)
.join('\n')
// #region supports features
typingString += '\n\n export interface SupportsFeature {\n'
// prevent duplicates, use last feature with the same name
const featureNames = features.map(feature => feature.name)
const featuresUnique = features.filter(({ name }, i) => featureNames.lastIndexOf(name) === i)
for (const feature of featuresUnique) {
const versionsRange = feature.values
? ''
: feature.version
? feature.version
: feature.versions.join(' - ')
const valueType = feature.values ? feature.values.map(({ value }) => JSON.stringify(value)).join(' | ') : 'boolean'
typingString += ' /**' + (versionsRange && ` \`${versionsRange}\``) + '\n' + ' * ' + feature.description + ' */\n'
typingString += ' "' + feature.name.replaceAll('"', '\\"') + `": ${valueType};\n`
}
typingString += ' }\n\n'
// #endregion
typingString += templateTypings
.split('\n')
.map((line) => ' ' + line)
.join('\n')
typingString += '\n}\n\n' // Close namespace
typingString += 'declare function MinecraftData(version: string | number): MinecraftData.IndexedData;\n'
typingString += 'export = MinecraftData'
fs.writeFileSync(path.resolve(__dirname, '../index.d.ts'), typingString)
}
generate()
.then(() => console.log('Generated index.d.ts'))
.catch((err) => console.error(err.stack))