ts-morph#MethodSignatureStructure TypeScript Examples
The following examples show how to use
ts-morph#MethodSignatureStructure.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: generator.ts From wsdl-tsclient with MIT License | 4 votes |
export async function generate(
parsedWsdl: ParsedWsdl,
outDir: string,
options: Partial<GeneratorOptions>
): Promise<void> {
const mergedOptions: GeneratorOptions = {
...defaultOptions,
...options,
};
const project = new Project();
const portsDir = path.join(outDir, "ports");
const servicesDir = path.join(outDir, "services");
const defDir = path.join(outDir, "definitions");
const allMethods: Method[] = [];
const allDefinitions: Definition[] = [];
const clientImports: Array<OptionalKind<ImportDeclarationStructure>> = [];
const clientServices: Array<OptionalKind<PropertySignatureStructure>> = [];
for (const service of parsedWsdl.services) {
const serviceFilePath = path.join(servicesDir, `${service.name}.ts`);
const serviceFile = project.createSourceFile(serviceFilePath, "", {
overwrite: true,
});
const serviceImports: Array<OptionalKind<ImportDeclarationStructure>> = [];
const servicePorts: Array<OptionalKind<PropertySignatureStructure>> = [];
for (const port of parsedWsdl.ports) {
const portFilePath = path.join(portsDir, `${port.name}.ts`);
const portFile = project.createSourceFile(portFilePath, "", {
overwrite: true,
});
const portImports: Array<OptionalKind<ImportDeclarationStructure>> = [];
const portFileMethods: Array<OptionalKind<MethodSignatureStructure>> = [];
for (const method of port.methods) {
// TODO: Deduplicate PortImports
if (method.paramDefinition !== null) {
if (!allDefinitions.includes(method.paramDefinition)) {
// Definition is not generated
generateDefinitionFile(
project,
method.paramDefinition,
defDir,
[method.paramDefinition.name],
allDefinitions,
mergedOptions
);
addSafeImport(
clientImports,
`./definitions/${method.paramDefinition.name}`,
method.paramDefinition.name
);
}
addSafeImport(
portImports,
`../definitions/${method.paramDefinition.name}`,
method.paramDefinition.name
);
}
if (method.returnDefinition !== null) {
if (!allDefinitions.includes(method.returnDefinition)) {
// Definition is not generated
generateDefinitionFile(
project,
method.returnDefinition,
defDir,
[method.returnDefinition.name],
allDefinitions,
mergedOptions
);
addSafeImport(
clientImports,
`./definitions/${method.returnDefinition.name}`,
method.returnDefinition.name
);
}
addSafeImport(
portImports,
`../definitions/${method.returnDefinition.name}`,
method.returnDefinition.name
);
}
// TODO: Deduplicate PortMethods
allMethods.push(method);
portFileMethods.push({
name: sanitizePropName(method.name),
parameters: [
{
name: camelcase(method.paramName),
type: method.paramDefinition ? method.paramDefinition.name : "{}",
},
{
name: "callback",
type: `(err: any, result: ${
method.returnDefinition ? method.returnDefinition.name : "unknown"
}, rawResponse: any, soapHeader: any, rawRequest: any) => void`, // TODO: Use ts-morph to generate proper type
},
],
returnType: "void",
});
} // End of PortMethod
if (!mergedOptions.emitDefinitionsOnly) {
addSafeImport(serviceImports, `../ports/${port.name}`, port.name);
servicePorts.push({
name: sanitizePropName(port.name),
isReadonly: true,
type: port.name,
});
portFile.addImportDeclarations(portImports);
portFile.addStatements([
{
leadingTrivia: (writer) => writer.newLine(),
isExported: true,
kind: StructureKind.Interface,
name: port.name,
methods: portFileMethods,
},
]);
Logger.log(`Writing Port file: ${path.resolve(path.join(portsDir, port.name))}.ts`);
portFile.saveSync();
}
} // End of Port
if (!mergedOptions.emitDefinitionsOnly) {
addSafeImport(clientImports, `./services/${service.name}`, service.name);
clientServices.push({ name: sanitizePropName(service.name), type: service.name });
serviceFile.addImportDeclarations(serviceImports);
serviceFile.addStatements([
{
leadingTrivia: (writer) => writer.newLine(),
isExported: true,
kind: StructureKind.Interface,
name: service.name,
properties: servicePorts,
},
]);
Logger.log(`Writing Service file: ${path.resolve(path.join(servicesDir, service.name))}.ts`);
serviceFile.saveSync();
}
} // End of Service
if (!mergedOptions.emitDefinitionsOnly) {
const clientFilePath = path.join(outDir, "client.ts");
const clientFile = project.createSourceFile(clientFilePath, "", {
overwrite: true,
});
clientFile.addImportDeclaration({
moduleSpecifier: "soap",
namedImports: [
{ name: "Client", alias: "SoapClient" },
{ name: "createClientAsync", alias: "soapCreateClientAsync" },
],
});
clientFile.addImportDeclarations(clientImports);
clientFile.addStatements([
{
leadingTrivia: (writer) => writer.newLine(),
isExported: true,
kind: StructureKind.Interface,
// docs: [`${parsedWsdl.name}Client`],
name: `${parsedWsdl.name}Client`,
properties: clientServices,
extends: ["SoapClient"],
methods: allMethods.map<OptionalKind<MethodSignatureStructure>>((method) => ({
name: sanitizePropName(`${method.name}Async`),
parameters: [
{
name: camelcase(method.paramName),
type: method.paramDefinition ? method.paramDefinition.name : "{}",
},
],
returnType: `Promise<[result: ${
method.returnDefinition ? method.returnDefinition.name : "unknown"
}, rawResponse: any, soapHeader: any, rawRequest: any]>`,
})),
},
]);
const createClientDeclaration = clientFile.addFunction({
name: "createClientAsync",
docs: [`Create ${parsedWsdl.name}Client`],
isExported: true,
parameters: [
{
isRestParameter: true,
name: "args",
type: "Parameters<typeof soapCreateClientAsync>",
},
],
returnType: `Promise<${parsedWsdl.name}Client>`, // TODO: `any` keyword is very dangerous
});
createClientDeclaration.setBodyText("return soapCreateClientAsync(args[0], args[1], args[2]) as any;");
Logger.log(`Writing Client file: ${path.resolve(path.join(outDir, "client"))}.ts`);
clientFile.saveSync();
}
// Create index file with re-exports
const indexFilePath = path.join(outDir, "index.ts");
const indexFile = project.createSourceFile(indexFilePath, "", {
overwrite: true,
});
indexFile.addExportDeclarations(
allDefinitions.map((def) => ({
namedExports: [def.name],
moduleSpecifier: `./definitions/${def.name}`,
}))
);
if (!mergedOptions.emitDefinitionsOnly) {
// TODO: Aggregate all exports during declarations generation
// https://ts-morph.com/details/exports
indexFile.addExportDeclarations([
{
namedExports: ["createClientAsync", `${parsedWsdl.name}Client`],
moduleSpecifier: "./client",
},
]);
indexFile.addExportDeclarations(
parsedWsdl.services.map((service) => ({
namedExports: [service.name],
moduleSpecifier: `./services/${service.name}`,
}))
);
indexFile.addExportDeclarations(
parsedWsdl.ports.map((port) => ({
namedExports: [port.name],
moduleSpecifier: `./ports/${port.name}`,
}))
);
}
Logger.log(`Writing Index file: ${path.resolve(path.join(outDir, "index"))}.ts`);
indexFile.saveSync();
}