UNPKG

@ts-for-gir/lib

Version:

Typescript .d.ts generator from GIR for gjs

98 lines (96 loc) 3.55 kB
import { Logger } from "../logger.js"; import { promisifyNamespaceFunctions } from "../gir/namespace.js"; import { override as overrideGLib } from "./dts/glib.js"; import { override as overrideGObject } from "./dts/gobject.js"; import { DtsGenerator } from "./dts.js"; export class DtsModuleGenerator extends DtsGenerator { log; constructor(namespace, options) { super(namespace, options); this.log = new Logger(options.verbose, DtsModuleGenerator.name); } generateNamespace(node) { const { namespace, options } = this; this.log.debug(`Resolving the types of ${namespace.namespace}...`); let suffix = ""; if (!options.noAdvancedVariants && node.namespace === "GLib") { suffix = `\n${overrideGLib(node)}\n`; } else if (node.namespace === "GObject") { suffix = `\n${overrideGObject(node)}\n`; } try { const { namespace: name, version } = node.dependency; const header = ` /** * ${name} ${version} * * Generated from ${node.package_version.join(".")} */ `; const base = ` `; if (options.promisify) { promisifyNamespaceFunctions(node); } const content = Array.from(node.members.values()) .map(m => { return `${(Array.isArray(m) ? m : [m]) .map(m => { const content = m.asString(this); return m.emit ? content : ""; }) .join("\n")}`; }) .join("\n"); // Resolve imports after we stringify everything else, sometimes we have to ad-hoc add an import. const imports = []; const metadata = ` /** * Name of the imported GIR library * @see https://gitlab.gnome.org/GNOME/gjs/-/blob/master/gi/ns.cpp#L188 */ export const __name__: string; /** * Version of the imported GIR library * @see https://gitlab.gnome.org/GNOME/gjs/-/blob/master/gi/ns.cpp#L189 */ export const __version__: string; `; const moduleIdentifier = `gi://${name}`; const versionedNamespaceIdentifier = `${name}${node.dependency.version.split(".")[0].replace(/[^A-z0-9_]/g, "_")}`; const versionedModuleIdentifier = `${moduleIdentifier}?version=${node.dependency.version}`; const [versionedModuleHeader, versionedModuleSuffix] = [ `declare module "${versionedModuleIdentifier}" { namespace ${versionedNamespaceIdentifier} {`, `}; export default ${versionedNamespaceIdentifier}; }` ]; const moduleDefinition = `declare module "${moduleIdentifier}" { export * from "${versionedModuleIdentifier}"; }`; const output = [ header, versionedModuleHeader, imports, base, content, suffix, metadata, versionedModuleSuffix, moduleDefinition ].join("\n\n"); this.log.debug(`Printing ${namespace.namespace}...`); return Promise.resolve(output); } catch (err) { this.log.error(`Failed to generate namespace: "${node.namespace}":`, err); return Promise.resolve(null); } } async stringifyNamespace(node) { return this.generateNamespace(node); } } //# sourceMappingURL=dts-modules.js.map