UNPKG

@tryforge/forgescript

Version:

ForgeScript is a comprehensive package that empowers you to effortlessly interact with Discord's API. It ensures scripting remains easy to learn and consistently effective.

142 lines 6.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = require("fs"); const managers_1 = require("../managers"); const process_1 = require("process"); const structures_1 = require("../structures"); const enum_1 = require("./enum"); const translate_1 = require("./translate"); const path_1 = require("path"); const FunctionNameRegex = /(name: "\$?(\w+)"),?/m; const FunctionCategoryRegex = /\r?\n(.*)(category: "\$?(\w+)"),?/m; const ArgEnumRegex = /(?:enum: +(\w+),?|Arg\.(?:\w+)Enum\([\r\n\t ]?(\w+))/gim; const OutputRegex = /output:(array(<[A-z.]+>)?\((\w+)?\)|(\w+)|ArgType.(\w+)|\[((\w+|ArgType.(\w+)),?)+\]),/im; function getOutputValues(fn, txt, enums) { const output = OutputRegex.exec(txt.replace(/[^0-9A-z:,.[\]<>()|]/gm, ""))?.[1].replace(/[[\]]/g, "").trim(); if (!output) { if (fn.output) { structures_1.Logger.error(`OUTPUT LOOKUP FAILURE: in ${fn.name}, out: ${output}`); (0, process_1.exit)(); } return null; } const arr = new Array(); let i = 0; for (const out of output.split(/,/)) { const arrMatch = /array(?:<(.*)>)?\((\w+)?\)/gim.exec(out); const match = out.match(/\.(\w+)/)?.[1]; if (!arrMatch && match) arr.push(match); else { if (arrMatch) { const [, raw, enumName] = arrMatch; const types = raw?.replaceAll("ArgType.", "") ?? enumName; const isMultiple = types.includes("|"); arr.push(`${isMultiple ? `(${types.trim().split("|").join(" | ")})` : types}[]`); if (enumName) { const en = Array.isArray(fn.output) ? fn.output[i] : fn.output; if (!(enumName in enums)) enums[enumName] = (0, enum_1.enumToArray)(en); } } else { arr.push(out); const en = Array.isArray(fn.output) ? fn.output[i] : fn.output; if (!(out in enums)) enums[out] = (0, enum_1.enumToArray)(en); } } i++; } return arr; } async function default_1(functionsAbsolutePath, mainCategoryName, eventName, warnOnNoOutput = false, expose, eventsAbsolutePath, translate = []) { let total = 0; const enums = {}; if (expose?.length) Object.entries(expose).forEach(x => enums[x[0]] = (0, enum_1.enumToArray)(x[1])); structures_1.Logger.info(`Loading functions from ${functionsAbsolutePath}`); managers_1.FunctionManager.load("Metadata", functionsAbsolutePath); structures_1.Logger.info(`Loaded ${managers_1.FunctionManager["Functions"].size} functions`); const metaOutPath = "./metadata"; if (!(0, fs_1.existsSync)(metaOutPath)) (0, fs_1.mkdirSync)(metaOutPath); const v = require((0, process_1.cwd)() + "/package.json").version; if (mainCategoryName) { for (const [, fn] of managers_1.FunctionManager["Functions"]) { const nativePath = fn.path.replace(".js", ".ts").replace("dist", "src"); let txt = (0, fs_1.readFileSync)(nativePath, "utf-8"); const enumNames = Array.from(txt.matchAll(ArgEnumRegex)); if (enumNames.length) { let i = 0; for (const arg of fn.data.args) { if (arg.enum) { const data = enumNames[i++]; const name = data[1] ?? data[2]; Reflect.set(arg, "enumName", name); if (name in enums) continue; enums[name] = (0, enum_1.enumToArray)(arg.enum); } } } const output = getOutputValues(fn.data, txt, enums); if (output?.length) Reflect.set(fn.data, "output", output); else { if (warnOnNoOutput) structures_1.Logger.warn(`Function ${fn.name} does not return anything!`); total++; Reflect.deleteProperty(fn.data, "output"); } let modified = false; const pathSplits = fn.path.split(/(?:\\|\/)/gim); const category = pathSplits.at(-2) === mainCategoryName ? null : pathSplits.at(-2); if (category) Reflect.set(fn.data, "category", category); if (txt.includes("category: ")) { structures_1.Logger.warn("Deleting category block from " + fn.name); txt = txt.replace(FunctionCategoryRegex, ""); modified = true; } if (!fn.data.version) { fn.data.version = v; txt = txt.replace(FunctionNameRegex, `$1,\n version: "${v}",`); modified = true; } if (modified) (0, fs_1.writeFileSync)(nativePath, txt); } if (warnOnNoOutput) structures_1.Logger.warn(`${total.toLocaleString()} functions are missing output value`); (0, fs_1.writeFileSync)((0, path_1.join)(metaOutPath, "enums.json"), JSON.stringify(enums), "utf-8"); (0, fs_1.writeFileSync)((0, path_1.join)(metaOutPath, "functions.json"), JSON.stringify(managers_1.FunctionManager.toJSON())); } if (eventName) { if (!eventsAbsolutePath) throw new Error("An absolute path to events must be provided"); structures_1.Logger.info(`Loading events from ${eventsAbsolutePath}`); managers_1.EventManager.load(eventName, eventsAbsolutePath); const events = Object.values(managers_1.EventManager["Loaded"][eventName]); structures_1.Logger.info(`Loaded ${events.length} events from ${eventsAbsolutePath}`); for (const event of events) { const nativePath = `${eventsAbsolutePath.replace("dist", "src")}/${event.name}.ts`; const txt = (0, fs_1.readFileSync)(nativePath, "utf-8"); if (!event.data.version) { event.data.version = v; (0, fs_1.writeFileSync)(nativePath, txt.replace(FunctionNameRegex, `$1,\n version: "${v}",`)); } } (0, fs_1.writeFileSync)((0, path_1.join)(metaOutPath, "events.json"), JSON.stringify(managers_1.EventManager.toJSON(eventName))); } if (translate.length) { structures_1.Logger.info("Now translating data, hold tight..."); await (0, translate_1.translateData)({ languages: translate, events: eventName ? Object.values(managers_1.EventManager["Loaded"][eventName]).map(x => x.data) : [], functions: [...managers_1.FunctionManager["Functions"].values()].map(x => x.data) }); } } exports.default = default_1; //# sourceMappingURL=generateMetadata.js.map