From 9cf11d0e4f5f3c8444d32193ba6f219d5af25b52 Mon Sep 17 00:00:00 2001 From: petrhavel2 Date: Tue, 17 Oct 2023 09:35:38 +0200 Subject: [PATCH] upgrade dist folder --- dist/common.js | 192 ++++++++++++++++++ dist/common.js.map | 1 + dist/common/generate.js | 23 +++ dist/common/generate.js.map | 1 + dist/common/templates/formArrayExtended.ts | 23 +++ dist/common/templates/formMap.ts | 28 +++ dist/common/templates/utils.ts | 52 +++++ dist/conf.js | 56 +++++ dist/conf.js.map | 1 + dist/definitions.js | 111 ++++++++++ dist/definitions.js.map | 1 + dist/forms/generate-form-modules.js | 55 +++++ dist/forms/generate-form-modules.js.map | 1 + dist/forms/generate-form-service.js | 179 ++++++++++++++++ dist/forms/generate-form-service.js.map | 1 + dist/forms/process-module.js | 41 ++++ dist/forms/process-module.js.map | 1 + dist/forms/shared-module.js | 28 +++ dist/forms/shared-module.js.map | 1 + dist/forms/states/generate-http-actions.js | 78 +++++++ .../forms/states/generate-http-actions.js.map | 1 + dist/forms/states/generate-http-effects.js | 63 ++++++ .../forms/states/generate-http-effects.js.map | 1 + dist/forms/states/generate-http-reducers.js | 63 ++++++ .../states/generate-http-reducers.js.map | 1 + dist/generate.js | 68 +++++++ dist/generate.js.map | 1 + dist/index.js | 19 ++ dist/index.js.map | 1 + dist/requests/process-controller.js | 69 +++++++ dist/requests/process-controller.js.map | 1 + dist/requests/process-method.js | 192 ++++++++++++++++++ dist/requests/process-method.js.map | 1 + dist/requests/process-params.js | 61 ++++++ dist/requests/process-params.js.map | 1 + dist/requests/process-paths.js | 86 ++++++++ dist/requests/process-paths.js.map | 1 + dist/requests/process-responses.js | 59 ++++++ dist/requests/process-responses.js.map | 1 + dist/requests/requests.models.js | 3 + dist/requests/requests.models.js.map | 1 + dist/types.js | 3 + dist/types.js.map | 1 + dist/utils.js | 164 +++++++++++++++ dist/utils.js.map | 1 + 45 files changed, 1737 insertions(+) create mode 100644 dist/common.js create mode 100644 dist/common.js.map create mode 100644 dist/common/generate.js create mode 100644 dist/common/generate.js.map create mode 100644 dist/common/templates/formArrayExtended.ts create mode 100644 dist/common/templates/formMap.ts create mode 100644 dist/common/templates/utils.ts create mode 100644 dist/conf.js create mode 100644 dist/conf.js.map create mode 100644 dist/definitions.js create mode 100644 dist/definitions.js.map create mode 100644 dist/forms/generate-form-modules.js create mode 100644 dist/forms/generate-form-modules.js.map create mode 100644 dist/forms/generate-form-service.js create mode 100644 dist/forms/generate-form-service.js.map create mode 100644 dist/forms/process-module.js create mode 100644 dist/forms/process-module.js.map create mode 100644 dist/forms/shared-module.js create mode 100644 dist/forms/shared-module.js.map create mode 100644 dist/forms/states/generate-http-actions.js create mode 100644 dist/forms/states/generate-http-actions.js.map create mode 100644 dist/forms/states/generate-http-effects.js create mode 100644 dist/forms/states/generate-http-effects.js.map create mode 100644 dist/forms/states/generate-http-reducers.js create mode 100644 dist/forms/states/generate-http-reducers.js.map create mode 100644 dist/generate.js create mode 100644 dist/generate.js.map create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 dist/requests/process-controller.js create mode 100644 dist/requests/process-controller.js.map create mode 100644 dist/requests/process-method.js create mode 100644 dist/requests/process-method.js.map create mode 100644 dist/requests/process-params.js create mode 100644 dist/requests/process-params.js.map create mode 100644 dist/requests/process-paths.js create mode 100644 dist/requests/process-paths.js.map create mode 100644 dist/requests/process-responses.js create mode 100644 dist/requests/process-responses.js.map create mode 100644 dist/requests/requests.models.js create mode 100644 dist/requests/requests.models.js.map create mode 100644 dist/types.js create mode 100644 dist/types.js.map create mode 100644 dist/utils.js create mode 100644 dist/utils.js.map diff --git a/dist/common.js b/dist/common.js new file mode 100644 index 00000000..4bddb597 --- /dev/null +++ b/dist/common.js @@ -0,0 +1,192 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getObjectPropSetter = exports.getAccessor = exports.translateType = exports.normalizeDef = exports.processProperty = void 0; +const _ = require("lodash"); +const tsutils_1 = require("tsutils"); +const conf = require("./conf"); +const utils_1 = require("./utils"); +/** + * Processes one property of the type + * @param prop property definition + * @param name property name + * @param namespace usage context for type name uniqueness + */ +function processProperty(prop, name = '', namespace = '', required = false, exportEnums = true) { + let type; + let enumDeclaration; + let native = true; + let isMap = false; + if (prop.properties) { + return _.flatMap(prop.properties, (v, k) => processProperty(v, k, namespace, prop.required)); + } + if (prop.enum || (prop.items && prop.items.enum)) { + type = _.upperFirst(name); + // file added to make the enum globally unique + type += _.upperFirst(namespace); + if (!type.match(/Enum/)) + type += 'Enum'; + const list = prop.enum || prop.items.enum; + const exp = exportEnums ? 'export ' : ''; + let enumValues; + if (typeof list[0] === 'number') { + enumValues = (0, utils_1.indent)(list.join(' |\n')); + } + else { + enumValues = (0, utils_1.indent)('\'' + list.join('\' |\n\'')) + '\''; + } + enumDeclaration = `${exp}type ${type} =\n${enumValues};`; + if (prop.type === 'array') + type += '[]'; + } + else { + let defType; + switch (prop.type) { + case undefined: + defType = translateType(prop.$ref); + type = defType.type; + break; + case 'array': + defType = translateType(prop.items && (prop.items.type || prop.items.$ref)); + const itemProp = processProperty(prop.items)[0]; + type = `${itemProp.property}[]`; + break; + default: + if (prop.additionalProperties) { + const ap = prop.additionalProperties; + let additionalType; + if (ap.type === 'array') { + defType = translateType(ap.items && (ap.items.type || ap.items.$ref)); + additionalType = `${defType.type}[]`; + } + else { + defType = translateType(prop.additionalProperties.type || + prop.additionalProperties.$ref); + additionalType = defType.type; + } + if (name) { + type = `{[key: string]: ${additionalType}}`; + } + else { + name = '[key: string]'; + type = additionalType; + isMap = true; + } + } + else { + defType = translateType(prop.type); + type = defType.type; + } + } + native = defType.native; + } + let optional = ''; + if (required === false && !isMap) + optional = '?'; + else if (Array.isArray(required) && !required.includes(name)) { + optional = '?'; + } + let readOnly = ''; + if (prop.readOnly) + readOnly = 'readonly '; + const comments = []; + if (prop.description) + comments.push(prop.description); + if (prop.example) + comments.push(`example: ${prop.example}`); + if (prop.format) + comments.push(`format: ${prop.format}`); + if (prop.default) + comments.push(`default: ${prop.default}`); + const comment = (0, utils_1.makeComment)(comments); + let property; + let propertyAsMethodParameter; + // pure type is returned if no name is specified + if (name) { + if (!isMap) + name = getAccessor(name); + property = `${comment}${readOnly}${name}${optional}: ${type};`; + propertyAsMethodParameter = `${name}${optional}: ${type}`; + } + else { + property = `${type}`; + propertyAsMethodParameter = property; + } + return [{ property, propertyAsMethodParameter, enumDeclaration, native, isRequired: optional !== '?' }]; +} +exports.processProperty = processProperty; +/** + * - recursive inside-out unwrapping of generics + * - space removal e.g. + * getFilename('PagedResources«Page«ItemCategoryDto»»') => + * 'ItemCategoryDtoPagePagedResources' + * @param type original type name + * @return normalized type name + */ +function normalizeDef(type) { + let res = ''; + while (true) { + const generic = type.match(/([^«]+)«(.+)»/); + if (!generic) { + break; + } + res = generic[1] + res; + type = generic[2]; + } + res = type + res; + res = res.trim(); + res = res.replace(/\./g, ' '); + if (res.match(/ /)) { + res = _.camelCase(res); + } + res = _.upperFirst(res); + return res; +} +exports.normalizeDef = normalizeDef; +/** + * Translates schema type into native/defined type for typescript + * @param type definition + */ +function translateType(type) { + if (type in conf.nativeTypes) { + const typeType = type; + return { type: conf.nativeTypes[typeType], native: true }; + } + const subtype = type.match(/^#\/definitions\/(.*)/); + if (subtype) + return resolveDefType(subtype[1]); + return { type, native: true }; +} +exports.translateType = translateType; +/** + * Checks whether the type should reference internally defined type + * and returns its reference to globally exported interfaces + * @param type + */ +function resolveDefType(type) { + // check direct native types for definitions and generics + // does not seem to happen but the function is ready for that + if (type in conf.nativeTypes) { + const typedType = type; + return { type: conf.nativeTypes[typedType], native: true }; + } + type = normalizeDef(type); + return { type: `__${conf.modelFile}.${type}`, native: false }; +} +function getAccessor(key, propName = '') { + let res = key; + if ((0, tsutils_1.isValidPropertyName)(key)) { + if (propName) + return `${propName}.${res}`; + return res; + } + res = `'${res}'`; + if (propName) + return `${propName}[${res}]`; + return res; +} +exports.getAccessor = getAccessor; +function getObjectPropSetter(key, propName, suffix = '') { + return `${getAccessor(key)}: ${getAccessor(key, propName)}${suffix},`; +} +exports.getObjectPropSetter = getObjectPropSetter; +//# sourceMappingURL=common.js.map \ No newline at end of file diff --git a/dist/common.js.map b/dist/common.js.map new file mode 100644 index 00000000..7e405cbc --- /dev/null +++ b/dist/common.js.map @@ -0,0 +1 @@ +{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/common/generate.js b/dist/common/generate.js new file mode 100644 index 00000000..467a4aaa --- /dev/null +++ b/dist/common/generate.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.writeTemplate = exports.addFormExtensions = exports.addUtils = void 0; +const fs_1 = require("fs"); +const path_1 = require("path"); +const utils_1 = require("../utils"); +function addUtils(dest) { + writeTemplate((0, path_1.join)(dest, `utils.ts`)); +} +exports.addUtils = addUtils; +function addFormExtensions(dest) { + writeTemplate((0, path_1.join)(dest, `formArrayExtended.ts`)); + writeTemplate((0, path_1.join)(dest, `formMap.ts`)); +} +exports.addFormExtensions = addFormExtensions; +function writeTemplate(dst) { + const srcFileName = (0, path_1.join)(__dirname, 'templates', (0, path_1.basename)(dst)); + const dstFileName = (0, path_1.join)(dst); + const content = (0, fs_1.readFileSync)(srcFileName).toString(); + (0, utils_1.writeFile)(dstFileName, content, undefined, 'ts', []); +} +exports.writeTemplate = writeTemplate; +//# sourceMappingURL=generate.js.map \ No newline at end of file diff --git a/dist/common/generate.js.map b/dist/common/generate.js.map new file mode 100644 index 00000000..7273af9a --- /dev/null +++ b/dist/common/generate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/common/generate.ts"],"names":[],"mappings":";;;AAAA,2BAAgC;AAChC,+BAAoC;AAEpC,oCAAmC;AAEnC,SAAgB,QAAQ,CAAC,IAAY;IACnC,aAAa,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;AACxC,CAAC;AAFD,4BAEC;AAED,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,aAAa,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAClD,aAAa,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;AAC1C,CAAC;AAHD,8CAGC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,WAAW,EAAE,IAAA,eAAQ,EAAC,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrD,IAAA,iBAAS,EAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AALD,sCAKC"} \ No newline at end of file diff --git a/dist/common/templates/formArrayExtended.ts b/dist/common/templates/formArrayExtended.ts new file mode 100644 index 00000000..0bf715e7 --- /dev/null +++ b/dist/common/templates/formArrayExtended.ts @@ -0,0 +1,23 @@ +import {AbstractControl, FormArray} from '@angular/forms'; +import {ControlFactory} from './utils'; + +/** Extends FormArray so it contains definition of items for further creation */ +export class FormArrayExtended extends FormArray { + constructor(public createControl: ControlFactory, controls: AbstractControl[], ...rest: any[]) { + super(controls, ...rest); + } + + override setValue(value: any[], options: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { + this.setSize(value.length); + super.setValue(value, options); + } + + /** + * Sets specified number of controls in the array + * @param size of the array + */ + setSize(size: number) { + while (size < this.controls.length) this.removeAt(0); + while (size > this.controls.length) this.push(this.createControl()); + } +} diff --git a/dist/common/templates/formMap.ts b/dist/common/templates/formMap.ts new file mode 100644 index 00000000..7b7f0e3b --- /dev/null +++ b/dist/common/templates/formMap.ts @@ -0,0 +1,28 @@ +import {AbstractControl, FormGroup} from '@angular/forms'; +import {ControlFactory} from './utils'; + +/** Extends FormGroup so it contains definition of map items for further creation */ +export class FormMap extends FormGroup { + constructor(public createControl: ControlFactory, controls: Record, ...rest: any[]) { + super(controls, ...rest); + } + + override setValue(value: Record, options: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { + this.setShape(Object.keys(value)); + super.setValue(value, options); + } + + /** + * Sets child controls for a specified list of keys + * @param keys list of keys new form group should contain + */ + setShape(keys: string[]) { + const allKeys = new Set([...keys, ...Object.keys(this.controls)]); + allKeys.forEach(key => { + // add control for a new one + if (!(key in this.controls)) this.addControl(key, this.createControl()); + // remove control if missing + else if (!keys.includes(key)) this.removeControl(key); + }); + } +} diff --git a/dist/common/templates/utils.ts b/dist/common/templates/utils.ts new file mode 100644 index 00000000..ce465b0f --- /dev/null +++ b/dist/common/templates/utils.ts @@ -0,0 +1,52 @@ +import {AbstractControl, FormArray, FormControl, FormGroup} from '@angular/forms'; + +import {FormArrayExtended} from './formArrayExtended'; +import {FormMap} from './formMap'; + +export type ControlFactory = () => AbstractControl; + +/** + * Recursively sets values of nested controls so nested object === null/undefined + * does not cause failure as in case of AbstractControl.patchValue + * @param control target FormControl, FormArray or FormGroup + * @param value source data + */ +export function safeSetValue(control: AbstractControl, value: any) { + if (control instanceof FormControl) { + control.setValue(value, {emitEvent: false}); + return; + } + + if (control instanceof FormArrayExtended) { + if (nullOrUndef(value)) value = []; + if (!Array.isArray(value)) throw new TypeError(`Cannot set value '${value}' on FormArrayExtended`); + + control.setSize(value.length); + control.controls.forEach((c, idx) => safeSetValue(c, value[idx])); + } else if (control instanceof FormMap) { + if (nullOrUndef(value)) value = {}; + if (typeof value !== 'object' || Array.isArray(value)) { + throw new TypeError(`Cannot set value '${value}' on FormMap`); + } + + control.setShape(Object.keys(value)); + Object.entries(control.controls).forEach(([name, c]) => safeSetValue(c, value[name])); + } else if (control instanceof FormArray) { + control.controls.forEach((child, idx) => + safeSetValue(child, getValue(value, idx))); + } else if (control instanceof FormGroup) { + Object.keys(control.controls).forEach(name => { + safeSetValue(control.controls[name], getValue(value, name)); + }); + } +} + +function nullOrUndef(input: any) { + return input === undefined || input === null; +} + +function getValue(input: any, attribute: string | number) { + return nullOrUndef(input) || typeof input !== 'object' ? + undefined : + input[attribute]; +} diff --git a/dist/conf.js b/dist/conf.js new file mode 100644 index 00000000..a39cff47 --- /dev/null +++ b/dist/conf.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.adHocExceptions = exports.controllerIgnores = exports.allowedParams = exports.nativeTypes = exports.swaggerFile = exports.omitVersion = exports.swaggerUrlPath = exports.indentation = exports.modelFile = exports.apiFile = exports.stateDir = exports.storeDir = exports.apiDir = exports.defsDir = exports.commonDir = exports.outDir = void 0; +// relative to project root +exports.outDir = 'src/api'; +exports.commonDir = 'common'; +exports.defsDir = 'defs'; +exports.apiDir = 'controllers'; +exports.storeDir = 'store'; +exports.stateDir = 'states'; +exports.apiFile = 'conf/api/api-docs.json'; +exports.modelFile = 'model'; +exports.indentation = 2; +exports.swaggerUrlPath = '/swagger'; +exports.omitVersion = false; +// part of path in url +exports.swaggerFile = '/swagger-ui.html#!/'; +// mapping from swagger native types to javascript types +exports.nativeTypes = { + binary: 'number', + boolean: 'boolean', + byte: 'number', + date: 'string', + dateTime: 'string', + double: 'number', + file: 'File', + float: 'number', + integer: 'number', + long: 'number', + number: 'number', + object: 'object', + password: 'string', + string: 'string', +}; +// list of parameter types accepted by methods +// ordered as they are passed to api service methods +// The 'parameters: []' type is only technical and serves for situations when common parameters are defined +// on the same level as HTTP methods +exports.allowedParams = { + get: ['path', 'query', 'header'], + patch: ['path', 'body', 'query', 'formData', 'header'], + post: ['path', 'body', 'query', 'formData', 'header'], + put: ['path', 'body', 'query', 'header'], + delete: ['path', 'header'], +}; +// list of simplified names of controllers +// that do not to generate api layer +exports.controllerIgnores = ['BackOffice']; +// implemented only for api +// once other one is needed, make it file-based +exports.adHocExceptions = { + api: { + Help: [/^ itemNumbers\?: ref;$/m, ' itemNumbers?: number[]'], + }, +}; +//# sourceMappingURL=conf.js.map \ No newline at end of file diff --git a/dist/conf.js.map b/dist/conf.js.map new file mode 100644 index 00000000..b681c4bf --- /dev/null +++ b/dist/conf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"conf.js","sourceRoot":"","sources":["../src/conf.ts"],"names":[],"mappings":";;;AAGA,2BAA2B;AACd,QAAA,MAAM,GAAG,SAAS,CAAC;AACnB,QAAA,SAAS,GAAG,QAAQ,CAAC;AACrB,QAAA,OAAO,GAAG,MAAM,CAAC;AACjB,QAAA,MAAM,GAAG,aAAa,CAAC;AACvB,QAAA,QAAQ,GAAG,OAAO,CAAC;AACnB,QAAA,QAAQ,GAAG,QAAQ,CAAC;AACpB,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,SAAS,GAAG,OAAO,CAAC;AACpB,QAAA,WAAW,GAAG,CAAC,CAAC;AAChB,QAAA,cAAc,GAAG,UAAU,CAAC;AAC5B,QAAA,WAAW,GAAG,KAAK,CAAC;AACjC,sBAAsB;AACT,QAAA,WAAW,GAAG,qBAAqB,CAAC;AAEjD,wDAAwD;AAC3C,QAAA,WAAW,GAAmC;IACzD,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,8CAA8C;AAC9C,oDAAoD;AACpD,2GAA2G;AAC3G,oCAAoC;AACvB,QAAA,aAAa,GAA2C;IACnE,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IAChC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;IACtD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;IACrD,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IACxC,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC3B,CAAC;AACF,0CAA0C;AAC1C,oCAAoC;AACvB,QAAA,iBAAiB,GAAG,CAAC,YAAY,CAAC,CAAC;AAChD,2BAA2B;AAC3B,+CAA+C;AAClC,QAAA,eAAe,GAAuD;IACjF,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;KAC/D;CACF,CAAC"} \ No newline at end of file diff --git a/dist/definitions.js b/dist/definitions.js new file mode 100644 index 00000000..61647da4 --- /dev/null +++ b/dist/definitions.js @@ -0,0 +1,111 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createExport = exports.processDefinition = exports.writeToBaseModelFile = exports.processDefinitions = void 0; +/** + * Processing of custom types from `definitions` section + * in the schema + */ +const _ = require("lodash"); +const path = require("path"); +const common_1 = require("./common"); +const conf = require("./conf"); +const utils_1 = require("./utils"); +/** + * Entry point, processes all definitions and exports them + * to individual files + * @param defs definitions from the schema + * @param config global configuration + */ +function processDefinitions(defs, config) { + (0, utils_1.emptyDir)(path.join(config.dest, conf.defsDir)); + const definitions = []; + const files = {}; + _.forOwn(defs, (v, source) => { + const file = processDefinition(v, source, config); + if (file && file.name) { + const previous = files[file.name]; + if (previous === undefined) + files[file.name] = [source]; + else + previous.push(source); + definitions.push(file); + } + }); + let allExports = ''; + _.forOwn(files, (sources, def) => { + allExports += createExport(def) + createExportComments(def, sources) + '\n'; + }); + writeToBaseModelFile(config, allExports); + return definitions; +} +exports.processDefinitions = processDefinitions; +function writeToBaseModelFile(config, allExports) { + const filename = path.join(config.dest, `${conf.modelFile}.ts`); + (0, utils_1.writeFile)(filename, allExports, config.header); +} +exports.writeToBaseModelFile = writeToBaseModelFile; +/** + * Creates the file of the type definition + * @param def type definition + * @param name name of the type definition and after normalization of the resulting interface + file + */ +function processDefinition(def, name, config) { + name = (0, common_1.normalizeDef)(name); + let output = ''; + if (def.type === 'array') { + const property = (0, common_1.processProperty)(def)[0]; + if (!property.native) { + output += `import * as __${conf.modelFile} from \'../${conf.modelFile}\';\n\n`; + } + if (def.description) + output += `/** ${def.description} */\n`; + output += `export type ${name} = ${property.property};\n`; + } + else if (def.properties || def.additionalProperties) { + const properties = (0, common_1.processProperty)(def, undefined, name); + // conditional import of global types + if (properties.some(p => !p.native)) { + output += `import * as __${conf.modelFile} from \'../${conf.modelFile}\';\n\n`; + } + if (def.description) + output += `/** ${def.description} */\n`; + output += `export interface ${name} {\n`; + output += (0, utils_1.indent)(_.map(properties, 'property').join('\n')); + output += `\n}\n`; + // concat non-empty enum lines + const enumLines = _.map(properties, 'enumDeclaration').filter(Boolean).join('\n\n'); + if (enumLines) + output += `\n${enumLines}\n`; + } + else if (def.type !== 'object') { + const property = (0, common_1.processProperty)(def)[0]; + if (!property.native) { + output += `import * as __${conf.modelFile} from \'../${conf.modelFile}\';\n\n`; + } + output += `export type ${name} = ${property.property};\n`; + } + const filename = path.join(config.dest, conf.defsDir, `${name}.ts`); + (0, utils_1.writeFile)(filename, output, config.header); + return { name, def }; +} +exports.processDefinition = processDefinition; +/** + * Creates single export line for `def` name + * @param def name of the definition file w/o extension + */ +function createExport(def) { + return `export * from './${conf.defsDir}/${def}';`; +} +exports.createExport = createExport; +/** + * Creates comment naming source definitions for the export + * @param def name of the definition file w/o extension + * @param sources list of sources for the file + */ +function createExportComments(file, sources) { + if (sources.length > 1 || !sources.includes(file)) { + return ' // sources: ' + sources.join(', '); + } + return ''; +} +//# sourceMappingURL=definitions.js.map \ No newline at end of file diff --git a/dist/definitions.js.map b/dist/definitions.js.map new file mode 100644 index 00000000..95f53b35 --- /dev/null +++ b/dist/definitions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,4BAA4B;AAC5B,6BAA6B;AAE7B,qCAAuD;AACvD,+BAA+B;AAG/B,mCAAoD;AAOpD;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,IAA6B,EAAE,MAAc;IAC9E,IAAA,gBAAQ,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/C,MAAM,WAAW,GAA0B,EAAE,CAAC;IAC9C,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,QAAQ,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;;gBACnD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACxB;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;QAC/B,UAAU,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEzC,OAAO,WAAW,CAAC;AACrB,CAAC;AAxBD,gDAwBC;AAED,SAAgB,oBAAoB,CAAC,MAAc,EAAE,UAAkB;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;IAChE,IAAA,iBAAS,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAHD,oDAGC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,GAAW,EAAE,IAAY,EAAE,MAAc;IACzE,IAAI,GAAG,IAAA,qBAAY,EAAC,IAAI,CAAC,CAAC;IAE1B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;QACxB,MAAM,QAAQ,GAAG,IAAA,wBAAe,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,MAAM,IAAI,iBAAiB,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,SAAS,CAAC;SAChF;QACD,IAAI,GAAG,CAAC,WAAW;YAAE,MAAM,IAAI,OAAO,GAAG,CAAC,WAAW,OAAO,CAAC;QAC7D,MAAM,IAAI,eAAe,IAAI,MAAM,QAAQ,CAAC,QAAQ,KAAK,CAAC;KAC3D;SAAM,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,oBAAoB,EAAE;QACrD,MAAM,UAAU,GAAG,IAAA,wBAAe,EAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACzD,qCAAqC;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;YACnC,MAAM,IAAI,iBAAiB,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,SAAS,CAAC;SAChF;QACD,IAAI,GAAG,CAAC,WAAW;YAAE,MAAM,IAAI,OAAO,GAAG,CAAC,WAAW,OAAO,CAAC;QAE7D,MAAM,IAAI,oBAAoB,IAAI,MAAM,CAAC;QACzC,MAAM,IAAI,IAAA,cAAM,EAAC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,OAAO,CAAC;QAElB,8BAA8B;QAC9B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpF,IAAI,SAAS;YAAE,MAAM,IAAI,KAAK,SAAS,IAAI,CAAC;KAC7C;SAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAA,wBAAe,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,MAAM,IAAI,iBAAiB,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,SAAS,CAAC;SAChF;QACD,MAAM,IAAI,eAAe,IAAI,MAAM,QAAQ,CAAC,QAAQ,KAAK,CAAC;KAC3D;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IACpE,IAAA,iBAAS,EAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE3C,OAAO,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC;AACrB,CAAC;AAtCD,8CAsCC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,GAAW;IACtC,OAAO,oBAAoB,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,CAAC;AACrD,CAAC;AAFD,oCAEC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,IAAY,EAAE,OAAiB;IAC3D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACjD,OAAO,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC7C;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"} \ No newline at end of file diff --git a/dist/forms/generate-form-modules.js b/dist/forms/generate-form-modules.js new file mode 100644 index 00000000..9460a485 --- /dev/null +++ b/dist/forms/generate-form-modules.js @@ -0,0 +1,55 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createForms = void 0; +const _ = require("lodash"); +const path = require("path"); +const conf = require("../conf"); +const utils_1 = require("../utils"); +// TODO! rename +const generate_form_service_1 = require("./generate-form-service"); +const process_module_1 = require("./process-module"); +const shared_module_1 = require("./shared-module"); +const generate_http_actions_1 = require("./states/generate-http-actions"); +const generate_http_effects_1 = require("./states/generate-http-effects"); +const generate_http_reducers_1 = require("./states/generate-http-reducers"); +function createForms(config, name, processedMethods, definitions) { + const kebabName = _.kebabCase(name); + const formBaseDir = path.join(config.dest, conf.storeDir); + const formDirName = path.join(formBaseDir, `${kebabName}`); + (0, utils_1.createDir)(formDirName); + for (const processedMethod of processedMethods) { + const paramGroups = processedMethod.paramGroups; + const responseDef = processedMethod.responseDef; + const simpleName = processedMethod.simpleName; + const formSubDirName = path.join(formBaseDir, `${kebabName}`, simpleName); + (0, utils_1.createDir)(formSubDirName); + let formParams = []; + Object.values(paramGroups).forEach(params => { + formParams = formParams.concat(params); + }); + const actionClassNameBase = (0, generate_http_actions_1.getActionClassNameBase)(simpleName); + const className = (0, generate_http_actions_1.getClassName)(simpleName); + const generateForms = formParams.length >= 1; + if (generateForms) { + // component.ts + (0, generate_form_service_1.generateFormService)(config, name, formParams, definitions, simpleName, formSubDirName, className); + } + if (config.generateStore) { + // states + const statesDirName = path.join(formSubDirName, conf.stateDir); + (0, utils_1.createDir)(statesDirName); + // actions.ts + (0, generate_http_actions_1.generateHttpActions)(config, name, responseDef, actionClassNameBase, simpleName, formSubDirName, formParams); + // reducers.ts + (0, generate_http_reducers_1.generateHttpReducers)(config, name, actionClassNameBase, formSubDirName, responseDef.type); + // effects.ts + (0, generate_http_effects_1.generateHttpEffects)(config, name, simpleName, actionClassNameBase, formSubDirName, formParams); + // form-shared-module.ts + (0, shared_module_1.createSharedModule)(config); + // module.ts + (0, process_module_1.createModule)(config, name, actionClassNameBase, formSubDirName, simpleName, className, generateForms); + } + } +} +exports.createForms = createForms; +//# sourceMappingURL=generate-form-modules.js.map \ No newline at end of file diff --git a/dist/forms/generate-form-modules.js.map b/dist/forms/generate-form-modules.js.map new file mode 100644 index 00000000..9a5e278b --- /dev/null +++ b/dist/forms/generate-form-modules.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate-form-modules.js","sourceRoot":"","sources":["../../src/forms/generate-form-modules.ts"],"names":[],"mappings":";;;AAAA,4BAA4B;AAC5B,6BAA6B;AAE7B,gCAAgC;AAKhC,oCAAmC;AACnC,eAAe;AACf,mEAA4D;AAC5D,qDAA8C;AAC9C,mDAAmD;AACnD,0EAAyG;AACzG,0EAAmE;AACnE,4EAAqE;AAErE,SAAgB,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,gBAAgC,EAC9D,WAAkC;IAC5D,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IAC3D,IAAA,iBAAS,EAAC,WAAW,CAAC,CAAC;IAEvB,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE;QAC9C,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;QAChD,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;QAChD,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAA,iBAAS,EAAC,cAAc,CAAC,CAAC;QAE1B,IAAI,UAAU,GAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC1C,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,mBAAmB,GAAG,IAAA,8CAAsB,EAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAA,oCAAY,EAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;QAE7C,IAAI,aAAa,EAAE;YACjB,eAAe;YACf,IAAA,2CAAmB,EAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;SACnG;QAED,IAAI,MAAM,CAAC,aAAa,EAAE;YACxB,SAAS;YACT,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/D,IAAA,iBAAS,EAAC,aAAa,CAAC,CAAC;YAEzB,aAAa;YACb,IAAA,2CAAmB,EAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YAC5G,cAAc;YACd,IAAA,6CAAoB,EAAC,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YAC1F,aAAa;YACb,IAAA,2CAAmB,EAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YAC/F,wBAAwB;YACxB,IAAA,kCAAkB,EAAC,MAAM,CAAC,CAAC;YAC3B,YAAY;YACZ,IAAA,6BAAY,EAAC,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;SACvG;KACF;AACH,CAAC;AA7CD,kCA6CC"} \ No newline at end of file diff --git a/dist/forms/generate-form-service.js b/dist/forms/generate-form-service.js new file mode 100644 index 00000000..1ca4e805 --- /dev/null +++ b/dist/forms/generate-form-service.js @@ -0,0 +1,179 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateFormService = void 0; +const _ = require("lodash"); +const nodePath = require("path"); +const common_1 = require("../common"); +const conf_1 = require("../conf"); +const process_params_1 = require("../requests/process-params"); +const utils_1 = require("../utils"); +function generateFormService(config, name, params, definitions, simpleName, formSubDirName, className) { + let content = ''; + const formName = 'form'; + const constructor = getConstructor(name, formName, definitions, params); + content += getImports(name, constructor); + content += `@Injectable()\n`; + content += `export class ${className}FormService {\n`; + content += (0, utils_1.indent)(`${formName}: FormGroup;\n`); + content += constructor; + content += getFormSubmitFunction(name, formName, simpleName, params); + content += '}\n'; + const componentHTMLFileName = nodePath.join(formSubDirName, `${simpleName}.service.ts`); + (0, utils_1.writeFile)(componentHTMLFileName, content, config.header); +} +exports.generateFormService = generateFormService; +function getImports(name, constructor) { + const imports = []; + if (constructor.match(/new FormControl\(/)) + imports.push('FormControl'); + if (constructor.match(/new FormGroup\(/)) + imports.push('FormGroup'); + if (constructor.match(/\[Validators\./)) + imports.push('Validators'); + let res = 'import {Injectable} from \'@angular/core\';\n'; + if (imports.length) + res += `import {${imports.join(', ')}} from '@angular/forms';\n`; + if (constructor.match(/new FormArrayExtended\(/)) { + res += `import {FormArrayExtended} from '../../../common/formArrayExtended';\n`; + } + if (constructor.match(/new FormMap\(/)) { + res += `import {FormMap} from '../../../common/formMap';\n`; + } + res += `import {${name}Service} from '../../../controllers/${name}';\n`; + res += '\n'; + return res; +} +function getConstructor(name, formName, definitions, params) { + let res = (0, utils_1.indent)('constructor(\n'); + res += (0, utils_1.indent)(`private ${_.lowerFirst(name)}Service: ${name}Service,\n`, 2); + res += (0, utils_1.indent)(') {\n'); + const definitionsMap = _.groupBy(definitions, 'name'); + const formDefinition = walkParamOrProp(params, definitionsMap); + res += (0, utils_1.indent)(`this.${formName} = new FormGroup({\n${formDefinition}\n});\n`, 2); + res += (0, utils_1.indent)('}\n'); + res += '\n'; + return res; +} +function walkParamOrProp(definition, definitions, parentTypes = []) { + const res = []; + let schema = {}; + let required; + // create unified inputs for + // 1. parameters + if (Array.isArray(definition)) { + schema = {}; + required = []; + definition.forEach(param => { + if (param.required) + required.push(param.name); + schema[param.name] = (0, process_params_1.parameterToSchema)(param); + }); + // 2. properties + } + else if (definition.def.properties) { + required = definition.def.required; + schema = definition.def.properties; + } + // walk the list and build recursive form model + Object.entries(schema).forEach(([paramName, param]) => { + const isRequired = required && required.includes(paramName); + const fieldDefinition = makeField(param, paramName, isRequired, definitions, parentTypes); + if (fieldDefinition) + res.push(fieldDefinition); + }); + return (0, utils_1.indent)(res); +} +function makeField(param, name, required, definitions, parentTypes) { + let newParentTypes = [...parentTypes]; + if (!param.type) { + const ref = param.$ref; + const refType = ref.replace(/^#\/definitions\//, ''); + const defType = (0, common_1.normalizeDef)(refType); + param = definitions[defType][0].def; + // break type definition chain with cycle + if (parentTypes.indexOf(ref) >= 0) + return; + if (ref) + newParentTypes = [...newParentTypes, ref]; + } + let type = param.type; + if (type in conf_1.nativeTypes) + type = conf_1.nativeTypes[type]; + let control; + let initializer; + if (type === 'array') { + control = 'FormArrayExtended'; + initializer = `() => `; + const controlInstance = makeField(param.items, undefined, required, definitions, newParentTypes); + if (!controlInstance) + return; + initializer += `(\n${(0, utils_1.indent)(controlInstance)}), []`; + } + else if (type === 'object') { + const def = { + name: '', + def: param, + }; + if (param.additionalProperties) { + control = 'FormMap'; + initializer = `() => `; + const controlInstance = makeField(param.additionalProperties, undefined, required, definitions, newParentTypes); + initializer += `(\n${(0, utils_1.indent)(controlInstance)}), {}`; + } + else { + const fields = walkParamOrProp(def, definitions, newParentTypes); + control = 'FormGroup'; + initializer = `{\n${fields}\n}`; + } + } + else { + control = 'FormControl'; + initializer = typeof param.default === 'string' ? `'${param.default}'` : param.default; + } + const validators = getValidators(param); + if (required) + validators.push('Validators.required'); + let res = `new ${control}(${initializer}, [${validators.join(', ')}])`; + if (name) { + name = (0, common_1.getAccessor)(name); + res = `${name}: ${res},`; + } + return res; +} +function getValidators(param) { + const validators = []; + if (param.format && param.format === 'email') + validators.push('Validators.email'); + if (!_.isNil(param.maximum)) + validators.push(`Validators.max(${param.maximum})`); + if (!_.isNil(param.minimum)) + validators.push(`Validators.min(${param.minimum})`); + if (!_.isNil(param.maxLength)) + validators.push(`Validators.maxLength(${param.maxLength})`); + if (!_.isNil(param.minLength)) + validators.push(`Validators.minLength(${param.minLength})`); + if (param.pattern) + validators.push(`Validators.pattern(/${param.pattern}/)`); + if (param.type === 'integer') + validators.push('Validators.pattern(/^([+-]?[1-9]\\d*|0)$/)'); + return validators; +} +function getFormSubmitFunction(name, formName, simpleName, paramGroups) { + const rawParam = paramGroups.length ? 'raw = false' : ''; + let res = (0, utils_1.indent)(`submit(${rawParam}) {\n`); + if (paramGroups.length) { + res += (0, utils_1.indent)([ + 'const data = raw ?', + (0, utils_1.indent)([ + `this.${formName}.getRawValue() :`, + `this.${formName}.value;`, + ]), + ], 2); + res += '\n'; + } + const params = paramGroups.length ? `data` : ''; + res += (0, utils_1.indent)(`return this.${_.lowerFirst(name)}Service.${simpleName}(${params});\n`, 2); + res += (0, utils_1.indent)('}\n'); + return res; +} +//# sourceMappingURL=generate-form-service.js.map \ No newline at end of file diff --git a/dist/forms/generate-form-service.js.map b/dist/forms/generate-form-service.js.map new file mode 100644 index 00000000..6e95d330 --- /dev/null +++ b/dist/forms/generate-form-service.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate-form-service.js","sourceRoot":"","sources":["../../src/forms/generate-form-service.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/forms/process-module.js b/dist/forms/process-module.js new file mode 100644 index 00000000..82dc3feb --- /dev/null +++ b/dist/forms/process-module.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createModule = void 0; +const path = require("path"); +const utils_1 = require("../utils"); +function createModule(config, name, actionClassNameBase, formSubDirName, simpleName, className, addForm) { + let content = `import {NgModule} from '@angular/core';\n`; + content += `import {EffectsModule as NgrxEffectsModule} from '@ngrx/effects';\n`; + content += `import {StoreModule as NgrxStoreModule} from '@ngrx/store';\n`; + content += '\n'; + content += `import {${name}Service} from '../../../controllers/${name}';\n`; + // TODO! use or remove + content += `import {FormsSharedModule} from '../../forms-shared.module';\n`; + if (addForm) + content += `import {${className}FormService} from './${simpleName}.service';\n`; + content += `\n`; + content += `import {${actionClassNameBase}Effects} from './states/effects';\n`; + content += `import {${actionClassNameBase}Reducer} from './states/reducers';\n`; + content += `import {selectorName} from './states/reducers';\n`; + content += '\n'; + content += '@NgModule({\n'; + content += (0, utils_1.indent)('imports: [\n'); + // TODO! use or remove + content += (0, utils_1.indent)('FormsSharedModule,\n', 2); + content += (0, utils_1.indent)(`NgrxStoreModule.forFeature(selectorName, ${actionClassNameBase}Reducer),\n`, 2); + content += (0, utils_1.indent)(`NgrxEffectsModule.forFeature([${actionClassNameBase}Effects]),\n`, 2); + content += (0, utils_1.indent)('],\n'); + const providers = [`${name}Service,`]; + if (addForm) + providers.push(`${className}FormService,`); + content += (0, utils_1.indent)('providers: [\n'); + content += (0, utils_1.indent)(providers, 2); + content += '\n'; + content += (0, utils_1.indent)('],\n'); + content += '})\n'; + content += `export class ${className}Module {}\n`; + const moduleFileName = path.join(formSubDirName, `${simpleName}.module.ts`); + (0, utils_1.writeFile)(moduleFileName, content, config.header); +} +exports.createModule = createModule; +//# sourceMappingURL=process-module.js.map \ No newline at end of file diff --git a/dist/forms/process-module.js.map b/dist/forms/process-module.js.map new file mode 100644 index 00000000..5632778e --- /dev/null +++ b/dist/forms/process-module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"process-module.js","sourceRoot":"","sources":["../../src/forms/process-module.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAE7B,oCAA2C;AAE3C,SAAgB,YAAY,CAAC,MAAc,EAAE,IAAY,EAAE,mBAA2B,EACzD,cAAsB,EAAE,UAAkB,EAAE,SAAiB,EAC7D,OAAgB;IAC3C,IAAI,OAAO,GAAG,2CAA2C,CAAC;IAC1D,OAAO,IAAI,qEAAqE,CAAC;IACjF,OAAO,IAAI,+DAA+D,CAAC;IAC3E,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,IAAI,WAAW,IAAI,uCAAuC,IAAI,MAAM,CAAC;IAE5E,sBAAsB;IACtB,OAAO,IAAI,gEAAgE,CAAC;IAC5E,IAAI,OAAO;QAAE,OAAO,IAAI,WAAW,SAAS,wBAAwB,UAAU,cAAc,CAAC;IAC7F,OAAO,IAAI,IAAI,CAAC;IAEhB,OAAO,IAAI,WAAW,mBAAmB,qCAAqC,CAAC;IAC/E,OAAO,IAAI,WAAW,mBAAmB,sCAAsC,CAAC;IAChF,OAAO,IAAI,mDAAmD,CAAC;IAC/D,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,IAAI,eAAe,CAAC;IAC3B,OAAO,IAAI,IAAA,cAAM,EAAC,cAAc,CAAC,CAAC;IAElC,sBAAsB;IACtB,OAAO,IAAI,IAAA,cAAM,EAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAE7C,OAAO,IAAI,IAAA,cAAM,EAAC,4CAA4C,mBAAmB,aAAa,EAAE,CAAC,CAAC,CAAC;IACnG,OAAO,IAAI,IAAA,cAAM,EAAC,iCAAiC,mBAAmB,cAAc,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,IAAI,IAAA,cAAM,EAAC,MAAM,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC;IACtC,IAAI,OAAO;QAAE,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC;IACxD,OAAO,IAAI,IAAA,cAAM,EAAC,gBAAgB,CAAC,CAAC;IACpC,OAAO,IAAI,IAAA,cAAM,EAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAChC,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,IAAI,IAAA,cAAM,EAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,IAAI,gBAAgB,SAAS,aAAa,CAAC;IAElD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,UAAU,YAAY,CAAC,CAAC;IAC5E,IAAA,iBAAS,EAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAvCD,oCAuCC"} \ No newline at end of file diff --git a/dist/forms/shared-module.js b/dist/forms/shared-module.js new file mode 100644 index 00000000..a5df1575 --- /dev/null +++ b/dist/forms/shared-module.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createSharedModule = void 0; +const path = require("path"); +const conf = require("../conf"); +const utils_1 = require("../utils"); +function createSharedModule(config) { + let content = ''; + content += `import {CommonModule} from '@angular/common';\n`; + content += `import {NgModule} from '@angular/core';\n`; + content += `import {ReactiveFormsModule} from '@angular/forms';\n`; + content += '\n'; + content += '@NgModule({\n'; + content += (0, utils_1.indent)('imports: [\n'); + content += (0, utils_1.indent)('CommonModule,\n', 2); + content += (0, utils_1.indent)('ReactiveFormsModule,\n', 2); + content += (0, utils_1.indent)('],\n'); + content += (0, utils_1.indent)('exports: [\n'); + content += (0, utils_1.indent)('CommonModule,\n', 2); + content += (0, utils_1.indent)('ReactiveFormsModule,\n', 2); + content += (0, utils_1.indent)('],\n'); + content += '})\n'; + content += `export class FormsSharedModule {}\n`; + const moduleFileName = path.join(config.dest, conf.storeDir, `forms-shared.module.ts`); + (0, utils_1.writeFile)(moduleFileName, content, config.header); +} +exports.createSharedModule = createSharedModule; +//# sourceMappingURL=shared-module.js.map \ No newline at end of file diff --git a/dist/forms/shared-module.js.map b/dist/forms/shared-module.js.map new file mode 100644 index 00000000..ba626f50 --- /dev/null +++ b/dist/forms/shared-module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shared-module.js","sourceRoot":"","sources":["../../src/forms/shared-module.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAC7B,gCAAgC;AAEhC,oCAA2C;AAE3C,SAAgB,kBAAkB,CAAC,MAAc;IAC/C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO,IAAI,iDAAiD,CAAC;IAC7D,OAAO,IAAI,2CAA2C,CAAC;IACvD,OAAO,IAAI,uDAAuD,CAAC;IACnE,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,IAAI,eAAe,CAAC;IAE3B,OAAO,IAAI,IAAA,cAAM,EAAC,cAAc,CAAC,CAAC;IAClC,OAAO,IAAI,IAAA,cAAM,EAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,IAAA,cAAM,EAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,IAAA,cAAM,EAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,IAAI,IAAA,cAAM,EAAC,cAAc,CAAC,CAAC;IAClC,OAAO,IAAI,IAAA,cAAM,EAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,IAAA,cAAM,EAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,IAAA,cAAM,EAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,IAAI,qCAAqC,CAAC;IAEjD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IACvF,IAAA,iBAAS,EAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAvBD,gDAuBC"} \ No newline at end of file diff --git a/dist/forms/states/generate-http-actions.js b/dist/forms/states/generate-http-actions.js new file mode 100644 index 00000000..c6977794 --- /dev/null +++ b/dist/forms/states/generate-http-actions.js @@ -0,0 +1,78 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getClassName = exports.getActionClassNameBase = exports.generateHttpActions = void 0; +const _ = require("lodash"); +const path = require("path"); +const conf_1 = require("../../conf"); +const utils_1 = require("../../utils"); +function generateHttpActions(config, name, responseDef, actionClassNameBase, simpleName, formSubDirName, paramGroups) { + let content = ''; + const hasParams = paramGroups.length >= 1; + content += getActionImports(name, simpleName, hasParams, responseDef.type.startsWith('__model.')); + content += getActionTypes(name, simpleName); + content += getActionStartDefinition(simpleName, hasParams); + content += getActionSuccessDefinition(responseDef); + content += getActionErrorDefinition(); + content += getActionOverviewType(actionClassNameBase); + const actionsFileName = path.join(formSubDirName, conf_1.stateDir, `actions.ts`); + (0, utils_1.writeFile)(actionsFileName, content, config.header, 'ts', ['max-line-length', 'max-classes-per-file']); +} +exports.generateHttpActions = generateHttpActions; +function getActionImports(name, simpleName, hasParams, importModels) { + let res = `import {HttpErrorResponse} from '@angular/common/http';\n`; + res += `import {Action} from '@ngrx/store';\n`; + if (hasParams) { + res += `import {${_.upperFirst(simpleName)}Params} from '../../../../controllers/${name}';\n`; + } + if (importModels) + res += `import * as __model from '../../../../model';\n`; + res += `\n`; + return res; +} +function getActionTypes(controllerName, methodName) { + let res = `export enum Actions {\n`; + res += (0, utils_1.indent)([ + `START = '[${controllerName} ${methodName}] Start',`, + `SUCCESS = '[${controllerName} ${methodName}] Success',`, + `ERROR = '[${controllerName} ${methodName}] Error',`, + ]); + res += `\n}\n\n`; + return res; +} +function getActionStartDefinition(name, hasParams) { + let res = `export class Start implements Action {\n`; + res += (0, utils_1.indent)(`readonly type = Actions.START;\n`); + const params = hasParams ? `public payload: ${_.upperFirst(name)}Params` : ''; + res += (0, utils_1.indent)(`constructor(${params}) {}\n`); + res += `}\n`; + res += `\n`; + return res; +} +function getActionSuccessDefinition(response) { + let res = `export class Success implements Action {\n`; + res += (0, utils_1.indent)(`readonly type = Actions.SUCCESS;\n`); + res += (0, utils_1.indent)(`constructor(public payload: ${response.type}) {}\n`); + res += `}\n`; + res += `\n`; + return res; +} +function getActionErrorDefinition() { + let res = `export class Error implements Action {\n`; + res += (0, utils_1.indent)(`readonly type = Actions.ERROR;\n`); + res += (0, utils_1.indent)(`constructor(public payload: HttpErrorResponse) {}\n`); + res += `}\n`; + res += `\n`; + return res; +} +function getActionOverviewType(actionClassNameBase) { + return `export type ${actionClassNameBase}Action = Start | Success | Error;\n`; +} +function getActionClassNameBase(name) { + return getClassName(name); +} +exports.getActionClassNameBase = getActionClassNameBase; +function getClassName(name) { + return _.upperFirst(name); +} +exports.getClassName = getClassName; +//# sourceMappingURL=generate-http-actions.js.map \ No newline at end of file diff --git a/dist/forms/states/generate-http-actions.js.map b/dist/forms/states/generate-http-actions.js.map new file mode 100644 index 00000000..28f33efc --- /dev/null +++ b/dist/forms/states/generate-http-actions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate-http-actions.js","sourceRoot":"","sources":["../../../src/forms/states/generate-http-actions.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/forms/states/generate-http-effects.js b/dist/forms/states/generate-http-effects.js new file mode 100644 index 00000000..a38a65f9 --- /dev/null +++ b/dist/forms/states/generate-http-effects.js @@ -0,0 +1,63 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateHttpEffects = void 0; +const path = require("path"); +const utils_1 = require("../../utils"); +function generateHttpEffects(config, name, simpleName, actionClassNameBase, formSubDirName, paramGroups) { + let content = ''; + content += getEffectsImports(name); + content += getEffectsStartDefinition(actionClassNameBase); + content += getEffectDefinition(actionClassNameBase, name, simpleName, paramGroups.length >= 1); + content += getConstructorDefinition(name); + content += `}\n`; + const effectsFileName = path.join(formSubDirName, `states`, `effects.ts`); + (0, utils_1.writeFile)(effectsFileName, content, config.header); +} +exports.generateHttpEffects = generateHttpEffects; +function getEffectsImports(name) { + let res = `import {HttpErrorResponse} from '@angular/common/http';\n`; + res += `import {Injectable} from '@angular/core';\n`; + res += `import {Actions, createEffect, ofType} from '@ngrx/effects';\n`; + res += '\n'; + res += `import {of} from 'rxjs';\n`; + res += '\n'; + res += `import {catchError, map, switchMap} from 'rxjs/operators';\n`; + res += `import {${name}Service} from '../../../../controllers/${name}';\n`; + res += `import * as actions from './actions';\n`; + res += `\n`; + return res; +} +function getEffectsStartDefinition(actionClassNameBase) { + let res = `@Injectable()\n`; + res += `export class ${actionClassNameBase}Effects {\n`; + return res; +} +function getConstructorDefinition(name) { + let res = `constructor(\n`; + res += (0, utils_1.indent)(`private storeActions: Actions,\n`); + res += (0, utils_1.indent)(`private ${name.toLowerCase()}Service: ${name}Service,\n`); + res += `) {}\n\n`; + return (0, utils_1.indent)(res); +} +function getEffectDefinition(actionClassNameBase, name, simpleName, hasParams) { + const startActionPayloadDefinition = getStartActionPayloadDefinition(hasParams); + let res = (0, utils_1.indent)(`${actionClassNameBase} = createEffect(() => this.storeActions.pipe(\n`); + res += (0, utils_1.indent)(`ofType(actions.Actions.START),\n`, 2); + const actionParam = hasParams ? 'action: actions.Start' : ''; + res += (0, utils_1.indent)(`switchMap((${actionParam}) => ` + + `this.${name.toLowerCase()}Service.${simpleName}(${startActionPayloadDefinition})\n`, 2); + res += (0, utils_1.indent)(`.pipe(\n`, 3); + res += (0, utils_1.indent)(`map(result => new actions.Success(result)),\n`, 4); + res += (0, utils_1.indent)(`catchError((error: HttpErrorResponse) => of(new actions.Error(error))),\n`, 4); + res += (0, utils_1.indent)(`),\n`, 3); + res += (0, utils_1.indent)(`),\n`, 2); + res += (0, utils_1.indent)(`));\n`); + res += '\n'; + return res; +} +function getStartActionPayloadDefinition(hasParams) { + if (hasParams) + return 'action.payload'; + return ''; +} +//# sourceMappingURL=generate-http-effects.js.map \ No newline at end of file diff --git a/dist/forms/states/generate-http-effects.js.map b/dist/forms/states/generate-http-effects.js.map new file mode 100644 index 00000000..8a8cdcff --- /dev/null +++ b/dist/forms/states/generate-http-effects.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate-http-effects.js","sourceRoot":"","sources":["../../../src/forms/states/generate-http-effects.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/forms/states/generate-http-reducers.js b/dist/forms/states/generate-http-reducers.js new file mode 100644 index 00000000..15a3dd7a --- /dev/null +++ b/dist/forms/states/generate-http-reducers.js @@ -0,0 +1,63 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateHttpReducers = void 0; +const path = require("path"); +const conf_1 = require("../../conf"); +const utils_1 = require("../../utils"); +function generateHttpReducers(config, name, actionClassNameBase, formSubDirName, responseType) { + let content = ''; + content += getReducerImports(responseType.startsWith('__model.')); + content += getStateInteface(actionClassNameBase, responseType); + content += getInitialState(actionClassNameBase); + content += getFeatureSelector(name, actionClassNameBase); + content += getReducerDefinition(actionClassNameBase); + const reducersFileName = path.join(formSubDirName, conf_1.stateDir, `reducers.ts`); + (0, utils_1.writeFile)(reducersFileName, content, config.header); +} +exports.generateHttpReducers = generateHttpReducers; +function getReducerImports(usesModels) { + let res = `import {createFeatureSelector} from '@ngrx/store';\n\n`; + res += `import {HttpErrorResponse} from '@angular/common/http';\n`; + if (usesModels) + res += `import * as __model from '../../../../model';\n`; + res += `import * as actions from './actions';\n\n`; + return res; +} +function getStateInteface(actionClassNameBase, type) { + let res = `export interface ${actionClassNameBase}State {\n`; + res += (0, utils_1.indent)(`data: ${type} | null;\n`); + res += (0, utils_1.indent)(`loading: boolean;\n`); + res += (0, utils_1.indent)(`error: HttpErrorResponse | null;\n`); + res += `}\n\n`; + return res; +} +function getInitialState(actionClassNameBase) { + let res = `export const initial${actionClassNameBase}State: ${actionClassNameBase}State = {\n`; + res += (0, utils_1.indent)(`data: null,\n`); + res += (0, utils_1.indent)(`loading: false,\n`); + res += (0, utils_1.indent)(`error: null,\n`); + res += `};\n\n`; + return res; +} +function getFeatureSelector(name, actionClassNameBase) { + let res = `export const selectorName = '${name}_${actionClassNameBase}';\n`; + res += `export const get${actionClassNameBase}StateSelector = ` + + `createFeatureSelector<${actionClassNameBase}State>(selectorName);\n\n`; + return res; +} +function getReducerDefinition(actionClassNameBase) { + let res = `export function ${actionClassNameBase}Reducer(\n`; + res += (0, utils_1.indent)(`state: ${actionClassNameBase}State = initial${actionClassNameBase}State,\n`); + res += (0, utils_1.indent)(`action: actions.${actionClassNameBase}Action): ${actionClassNameBase}State {\n\n`); + res += (0, utils_1.indent)(`switch (action.type) {\n`); + res += (0, utils_1.indent)([ + 'case actions.Actions.START: return {...state, loading: true, error: null};', + 'case actions.Actions.SUCCESS: return {...state, data: action.payload, loading: false};', + 'case actions.Actions.ERROR: return {...state, error: action.payload, loading: false};', + 'default: return state;', + ], 2); + res += (0, utils_1.indent)(`\n}\n`); + res += `}\n`; + return res; +} +//# sourceMappingURL=generate-http-reducers.js.map \ No newline at end of file diff --git a/dist/forms/states/generate-http-reducers.js.map b/dist/forms/states/generate-http-reducers.js.map new file mode 100644 index 00000000..a50f5bb7 --- /dev/null +++ b/dist/forms/states/generate-http-reducers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate-http-reducers.js","sourceRoot":"","sources":["../../../src/forms/states/generate-http-reducers.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/generate.js b/dist/generate.js new file mode 100644 index 00000000..f710c59d --- /dev/null +++ b/dist/generate.js @@ -0,0 +1,68 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generate = void 0; +/** Generator of API models (interfaces) from BE API json */ +const fs = require("fs"); +const path = require("path"); +const conf = require("./conf"); +const generate_1 = require("./common/generate"); +const definitions_1 = require("./definitions"); +const process_paths_1 = require("./requests/process-paths"); +const utils_1 = require("./utils"); +/** + * Generates API layer for the project based on src to dest + * @param src source swagger json schema + * @param dest destination directory + * @param generateStore decides if redux workflow should be generated + * @param unwrapSingleParamMethods controls if the single param methods should be generated + * @param swaggerUrlPath the path where the swagger ui definition can be found + * @param omitVersion shouldn't generate API version info to generated files + */ +function generate(src = conf.apiFile, dest = conf.outDir, generateStore = true, unwrapSingleParamMethods = false, swaggerUrlPath = conf.swaggerUrlPath, omitVersion = false) { + let schema; + try { + const content = fs.readFileSync(src); + schema = JSON.parse(content.toString()); + } + catch (e) { + if (e instanceof SyntaxError) { + (0, utils_1.out)(`${src} is either not a valid JSON scheme or contains non-printable characters`, utils_1.TermColors.red); + } + else + (0, utils_1.out)(`JSON scheme file '${src}' does not exist`, utils_1.TermColors.red); + (0, utils_1.out)(`${e}`); + return; + } + // normalize basePath, strip trailing '/'s + const basePath = schema.basePath; + if (typeof basePath === 'string') { + schema.basePath = basePath.replace(/\/+$/, ''); + } + else + schema.basePath = ''; + recreateDirectories(dest); + const header = (0, utils_1.processHeader)(schema, omitVersion); + const config = { header, dest, generateStore, unwrapSingleParamMethods }; + generateCommon(path.join(dest, conf.commonDir)); + if (!fs.existsSync(dest)) + fs.mkdirSync(dest); + const definitions = (0, definitions_1.processDefinitions)(schema.definitions, config); + (0, process_paths_1.processPaths)(schema.paths, `http://${schema.host}${swaggerUrlPath}${conf.swaggerFile}`, config, definitions, schema.basePath); +} +exports.generate = generate; +function recreateDirectories(dest) { + (0, utils_1.emptyDir)(path.join(dest, conf.commonDir), true); + (0, utils_1.emptyDir)(path.join(dest, conf.defsDir), true); + (0, utils_1.emptyDir)(path.join(dest, conf.apiDir), true); + (0, utils_1.emptyDir)(path.join(dest, conf.storeDir), true); + (0, utils_1.createDir)(path.join(dest, conf.commonDir)); + (0, utils_1.createDir)(path.join(dest, conf.defsDir)); + (0, utils_1.createDir)(path.join(dest, conf.apiDir)); + (0, utils_1.createDir)(path.join(dest, conf.storeDir)); +} +/** Generates common classes, methods, utils */ +function generateCommon(dest) { + (0, generate_1.addUtils)(dest); + (0, generate_1.addFormExtensions)(dest); +} +//# sourceMappingURL=generate.js.map \ No newline at end of file diff --git a/dist/generate.js.map b/dist/generate.js.map new file mode 100644 index 00000000..86ec9a34 --- /dev/null +++ b/dist/generate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 00000000..14591e1f --- /dev/null +++ b/dist/index.js @@ -0,0 +1,19 @@ +#!/usr/bin/env node +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const commander_1 = require("commander"); +const conf = require("./conf"); +const generate_1 = require("./generate"); +commander_1.program + .option('-s, --src ', `Source directory, default: ${conf.apiFile}`) + .option('-d, --dest ', `Destination directory, default: ${conf.outDir}`) + .option('--no-store', 'Do not generate store') + .option('-w, --unwrap-single-param-methods', 'Controller methods with a single parameter get a method_() where the parameter object is unwrapped') + /* tslint:disable-next-line:max-line-length */ + .option('-u, --swagger-url-path ', `swagger URL path, where the swagger ui documentation can be found; default: ${conf.swaggerUrlPath}, i.e. the resulting address would be http://example${conf.swaggerUrlPath}`) + .option('-o, --omit-version', `Write version info, default: ${conf.omitVersion}`) + .parse(process.argv); +commander_1.program.parse(); +const options = commander_1.program.opts(); +(0, generate_1.generate)(options.src, options.dest, options.store, options.unwrapSingleParamMethods, options.swaggerUrlPath, options.omitVersion); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 00000000..039ea30a --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAkC;AAClC,+BAA+B;AAC/B,yCAAoC;AAEpC,mBAAO;KACJ,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,IAAI,CAAC,OAAO,EAAE,CAAC;KAC1E,MAAM,CAAC,0BAA0B,EAAE,mCAAmC,IAAI,CAAC,MAAM,EAAE,CAAC;KACpF,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC;KAC7C,MAAM,CAAC,mCAAmC,EACzC,oGAAoG,CAAC;IACvG,8CAA8C;KAC7C,MAAM,CAAC,+BAA+B,EAAE,+EAA+E,IAAI,CAAC,cAAc,uDAAuD,IAAI,CAAC,cAAc,EAAE,CAAC;KACvN,MAAM,CAAC,oBAAoB,EAAE,gCAAgC,IAAI,CAAC,WAAW,EAAE,CAAC;KAChF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvB,mBAAO,CAAC,KAAK,EAAE,CAAC;AAChB,MAAM,OAAO,GAAG,mBAAO,CAAC,IAAI,EAAE,CAAC;AAE/B,IAAA,mBAAQ,EAAC,OAAO,CAAC,GAAG,EAClB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,wBAAwB,EAChC,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,WAAW,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/requests/process-controller.js b/dist/requests/process-controller.js new file mode 100644 index 00000000..ad0d7b68 --- /dev/null +++ b/dist/requests/process-controller.js @@ -0,0 +1,69 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.processController = void 0; +/** + * Processing of custom types from `paths` section + * in the schema + */ +const _ = require("lodash"); +const path = require("path"); +const conf = require("../conf"); +const generate_form_modules_1 = require("../forms/generate-form-modules"); +const utils_1 = require("../utils"); +const process_method_1 = require("./process-method"); +const process_responses_1 = require("./process-responses"); +/** + * Creates and serializes class for api communication for controller + * @param controllers list of methods of the controller + * @param name + */ +function processController(methods, name, config, definitions) { + const filename = path.join(config.dest, conf.apiDir, `${name}.ts`); + let usesGlobalType = false; + // make simpleNames unique and process responses + const simpleNames = _.map(methods, 'simpleName'); + methods.forEach(controller => { + if (simpleNames.filter(n => n === controller.simpleName).length > 1) { + const preserveCapitals = controller.operationId.replace(/([A-Z])/g, '-$1'); + controller.simpleName = _.lowerFirst(_.camelCase(preserveCapitals)); + } + controller.responseDef = (0, process_responses_1.processResponses)(controller.responses, controller.simpleName, config); + usesGlobalType = usesGlobalType || controller.responseDef.usesGlobalType; + }); + const processedMethods = methods.map(m => (0, process_method_1.processMethod)(m, config.unwrapSingleParamMethods)); + usesGlobalType = usesGlobalType || processedMethods.some(c => c.usesGlobalType); + let content = ''; + const angularCommonHttp = ['HttpClient']; + if (processedMethods.some(c => 'header' in c.paramGroups)) { + angularCommonHttp.push('HttpHeaders'); + } + if (processedMethods.some(c => 'query' in c.paramGroups)) { + angularCommonHttp.push('HttpParams'); + } + content += `import {${angularCommonHttp.join(', ')}} from \'@angular/common/http\';\n`; + content += 'import {Injectable} from \'@angular/core\';\n'; + content += 'import {Observable} from \'rxjs\';\n\n'; + if (usesGlobalType) { + content += `import * as __${conf.modelFile} from \'../${conf.modelFile}\';\n\n`; + } + const interfaceDef = _.map(processedMethods, 'interfaceDef').filter(Boolean).join('\n'); + if (interfaceDef) { + content += interfaceDef; + content += '\n'; + } + content += `@Injectable()\n`; + content += `export class ${name}Service {\n`; + content += (0, utils_1.indent)('constructor(private http: HttpClient) {}'); + content += '\n'; + content += (0, utils_1.indent)(_.map(processedMethods, 'methodDef').join('\n\n')); + content += '\n}\n'; + if (conf.adHocExceptions.api[name]) { + content = content.replace(conf.adHocExceptions.api[name][0], conf.adHocExceptions.api[name][1]); + } + // controllers + (0, utils_1.writeFile)(filename, content, config.header); + // forms + (0, generate_form_modules_1.createForms)(config, name, processedMethods, definitions); +} +exports.processController = processController; +//# sourceMappingURL=process-controller.js.map \ No newline at end of file diff --git a/dist/requests/process-controller.js.map b/dist/requests/process-controller.js.map new file mode 100644 index 00000000..27c1af00 --- /dev/null +++ b/dist/requests/process-controller.js.map @@ -0,0 +1 @@ +{"version":3,"file":"process-controller.js","sourceRoot":"","sources":["../../src/requests/process-controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/requests/process-method.js b/dist/requests/process-method.js new file mode 100644 index 00000000..a8ffcf0a --- /dev/null +++ b/dist/requests/process-method.js @@ -0,0 +1,192 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.processMethod = void 0; +/** + * Processing of custom types from `paths` section + * in the schema + */ +const lodash_1 = require("lodash"); +const common_1 = require("../common"); +const conf = require("../conf"); +const utils_1 = require("../utils"); +const process_params_1 = require("./process-params"); +/** + * Transforms method definition to typescript method + * with single typed param object that is separated into several objects + * and passed to api service + * @param method data needed for method processing + * @param unwrapSingleParamMethods boolean + */ +function processMethod(method, unwrapSingleParamMethods) { + let methodDef = ''; + let interfaceDef = ''; + const url = method.url.replace(/{([^}]+)}/g, (_, key) => `\${${(0, common_1.getAccessor)(key, 'pathParams')}}`); + const allowed = conf.allowedParams[method.methodName]; + let paramSeparation = []; + let paramsSignature = ''; + let params; + let usesGlobalType = false; + let paramTypes = []; + let paramGroups = {}; + let splitParamsMethod = ''; + const simpleName = method.simpleName; + const methodName = method.methodName; + if (method.paramDef) { + const paramDef = method.paramDef.filter(df => allowed.includes(df.in)); + paramGroups = (0, lodash_1.groupBy)(paramDef, 'in'); + const paramsType = (0, lodash_1.upperFirst)(`${method.simpleName}Params`); + const processedParams = (0, process_params_1.processParams)(paramDef, paramsType); + paramTypes = Object.keys(paramGroups); + paramSeparation = getParamSeparation(paramGroups); + paramsSignature = getParamsSignature(processedParams, paramsType); + usesGlobalType = processedParams.usesGlobalType; + interfaceDef = getInterfaceDef(processedParams); + if (unwrapSingleParamMethods && processedParams.typesOnly.length > 0 && paramDef.length === 1) { + splitParamsMethod = getSplitParamsMethod(method, processedParams); + } + } + params = getRequestParams(paramTypes, method.methodName); + methodDef += '\n'; + methodDef += (0, utils_1.makeComment)([method.summary, method.description, method.swaggerUrl].filter(Boolean)); + methodDef += `${method.simpleName}(${paramsSignature}): Observable<${method.responseDef.type}> {\n`; + // apply the param definitions, e.g. bodyParams + methodDef += (0, utils_1.indent)(paramSeparation); + if (paramSeparation.length) + methodDef += '\n'; + const body = `return this.http.${method.methodName}<${method.responseDef.type}>` + + `(\`${method.basePath}${url}\`${params});`; + methodDef += (0, utils_1.indent)(body); + methodDef += `\n`; + methodDef += `}`; + methodDef += splitParamsMethod; + if (method.responseDef.enumDeclaration) { + if (interfaceDef) + interfaceDef += '\n'; + interfaceDef += `${method.responseDef.enumDeclaration}\n`; + } + const responseDef = method.responseDef; + return { methodDef, interfaceDef, usesGlobalType, paramGroups, responseDef, simpleName, methodName }; +} +exports.processMethod = processMethod; +function getSplitParamsMethod(method, processedParams) { + let splitParamsMethod = ''; + const splitParamsSignature = getSplitParamsSignature(processedParams); + splitParamsMethod += `\n${method.simpleName}_(${splitParamsSignature}): Observable<${method.responseDef.type}> {\n`; + const propAssignments = getPropertyAssignments(method.paramDef); + splitParamsMethod += (0, utils_1.indent)(`return this.${method.simpleName}(${propAssignments});\n`); + splitParamsMethod += '}\n'; + return splitParamsMethod; +} +/** + * Creates a definition of paramsSignature, which serves as input to http methods + * @param processedParams + * @param paramsType + */ +function getParamsSignature(processedParams, paramsType) { + return !processedParams.isInterfaceEmpty ? `params: ${paramsType}` : ''; +} +function getSplitParamsSignature(paramsOutput) { + return paramsOutput.typesOnly; +} +function getPropertyAssignments(params) { + return '{' + params.map(p => p.name).join(', ') + '}'; +} +/** + * Creates a definition of interfaceDef, which defines interface for the http method input + * @param processedParams + */ +function getInterfaceDef(processedParams) { + return !processedParams.isInterfaceEmpty ? processedParams.paramDef : ''; +} +/** + * Creates a definition of pathParams, bodyParams, queryParms or formDataParams + * @param paramGroups + */ +function getParamSeparation(paramGroups) { + return (0, lodash_1.map)(paramGroups, (group, groupName) => { + let baseDef; + let def; + const list = (0, lodash_1.map)(group, p => { + // header params values need to be strings + let suffix; + if (groupName === 'header' && p.type !== 'string') + suffix = '.toString()'; + else if (groupName === 'query' && p.type === 'array') { + let separator; + if (p.collectionFormat === 'ssv') + separator = ' '; + else if (p.collectionFormat === 'tsv') + separator = '\\t'; + else if (p.collectionFormat === 'pipes') + separator = '|'; + else if (['csv', undefined].includes(p.collectionFormat)) + separator = ','; + if (separator) + suffix = `.join('${separator}')`; + } + else + suffix = ''; + return (0, common_1.getObjectPropSetter)(p.name, 'params', suffix); + }); + if (groupName === 'query') { + baseDef = '{\n' + (0, utils_1.indent)(list) + '\n};'; + def = `const queryParamBase = ${baseDef}\n\n`; + def += 'let queryParams = new HttpParams();\n'; + def += 'Object.entries(queryParamBase).forEach(([key, value]: [string, any]) => {\n'; + def += ' if (value !== undefined) {\n'; + def += ' if (typeof value === \'string\') queryParams = queryParams.set(key, value);\n'; + // `collectionFormat` set to multi viz. https://swagger.io/docs/specification/2-0/describing-parameters/ + def += ' else if (Array.isArray(value)) value.forEach(v => queryParams = queryParams.append(key, v));\n'; + def += ' else queryParams = queryParams.set(key, JSON.stringify(value));\n'; + def += ' }\n'; + def += '});\n'; + return def; + } + if (groupName === 'body') { + // when the schema: { '$ref': '#/definitions/exampleDto' } construct is used + if ('schema' in group[0]) { + def = `params.${group[0].name};`; + } + else { + def = '{\n' + (0, utils_1.indent)(list) + '\n};'; + } + return `const ${groupName}Params = ${def}\n`; + } + def = '{\n' + (0, utils_1.indent)(list) + '\n}'; + if (groupName === 'header') { + def = `new HttpHeaders(${def})`; + } + def += ';'; + return `const ${groupName}Params = ${def}`; + }); +} +/** + * Returns a list of additional params for http client call invocation + * @param paramTypes list of params types + * @param methodName name of http method to invoke + */ +function getRequestParams(paramTypes, methodName) { + let res = ''; + if (['post', 'put', 'patch'].includes(methodName)) { + if (paramTypes.includes('body')) { + res += ', bodyParams || {}'; + } + else if (paramTypes.includes('formData')) { + res += ', formDataParams'; + } + else { + res += ', {}'; + } + } + const optionParams = []; + if (paramTypes.includes('query')) { + optionParams.push('params: queryParams'); + } + if (paramTypes.includes('header')) { + optionParams.push('headers: headerParams'); + } + if (optionParams.length) + res += `, {${optionParams.join(', ')}}`; + return res; +} +//# sourceMappingURL=process-method.js.map \ No newline at end of file diff --git a/dist/requests/process-method.js.map b/dist/requests/process-method.js.map new file mode 100644 index 00000000..19334943 --- /dev/null +++ b/dist/requests/process-method.js.map @@ -0,0 +1 @@ +{"version":3,"file":"process-method.js","sourceRoot":"","sources":["../../src/requests/process-method.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/requests/process-params.js b/dist/requests/process-params.js new file mode 100644 index 00000000..5833d687 --- /dev/null +++ b/dist/requests/process-params.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parameterToSchema = exports.processParams = void 0; +/** + * Processing of custom types from `paths` section + * in the schema + */ +const _ = require("lodash"); +const common_1 = require("../common"); +const utils_1 = require("../utils"); +/** + * Transforms input parameters to interfaces definition + * @param def definition + * @param paramsType name of the type + */ +function processParams(def, paramsType) { + let paramDef = ''; + let typesOnly = ''; + paramDef += `export interface ${paramsType} {\n`; + const params = _.map(def, p => (0, common_1.processProperty)(parameterToSchema(p), p.name, paramsType, p.required)[0]); + const isInterfaceEmpty = !params.length; + const usesGlobalType = params.some(p => !p.native); + paramDef += (0, utils_1.indent)(_.map(params, 'property')); + paramDef += `\n`; + paramDef += `}\n`; + const enums = _.map(params, 'enumDeclaration').filter(Boolean); + if (enums.length) { + paramDef += `\n`; + paramDef += enums.join('\n\n'); + paramDef += `\n`; + } + params.sort((p1, p2) => (p1.isRequired ? 0 : 1) - (p2.isRequired ? 0 : 1)); + typesOnly = params.map(p => p.propertyAsMethodParameter).join(', '); + return { paramDef, typesOnly, usesGlobalType, isInterfaceEmpty }; +} +exports.processParams = processParams; +// TODO! use required array to set the variable +// TODO might be unnecessary for v3.0+ of OpenAPI spec +// https://swagger.io/specification/#parameterObject +function parameterToSchema(param) { + return { + ...{ + allowEmptyValue: param.allowEmptyValue, + default: param.default, + description: param.description, + enum: param.enum, + format: param.format, + items: param.items, + maximum: param.maximum, + maxLength: param.maxLength, + minimum: param.minimum, + minLength: param.minLength, + pattern: param.pattern, + type: param.type, + uniqueItems: param.uniqueItems, + }, + ...param.schema, // move level up + }; +} +exports.parameterToSchema = parameterToSchema; +//# sourceMappingURL=process-params.js.map \ No newline at end of file diff --git a/dist/requests/process-params.js.map b/dist/requests/process-params.js.map new file mode 100644 index 00000000..14da62ac --- /dev/null +++ b/dist/requests/process-params.js.map @@ -0,0 +1 @@ +{"version":3,"file":"process-params.js","sourceRoot":"","sources":["../../src/requests/process-params.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,4BAA4B;AAE5B,sCAA0C;AAE1C,oCAAgC;AAShC;;;;GAIG;AACH,SAAgB,aAAa,CAAC,GAAgB,EAAE,UAAkB;IAChE,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,QAAQ,IAAI,oBAAoB,UAAU,MAAM,CAAC;IAEjD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,IAAA,wBAAe,EAC5C,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEnD,QAAQ,IAAI,IAAA,cAAM,EAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAa,CAAC,CAAC;IAC1D,QAAQ,IAAI,IAAI,CAAC;IACjB,QAAQ,IAAI,KAAK,CAAC;IAClB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/D,IAAI,KAAK,CAAC,MAAM,EAAE;QAChB,QAAQ,IAAI,IAAI,CAAC;QACjB,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,QAAQ,IAAI,IAAI,CAAC;KAClB;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpE,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAC,CAAC;AACjE,CAAC;AA1BD,sCA0BC;AAED,+CAA+C;AAC/C,sDAAsD;AACtD,oDAAoD;AACpD,SAAgB,iBAAiB,CAAC,KAAgB;IAChD,OAAO;QACL,GAAG;YACD,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B;QACD,GAAG,KAAK,CAAC,MAAM,EAAE,gBAAgB;KAClC,CAAC;AACJ,CAAC;AAnBD,8CAmBC"} \ No newline at end of file diff --git a/dist/requests/process-paths.js b/dist/requests/process-paths.js new file mode 100644 index 00000000..25a63b26 --- /dev/null +++ b/dist/requests/process-paths.js @@ -0,0 +1,86 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.processPaths = void 0; +/** + * Processing of custom types from `paths` section + * in the schema + */ +const _ = require("lodash"); +const conf = require("../conf"); +const utils_1 = require("../utils"); +const process_controller_1 = require("./process-controller"); +/** + * Entry point, processes all possible api requests and exports them + * to files devided ty controllers (same as swagger web app sections) + * @param pathsWithParameters paths from the schema + * @param swaggerPath swagger base url + * @param config global configs + * @param definitions + * @param basePath base URL path + */ +function processPaths(pathsWithParameters, swaggerPath, config, definitions, basePath) { + const paths = preProcessPaths(pathsWithParameters); + const controllers = _.flatMap(paths, (methods, url) => (_.map(methods, (method, methodName) => ({ + url, + name: getName(method), + methodName, + simpleName: getSimpleName(url), + summary: method.summary, + operationId: method.operationId, + swaggerUrl: `${swaggerPath}${method.tags[0]}/${method.operationId}`, + description: method.description, + paramDef: method.parameters, + responses: method.responses, + responseDef: null, + basePath, + })))); + const controllerFiles = _.groupBy(controllers, 'name'); + conf.controllerIgnores.forEach(key => delete controllerFiles[key]); + _.forEach(controllerFiles, (methods, name) => (0, process_controller_1.processController)(methods, name, config, definitions)); +} +exports.processPaths = processPaths; +/** + * Returns simple name from last static URL segment + * example: `/accounts/${accountId}/updateMothersName` => `updateMothersName` + * @param url + */ +function getSimpleName(url) { + // remove url params + let method = url.replace(/\/{[^}]+}/g, ''); + // remove trailing `/` if present + method = method.replace(/\/$/, ''); + // take trailing url folder + method = method.replace(/(.*\/)*/, ''); + // subst spaces and underscores + method = _.camelCase(method); + method = method.replace(/[^\w]/g, ''); + return method; +} +/** + * Returns name of the method + * @param method + */ +function getName(method) { + return _.upperFirst(_.camelCase(method.tags[0].replace(/(-rest)?-controller/, ''))); +} +/** + * One of the allowed swagger formats is that under given url, there can be methods like get, post, put etc., but also + * parameters that often defines a path parameter common for the HTTP methods. + * This method extends HTTP method (get, post ...) parameters with the above mentioned parameters + * @param paths + */ +function preProcessPaths(paths) { + Object.values(paths).forEach(pathValue => { + if (pathValue.parameters) { + Object.keys(pathValue).forEach(key => { + if (key === 'parameters') + return; + const method = pathValue[key]; + method.parameters = (0, utils_1.merge)(method.parameters, pathValue.parameters, 'in', 'name'); + }); + } + delete pathValue.parameters; + }); + return paths; +} +//# sourceMappingURL=process-paths.js.map \ No newline at end of file diff --git a/dist/requests/process-paths.js.map b/dist/requests/process-paths.js.map new file mode 100644 index 00000000..353e89de --- /dev/null +++ b/dist/requests/process-paths.js.map @@ -0,0 +1 @@ +{"version":3,"file":"process-paths.js","sourceRoot":"","sources":["../../src/requests/process-paths.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/requests/process-responses.js b/dist/requests/process-responses.js new file mode 100644 index 00000000..bcf11f09 --- /dev/null +++ b/dist/requests/process-responses.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.processResponses = void 0; +/** + * Processing of custom types from `paths` section + * in the schema + */ +const _ = require("lodash"); +const fs = require("fs"); +const path = require("path"); +const common_1 = require("../common"); +const conf = require("../conf"); +const definitions_1 = require("../definitions"); +/** + * Process all responses of one method + * @param httpResponse response object + * @param name of the context for type name uniqueness + * @param config global config + */ +function processResponses(httpResponse, name, config) { + const responses = _.filter(httpResponse, (r, status) => (r.schema && Math.floor(Number(status) / 100) === 2)); + let properties = []; + for (const response of responses) { + if (response.schema && response.schema.properties) { + const processedDefinition = processNestedSchemaDefinition(response.schema, name, config); + const propertyOutput = { + property: `__model.${processedDefinition.name}`, + propertyAsMethodParameter: '', + enumDeclaration: undefined, + native: false, + isRequired: false, + }; + properties.push(propertyOutput); + } + else { + properties = properties.concat((0, common_1.processProperty)(response.schema, undefined, name)); + } + } + const property = _.map(properties, 'property'); + const enumDeclaration = _.map(properties, 'enumDeclaration').filter(Boolean).join('\n\n'); + const usesGlobalType = properties.some(p => !p.native); + let type; + if (property.length) { + type = _.uniqWith(property, _.isEqual).join(' | '); + } + else { + type = 'void'; + } + return { type, enumDeclaration, usesGlobalType }; +} +exports.processResponses = processResponses; +function processNestedSchemaDefinition(schema, name, config) { + const processedDef = (0, definitions_1.processDefinition)(schema, `${name}GeneratedInlineModel`, config); + const filename = path.join(config.dest, `${conf.modelFile}.ts`); + const exportDefiniton = (0, definitions_1.createExport)(processedDef.name); + fs.appendFileSync(filename, `${exportDefiniton}\n`); + return processedDef; +} +//# sourceMappingURL=process-responses.js.map \ No newline at end of file diff --git a/dist/requests/process-responses.js.map b/dist/requests/process-responses.js.map new file mode 100644 index 00000000..57d6430f --- /dev/null +++ b/dist/requests/process-responses.js.map @@ -0,0 +1 @@ +{"version":3,"file":"process-responses.js","sourceRoot":"","sources":["../../src/requests/process-responses.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,4BAA4B;AAE5B,yBAAyB;AACzB,6BAA6B;AAC7B,sCAA0D;AAC1D,gCAAgC;AAChC,gDAAoF;AAIpF;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,YAA0B,EAAE,IAAY,EAAE,MAAc;IACvF,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,MAAgB,EAAE,EAAE,CAAC,CAChE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,UAAU,GAAqB,EAAE,CAAC;IAEtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAChC,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;YACjD,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACzF,MAAM,cAAc,GAAmB;gBACrC,QAAQ,EAAE,WAAW,mBAAmB,CAAC,IAAI,EAAE;gBAC/C,yBAAyB,EAAE,EAAE;gBAC7B,eAAe,EAAE,SAAS;gBAC1B,MAAM,EAAE,KAAK;gBACb,UAAU,EAAE,KAAK;aAClB,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACjC;aAAM;YACL,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,IAAA,wBAAe,EAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;SACnF;KACF;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEvD,IAAI,IAAY,CAAC;IACjB,IAAI,QAAQ,CAAC,MAAM,EAAE;QACnB,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACpD;SAAM;QACL,IAAI,GAAG,MAAM,CAAC;KACf;IAED,OAAO,EAAC,IAAI,EAAE,eAAe,EAAE,cAAc,EAAC,CAAC;AACjD,CAAC;AAjCD,4CAiCC;AAED,SAAS,6BAA6B,CAAC,MAAc,EAAE,IAAY,EAAE,MAAc;IACjF,MAAM,YAAY,GAAG,IAAA,+BAAiB,EAAC,MAAM,EAAE,GAAG,IAAI,sBAAsB,EAAE,MAAM,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,IAAA,0BAAY,EAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxD,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,eAAe,IAAI,CAAC,CAAC;IAEpD,OAAO,YAAY,CAAC;AACtB,CAAC"} \ No newline at end of file diff --git a/dist/requests/requests.models.js b/dist/requests/requests.models.js new file mode 100644 index 00000000..99dd38b4 --- /dev/null +++ b/dist/requests/requests.models.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=requests.models.js.map \ No newline at end of file diff --git a/dist/requests/requests.models.js.map b/dist/requests/requests.models.js.map new file mode 100644 index 00000000..ce70ad37 --- /dev/null +++ b/dist/requests/requests.models.js.map @@ -0,0 +1 @@ +{"version":3,"file":"requests.models.js","sourceRoot":"","sources":["../../src/requests/requests.models.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/types.js b/dist/types.js new file mode 100644 index 00000000..11e638d1 --- /dev/null +++ b/dist/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/types.js.map b/dist/types.js.map new file mode 100644 index 00000000..c768b790 --- /dev/null +++ b/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/utils.js b/dist/utils.js new file mode 100644 index 00000000..5aa5566f --- /dev/null +++ b/dist/utils.js @@ -0,0 +1,164 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.merge = exports.out = exports.TermColors = exports.processHeader = exports.makeComment = exports.writeFile = exports.indent = exports.emptyDir = exports.createDir = void 0; +const fs = require("fs"); +const conf = require("./conf"); +/** + * Checks if directory exists + * @param path + */ +function doesDirExist(path) { + try { + return fs.statSync(path).isDirectory(); + } + catch (e) { + if (e.code === 'ENOENT') { + return false; + } + else { + throw e; + } + } +} +/** + * Creates directory based on provided path + * @param path + */ +function createDir(path) { + if (!doesDirExist(path)) + fs.mkdirSync(path, { recursive: true }); +} +exports.createDir = createDir; +/** + * Recursively deletes the path and optionally creates self as an empty directory + * @param path + * @param removeSelf whether to remove the directory itself or just its content + */ +function emptyDir(path, removeSelf = false) { + if (!fs.existsSync(path)) { + if (!removeSelf) + fs.mkdirSync(path); + return; + } + fs.readdirSync(path).forEach(file => { + const current = `${path}/${file}`; + if (fs.lstatSync(current).isDirectory()) + emptyDir(current, removeSelf); + else + fs.unlinkSync(current); + }); + if (removeSelf) + fs.rmdirSync(path); +} +exports.emptyDir = emptyDir; +/** + * Indents the input + * @param input string (with new-line separation) or array of lines + * @param level of indentation, takes into account `conf` indentation setting + */ +function indent(input, level = 1) { + if (Array.isArray(input)) + input = input.join('\n'); + let res; + res = input.replace(/^/gm, ' '.repeat(level * conf.indentation)); + res = res.replace(/^\s+$/gm, ''); + return res; +} +exports.indent = indent; +/** + * Serializes the content to the file including global header + * @param file + * @param content + */ +function writeFile(file, content, header = '', fileType = 'ts', disableFlags) { + if (fileType === 'ts') { + if (!disableFlags) + disableFlags = ['max-line-length']; + let disable = ''; + if (disableFlags.length) + disable = `/* tslint:disable:${disableFlags.join(' ')} */\n`; + if (header) + header += '\n'; + content = `${disable}${header}${content}`; + } + fs.writeFileSync(file, content); + out(`${file} generated`, TermColors.green); +} +exports.writeFile = writeFile; +/** + * Makes the string commented, supports single/multi-line and empty output + * @param input string (with new-line separation) or array of lines + */ +function makeComment(input) { + if (Array.isArray(input)) + input = input.join('\n'); + input = input.split('\n'); + let res = ''; + if (input.length > 1) { + res = input.map(c => c ? ` * ${c}` : ' *').join('\n'); + res = `/**\n${res}\n */\n`; + } + else if (input.length && input[0]) { + res = `/** ${input[0]} */\n`; + } + return res; +} +exports.makeComment = makeComment; +/** + * Creates a unified header for all serialized files + * @param schemaDef input schema header + * @param swaggerUrlPath the path where the swagger ui definition can be found + * @param version should API version info be included in generated files + */ +function processHeader(schemaDef, omitVersion = false) { + const relevant = { + info: schemaDef.info, + path: schemaDef.host + (schemaDef.basePath || ''), + }; + if (omitVersion) + delete relevant.info.version; + let res = JSON.stringify(relevant, null, conf.indentation); + res = res.replace(/^[{}]$/gm, ''); + res = res.replace(/^\s*"[^"]+": [{"]/gm, ''); + res = res.replace(/["}],?$/gm, ''); + res = res.split('\n').filter(l => l.match(/\w/)).join('\n'); + return makeComment(res); +} +exports.processHeader = processHeader; +var TermColors; +(function (TermColors) { + TermColors["green"] = "\u001B[32m"; + TermColors["red"] = "\u001B[31m"; + TermColors["default"] = "\u001B[0m"; +})(TermColors || (exports.TermColors = TermColors = {})); +/** + * Outputs text in optional color + * @param text + * @param color + */ +function out(text, color) { + if (Array.isArray(text)) + text = text.join('\n'); + if (color) + text = `${color}${text}${TermColors.default}`; + process.stdout.write(`${text}\n`); +} +exports.out = out; +/** + * From others it filters out duplicate elements which are included in favoured. + * Duplicates = same values for keys. + * @param favoured + * @param others + * @param keys + */ +function merge(favoured, others, ...keys) { + const othersFiltered = others + .filter(elem => { + return !favoured.find(subElem => keys + .map((k) => elem[k] === subElem[k]) + .every(Boolean)); + }); + return favoured.concat(othersFiltered); +} +exports.merge = merge; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/dist/utils.js.map b/dist/utils.js.map new file mode 100644 index 00000000..7d6af17d --- /dev/null +++ b/dist/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file