@flymeth/datapackjs
Version:
A great library to create your own minecraft datapack with javascript!
88 lines (76 loc) • 2.62 kB
text/typescript
import { readFile, rmSync } from "fs";
import path from "path";
import Datapack, { buildDatas, dpOptions } from "..";
import buildEvent from "./readers/events";
import buildFunction from "./readers/functions";
import buildTag from "./readers/tags";
import buildAdvancement from "./readers/advancement";
import mk from "./utils/mk";
import buildRecipe from "./readers/recipe";
type buildConfig = {
/**
* datapacks/foo/[HERE]
*/
mainPath: string,
namespace: string,
options: dpOptions
}
var buildInfos:buildConfig = {
mainPath: ".",
namespace: "dpjs",
options: {}
}
async function initBuild(pck:Datapack) {
const {name, options, version, description, icon, namespace} = pck
if(!(
name && version && namespace
)) throw new Error(`Cannot build a datapack without his main informations!`)
const { buildPath, author } = options || {}
const mainFolderPath = path.join(buildPath || '.', name)
try {
rmSync(mainFolderPath, {recursive: true})
} catch (e) {}
buildInfos = {
mainPath: mainFolderPath,
namespace,
options: options || {}
}
mk("folder", path.join(mainFolderPath, "data", namespace))
if(icon) {
const ext = path.extname(icon)
if(ext !== "png") console.error(`".${ext}" is not a valid icon extention!`)
else readFile(path.join(__dirname, icon), (e, f) => {
if(e) return console.error(`"${icon}" is not a valid icon!`)
mk("file", path.join(mainFolderPath, "pack.png", f.toString('utf-8')))
})
}
const packFormat = {
"1.18": 8,
"1.18.2": 9,
"1.19": 10
}
const packmeta = {
pack: {
pack_format: packFormat[version] || version[version.length - 1],
description
}
}
mk("file", path.join(mainFolderPath, 'pack.mcmeta'), JSON.stringify(packmeta))
}
function build(...datas: buildDatas[]) {
const functions: {[key: string]: any} = {
"event": buildEvent,
"function": buildFunction,
"tag": buildTag,
"advancement": buildAdvancement,
"recipe": buildRecipe
}
for(const obj of datas) {
const f = functions[obj.ObjectType?.toLowerCase()]
if(!f) return console.error(`"${obj.ObjectType}" isn't a valid object type!`)
else f(obj, buildInfos)
}
console.info(`The datapack has been built inside ${buildInfos.mainPath}!`)
}
export default initBuild
export {build, initBuild, buildConfig}