plugify-plugins-types-generator
Version:
tool to generate d.ts for plugify plugins by pplugin file (ESM)
65 lines (57 loc) • 2.51 kB
text/typescript
import { plugifyParseCallbacks, plugifyParseEnums } from "./src/plugify/parser.js";
import { plugifyCallbacksGenerator } from "./src/ts-generator/callback.js";
import { plugifyEnumsGenerator } from "./src/ts-generator/enum.js";
import { plugifyMethodsGenerator } from "./src/ts-generator/method.js";
import { plugifyModuleGenerator } from "./src/ts-generator/module.js";
import { PlugifyPluginMetadata } from "./src/types/plugify.js";
import { writeDts } from "./src/plugify/utils.js";
import { readFileSync } from "fs";
import { plugifyNamespaceGenerator } from "./src/ts-generator/namespace.js";
/**
* @description Use to create dts from json
*/
export const generateDTS = ({ data: { docsURL, exportedMethods }, name }: { data: PlugifyPluginMetadata, name: string }, modulePrefix = ":") => {
// todo: validate docs url?
const docsViewer = "https://untrustedmodders.github.io/plugify-generator/?file="
const docsToItemURL = `${docsURL}/blob/main/${name}.pplugin.in`
const enumsMap = plugifyParseEnums(exportedMethods);
const prototypesMap = plugifyParseCallbacks(exportedMethods);
const callbacks = plugifyCallbacksGenerator(prototypesMap, docsViewer, docsToItemURL)
const enums = plugifyEnumsGenerator(enumsMap)
const methods = plugifyMethodsGenerator(exportedMethods, docsViewer, docsToItemURL)
// Our DTS content
return plugifyModuleGenerator([
enums,
plugifyNamespaceGenerator([callbacks]),
methods,
], {
name: name,
modulePrefix
})
}
/**
* @description Probably, you want to use this one to read from pplugin file & create d.ts or get content (without file)
*/
export const usePlugifyParser = (ppluginPath: string, dtsFolder: string = "./", writeFile: boolean, modulePrefix?: string) => {
const data = usePlugifyFileReader(ppluginPath)
if (writeFile) {
writeDts(dtsFolder, data.name, generateDTS(data, modulePrefix))
return;
}
return generateDTS(data, modulePrefix)
}
/**
* @description Use if you want read pplugin data from file
*/
export const usePlugifyFileReader = (path: string) => {
const data = JSON.parse(readFileSync(path, 'utf8')) as PlugifyPluginMetadata;
return usePlugifyReader(data)
}
/**
* @description Use if you want read pplugin data from memory
*/
export const usePlugifyReader = (data: PlugifyPluginMetadata) => {
// todo: make better plugin name parse?
const name = data.entryPoint.replace("bin/", "")
return { data, name }
}