Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ Options:
client [string] [required]
--emitDefinitionsOnly Generate definitions only (interfaces and
types) [boolean]
--verbatimModuleSyntax Use import type instead of import for types
and interfaces [boolean]
--modelNamePreffix Prefix for generated interface names[string]
--modelNameSuffix Suffix for generated interface names[string]
--modelPropertyNaming Property naming convention ('camelCase' or
Expand Down
8 changes: 8 additions & 0 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ const conf = yargs(process.argv.slice(2))
type: "boolean",
description: "Generate definitions only (interfaces and types)",
})
.option("verbatimModuleSyntax", {
type: "boolean",
description: "Use import type instead of import for types and interfaces",
})
.option("modelNamePreffix", {
type: "string",
description: "Prefix for generated interface names",
Expand Down Expand Up @@ -104,6 +108,10 @@ if (conf.emitDefinitionsOnly) {
options.emitDefinitionsOnly = true;
}

if (conf.verbatimModuleSyntax) {
options.verbatimModuleSyntax = true;
}

if (conf.modelNamePreffix) {
options.modelNamePreffix = conf.modelNamePreffix;
}
Expand Down
31 changes: 21 additions & 10 deletions src/generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ export interface GeneratorOptions {
emitDefinitionsOnly: boolean;
modelPropertyNaming: ModelPropertyNaming;
esm: boolean;
verbatimModuleSyntax: boolean;
}

const defaultOptions: GeneratorOptions = {
emitDefinitionsOnly: false,
modelPropertyNaming: null,
esm: false,
verbatimModuleSyntax: false,
};

/**
Expand All @@ -30,10 +32,12 @@ const defaultOptions: GeneratorOptions = {
function addSafeImport(
imports: OptionalKind<ImportDeclarationStructure>[],
moduleSpecifier: string,
namedImport: string
namedImport: string,
isTypeOnly: boolean
) {
if (!imports.find((imp) => imp.moduleSpecifier == moduleSpecifier)) {
imports.push({
isTypeOnly,
moduleSpecifier,
namedImports: [{ name: namedImport }],
});
Expand Down Expand Up @@ -107,7 +111,7 @@ function generateDefinitionFile(
}
// If a property is of the same type as its parent type, don't add import
if (prop.ref.name !== definition.name) {
addSafeImport(definitionImports, `./${prop.ref.name}${options.esm ? ".js" : ""}`, prop.ref.name);
addSafeImport(definitionImports, `./${prop.ref.name}${options.esm ? ".js" : ""}`, prop.ref.name, options.verbatimModuleSyntax);
}
definitionProperties.push(createProperty(prop.name, prop.ref.name, prop.sourceName, prop.isArray));
}
Expand Down Expand Up @@ -180,13 +184,15 @@ export async function generate(
addSafeImport(
clientImports,
`./definitions/${method.paramDefinition.name}${mergedOptions.esm ? ".js" : ""}`,
method.paramDefinition.name
method.paramDefinition.name,
mergedOptions.verbatimModuleSyntax
);
}
addSafeImport(
portImports,
`../definitions/${method.paramDefinition.name}${mergedOptions.esm ? ".js" : ""}`,
method.paramDefinition.name
method.paramDefinition.name,
mergedOptions.verbatimModuleSyntax
);
}
if (method.returnDefinition !== null) {
Expand All @@ -203,13 +209,15 @@ export async function generate(
addSafeImport(
clientImports,
`./definitions/${method.returnDefinition.name}${mergedOptions.esm ? ".js" : ""}`,
method.returnDefinition.name
method.returnDefinition.name,
mergedOptions.verbatimModuleSyntax
);
}
addSafeImport(
portImports,
`../definitions/${method.returnDefinition.name}${mergedOptions.esm ? ".js" : ""}`,
method.returnDefinition.name
method.returnDefinition.name,
mergedOptions.verbatimModuleSyntax
);
}
// TODO: Deduplicate PortMethods
Expand All @@ -232,7 +240,7 @@ export async function generate(
});
} // End of PortMethod
if (!mergedOptions.emitDefinitionsOnly) {
addSafeImport(serviceImports, `../ports/${port.name}${mergedOptions.esm ? ".js" : ""}`, port.name);
addSafeImport(serviceImports, `../ports/${port.name}${mergedOptions.esm ? ".js" : ""}`, port.name, mergedOptions.verbatimModuleSyntax);
servicePorts.push({
name: sanitizePropName(port.name),
isReadonly: true,
Expand All @@ -254,7 +262,7 @@ export async function generate(
} // End of Port

if (!mergedOptions.emitDefinitionsOnly) {
addSafeImport(clientImports, `./services/${service.name}${mergedOptions.esm ? ".js" : ""}`, service.name);
addSafeImport(clientImports, `./services/${service.name}${mergedOptions.esm ? ".js" : ""}`, service.name, mergedOptions.verbatimModuleSyntax);
clientServices.push({ name: sanitizePropName(service.name), type: service.name });

serviceFile.addImportDeclarations(serviceImports);
Expand Down Expand Up @@ -282,7 +290,7 @@ export async function generate(
namedImports: [
{ name: "Client", alias: "SoapClient" },
{ name: "createClientAsync", alias: "soapCreateClientAsync" },
{ name: "IExOptions", alias: "ISoapExOptions" },
{ name: "IExOptions", alias: "ISoapExOptions", isTypeOnly: mergedOptions.verbatimModuleSyntax},
],
});
clientFile.addImportDeclarations(clientImports);
Expand Down Expand Up @@ -342,27 +350,30 @@ export async function generate(
allDefinitions.map((def) => ({
namedExports: [def.name],
moduleSpecifier: `./definitions/${def.name}${mergedOptions.esm ? ".js" : ""}`,
isTypeOnly: options.verbatimModuleSyntax,
}))
);
if (!mergedOptions.emitDefinitionsOnly) {
// TODO: Aggregate all exports during declarations generation
// https://ts-morph.com/details/exports
indexFile.addExportDeclarations([
{
namedExports: ["createClientAsync", `${parsedWsdl.name}Client`],
namedExports: [{name: "createClientAsync", isTypeOnly: false}, {name:`${parsedWsdl.name}Client`, isTypeOnly: mergedOptions.verbatimModuleSyntax}],
moduleSpecifier: `./client${mergedOptions.esm ? ".js" : ""}`,
},
]);
indexFile.addExportDeclarations(
parsedWsdl.services.map((service) => ({
namedExports: [service.name],
moduleSpecifier: `./services/${service.name}${mergedOptions.esm ? ".js" : ""}`,
isTypeOnly: mergedOptions.verbatimModuleSyntax,
}))
);
indexFile.addExportDeclarations(
parsedWsdl.ports.map((port) => ({
namedExports: [port.name],
moduleSpecifier: `./ports/${port.name}${mergedOptions.esm ? ".js" : ""}`,
isTypeOnly: mergedOptions.verbatimModuleSyntax,
}))
);
}
Expand Down
6 changes: 6 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ export interface Options {
* @default false
*/
emitDefinitionsOnly: boolean;
/**
* Use `import type` instead of `import` for types and interfaces
* @default false
*/
verbatimModuleSyntax: boolean;
/**
* Prefix for generated interface names
* @default ""
Expand Down Expand Up @@ -69,6 +74,7 @@ export interface Options {

export const defaultOptions: Options = {
emitDefinitionsOnly: false,
verbatimModuleSyntax: false,
modelNamePreffix: "",
modelNameSuffix: "",
caseInsensitiveNames: false,
Expand Down