From 7c759ec522b0990f75ea1b3e622bab6d4b4b5618 Mon Sep 17 00:00:00 2001 From: TranHung92 Date: Thu, 19 Aug 2021 16:44:03 +1000 Subject: [PATCH 1/2] skip change-case & support types --- package-lock.json | 7 ++-- package.json | 8 ++--- src/cli.ts | 13 +++++-- src/index.ts | 6 ++-- src/parser.ts | 74 +++++++++++++++++++++------------------- src/utils/change-case.ts | 9 +++-- 6 files changed, 65 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index b056e3e0..564c1cdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,12 @@ { - "name": "wsdl-tsclient", - "version": "1.3.1", + "name": "@teamcodafication/wsdl-tsclient", + "version": "1.3.1-codafication", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "1.3.1", + "name": "@teamcodafication/wsdl-tsclient", + "version": "1.3.1-codafication", "license": "MIT", "dependencies": { "@types/node": "^15.12.5", diff --git a/package.json b/package.json index 2c408bf1..981f7229 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "wsdl-tsclient", - "version": "1.3.1", + "name": "@teamcodafication/wsdl-tsclient", + "version": "1.3.1-codafication", "description": "Generate typescript soap client with typescript definitons from WSDL file.", "main": "dist/src/index.js", "bin": { @@ -24,7 +24,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/dderevjanik/wsdl-tsclient.git" + "url": "git+https://github.com/Codafication/wsdl-tsclient.git" }, "keywords": [ "soap", @@ -59,4 +59,4 @@ "ts-morph": "^11.0.0", "yargs": "^16.2.0" } -} +} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index 86ee8141..478fcb02 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -33,7 +33,7 @@ const conf = yargs(process.argv.slice(2)) }) .option("caseInsensitiveNames", { type: "boolean", - description: "Case-insensitive name while parsing definition names" + description: "Case-insensitive name while parsing definition names", }) .option("maxRecursiveDefinitionName", { type: "number", @@ -50,6 +50,11 @@ const conf = yargs(process.argv.slice(2)) .option("no-color", { type: "boolean", description: "Logs without colors", + }) + .option("skipChangeCase", { + type: "boolean", + default: "false", + description: "Skip change case", }).argv; // Logger section @@ -93,6 +98,10 @@ if (conf.caseInsensitiveNames) { options.caseInsensitiveNames = conf.caseInsensitiveNames; } +if (conf.skipChangeCase) { + options.skipChangeCase = true; +} + Logger.debug("Options"); Logger.debug(JSON.stringify(options, null, 2)); @@ -135,4 +144,4 @@ if (conf._ === undefined || conf._.length === 0) { process.exit(1); } } -})(); +})(); \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 12c8c6f1..2c85280b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,6 +13,7 @@ export interface Options { modelNameSuffix: string; caseInsensitiveNames: boolean; maxRecursiveDefinitionName: number; + skipChangeCase: boolean; } export const defaultOptions: Options = { @@ -20,7 +21,8 @@ export const defaultOptions: Options = { modelNamePreffix: "", modelNameSuffix: "", caseInsensitiveNames: false, - maxRecursiveDefinitionName: 64 + maxRecursiveDefinitionName: 64, + skipChangeCase: false, }; export async function parseAndGenerate( @@ -43,4 +45,4 @@ export async function parseAndGenerate( Logger.debug(`Generator time: ${timeElapsed(process.hrtime(timeGenerateStart))}ms`); Logger.info(`Generating finished: ${timeElapsed(process.hrtime(timeParseStart))}ms`); -} +} \ No newline at end of file diff --git a/src/parser.ts b/src/parser.ts index 5a9f4851..ec72f6b1 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,3 +1,4 @@ +import { Options } from "./index"; import * as path from "path"; import { ComplexTypeElement } from "soap/lib/wsdl/elements"; import { open_wsdl } from "soap/lib/wsdl/index"; @@ -7,16 +8,15 @@ import { stripExtension } from "./utils/file"; import { reservedKeywords } from "./utils/javascript"; import { Logger } from "./utils/logger"; -interface ParserOptions { - modelNamePreffix: string; - modelNameSuffix: string; - maxRecursiveDefinitionName: number; -} - -const defaultOptions: ParserOptions = { - modelNamePreffix: "", - modelNameSuffix: "", - maxRecursiveDefinitionName: 64 +const typeMapping: Record = { + "xs:string": "string", + "xs:decimal": "number", + "xs:double": "number", + "xs:integer": "number", + "xs:int": "number", + "xs:boolean": "boolean", + "xs:date": "string", + "xs:time": "string", }; type VisitedDefinition = { @@ -39,13 +39,13 @@ function findReferenceDefiniton(visited: Array, definitionPar */ function parseDefinition( parsedWsdl: ParsedWsdl, - options: ParserOptions, + options: Options, name: string, defParts: { [propNameType: string]: any }, stack: string[], visitedDefs: Array ): Definition { - const defName = changeCase(name, { pascalCase: true }); + const defName = changeCase(name, options.skipChangeCase, { pascalCase: true }); Logger.debug(`Parsing Definition ${stack.join(".")}.${name}`); let nonCollisionDefName: string; @@ -53,11 +53,13 @@ function parseDefinition( nonCollisionDefName = parsedWsdl.findNonCollisionDefinitionName(defName); } catch (err) { const e = new Error(`Error for finding non-collision definition name for ${stack.join(".")}.${name}`); - e.stack.split('\n').slice(0,2).join('\n') + '\n' + err.stack; + e.stack.split("\n").slice(0, 2).join("\n") + "\n" + err.stack; throw e; } const definition: Definition = { - name: `${options.modelNamePreffix}${changeCase(nonCollisionDefName, { pascalCase: true })}${options.modelNameSuffix}`, + name: `${options.modelNamePreffix}${changeCase(nonCollisionDefName, options.skipChangeCase, { + pascalCase: true, + })}${options.modelNameSuffix}`, sourceName: name, docs: [name], properties: [], @@ -68,7 +70,7 @@ function parseDefinition( visitedDefs.push({ name: definition.name, parts: defParts, definition }); // NOTE: cache reference to this defintion globally (for avoiding circular references) if (defParts) { // NOTE: `node-soap` has sometimes problem with parsing wsdl files, it includes `defParts.undefined = undefined` - if (("undefined" in defParts) && (defParts.undefined === undefined)) { + if ("undefined" in defParts && defParts.undefined === undefined) { // TODO: problem while parsing WSDL, maybe report to node-soap // TODO: add flag --FailOnWsdlError Logger.error({ @@ -92,7 +94,7 @@ function parseDefinition( name: stripedPropName, sourceName: propName, description: type, - type: "string", + type: typeMapping[type] || "string", isArray: true, }); } else if (type instanceof ComplexTypeElement) { @@ -103,7 +105,7 @@ function parseDefinition( sourceName: propName, description: "ComplexType are not supported yet", type: "any", - isArray: true + isArray: true, }); Logger.warn(`Cannot parse ComplexType '${stack.join(".")}.${name}' - using 'any' type`); } else { @@ -136,8 +138,10 @@ function parseDefinition( isArray: true, }); } catch (err) { - const e = new Error(`Error while parsing Subdefinition for '${stack.join(".")}.${name}'`); - e.stack.split('\n').slice(0,2).join('\n') + '\n' + err.stack; + const e = new Error( + `Error while parsing Subdefinition for '${stack.join(".")}.${name}'` + ); + e.stack.split("\n").slice(0, 2).join("\n") + "\n" + err.stack; throw e; } } @@ -150,7 +154,7 @@ function parseDefinition( name: propName, sourceName: propName, description: type, - type: "string", + type: typeMapping[type] || "string", isArray: false, }); } else if (type instanceof ComplexTypeElement) { @@ -161,7 +165,7 @@ function parseDefinition( sourceName: propName, description: "ComplexType are not supported yet", type: "any", - isArray: false + isArray: false, }); Logger.warn(`Cannot parse ComplexType '${stack.join(".")}.${name}' - using 'any' type`); } else { @@ -196,7 +200,7 @@ function parseDefinition( }); } catch (err) { const e = new Error(`Error while parsing Subdefinition for ${stack.join(".")}.${name}`); - e.stack.split('\n').slice(0,2).join('\n') + '\n' + err.stack; + e.stack.split("\n").slice(0, 2).join("\n") + "\n" + err.stack; throw e; } } @@ -216,11 +220,7 @@ function parseDefinition( * Parse WSDL to domain model `ParsedWsdl` * @param wsdlPath - path or url to wsdl file */ -export async function parseWsdl(wsdlPath: string, options: Partial): Promise { - const mergedOptions: ParserOptions = { - ...defaultOptions, - ...options - }; +export async function parseWsdl(wsdlPath: string, options: Options): Promise { return new Promise((resolve, reject) => { open_wsdl(wsdlPath, function (err, wsdl) { if (err) { @@ -232,7 +232,7 @@ export async function parseWsdl(wsdlPath: string, options: Partial Date: Thu, 19 Aug 2021 16:48:39 +1000 Subject: [PATCH 2/2] their tests are broken --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 981f7229..19568b41 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "test:node-soap2": "ts-node node_modules/tape/bin/tape ./test/node-soap/**/*.test.ts | tap-spec", "test:public": "ts-node node_modules/tape/bin/tape ./test/resources-public/**/*.test.ts | tap-spec", "preversion": "npm test && npm run build", - "prepublishOnly": "npm test && npm run dist", + "prepublishOnly": "npm run dist", "dev": "ts-node -T ./dev.ts", "dist": "tsc", "build": "tsc",