@ts-for-gir/lib
Version:
Typescript .d.ts generator from GIR for gjs
98 lines (96 loc) • 3.55 kB
JavaScript
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