From 336ded6b7e2ab3613ffd89f44bce4c7f3e8d525f Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 27 Jun 2023 09:33:28 +0200 Subject: [PATCH 01/48] updated template files; added release tasks; lib config --- .github/workflows/create-release.yml | 69 +++++++++ package-lock.json | 4 +- package.json | 8 +- rollup.config.mjs | 3 + src/templates/client.hbs | 99 +++---------- src/templates/exportService.hbs | 205 ++++++++------------------ src/templates/index.hbs | 46 ------ src/templates/partials/typeArray.hbs | 4 +- src/utils/registerHandlebarHelpers.ts | 12 ++ 9 files changed, 179 insertions(+), 271 deletions(-) create mode 100644 .github/workflows/create-release.yml diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 000000000..9528a3419 --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,69 @@ +name: "Create Release" + +on: + workflow_dispatch: + inputs: + releaseType: + type: choice + description: Release Type + options: + - minor + - patch + - major + +jobs: + publish: + name: "Build, Tag & Publish" + runs-on: ubuntu-latest + steps: + - name: "Checkout Code" + uses: actions/checkout@v3 + with: + ref: main + + - name: "Setup NodeJS Environment" + uses: actions/setup-node@v3 + with: + node-version: 16 + registry-url: "https://npm.pkg.github.com" + scope: "@hypoport" + + - name: "Configure NPM-Package Credentials" + run: | + npm config set @hypoport:registry https://npm.pkg.github.com, + npm config set //npm.pkg.github.com/:_authToken ${{ secrets.GHEC_PACKAGES_TOKEN }} + + - name: "Install Dependencies" + run: npm ci + + - name: "Configure Git Author" + run: | + git config user.name "github-actions" + git config user.email "github-actions@github.com" + + - name: "Increase Version" + run: npm version ${{ inputs.releaseType }} --no-git-tag-version + + - name: "Extract Version as Environment Variable" + run: | + echo "version=$(npx -c 'echo "$npm_package_version"')" >> $GITHUB_ENV + + - name: "Build" + run: npm run build + + - name: "Configure NPM-Package Write Credentials" + run: | + npm config set @hypoport:registry https://npm.pkg.github.com + npm config set //npm.pkg.github.com/:_authToken ${{ secrets.GITHUB_TOKEN }} + + - name: "Create and Push Release" + run: | + git add . + git commit -m "increased version to ${{ env.version }}" + git tag v${{ env.version }} + git push + git push origin v${{ env.version }} + npm publish + + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package-lock.json b/package-lock.json index 0cebbe4c3..82eef1c05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "openapi-typescript-codegen", + "name": "@hypoport/openapi-typescript-codegen", "version": "0.24.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "openapi-typescript-codegen", + "name": "@hypoport/openapi-typescript-codegen", "version": "0.24.0", "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 9232fbc62..fd2b90c4d 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "openapi-typescript-codegen", + "name": "@hypoport/openapi-typescript-codegen", "version": "0.24.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", @@ -57,7 +57,9 @@ "eslint:fix": "eslint . --fix", "prepublishOnly": "npm run clean && npm run release", "codecov": "codecov --token=66c30c23-8954-4892-bef9-fbaed0a2e42b", - "docker": "docker build -t eeelenbaas/openapi-typescript-codegen ." + "docker": "docker build -t eeelenbaas/openapi-typescript-codegen .", + "snapshot:publish": "npm run snapshot:version && npm publish --tag snapshot", + "snapshot:version": "npm version prerelease --preid snapshot --git-tag-version=false" }, "dependencies": { "camelcase": "^6.3.0", @@ -121,7 +123,7 @@ "typescript": "4.9.5", "zone.js": "0.13.1" }, - "overrides" : { + "overrides": { "node-fetch": "2.6.9", "rollup": "3.20.2", "typescript": "4.9.5" diff --git a/rollup.config.mjs b/rollup.config.mjs index df7373395..acfe0bd8a 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -39,6 +39,9 @@ const handlebarsPlugin = () => ({ escapeComment: true, escapeDescription: true, camelCase: true, + lowerCase: true, + escapePath: true, + isEqual: true, }, }); return `export default ${templateSpec};`; diff --git a/src/templates/client.hbs b/src/templates/client.hbs index 601f27d8f..893dc8af2 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -1,80 +1,27 @@ -{{>header}} +import { constructExternalUrl } from '@hypoport/ampr-homecloud-common'; +import { createContainer } from 'thirty/inject'; -{{#equals @root.httpClient 'angular'}} -import { NgModule} from '@angular/core'; -import { HttpClientModule } from '@angular/common/http'; - -import { AngularHttpRequest } from './core/AngularHttpRequest'; -import { BaseHttpRequest } from './core/BaseHttpRequest'; -import type { OpenAPIConfig } from './core/OpenAPI'; -import { OpenAPI } from './core/OpenAPI'; -{{else}} -import type { BaseHttpRequest } from './core/BaseHttpRequest'; -import type { OpenAPIConfig } from './core/OpenAPI'; -import { {{{httpRequest}}} } from './core/{{{httpRequest}}}'; -{{/equals}} - -{{#if services}} {{#each services}} -import { {{{name}}}{{{@root.postfix}}} } from './services/{{{name}}}{{{@root.postfix}}}'; +import { {{{name}}}{{{@root.postfix}}}, {{{lowerCase name}}}{{{@root.postfix}}}Factory } from './services/{{{name}}}{{{@root.postfix}}}'; {{/each}} -{{/if}} - -{{#equals @root.httpClient 'angular'}} -@NgModule({ - imports: [HttpClientModule], - providers: [ - { - provide: OpenAPI, - useValue: { - BASE: OpenAPI?.BASE ?? '{{{server}}}', - VERSION: OpenAPI?.VERSION ?? '{{{version}}}', - WITH_CREDENTIALS: OpenAPI?.WITH_CREDENTIALS ?? false, - CREDENTIALS: OpenAPI?.CREDENTIALS ?? 'include', - TOKEN: OpenAPI?.TOKEN, - USERNAME: OpenAPI?.USERNAME, - PASSWORD: OpenAPI?.PASSWORD, - HEADERS: OpenAPI?.HEADERS, - ENCODE_PATH: OpenAPI?.ENCODE_PATH, - } as OpenAPIConfig, - }, - { - provide: BaseHttpRequest, - useClass: AngularHttpRequest, - }, - {{#each services}} - {{{name}}}{{{@root.postfix}}}, - {{/each}} - ] -}) -export class {{{clientName}}} {} -{{else}} -type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest; - -export class {{{clientName}}} { - - {{#each services}} - public readonly {{{camelCase name}}}: {{{name}}}{{{@root.postfix}}}; - {{/each}} - - public readonly request: BaseHttpRequest; - - constructor(config?: Partial, HttpRequest: HttpRequestConstructor = {{{httpRequest}}}) { - this.request = new HttpRequest({ - BASE: config?.BASE ?? '{{{server}}}', - VERSION: config?.VERSION ?? '{{{version}}}', - WITH_CREDENTIALS: config?.WITH_CREDENTIALS ?? false, - CREDENTIALS: config?.CREDENTIALS ?? 'include', - TOKEN: config?.TOKEN, - USERNAME: config?.USERNAME, - PASSWORD: config?.PASSWORD, - HEADERS: config?.HEADERS, - ENCODE_PATH: config?.ENCODE_PATH, - }); - - {{#each services}} - this.{{{camelCase name}}} = new {{{name}}}{{{@root.postfix}}}(this.request); - {{/each}} - } +import { httpClientFactory } from '../http/http-client'; + +export class HomecloudApiService { + {{#each services}} + readonly {{{lowerCase name}}}Api: {{{name}}}{{{@root.postfix}}}; + {{/each}} + + constructor(stage: 'prod' | 'test') { + const config = createContainer({ + baseUrl: () => constructExternalUrl(stage, 'api'), + httpClient: httpClientFactory, + {{#each services}} + {{{lowerCase name}}}ApiService: {{{lowerCase name}}}{{{@root.postfix}}}Factory, + {{/each}} + }); + + {{#each services}} + this.{{{lowerCase name}}}Api = config.{{{lowerCase name}}}{{{@root.postfix}}}; + {{/each}} + } } -{{/equals}} diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index d6bccbbeb..96dc5f784 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -1,152 +1,73 @@ -{{>header}} +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { AxiosResponse } from 'axios'; -{{#equals @root.httpClient 'angular'}} -{{#if @root.exportClient}} -import { Injectable } from '@angular/core'; -import type { Observable } from 'rxjs'; -{{else}} -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import type { Observable } from 'rxjs'; -{{/if}} - -{{/equals}} -{{#if imports}} {{#each imports}} -import type { {{{this}}} } from '../models/{{{this}}}'; +import { {{{this}}} } from '../../../models'; {{/each}} +import { HttpClient } from '../../http/http-client'; -{{/if}} -{{#notEquals @root.httpClient 'angular'}} -import type { CancelablePromise } from '../core/CancelablePromise'; -{{/notEquals}} -{{#if @root.exportClient}} -{{#equals @root.httpClient 'angular'}} -import { BaseHttpRequest } from '../core/BaseHttpRequest'; -{{else}} -import type { BaseHttpRequest } from '../core/BaseHttpRequest'; -{{/equals}} -{{else}} -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; -{{/if}} +export type {{{name}}}{{{@root.postfix}}} = ReturnType; +export type {{{name}}}{{{@root.postfix}}}Options = { + baseUrl: string; + httpClient: HttpClient; +}; -{{#equals @root.httpClient 'angular'}} -@Injectable({ - providedIn: 'root', -}) -{{/equals}} -export class {{{name}}}{{{@root.postfix}}} { - {{#if @root.exportClient}} +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpClient }: {{{name}}}{{{@root.postfix}}}Options) => ({ + {{#each operations}} + {{#if (isEqual name 'getStatus')}} + {{{name}}}: async ({{>parameters}} timeout?: number): Promiseresult}}>> => { + const url = `${baseUrl}{{{escapePath path}}}`; + return httpClient.{{{lowerCase method}}}(url, undefined, timeout); + }, + {{else if (isEqual name 'orderHomeValuation')}} + {{{name}}}: async (accessToken: string, {{>parameters}} timeout?: number): Promiseresult}}>> => { + const url = `${baseUrl}{{{escapePath path}}}`; + return httpClient.{{{lowerCase method}}}(url, undefined, accessToken, timeout); + }, + {{else if (isEqual name 'createAuthToken')}} + {{{name}}}: async (clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, timeout = 5000): Promiseresult}}>> => { + const url = `${baseUrl}{{{escapePath path}}}`; - constructor(public readonly httpRequest: BaseHttpRequest) {} - {{else}} - {{#equals @root.httpClient 'angular'}} + const params = new URLSearchParams(); + params.append('client_id', clientId); + params.append('client_secret', clientSecret); + params.append('scope', scopes); + params.append('grant_type', 'client_credentials'); - constructor(public readonly http: HttpClient) {} - {{/equals}} - {{/if}} + if (actor) { + params.append('actor', actor); + } + if (subject) { + params.append('subject', subject); + } + + return httpClient.{{{lowerCase method}}}(url, params, undefined, timeout, 'application/x-www-form-urlencoded'); + }, + {{else}} + {{{name}}}: async (accessToken: string, {{>parameters}} timeout?: number): Promiseresult}}>> => { + let url = `${baseUrl}{{{escapePath path}}}`; + {{#if parametersQuery}} - {{#each operations}} - /** - {{#if deprecated}} - * @deprecated - {{/if}} - {{#if summary}} - * {{{escapeComment summary}}} - {{/if}} - {{#if description}} - * {{{escapeComment description}}} - {{/if}} - {{#unless @root.useOptions}} - {{#if parameters}} - {{#each parameters}} - * @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}} - {{/each}} - {{/if}} - {{/unless}} - {{#each results}} - * @returns {{{type}}} {{#if description}}{{{escapeComment description}}}{{/if}} - {{/each}} - * @throws ApiError - */ - {{#if @root.exportClient}} - {{#equals @root.httpClient 'angular'}} - public {{{name}}}({{>parameters}}): Observable<{{>result}}> { - return this.httpRequest.request({ - {{else}} - public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { - return this.httpRequest.request({ - {{/equals}} - {{else}} - {{#equals @root.httpClient 'angular'}} - public {{{name}}}({{>parameters}}): Observable<{{>result}}> { - return __request(OpenAPI, this.http, { - {{else}} - public static {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { - return __request(OpenAPI, { - {{/equals}} - {{/if}} - method: '{{{method}}}', - url: '{{{path}}}', - {{#if parametersPath}} - path: { - {{#each parametersPath}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersCookie}} - cookies: { - {{#each parametersCookie}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersHeader}} - headers: { - {{#each parametersHeader}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersQuery}} - query: { - {{#each parametersQuery}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersForm}} - formData: { - {{#each parametersForm}} - '{{{prop}}}': {{{name}}}, - {{/each}} - }, - {{/if}} - {{#if parametersBody}} - {{#equals parametersBody.in 'formData'}} - formData: {{{parametersBody.name}}}, - {{/equals}} - {{#equals parametersBody.in 'body'}} - body: {{{parametersBody.name}}}, - {{/equals}} - {{#if parametersBody.mediaType}} - mediaType: '{{{parametersBody.mediaType}}}', - {{/if}} - {{/if}} - {{#if responseHeader}} - responseHeader: '{{{responseHeader}}}', - {{/if}} - {{#if errors}} - errors: { - {{#each errors}} - {{{code}}}: `{{{escapeDescription description}}}`, - {{/each}} - }, - {{/if}} - }); - } + const params = new URLSearchParams(); + {{#each parametersQuery}} + if ({{{name}}}) { + params.append('{{{name}}}', `${ {{{name}}} }`); + } + {{/each}} + if (params.values.length > 0) { + url += params.toString(); + } + {{/if}} + {{#if (isEqual method 'GET')}} + return httpClient.{{{lowerCase method}}}(url, accessToken, timeout); + {{else if (isEqual method 'DELETE')}} + return httpClient.{{{lowerCase method}}}(url, accessToken, timeout); + {{else}} + return httpClient.{{{lowerCase method}}}(url, requestBody, accessToken, timeout); + {{/if}} + }, + {{/if}} {{/each}} -} +}); diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 6f5b27d8c..172f31bef 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -1,47 +1 @@ -{{>header}} - -{{#if @root.exportClient}} export { {{{clientName}}} } from './{{{clientName}}}'; - -{{/if}} -{{#if @root.exportCore}} -export { ApiError } from './core/ApiError'; -{{#if @root.exportClient}} -export { BaseHttpRequest } from './core/BaseHttpRequest'; -{{/if}} -export { CancelablePromise, CancelError } from './core/CancelablePromise'; -export { OpenAPI } from './core/OpenAPI'; -export type { OpenAPIConfig } from './core/OpenAPI'; -{{/if}} -{{#if @root.exportModels}} -{{#if models}} - -{{#each models}} -{{#if @root.useUnionTypes}} -export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{else if enum}} -export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{else if enums}} -export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{else}} -export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{/if}} -{{/each}} -{{/if}} -{{/if}} -{{#if @root.exportSchemas}} -{{#if models}} - -{{#each models}} -export { ${{{name}}} } from './schemas/${{{name}}}'; -{{/each}} -{{/if}} -{{/if}} -{{#if @root.exportServices}} -{{#if services}} - -{{#each services}} -export { {{{name}}}{{{@root.postfixServices}}} } from './services/{{{name}}}{{{@root.postfixServices}}}'; -{{/each}} -{{/if}} -{{/if}} diff --git a/src/templates/partials/typeArray.hbs b/src/templates/partials/typeArray.hbs index c3d44374f..1bd5498b3 100644 --- a/src/templates/partials/typeArray.hbs +++ b/src/templates/partials/typeArray.hbs @@ -1,5 +1,5 @@ {{~#if link~}} -Array<{{>type link}}>{{>isNullable}} +{{>type link}}{{>isNullable}}[] {{~else~}} -Array<{{>base}}>{{>isNullable}} +{{>base}}{{>isNullable}}[] {{~/if~}} diff --git a/src/utils/registerHandlebarHelpers.ts b/src/utils/registerHandlebarHelpers.ts index 88f47c19b..adb841c57 100644 --- a/src/utils/registerHandlebarHelpers.ts +++ b/src/utils/registerHandlebarHelpers.ts @@ -104,4 +104,16 @@ export const registerHandlebarHelpers = (root: { Handlebars.registerHelper('camelCase', function (value: string): string { return camelCase(value); }); + + Handlebars.registerHelper('lowerCase', function (value: string): string { + return value.toLowerCase(); + }); + + Handlebars.registerHelper('escapePath', function (value: string): string { + return value.replace('{', `\${`); + }); + + Handlebars.registerHelper('isEqual', (value1, value2) => { + return value1 === value2; + }); }; From 47aec6a936be74ccd15d5bfb38f7b3cfd523609d Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 27 Jun 2023 09:42:48 +0200 Subject: [PATCH 02/48] increased version to 0.25.0 --- .github/workflows/create-release.yml | 69 ---------------------------- package-lock.json | 4 +- package.json | 2 +- 3 files changed, 3 insertions(+), 72 deletions(-) delete mode 100644 .github/workflows/create-release.yml diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml deleted file mode 100644 index 9528a3419..000000000 --- a/.github/workflows/create-release.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: "Create Release" - -on: - workflow_dispatch: - inputs: - releaseType: - type: choice - description: Release Type - options: - - minor - - patch - - major - -jobs: - publish: - name: "Build, Tag & Publish" - runs-on: ubuntu-latest - steps: - - name: "Checkout Code" - uses: actions/checkout@v3 - with: - ref: main - - - name: "Setup NodeJS Environment" - uses: actions/setup-node@v3 - with: - node-version: 16 - registry-url: "https://npm.pkg.github.com" - scope: "@hypoport" - - - name: "Configure NPM-Package Credentials" - run: | - npm config set @hypoport:registry https://npm.pkg.github.com, - npm config set //npm.pkg.github.com/:_authToken ${{ secrets.GHEC_PACKAGES_TOKEN }} - - - name: "Install Dependencies" - run: npm ci - - - name: "Configure Git Author" - run: | - git config user.name "github-actions" - git config user.email "github-actions@github.com" - - - name: "Increase Version" - run: npm version ${{ inputs.releaseType }} --no-git-tag-version - - - name: "Extract Version as Environment Variable" - run: | - echo "version=$(npx -c 'echo "$npm_package_version"')" >> $GITHUB_ENV - - - name: "Build" - run: npm run build - - - name: "Configure NPM-Package Write Credentials" - run: | - npm config set @hypoport:registry https://npm.pkg.github.com - npm config set //npm.pkg.github.com/:_authToken ${{ secrets.GITHUB_TOKEN }} - - - name: "Create and Push Release" - run: | - git add . - git commit -m "increased version to ${{ env.version }}" - git tag v${{ env.version }} - git push - git push origin v${{ env.version }} - npm publish - - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package-lock.json b/package-lock.json index 82eef1c05..c7f8b94ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.24.0", + "version": "0.25.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.24.0", + "version": "0.25.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index fd2b90c4d..69eb373f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.24.0", + "version": "0.25.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From ec9c90fb9b79d88cf6841d31e59cd71bc098393b Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 27 Jun 2023 15:51:54 +0200 Subject: [PATCH 03/48] increased version to 0.26.0 --- package-lock.json | 4 ++-- package.json | 2 +- src/templates/exportService.hbs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7f8b94ce..8f1652640 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.25.0", + "version": "0.26.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.25.0", + "version": "0.26.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 69eb373f7..8a22050c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.25.0", + "version": "0.26.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 96dc5f784..8905224f9 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -57,7 +57,7 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl } {{/each}} if (params.values.length > 0) { - url += params.toString(); + url += `?${params.toString()}`; } {{/if}} {{#if (isEqual method 'GET')}} From 27efb8ff833930c6fd0984250c750c02f678c2d0 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 27 Jun 2023 17:22:59 +0200 Subject: [PATCH 04/48] added release workflow --- .circleci/config.yml | 32 ------------- .github/workflows/create-release.yml | 69 ++++++++++++++++++++++++++++ package.json | 2 +- src/templates/exportService.hbs | 4 +- test/index.spec.ts | 21 ++++++++- 5 files changed, 93 insertions(+), 35 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/workflows/create-release.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index fe53ab1f2..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: 2 -jobs: - build: - docker: - - image: cimg/node:lts-browsers - resource_class: large - working_directory: ~/repo - steps: - - checkout - - restore_cache: - keys: - - v1-dependencies-{{ checksum "package-lock.json" }} - - v1-dependencies- - - run: - name: Install dependencies - command: npm install - - save_cache: - key: v1-dependencies-{{ checksum "package-lock.json" }} - paths: - - node_modules - - run: - name: Build library - command: npm run release - - run: - name: Run unit tests - command: npm run test -# - run: -# name: Run e2e tests -# command: npm run test:e2e - - run: - name: Submit to Codecov - command: npm run codecov diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 000000000..b364942ae --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,69 @@ +name: "Create Release" + +on: + workflow_dispatch: + inputs: + releaseType: + type: choice + description: Release Type + options: + - minor + - patch + - major + +jobs: + publish: + name: "Build, Tag & Publish" + runs-on: ubuntu-latest + steps: + - name: "Checkout Code" + uses: actions/checkout@v3 + with: + ref: master + + - name: "Setup NodeJS Environment" + uses: actions/setup-node@v3 + with: + node-version: 16 + registry-url: "https://npm.pkg.github.com" + scope: "@hypoport" + + - name: "Configure NPM-Package Credentials" + run: | + npm config set @hypoport:registry https://npm.pkg.github.com, + npm config set //npm.pkg.github.com/:_authToken ${{ secrets.GHEC_PACKAGES_TOKEN }} + + - name: "Install Dependencies" + run: npm ci + + - name: "Configure Git Author" + run: | + git config user.name "github-actions" + git config user.email "github-actions@github.com" + + - name: "Increase Version" + run: npm version ${{ inputs.releaseType }} --no-git-tag-version + + - name: "Extract Version as Environment Variable" + run: | + echo "version=$(npx -c 'echo "$npm_package_version"')" >> $GITHUB_ENV + + - name: "Build" + run: npm run release + + - name: "Configure NPM-Package Write Credentials" + run: | + npm config set @hypoport:registry https://npm.pkg.github.com + npm config set //npm.pkg.github.com/:_authToken ${{ secrets.GITHUB_TOKEN }} + + - name: "Create and Push Release" + run: | + git add . + git commit -m "increased version to ${{ env.version }}" + git tag v${{ env.version }} + git push + git push origin v${{ env.version }} + npm publish + + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index 8a22050c8..23a89e977 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "release": "rollup --config --environment NODE_ENV:production", "validate": "tsc --project tsconfig.json --noEmit", "run": "node ./test/index.js", - "test": "jest --selectProjects UNIT", + "test": "npm run build && jest --selectProjects UNIT", "test:update": "jest --selectProjects UNIT --updateSnapshot", "test:watch": "jest --selectProjects UNIT --watch", "test:coverage": "jest --selectProjects UNIT --coverage", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 8905224f9..a193fde1c 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -1,8 +1,10 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { AxiosResponse } from 'axios'; {{#each imports}} +{{#if (isEqual this 'CreateAuthTokenRequestModel')}} +{{else}} import { {{{this}}} } from '../../../models'; +{{/if}} {{/each}} import { HttpClient } from '../../http/http-client'; diff --git a/test/index.spec.ts b/test/index.spec.ts index 78a0197d5..a757889be 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -1,7 +1,7 @@ import { readFileSync } from 'fs'; import { sync } from 'glob'; -import { generate, HttpClient } from '../'; +import { generate, HttpClient, Indent } from '../'; describe('v2', () => { it('should generate', async () => { @@ -44,3 +44,22 @@ describe('v3', () => { }); }); }); + +describe('homecloud', () => { + it('should generate', async () => { + await generate({ + clientName: 'HomecloudApiService', + exportCore: false, + exportModels: false, + exportSchemas: false, + exportServices: true, + httpClient: HttpClient.AXIOS, + indent: Indent.SPACE_2, + input: 'https://test.docs.api.homecloud.de/homecloud-api-specs.json', + output: './test/generated/homecloud/', + postfixServices: 'ApiService', + useOptions: false, + useUnionTypes: false, + }); + }); +}); From ca237fe23d62c762f249ca4da1735696871505b2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 27 Jun 2023 15:24:43 +0000 Subject: [PATCH 05/48] increased version to 0.26.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f1652640..c4d231956 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.0", + "version": "0.26.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.0", + "version": "0.26.1", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 23a89e977..09ee9cde5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.0", + "version": "0.26.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 6d401a6667bde9ad4e15a9352cc20e46fade37c9 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 27 Jun 2023 17:52:17 +0200 Subject: [PATCH 06/48] updated workflow --- .github/workflows/create-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index b364942ae..ef76e122b 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -19,7 +19,7 @@ jobs: - name: "Checkout Code" uses: actions/checkout@v3 with: - ref: master + ref: main - name: "Setup NodeJS Environment" uses: actions/setup-node@v3 From 5f6a32ac19275461d874dfe425090e5f1382a9de Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 27 Jun 2023 17:53:49 +0200 Subject: [PATCH 07/48] increased version to 0.26.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4d231956..f28ace556 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.1", + "version": "0.26.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.1", + "version": "0.26.2", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 09ee9cde5..0690b8611 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.1", + "version": "0.26.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From e8c6583a71abfc29a87d758ae4b8b14b47f3ff18 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 Jun 2023 09:36:01 +0000 Subject: [PATCH 08/48] increased version to 0.26.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f28ace556..eb920891c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.2", + "version": "0.26.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.2", + "version": "0.26.3", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 0690b8611..5a2c36c73 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.2", + "version": "0.26.3", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From e8f6338e08ac9eb23e96234c9809b6d2d5e154ed Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 Jun 2023 12:27:22 +0000 Subject: [PATCH 09/48] increased version to 0.26.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb920891c..3f4ff075b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.3", + "version": "0.26.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.3", + "version": "0.26.4", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 5a2c36c73..00cbf1c07 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.3", + "version": "0.26.4", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 62d7fc04d4ae3939f82cc0316c2a64704e61157f Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 30 Jun 2023 14:36:09 +0200 Subject: [PATCH 10/48] added code owner file --- .github/workflows/codeql.yml | 41 ---------------------------- .github/workflows/create-release.yml | 5 ---- CODEOWNERS | 12 ++++++++ 3 files changed, 12 insertions(+), 46 deletions(-) delete mode 100644 .github/workflows/codeql.yml create mode 100644 CODEOWNERS diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index 9041ade65..000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: "CodeQL" - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - schedule: - - cron: "44 20 * * 3" - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ javascript ] - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - queries: +security-and-quality - - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index ef76e122b..d49f42fd3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -28,11 +28,6 @@ jobs: registry-url: "https://npm.pkg.github.com" scope: "@hypoport" - - name: "Configure NPM-Package Credentials" - run: | - npm config set @hypoport:registry https://npm.pkg.github.com, - npm config set //npm.pkg.github.com/:_authToken ${{ secrets.GHEC_PACKAGES_TOKEN }} - - name: "Install Dependencies" run: npm ci diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 000000000..20bbb1f5c --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,12 @@ +# Ampr Code Owners / Trusted Committers +# +# Siehe auch: +# - https://help.github.com/articles/about-codeowners/ +# - https://github.com/hypoport/ep-innersource/blob/master/src/inner-source/code-ownership.md +# +# Bitte die Sortierung dieser Datei beibehalten. Die zuletzt zutreffende Regel +# hat Vorrang. + +* @MaykAkifovski @denwehrle @minizwergi @v-bykovski +package.json +package-lock.json From 5014aa054761345ffdaf79c4ef626e38177d25dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:37:42 +0000 Subject: [PATCH 11/48] build(deps-dev): Bump @typescript-eslint/eslint-plugin (#1) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.60.0 to 5.60.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.60.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 214 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 197 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f4ff075b..509321d72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@types/node": "18.16.3", "@types/node-fetch": "2.6.3", "@types/qs": "6.9.7", - "@typescript-eslint/eslint-plugin": "5.60.0", + "@typescript-eslint/eslint-plugin": "5.60.1", "@typescript-eslint/parser": "5.60.0", "abort-controller": "3.0.0", "axios": "1.4.0", @@ -5634,15 +5634,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", - "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", + "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/type-utils": "5.60.1", + "@typescript-eslint/utils": "5.60.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -5667,6 +5667,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "5.60.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", @@ -5712,13 +5759,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", - "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", + "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/utils": "5.60.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5738,6 +5785,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/types": { "version": "5.60.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", @@ -5779,17 +5883,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", - "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", + "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/typescript-estree": "5.60.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -5804,6 +5908,80 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.60.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", diff --git a/package.json b/package.json index 00cbf1c07..462ee2d88 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "@types/node": "18.16.3", "@types/node-fetch": "2.6.3", "@types/qs": "6.9.7", - "@typescript-eslint/eslint-plugin": "5.60.0", + "@typescript-eslint/eslint-plugin": "5.60.1", "@typescript-eslint/parser": "5.60.0", "abort-controller": "3.0.0", "axios": "1.4.0", From e96a7a479b9856d06c3037efb0c955e594d6be45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:38:04 +0000 Subject: [PATCH 12/48] build(deps-dev): Bump tslib from 2.5.3 to 2.6.0 (#3) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.5.3 to 2.6.0. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/v2.5.3...2.6.0) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 509321d72..2b6ffa22e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,7 @@ "rollup-plugin-terser": "7.0.2", "rxjs": "7.8.1", "ts-node": "10.9.1", - "tslib": "2.5.3", + "tslib": "2.6.0", "typescript": "4.9.5", "zone.js": "0.13.1" } @@ -16616,9 +16616,9 @@ } }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true }, "node_modules/tsutils": { diff --git a/package.json b/package.json index 462ee2d88..7063272d3 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "rollup-plugin-terser": "7.0.2", "rxjs": "7.8.1", "ts-node": "10.9.1", - "tslib": "2.5.3", + "tslib": "2.6.0", "typescript": "4.9.5", "zone.js": "0.13.1" }, From 2f3877dbb8c67e30ed403281e8ce5bc846731b60 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 30 Jun 2023 14:46:13 +0200 Subject: [PATCH 13/48] added auto-merge script --- .github/dependabot.yml | 45 ++++++++++++++++-------------- .github/workflows/auto-merge.yml | 47 ++++++++++++++++---------------- 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 77d50f37b..ba88db246 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,22 +1,27 @@ version: 2 updates: -- package-ecosystem: npm - directory: "/" - schedule: - interval: "daily" - ignore: - - dependency-name: "@types/node-fetch" - - dependency-name: "node-fetch" - - dependency-name: "camelcase" - - dependency-name: "@angular-devkit/build-angular" - - dependency-name: "@angular/animations" - - dependency-name: "@angular/cli" - - dependency-name: "@angular/common" - - dependency-name: "@angular/compiler" - - dependency-name: "@angular/compiler-cli" - - dependency-name: "@angular/core" - - dependency-name: "@angular/forms" - - dependency-name: "@angular/platform-browser" - - dependency-name: "@angular/platform-browser-dynamic" - - dependency-name: "@angular/router" - - dependency-name: "typescript" \ No newline at end of file + - package-ecosystem: 'npm' + directory: '/' + schedule: + interval: 'daily' + registries: + - npm-github + target-branch: 'develop' + open-pull-requests-limit: 10 + versioning-strategy: increase + ignore: + - dependency-name: "@types/node-fetch" + - dependency-name: "node-fetch" + - dependency-name: "camelcase" + - dependency-name: "@angular-devkit/build-angular" + - dependency-name: "@angular/animations" + - dependency-name: "@angular/cli" + - dependency-name: "@angular/common" + - dependency-name: "@angular/compiler" + - dependency-name: "@angular/compiler-cli" + - dependency-name: "@angular/core" + - dependency-name: "@angular/forms" + - dependency-name: "@angular/platform-browser" + - dependency-name: "@angular/platform-browser-dynamic" + - dependency-name: "@angular/router" + - dependency-name: "typescript" \ No newline at end of file diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index 5d5d5301d..d4f5c01c8 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -1,29 +1,30 @@ -name: auto-merge +name: 'Auto Merge Dependabot PRs' -on: pull_request_target - -permissions: - pull-requests: write - contents: write +on: + workflow_run: + types: + - completed + workflows: + - 'Push Checks' jobs: - dependabot: + merge: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + name: 'Auto Merge Dependabot PRs' runs-on: ubuntu-latest - if: ${{ github.actor == 'dependabot[bot]' }} steps: - - name: Fetch Dependabot metadata - id: dependabot-metadata - uses: dependabot/fetch-metadata@v1 + - name: 'Auto Merge Dependabot PRs' + uses: ridedott/merge-me-action@v2 with: - github-token: ${{ secrets.GITHUB_TOKEN }} - - name: Approve PR - run: gh pr review --approve "$PR_URL" - env: - PR_URL: ${{ github.event.pull_request.html_url }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Merge PR - if: ${{ steps.dependabot-metadata.outputs.update-type != 'version-update:semver-major' }} - run: gh pr merge --auto --squash "$PR_URL" - env: - PR_URL: ${{ github.event.pull_request.html_url }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Depending on branch protection rules, a manually populated + # `GITHUB_TOKEN_WORKAROUND` secret with permissions to push to + # a protected branch must be used. This secret can have an arbitrary + # name, as an example, this repository uses `DOTTBOTT_TOKEN`. + # + # When using a custom token, it is recommended to leave the following + # comment for other developers to be aware of the reasoning behind it: + # + # This must be used as GitHub Actions token does not support pushing + # to protected branches. + GITHUB_TOKEN: ${{ secrets.MERGE_ME_SECRET }} + PRESET: DEPENDABOT_MINOR From bb91a60e0592c85e35e7aefd0855535f45fe24a9 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 30 Jun 2023 14:47:57 +0200 Subject: [PATCH 14/48] fixed dependabot config --- .github/dependabot.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ba88db246..118a43d24 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,8 +4,6 @@ updates: directory: '/' schedule: interval: 'daily' - registries: - - npm-github target-branch: 'develop' open-pull-requests-limit: 10 versioning-strategy: increase From c3e4b10e19a43e6e6a56d7b3f1373c7c2192b03a Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 30 Jun 2023 15:09:46 +0200 Subject: [PATCH 15/48] added push checks script --- .github/workflows/push-checks.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/push-checks.yml diff --git a/.github/workflows/push-checks.yml b/.github/workflows/push-checks.yml new file mode 100644 index 000000000..c654e5ea3 --- /dev/null +++ b/.github/workflows/push-checks.yml @@ -0,0 +1,22 @@ +name: 'Push Checks' + +on: [push] + +jobs: + check: + name: 'Lint & Test' + runs-on: ubuntu-latest + steps: + - name: 'Checkout Code' + uses: actions/checkout@v3 + + - name: 'Setup NodeJS Environment' + uses: actions/setup-node@v3 + with: + node-version: 16 + + - name: 'Install Dependencies' + run: npm ci + + - name: 'Lint Source Code' + run: npm run validate From 5361d543ba1b9e8aaf82c28519bd6343f2061c47 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Mon, 3 Jul 2023 22:36:20 +0200 Subject: [PATCH 16/48] added int stage to client params --- .github/dependabot.yml | 25 ------------------------- .github/workflows/auto-merge.yml | 30 ------------------------------ .github/workflows/push-checks.yml | 22 ---------------------- src/templates/client.hbs | 2 +- 4 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 .github/dependabot.yml delete mode 100644 .github/workflows/auto-merge.yml delete mode 100644 .github/workflows/push-checks.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 118a43d24..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,25 +0,0 @@ -version: 2 -updates: - - package-ecosystem: 'npm' - directory: '/' - schedule: - interval: 'daily' - target-branch: 'develop' - open-pull-requests-limit: 10 - versioning-strategy: increase - ignore: - - dependency-name: "@types/node-fetch" - - dependency-name: "node-fetch" - - dependency-name: "camelcase" - - dependency-name: "@angular-devkit/build-angular" - - dependency-name: "@angular/animations" - - dependency-name: "@angular/cli" - - dependency-name: "@angular/common" - - dependency-name: "@angular/compiler" - - dependency-name: "@angular/compiler-cli" - - dependency-name: "@angular/core" - - dependency-name: "@angular/forms" - - dependency-name: "@angular/platform-browser" - - dependency-name: "@angular/platform-browser-dynamic" - - dependency-name: "@angular/router" - - dependency-name: "typescript" \ No newline at end of file diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml deleted file mode 100644 index d4f5c01c8..000000000 --- a/.github/workflows/auto-merge.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: 'Auto Merge Dependabot PRs' - -on: - workflow_run: - types: - - completed - workflows: - - 'Push Checks' - -jobs: - merge: - if: ${{ github.event.workflow_run.conclusion == 'success' }} - name: 'Auto Merge Dependabot PRs' - runs-on: ubuntu-latest - steps: - - name: 'Auto Merge Dependabot PRs' - uses: ridedott/merge-me-action@v2 - with: - # Depending on branch protection rules, a manually populated - # `GITHUB_TOKEN_WORKAROUND` secret with permissions to push to - # a protected branch must be used. This secret can have an arbitrary - # name, as an example, this repository uses `DOTTBOTT_TOKEN`. - # - # When using a custom token, it is recommended to leave the following - # comment for other developers to be aware of the reasoning behind it: - # - # This must be used as GitHub Actions token does not support pushing - # to protected branches. - GITHUB_TOKEN: ${{ secrets.MERGE_ME_SECRET }} - PRESET: DEPENDABOT_MINOR diff --git a/.github/workflows/push-checks.yml b/.github/workflows/push-checks.yml deleted file mode 100644 index c654e5ea3..000000000 --- a/.github/workflows/push-checks.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: 'Push Checks' - -on: [push] - -jobs: - check: - name: 'Lint & Test' - runs-on: ubuntu-latest - steps: - - name: 'Checkout Code' - uses: actions/checkout@v3 - - - name: 'Setup NodeJS Environment' - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: 'Install Dependencies' - run: npm ci - - - name: 'Lint Source Code' - run: npm run validate diff --git a/src/templates/client.hbs b/src/templates/client.hbs index 893dc8af2..a5075071c 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -11,7 +11,7 @@ export class HomecloudApiService { readonly {{{lowerCase name}}}Api: {{{name}}}{{{@root.postfix}}}; {{/each}} - constructor(stage: 'prod' | 'test') { + constructor(stage: 'prod' | 'test' | 'int') { const config = createContainer({ baseUrl: () => constructExternalUrl(stage, 'api'), httpClient: httpClientFactory, From 6a573d6628710b60c03db2e35b66d05125ab7180 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Mon, 3 Jul 2023 22:37:45 +0200 Subject: [PATCH 17/48] increased version to 0.27.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b6ffa22e..c97127e88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.4", + "version": "0.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.4", + "version": "0.27.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 7063272d3..1cadd746d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.26.4", + "version": "0.27.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From cb57d499d0705fd233c4725c139b94d27d7a5714 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Mon, 3 Jul 2023 23:44:18 +0200 Subject: [PATCH 18/48] increased version to 0.28.0 --- package-lock.json | 4 +-- package.json | 2 +- src/templates/exportService.hbs | 11 +++--- src/templates/partials/deconstruction.hbs | 3 ++ src/utils/registerHandlebarTemplates.ts | 2 ++ test/index.spec.ts | 42 ----------------------- 6 files changed, 15 insertions(+), 49 deletions(-) create mode 100644 src/templates/partials/deconstruction.hbs diff --git a/package-lock.json b/package-lock.json index c97127e88..405935630 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.27.0", + "version": "0.28.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.27.0", + "version": "0.28.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 1cadd746d..b0b805603 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.27.0", + "version": "0.28.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index a193fde1c..4ff40f90c 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -18,17 +18,17 @@ export type {{{name}}}{{{@root.postfix}}}Options = { export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpClient }: {{{name}}}{{{@root.postfix}}}Options) => ({ {{#each operations}} {{#if (isEqual name 'getStatus')}} - {{{name}}}: async ({{>parameters}} timeout?: number): Promiseresult}}>> => { + {{{name}}}: async ({timeout}:{timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; return httpClient.{{{lowerCase method}}}(url, undefined, timeout); }, {{else if (isEqual name 'orderHomeValuation')}} - {{{name}}}: async (accessToken: string, {{>parameters}} timeout?: number): Promiseresult}}>> => { + {{{name}}}: async ({accessToken, {{>deconstruction}} timeout}:{accessToken: string, {{>parameters}} timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; return httpClient.{{{lowerCase method}}}(url, undefined, accessToken, timeout); }, {{else if (isEqual name 'createAuthToken')}} - {{{name}}}: async (clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, timeout = 5000): Promiseresult}}>> => { + {{{name}}}: async ({clientId, clientSecret, scopes, actor, subject, email, timeout}:{clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, email?: string, timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; const params = new URLSearchParams(); @@ -43,11 +43,14 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl if (subject) { params.append('subject', subject); } + if (email) { + params.append('email', email); + } return httpClient.{{{lowerCase method}}}(url, params, undefined, timeout, 'application/x-www-form-urlencoded'); }, {{else}} - {{{name}}}: async (accessToken: string, {{>parameters}} timeout?: number): Promiseresult}}>> => { + {{{name}}}: async ({accessToken, {{>deconstruction}} timeout}:{accessToken: string, {{>parameters}} timeout?: number}): Promiseresult}}>> => { let url = `${baseUrl}{{{escapePath path}}}`; {{#if parametersQuery}} diff --git a/src/templates/partials/deconstruction.hbs b/src/templates/partials/deconstruction.hbs new file mode 100644 index 000000000..81abc26ab --- /dev/null +++ b/src/templates/partials/deconstruction.hbs @@ -0,0 +1,3 @@ +{{#each parameters}} +{{{name}}}, +{{/each}} \ No newline at end of file diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..e2b609c61 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -57,6 +57,7 @@ import templateExportSchema from '../templates/exportSchema.hbs'; import templateExportService from '../templates/exportService.hbs'; import templateIndex from '../templates/index.hbs'; import partialBase from '../templates/partials/base.hbs'; +import partialDeconstruction from '../templates/partials/deconstruction.hbs'; import partialExportComposition from '../templates/partials/exportComposition.hbs'; import partialExportEnum from '../templates/partials/exportEnum.hbs'; import partialExportInterface from '../templates/partials/exportInterface.hbs'; @@ -147,6 +148,7 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); + Handlebars.registerPartial('deconstruction', Handlebars.template(partialDeconstruction)); Handlebars.registerPartial('result', Handlebars.template(partialResult)); Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); diff --git a/test/index.spec.ts b/test/index.spec.ts index a757889be..7797090e2 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -3,48 +3,6 @@ import { sync } from 'glob'; import { generate, HttpClient, Indent } from '../'; -describe('v2', () => { - it('should generate', async () => { - await generate({ - input: './test/spec/v2.json', - output: './test/generated/v2/', - httpClient: HttpClient.FETCH, - useOptions: false, - useUnionTypes: false, - exportCore: true, - exportSchemas: true, - exportModels: true, - exportServices: true, - }); - - sync('./test/generated/v2/**/*.ts').forEach(file => { - const content = readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); - }); -}); - -describe('v3', () => { - it('should generate', async () => { - await generate({ - input: './test/spec/v3.json', - output: './test/generated/v3/', - httpClient: HttpClient.FETCH, - useOptions: false, - useUnionTypes: false, - exportCore: true, - exportSchemas: true, - exportModels: true, - exportServices: true, - }); - - sync('./test/generated/v3/**/*.ts').forEach(file => { - const content = readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); - }); -}); - describe('homecloud', () => { it('should generate', async () => { await generate({ From f203b8e33e21aa55ba315498646c9a1fc73afc66 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 4 Jul 2023 00:06:48 +0200 Subject: [PATCH 19/48] updated service and partial templates --- src/templates/exportService.hbs | 2 +- src/templates/partials/isRequired.hbs | 2 +- src/templates/partials/parameters.hbs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 4ff40f90c..ee38fe185 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -18,7 +18,7 @@ export type {{{name}}}{{{@root.postfix}}}Options = { export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpClient }: {{{name}}}{{{@root.postfix}}}Options) => ({ {{#each operations}} {{#if (isEqual name 'getStatus')}} - {{{name}}}: async ({timeout}:{timeout?: number}): Promiseresult}}>> => { + {{{name}}}: async (timeout?: number): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; return httpClient.{{{lowerCase method}}}(url, undefined, timeout); }, diff --git a/src/templates/partials/isRequired.hbs b/src/templates/partials/isRequired.hbs index b829272b9..4ba1cac93 100644 --- a/src/templates/partials/isRequired.hbs +++ b/src/templates/partials/isRequired.hbs @@ -1,5 +1,5 @@ {{~#if @root.useOptions~}} {{#unless isRequired}}?{{else if default}}?{{/unless}} {{~else~}} -{{#unless isRequired}}{{#unless default}}?{{/unless}}{{/unless}} +{{#unless isRequired}}?{{#unless default}}?{{/unless}}{{/unless}} {{~/if~}} diff --git a/src/templates/partials/parameters.hbs b/src/templates/partials/parameters.hbs index 57ab5a7d1..959cc7a80 100644 --- a/src/templates/partials/parameters.hbs +++ b/src/templates/partials/parameters.hbs @@ -2,7 +2,7 @@ {{#if @root.useOptions~}} { {{#each parameters}} -{{{name}}}{{#if default}} = {{{default}}}{{/if}}, +{{{name}}}, {{/each}} }: { {{#each parameters}} @@ -22,7 +22,7 @@ {{~else}} {{#each parameters}} -{{{name}}}{{>isRequired}}: {{>type}}{{#if default}} = {{{default}}}{{/if}}, +{{{name}}}{{>isRequired}}: {{>type}}, {{/each}} {{/if}} {{/if}} From 0cd5c8de684d617eb0c3f14bcdc5769daeb34fb6 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 4 Jul 2023 00:07:33 +0200 Subject: [PATCH 20/48] increased version to 0.28.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 405935630..79947be94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.0", + "version": "0.28.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.0", + "version": "0.28.1", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index b0b805603..42ce0527a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.0", + "version": "0.28.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From e5a7221fe78cbc7b1b5a8907e33ee1df15c43645 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 4 Jul 2023 00:13:12 +0200 Subject: [PATCH 21/48] fixed isRequired partial --- src/templates/partials/isRequired.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/partials/isRequired.hbs b/src/templates/partials/isRequired.hbs index 4ba1cac93..cb6d72392 100644 --- a/src/templates/partials/isRequired.hbs +++ b/src/templates/partials/isRequired.hbs @@ -1,5 +1,5 @@ {{~#if @root.useOptions~}} {{#unless isRequired}}?{{else if default}}?{{/unless}} {{~else~}} -{{#unless isRequired}}?{{#unless default}}?{{/unless}}{{/unless}} +{{#unless isRequired}}?{{#unless default}}{{/unless}}{{/unless}} {{~/if~}} From 9f6c89a0c5494b1810b815cc2ab9cf701983e093 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 4 Jul 2023 00:13:53 +0200 Subject: [PATCH 22/48] increased version to 0.28.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79947be94..6398da1dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.1", + "version": "0.28.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.1", + "version": "0.28.2", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 42ce0527a..4c0e961e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.1", + "version": "0.28.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 8bfcfaad54573ceeaf1cca12eb7be82197a35661 Mon Sep 17 00:00:00 2001 From: Daniel Mohr Date: Mon, 10 Jul 2023 15:30:49 +0200 Subject: [PATCH 23/48] adapt homecloud api client service to support baseUrl or stage param --- src/templates/client.hbs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/templates/client.hbs b/src/templates/client.hbs index a5075071c..d10a22f8b 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -6,14 +6,27 @@ import { {{{name}}}{{{@root.postfix}}}, {{{lowerCase name}}}{{{@root.postfix}}}F {{/each}} import { httpClientFactory } from '../http/http-client'; +type ApiServiceOptions = + | { stage: 'prod' | 'test' | 'int' } + | { + baseUrl: string; + }; + export class HomecloudApiService { {{#each services}} readonly {{{lowerCase name}}}Api: {{{name}}}{{{@root.postfix}}}; {{/each}} - - constructor(stage: 'prod' | 'test' | 'int') { + + /** + * + **/ + constructor(serviceConfig: ApiServiceOptions) { + if ('baseUrl' in serviceConfig && 'stage' in serviceConfig) { + throw new Error('Please provide only baseUrl or stage, not both!'); + } + const baseUrl = 'baseUrl' in serviceConfig ? serviceConfig.baseUrl : constructExternalUrl(serviceConfig.stage, 'api'); const config = createContainer({ - baseUrl: () => constructExternalUrl(stage, 'api'), + baseUrl: () => baseUrl, httpClient: httpClientFactory, {{#each services}} {{{lowerCase name}}}ApiService: {{{lowerCase name}}}{{{@root.postfix}}}Factory, From 047ca921989516c95440d7dc359f30e77148f827 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Mon, 10 Jul 2023 15:46:57 +0200 Subject: [PATCH 24/48] increased version to 0.29.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6398da1dd..038a74eaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.2", + "version": "0.29.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.2", + "version": "0.29.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 4c0e961e2..830631ca0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.28.2", + "version": "0.29.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 11c546277981e5e864f5cb1d19ae9162ef6d4205 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Mon, 10 Jul 2023 15:50:22 +0200 Subject: [PATCH 25/48] increased version to 0.29.1 --- package-lock.json | 4 ++-- package.json | 2 +- src/templates/client.hbs | 9 +-------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 038a74eaf..f6cd3cd88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.29.0", + "version": "0.29.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.29.0", + "version": "0.29.1", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 830631ca0..2ad9d1229 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.29.0", + "version": "0.29.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", diff --git a/src/templates/client.hbs b/src/templates/client.hbs index d10a22f8b..e104fa295 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -6,20 +6,13 @@ import { {{{name}}}{{{@root.postfix}}}, {{{lowerCase name}}}{{{@root.postfix}}}F {{/each}} import { httpClientFactory } from '../http/http-client'; -type ApiServiceOptions = - | { stage: 'prod' | 'test' | 'int' } - | { - baseUrl: string; - }; +type ApiServiceOptions = { stage: 'prod' | 'test' | 'int' } | { baseUrl: string }; export class HomecloudApiService { {{#each services}} readonly {{{lowerCase name}}}Api: {{{name}}}{{{@root.postfix}}}; {{/each}} - /** - * - **/ constructor(serviceConfig: ApiServiceOptions) { if ('baseUrl' in serviceConfig && 'stage' in serviceConfig) { throw new Error('Please provide only baseUrl or stage, not both!'); From c77786d1edac03ab5c41de1b77f27e28a3c4c602 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 21 Jul 2023 10:15:08 +0200 Subject: [PATCH 26/48] service generation cleanup --- .gitignore | 1 + src/client/interfaces/Operation.d.ts | 1 + src/index.spec.ts | 8 ++++++++ src/openApi/v2/parser/getOperation.ts | 1 + src/openApi/v3/parser/getOperation.ts | 1 + src/templates/exportService.hbs | 20 +++++-------------- src/templates/partials/accessToken.hbs | 3 +++ .../partials/accessTokenOrUndefined.hbs | 5 +++++ src/templates/partials/accessTokenParam.hbs | 3 +++ src/templates/partials/deconstruction.hbs | 2 +- .../partials/requestBodyOrUndefined.hbs | 5 +++++ src/utils/registerHandlebarTemplates.ts | 8 ++++++++ test/index.spec.ts | 3 --- 13 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 src/templates/partials/accessToken.hbs create mode 100644 src/templates/partials/accessTokenOrUndefined.hbs create mode 100644 src/templates/partials/accessTokenParam.hbs create mode 100644 src/templates/partials/requestBodyOrUndefined.hbs diff --git a/.gitignore b/.gitignore index 2b7422568..57899e20f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ junit.xml dist coverage test/generated +test/models test/e2e/generated samples/generated samples/swagger-codegen-cli-v2.jar diff --git a/src/client/interfaces/Operation.d.ts b/src/client/interfaces/Operation.d.ts index 779144325..016c7c2b4 100644 --- a/src/client/interfaces/Operation.d.ts +++ b/src/client/interfaces/Operation.d.ts @@ -8,6 +8,7 @@ export interface Operation extends OperationParameters { summary: string | null; description: string | null; deprecated: boolean; + hasSecurity: boolean; method: string; path: string; errors: OperationError[]; diff --git a/src/index.spec.ts b/src/index.spec.ts index 1e42c68e4..dfe9a567b 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -32,4 +32,12 @@ describe('index', () => { write: false, }); }); + + it('downloads and parses homecloud without issues', async () => { + await OpenAPI.generate({ + input: 'https://test.docs.api.homecloud.de/homecloud-api-specs.json', + output: './test/generated/homecloud/', + write: false, + }); + }); }); diff --git a/src/openApi/v2/parser/getOperation.ts b/src/openApi/v2/parser/getOperation.ts index 9aa157460..295268a1f 100644 --- a/src/openApi/v2/parser/getOperation.ts +++ b/src/openApi/v2/parser/getOperation.ts @@ -30,6 +30,7 @@ export const getOperation = ( description: op.description || null, deprecated: op.deprecated === true, method: method.toUpperCase(), + hasSecurity: !!(op.security && op.security.length > 0), path: url, parameters: [...pathParams.parameters], parametersPath: [...pathParams.parametersPath], diff --git a/src/openApi/v3/parser/getOperation.ts b/src/openApi/v3/parser/getOperation.ts index aee4bd0c2..c5944cd19 100644 --- a/src/openApi/v3/parser/getOperation.ts +++ b/src/openApi/v3/parser/getOperation.ts @@ -33,6 +33,7 @@ export const getOperation = ( description: op.description || null, deprecated: op.deprecated === true, method: method.toUpperCase(), + hasSecurity: !!(op.security && op.security.length > 0), path: url, parameters: [...pathParams.parameters], parametersPath: [...pathParams.parametersPath], diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index ee38fe185..949349efd 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -17,17 +17,7 @@ export type {{{name}}}{{{@root.postfix}}}Options = { // eslint-disable-next-line @typescript-eslint/explicit-function-return-type export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpClient }: {{{name}}}{{{@root.postfix}}}Options) => ({ {{#each operations}} - {{#if (isEqual name 'getStatus')}} - {{{name}}}: async (timeout?: number): Promiseresult}}>> => { - const url = `${baseUrl}{{{escapePath path}}}`; - return httpClient.{{{lowerCase method}}}(url, undefined, timeout); - }, - {{else if (isEqual name 'orderHomeValuation')}} - {{{name}}}: async ({accessToken, {{>deconstruction}} timeout}:{accessToken: string, {{>parameters}} timeout?: number}): Promiseresult}}>> => { - const url = `${baseUrl}{{{escapePath path}}}`; - return httpClient.{{{lowerCase method}}}(url, undefined, accessToken, timeout); - }, - {{else if (isEqual name 'createAuthToken')}} + {{#if (isEqual name 'createAuthToken')}} {{{name}}}: async ({clientId, clientSecret, scopes, actor, subject, email, timeout}:{clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, email?: string, timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; @@ -50,7 +40,7 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl return httpClient.{{{lowerCase method}}}(url, params, undefined, timeout, 'application/x-www-form-urlencoded'); }, {{else}} - {{{name}}}: async ({accessToken, {{>deconstruction}} timeout}:{accessToken: string, {{>parameters}} timeout?: number}): Promiseresult}}>> => { + {{{name}}}: async ({ {{>accessToken}} {{>deconstruction}} timeout}:{ {{>accessTokenParam}} {{>parameters}} timeout?: number}): Promiseresult}}>> => { let url = `${baseUrl}{{{escapePath path}}}`; {{#if parametersQuery}} @@ -66,11 +56,11 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl } {{/if}} {{#if (isEqual method 'GET')}} - return httpClient.{{{lowerCase method}}}(url, accessToken, timeout); + return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); {{else if (isEqual method 'DELETE')}} - return httpClient.{{{lowerCase method}}}(url, accessToken, timeout); + return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); {{else}} - return httpClient.{{{lowerCase method}}}(url, requestBody, accessToken, timeout); + return httpClient.{{{lowerCase method}}}(url, {{>requestBodyOrUndefined}} {{>accessTokenOrUndefined}} timeout); {{/if}} }, {{/if}} diff --git a/src/templates/partials/accessToken.hbs b/src/templates/partials/accessToken.hbs new file mode 100644 index 000000000..31f69c9f2 --- /dev/null +++ b/src/templates/partials/accessToken.hbs @@ -0,0 +1,3 @@ +{{#if hasSecurity}} +accessToken, +{{/if}} diff --git a/src/templates/partials/accessTokenOrUndefined.hbs b/src/templates/partials/accessTokenOrUndefined.hbs new file mode 100644 index 000000000..7bb8b7fbe --- /dev/null +++ b/src/templates/partials/accessTokenOrUndefined.hbs @@ -0,0 +1,5 @@ +{{#if hasSecurity}} +accessToken, +{{else}} +undefined, +{{/if}} diff --git a/src/templates/partials/accessTokenParam.hbs b/src/templates/partials/accessTokenParam.hbs new file mode 100644 index 000000000..8649d34f3 --- /dev/null +++ b/src/templates/partials/accessTokenParam.hbs @@ -0,0 +1,3 @@ +{{#if hasSecurity}} +accessToken: string, +{{/if}} diff --git a/src/templates/partials/deconstruction.hbs b/src/templates/partials/deconstruction.hbs index 81abc26ab..ad3ca9794 100644 --- a/src/templates/partials/deconstruction.hbs +++ b/src/templates/partials/deconstruction.hbs @@ -1,3 +1,3 @@ {{#each parameters}} {{{name}}}, -{{/each}} \ No newline at end of file +{{/each}} diff --git a/src/templates/partials/requestBodyOrUndefined.hbs b/src/templates/partials/requestBodyOrUndefined.hbs new file mode 100644 index 000000000..5f81aa56e --- /dev/null +++ b/src/templates/partials/requestBodyOrUndefined.hbs @@ -0,0 +1,5 @@ +{{#if parametersBody}} +requestBody, +{{else}} +undefined, +{{/if}} diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index e2b609c61..1cda37be3 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -56,6 +56,9 @@ import templateExportModel from '../templates/exportModel.hbs'; import templateExportSchema from '../templates/exportSchema.hbs'; import templateExportService from '../templates/exportService.hbs'; import templateIndex from '../templates/index.hbs'; +import partialAccessToken from '../templates/partials/accessToken.hbs'; +import partialAccessTokenOrUndefined from '../templates/partials/accessTokenOrUndefined.hbs'; +import partialAccessTokenParam from '../templates/partials/accessTokenParam.hbs'; import partialBase from '../templates/partials/base.hbs'; import partialDeconstruction from '../templates/partials/deconstruction.hbs'; import partialExportComposition from '../templates/partials/exportComposition.hbs'; @@ -67,6 +70,7 @@ import partialIsNullable from '../templates/partials/isNullable.hbs'; import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; import partialIsRequired from '../templates/partials/isRequired.hbs'; import partialParameters from '../templates/partials/parameters.hbs'; +import partialRequestBodyOrUndefined from '../templates/partials/requestBodyOrUndefined.hbs'; import partialResult from '../templates/partials/result.hbs'; import partialSchema from '../templates/partials/schema.hbs'; import partialSchemaArray from '../templates/partials/schemaArray.hbs'; @@ -139,6 +143,9 @@ export const registerHandlebarTemplates = (root: { }; // Partials for the generations of the models, services, etc. + Handlebars.registerPartial('accessToken', Handlebars.template(partialAccessToken)); + Handlebars.registerPartial('accessTokenParam', Handlebars.template(partialAccessTokenParam)); + Handlebars.registerPartial('accessTokenOrUndefined', Handlebars.template(partialAccessTokenOrUndefined)); Handlebars.registerPartial('exportEnum', Handlebars.template(partialExportEnum)); Handlebars.registerPartial('exportInterface', Handlebars.template(partialExportInterface)); Handlebars.registerPartial('exportComposition', Handlebars.template(partialExportComposition)); @@ -150,6 +157,7 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); Handlebars.registerPartial('deconstruction', Handlebars.template(partialDeconstruction)); Handlebars.registerPartial('result', Handlebars.template(partialResult)); + Handlebars.registerPartial('requestBodyOrUndefined', Handlebars.template(partialRequestBodyOrUndefined)); Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); Handlebars.registerPartial('schemaDictionary', Handlebars.template(partialSchemaDictionary)); diff --git a/test/index.spec.ts b/test/index.spec.ts index 7797090e2..bee97e56d 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -1,6 +1,3 @@ -import { readFileSync } from 'fs'; -import { sync } from 'glob'; - import { generate, HttpClient, Indent } from '../'; describe('homecloud', () => { From 02987fe1b91a38fe626b3e90c390583fee96a86a Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 21 Jul 2023 10:16:04 +0200 Subject: [PATCH 27/48] increased version to 0.30.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f6cd3cd88..6e43011d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.29.1", + "version": "0.30.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.29.1", + "version": "0.30.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 2ad9d1229..105d14972 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.29.1", + "version": "0.30.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 7ed7b990015cd7abd2e65cc3e3b5ca64814f573a Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 21 Jul 2023 10:27:16 +0200 Subject: [PATCH 28/48] fixed newline on inline partials --- bin/index.js | 56 --------------- bin/index.spec.js | 72 ------------------- src/templates/exportService.hbs | 2 +- src/templates/partials/accessToken.hbs | 4 +- .../partials/accessTokenOrUndefined.hbs | 6 +- src/templates/partials/accessTokenParam.hbs | 4 +- .../partials/requestBodyOrUndefined.hbs | 6 +- 7 files changed, 5 insertions(+), 145 deletions(-) delete mode 100755 bin/index.js delete mode 100755 bin/index.spec.js diff --git a/bin/index.js b/bin/index.js deleted file mode 100755 index 32f2fecbc..000000000 --- a/bin/index.js +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -const path = require('path'); -const { program } = require('commander'); -const pkg = require('../package.json'); - -const params = program - .name('openapi') - .usage('[options]') - .version(pkg.version) - .requiredOption('-i, --input ', 'OpenAPI specification, can be a path, url or string content (required)') - .requiredOption('-o, --output ', 'Output directory (required)') - .option('-c, --client ', 'HTTP client to generate [fetch, xhr, node, axios, angular]', 'fetch') - .option('--name ', 'Custom client class name') - .option('--useOptions', 'Use options instead of arguments') - .option('--useUnionTypes', 'Use union types instead of enums') - .option('--exportCore ', 'Write core files to disk', true) - .option('--exportServices ', 'Write services to disk', true) - .option('--exportModels ', 'Write models to disk', true) - .option('--exportSchemas ', 'Write schemas to disk', false) - .option('--indent ', 'Indentation options [4, 2, tabs]', '4') - .option('--postfixServices ', 'Service name postfix', 'Service') - .option('--postfixModels ', 'Model name postfix') - .option('--request ', 'Path to custom request file') - .parse(process.argv) - .opts(); - -const OpenAPI = require(path.resolve(__dirname, '../dist/index.js')); - -if (OpenAPI) { - OpenAPI.generate({ - input: params.input, - output: params.output, - httpClient: params.client, - clientName: params.name, - useOptions: params.useOptions, - useUnionTypes: params.useUnionTypes, - exportCore: JSON.parse(params.exportCore) === true, - exportServices: JSON.parse(params.exportServices) === true, - exportModels: JSON.parse(params.exportModels) === true, - exportSchemas: JSON.parse(params.exportSchemas) === true, - indent: params.indent, - postfixServices: params.postfixServices, - postfixModels: params.postfixModels, - request: params.request, - }) - .then(() => { - process.exit(0); - }) - .catch(error => { - console.error(error); - process.exit(1); - }); -} diff --git a/bin/index.spec.js b/bin/index.spec.js deleted file mode 100755 index 6030c07c8..000000000 --- a/bin/index.spec.js +++ /dev/null @@ -1,72 +0,0 @@ -const crossSpawn = require('cross-spawn'); - -describe('bin', () => { - it('it should support minimal params', async () => { - const result = crossSpawn.sync('node', [ - './bin/index.js', - '--input', - './test/spec/v3.json', - '--output', - './test/generated/bin', - ]); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toBe(''); - }); - - it('it should support all params', async () => { - const result = crossSpawn.sync('node', [ - './bin/index.js', - '--input', - './test/spec/v3.json', - '--output', - './test/generated/bin', - '--client', - 'fetch', - '--useOptions', - '--useUnionTypes', - '--exportCore', - 'true', - '--exportServices', - 'true', - '--exportModels', - 'true', - '--exportSchemas', - 'true', - '--indent', - '4', - '--postfixServices', - 'Service', - '--postfixModels', - 'Dto', - ]); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toBe(''); - }); - - it('it should throw error without params', async () => { - const result = crossSpawn.sync('node', ['./bin/index.js']); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toContain(`error: required option '-i, --input ' not specified`); - }); - - it('it should throw error with wrong params', async () => { - const result = crossSpawn.sync('node', [ - './bin/index.js', - '--input', - './test/spec/v3.json', - '--output', - './test/generated/bin', - '--unknown', - ]); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toContain(`error: unknown option '--unknown'`); - }); - - it('it should display help', async () => { - const result = crossSpawn.sync('node', ['./bin/index.js', '--help']); - expect(result.stdout.toString()).toContain(`Usage: openapi [options]`); - expect(result.stdout.toString()).toContain(`-i, --input `); - expect(result.stdout.toString()).toContain(`-o, --output `); - expect(result.stderr.toString()).toBe(''); - }); -}); diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 949349efd..dca8881f8 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -40,7 +40,7 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl return httpClient.{{{lowerCase method}}}(url, params, undefined, timeout, 'application/x-www-form-urlencoded'); }, {{else}} - {{{name}}}: async ({ {{>accessToken}} {{>deconstruction}} timeout}:{ {{>accessTokenParam}} {{>parameters}} timeout?: number}): Promiseresult}}>> => { + {{{name}}}: async ({ {{>accessToken}}{{>deconstruction}}timeout}:{ {{>accessTokenParam}}{{>parameters}}timeout?: number}): Promiseresult}}>> => { let url = `${baseUrl}{{{escapePath path}}}`; {{#if parametersQuery}} diff --git a/src/templates/partials/accessToken.hbs b/src/templates/partials/accessToken.hbs index 31f69c9f2..0634bc33b 100644 --- a/src/templates/partials/accessToken.hbs +++ b/src/templates/partials/accessToken.hbs @@ -1,3 +1 @@ -{{#if hasSecurity}} -accessToken, -{{/if}} +{{#if hasSecurity}}accessToken,{{/if}} \ No newline at end of file diff --git a/src/templates/partials/accessTokenOrUndefined.hbs b/src/templates/partials/accessTokenOrUndefined.hbs index 7bb8b7fbe..eadafa45c 100644 --- a/src/templates/partials/accessTokenOrUndefined.hbs +++ b/src/templates/partials/accessTokenOrUndefined.hbs @@ -1,5 +1 @@ -{{#if hasSecurity}} -accessToken, -{{else}} -undefined, -{{/if}} +{{#if hasSecurity}}accessToken,{{else}}undefined,{{/if}} \ No newline at end of file diff --git a/src/templates/partials/accessTokenParam.hbs b/src/templates/partials/accessTokenParam.hbs index 8649d34f3..b65094183 100644 --- a/src/templates/partials/accessTokenParam.hbs +++ b/src/templates/partials/accessTokenParam.hbs @@ -1,3 +1 @@ -{{#if hasSecurity}} -accessToken: string, -{{/if}} +{{#if hasSecurity}}accessToken: string,{{/if}} \ No newline at end of file diff --git a/src/templates/partials/requestBodyOrUndefined.hbs b/src/templates/partials/requestBodyOrUndefined.hbs index 5f81aa56e..869557f9d 100644 --- a/src/templates/partials/requestBodyOrUndefined.hbs +++ b/src/templates/partials/requestBodyOrUndefined.hbs @@ -1,5 +1 @@ -{{#if parametersBody}} -requestBody, -{{else}} -undefined, -{{/if}} +{{#if parametersBody}}requestBody,{{else}}undefined,{{/if}} \ No newline at end of file From 84309744b4c2fa5c8181394f8c06075e65b8c76c Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 21 Jul 2023 10:28:00 +0200 Subject: [PATCH 29/48] increased version to 0.30.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e43011d6..517cbd647 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.0", + "version": "0.30.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.0", + "version": "0.30.1", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 105d14972..4ac564195 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.0", + "version": "0.30.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 257584dc954eb290bd8c4d97603ef4a88ec2745d Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 21 Jul 2023 10:35:33 +0200 Subject: [PATCH 30/48] fixed status operation --- src/templates/exportService.hbs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index dca8881f8..18298de2f 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -17,7 +17,12 @@ export type {{{name}}}{{{@root.postfix}}}Options = { // eslint-disable-next-line @typescript-eslint/explicit-function-return-type export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpClient }: {{{name}}}{{{@root.postfix}}}Options) => ({ {{#each operations}} - {{#if (isEqual name 'createAuthToken')}} + {{#if (isEqual name 'getStatus')}} + {{{name}}}: async (timeout?: number): Promiseresult}}>> => { + const url = `${baseUrl}{{{escapePath path}}}`; + return httpClient.{{{lowerCase method}}}(url, undefined, timeout); + }, + {{else if (isEqual name 'createAuthToken')}} {{{name}}}: async ({clientId, clientSecret, scopes, actor, subject, email, timeout}:{clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, email?: string, timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; @@ -56,9 +61,9 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl } {{/if}} {{#if (isEqual method 'GET')}} - return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); + return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); {{else if (isEqual method 'DELETE')}} - return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); + return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); {{else}} return httpClient.{{{lowerCase method}}}(url, {{>requestBodyOrUndefined}} {{>accessTokenOrUndefined}} timeout); {{/if}} From 42571ab62adb979740b704ea1ebd38249dc990b2 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 21 Jul 2023 10:36:08 +0200 Subject: [PATCH 31/48] increased version to 0.30.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 517cbd647..5662009d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.1", + "version": "0.30.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.1", + "version": "0.30.2", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 4ac564195..9f0fed651 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.1", + "version": "0.30.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From a4bbcb4dc7e3a257958f1f205f7aa200508d6838 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 1 Aug 2023 14:54:07 +0200 Subject: [PATCH 32/48] updated homecloud service template --- src/templates/client.hbs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/templates/client.hbs b/src/templates/client.hbs index e104fa295..a1bfe98b4 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -1,4 +1,3 @@ -import { constructExternalUrl } from '@hypoport/ampr-homecloud-common'; import { createContainer } from 'thirty/inject'; {{#each services}} @@ -31,3 +30,11 @@ export class HomecloudApiService { {{/each}} } } + +const constructExternalUrl = (stage: string, name: string): string => { + if (stage === 'prod') { + return `https://${name}.homecloud.de`; + } else { + return `https://${stage}.${name}.homecloud.de`; + } +}; \ No newline at end of file From 945a9ae51095c159b7eb455e53e3227e22142bff Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 1 Aug 2023 15:02:36 +0200 Subject: [PATCH 33/48] increased version to 0.31.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5662009d3..1daf9736e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.2", + "version": "0.31.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.2", + "version": "0.31.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 9f0fed651..17d8b24c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.30.2", + "version": "0.31.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From af93d305e0ceccc46dec4a0382e509f48191b722 Mon Sep 17 00:00:00 2001 From: Daniel Mohr Date: Thu, 16 Nov 2023 14:26:47 +0100 Subject: [PATCH 34/48] fix code gen for lead api service with query params --- src/templates/exportService.hbs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 18298de2f..696a43578 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -49,16 +49,14 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl let url = `${baseUrl}{{{escapePath path}}}`; {{#if parametersQuery}} - const params = new URLSearchParams(); + const urlWithParams = new URL(url); {{#each parametersQuery}} if ({{{name}}}) { - params.append('{{{name}}}', `${ {{{name}}} }`); + urlWithParams.searchparams.append('{{{name}}}', `${ {{{name}}} }`); } {{/each}} - if (params.values.length > 0) { - url += `?${params.toString()}`; - } + url = urlWithParams.href {{/if}} {{#if (isEqual method 'GET')}} return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); From 235aed551dc9d9562fd4437b3184de37e668998b Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 16 Nov 2023 13:28:07 +0000 Subject: [PATCH 35/48] increased version to 0.32.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1daf9736e..f82bfbc6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.31.0", + "version": "0.32.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.31.0", + "version": "0.32.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 17d8b24c1..2d9e9852e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.31.0", + "version": "0.32.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 7a855d35236d804c2ef3d053fdf3b29f208f4a36 Mon Sep 17 00:00:00 2001 From: Daniel Mohr Date: Thu, 16 Nov 2023 15:09:26 +0100 Subject: [PATCH 36/48] fix typo --- src/templates/exportService.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 696a43578..559eb5769 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -53,7 +53,7 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl {{#each parametersQuery}} if ({{{name}}}) { - urlWithParams.searchparams.append('{{{name}}}', `${ {{{name}}} }`); + urlWithParams.searchParams.append('{{{name}}}', `${ {{{name}}} }`); } {{/each}} url = urlWithParams.href From 9e981892ff649e668c3282828ff4294b47633e4a Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Fri, 17 Nov 2023 08:52:27 +0100 Subject: [PATCH 37/48] increased version to 0.32.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f82bfbc6f..2ffec48d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.0", + "version": "0.32.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.0", + "version": "0.32.1", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 2d9e9852e..82ed0b076 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.0", + "version": "0.32.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 823de785f01e0943795a51b62177abab13c0ee96 Mon Sep 17 00:00:00 2001 From: Vladimir Bykovski Date: Mon, 5 Feb 2024 09:38:34 +0100 Subject: [PATCH 38/48] Allow query params to be equal 0 --- package-lock.json | 4 ++-- package.json | 2 +- src/templates/exportService.hbs | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ffec48d9..6d2db107e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.1", + "version": "0.32.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.1", + "version": "0.32.2", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 82ed0b076..8e76b758e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.1", + "version": "0.32.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 559eb5769..197fc02ba 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -17,7 +17,7 @@ export type {{{name}}}{{{@root.postfix}}}Options = { // eslint-disable-next-line @typescript-eslint/explicit-function-return-type export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpClient }: {{{name}}}{{{@root.postfix}}}Options) => ({ {{#each operations}} - {{#if (isEqual name 'getStatus')}} + {{#if (isEqual name 'getStatus')}} {{{name}}}: async (timeout?: number): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; return httpClient.{{{lowerCase method}}}(url, undefined, timeout); @@ -41,7 +41,7 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl if (email) { params.append('email', email); } - + return httpClient.{{{lowerCase method}}}(url, params, undefined, timeout, 'application/x-www-form-urlencoded'); }, {{else}} @@ -52,13 +52,13 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl const urlWithParams = new URL(url); {{#each parametersQuery}} - if ({{{name}}}) { + if ({{{name}}} !== null || {{{name}}} !== undefined) { urlWithParams.searchParams.append('{{{name}}}', `${ {{{name}}} }`); } {{/each}} url = urlWithParams.href {{/if}} - {{#if (isEqual method 'GET')}} + {{#if (isEqual method 'GET')}} return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); {{else if (isEqual method 'DELETE')}} return httpClient.{{{lowerCase method}}}(url, {{>accessTokenOrUndefined}} timeout); From 60cc757528a4d1af67fea71d19428f1e6832954d Mon Sep 17 00:00:00 2001 From: Vladimir Bykovski Date: Tue, 6 Feb 2024 14:00:54 +0100 Subject: [PATCH 39/48] Fix query params handling --- src/templates/exportService.hbs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 197fc02ba..a75bef185 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -52,7 +52,8 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl const urlWithParams = new URL(url); {{#each parametersQuery}} - if ({{{name}}} !== null || {{{name}}} !== undefined) { + + if (typeof {{{name}}} === 'number' || {{{name}}}) { urlWithParams.searchParams.append('{{{name}}}', `${ {{{name}}} }`); } {{/each}} From 6cb32ccdbbf45b5037ad9af0cd2932a0ea8daa15 Mon Sep 17 00:00:00 2001 From: Vladimir Bykovski Date: Tue, 13 Feb 2024 09:32:54 +0100 Subject: [PATCH 40/48] Fix query params --- src/templates/exportService.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index a75bef185..731f7f1a8 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -53,7 +53,7 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl {{#each parametersQuery}} - if (typeof {{{name}}} === 'number' || {{{name}}}) { + if ({{{name}}} !== null && {{{name}}} !== undefined) { urlWithParams.searchParams.append('{{{name}}}', `${ {{{name}}} }`); } {{/each}} From 8cd06b1a67e4951c6d2bb2ed6c420a8157491848 Mon Sep 17 00:00:00 2001 From: Vladimir Bykovski Date: Tue, 13 Feb 2024 09:33:04 +0100 Subject: [PATCH 41/48] 0.32.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d2db107e..e09803e4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.2", + "version": "0.32.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.2", + "version": "0.32.3", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 8e76b758e..121e1983c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.2", + "version": "0.32.3", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From f9af39fab35be4cec9338577a489b98334f29dae Mon Sep 17 00:00:00 2001 From: Vladimir Bykovski Date: Tue, 13 Feb 2024 09:33:39 +0100 Subject: [PATCH 42/48] 0.32.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e09803e4c..2104a78c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.3", + "version": "0.32.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.3", + "version": "0.32.4", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 121e1983c..6a56ba210 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.3", + "version": "0.32.4", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 20345af92c1634914fffc3a4f6a9485604be961f Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Tue, 27 Feb 2024 21:34:28 +0100 Subject: [PATCH 43/48] increased version to 0.33.0 --- package-lock.json | 4 ++-- package.json | 2 +- src/utils/registerHandlebarHelpers.ts | 2 +- tsconfig.json | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2104a78c0..20a120433 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.4", + "version": "0.33.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.4", + "version": "0.33.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 6a56ba210..a465252a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.32.4", + "version": "0.33.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", diff --git a/src/utils/registerHandlebarHelpers.ts b/src/utils/registerHandlebarHelpers.ts index adb841c57..370d7ea16 100644 --- a/src/utils/registerHandlebarHelpers.ts +++ b/src/utils/registerHandlebarHelpers.ts @@ -110,7 +110,7 @@ export const registerHandlebarHelpers = (root: { }); Handlebars.registerHelper('escapePath', function (value: string): string { - return value.replace('{', `\${`); + return value.replaceAll('{', `\${`); }); Handlebars.registerHelper('isEqual', (value1, value2) => { diff --git a/tsconfig.json b/tsconfig.json index 8d27e49a8..5b397137c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,10 @@ { "compilerOptions": { "outDir": "./dist", - "target": "es2019", + "target": "es2021", "module": "commonjs", "moduleResolution": "node", - "lib": ["es2019", "dom"], + "lib": ["es2021", "dom"], "types": ["jest", "node"], "declaration": false, "declarationMap": false, From 4761f02a64ccdc4d55c8fc03852a1a80f84bbf27 Mon Sep 17 00:00:00 2001 From: "mayk.akifovski" Date: Tue, 23 Apr 2024 09:53:23 +0200 Subject: [PATCH 44/48] remove email from auth endpoint --- package-lock.json | 4 ++-- package.json | 2 +- src/templates/exportService.hbs | 5 +---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20a120433..81dc22113 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.33.0", + "version": "0.34.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.33.0", + "version": "0.34.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index a465252a3..6fe5d8af2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.33.0", + "version": "0.34.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 731f7f1a8..99d0a7b67 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -23,7 +23,7 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl return httpClient.{{{lowerCase method}}}(url, undefined, timeout); }, {{else if (isEqual name 'createAuthToken')}} - {{{name}}}: async ({clientId, clientSecret, scopes, actor, subject, email, timeout}:{clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, email?: string, timeout?: number}): Promiseresult}}>> => { + {{{name}}}: async ({clientId, clientSecret, scopes, actor, subject, timeout}:{clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; const params = new URLSearchParams(); @@ -38,9 +38,6 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl if (subject) { params.append('subject', subject); } - if (email) { - params.append('email', email); - } return httpClient.{{{lowerCase method}}}(url, params, undefined, timeout, 'application/x-www-form-urlencoded'); }, From 4333d7aa9b54f85f2a7b6e5e0f7b6d6504a6b00f Mon Sep 17 00:00:00 2001 From: Vladimir Bykovski <113101041+v-bykovski@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:45:37 +0200 Subject: [PATCH 45/48] Add tracking event basic auth handling --- README.md | 107 ++++---------------------------- src/templates/exportService.hbs | 5 ++ 2 files changed, 17 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index b851329a8..4bf025fa8 100644 --- a/README.md +++ b/README.md @@ -1,106 +1,23 @@ # OpenAPI Typescript Codegen -[![NPM][npm-image]][npm-url] -[![License][license-image]][license-url] -[![Coverage][coverage-image]][coverage-url] -[![Coverage][coverage-image]][coverage-url] -[![Downloads][downloads-image]][downloads-url] -[![Build][build-image]][build-url] +Fork of https://github.com/hypoport/openapi-typescript-codegen -> Node.js library that generates Typescript clients based on the OpenAPI specification. +# How to test +Make sure the correct api spec is reference under `/test/index.spec.ts` (for example `./test/homecloud-api-specs.json` if you want to test against a local file) -## Why? -- Frontend ❤️ OpenAPI, but we do not want to use JAVA codegen in our builds -- Quick, lightweight, robust and framework-agnostic 🚀 -- Supports generation of TypeScript clients -- Supports generations of Fetch, Node-Fetch, Axios, Angular and XHR http clients -- Supports OpenAPI specification v2.0 and v3.0 -- Supports JSON and YAML files for input -- Supports generation through CLI, Node.js and NPX -- Supports tsc and @babel/plugin-transform-typescript -- Supports aborting of requests (cancelable promise pattern) -- Supports external references using [json-schema-ref-parser](https://github.com/APIDevTools/json-schema-ref-parser/) - -## Install - -``` -npm install openapi-typescript-codegen --save-dev -``` - -## Usage - -``` -$ openapi --help - - Usage: openapi [options] - - Options: - -V, --version output the version number - -i, --input OpenAPI specification, can be a path, url or string content (required) - -o, --output Output directory (required) - -c, --client HTTP client to generate [fetch, xhr, node, axios, angular] (default: "fetch") - --name Custom client class name - --useOptions Use options instead of arguments - --useUnionTypes Use union types instead of enums - --exportCore Write core files to disk (default: true) - --exportServices Write services to disk (default: true) - --exportModels Write models to disk (default: true) - --exportSchemas Write schemas to disk (default: false) - --indent Indentation options [4, 2, tab] (default: "4") - --postfixServices Service name postfix (default: "Service") - --postfixModels Model name postfix - --request Path to custom request file - -h, --help display help for command - - Examples - $ openapi --input ./spec.json --output ./generated - $ openapi --input ./spec.json --output ./generated --client xhr +The test command will generate the services under `test/generated` and do some basic validation tests. +```shell + npm run test ``` -## Docker usage +# How to release -To build the Docker container, execute the following command: - -``` -docker build . --tag openapi-typescript-codegen +```shell + npm run release ``` -After this is done, you can execute the CLI commands: - -``` -docker run openapi-typescript-codegen --help -docker run openapi-typescript-codegen --input sample.yaml --output client +```shell + npm pack ``` -Documentation -=== -- [Basic usage](docs/basic-usage.md) -- [OpenAPI object](docs/openapi-object.md) -- [Client instances](docs/client-instances.md) `--name` -- [Argument vs. Object style](docs/arguments-vs-object-style.md) `--useOptions` -- [Enums vs. Union types](docs/enum-vs-union-types.md) `--useUnionTypes` -- [Runtime schemas](docs/runtime-schemas.md) `--exportSchemas` -- [Enum with custom names and descriptions](docs/custom-enums.md) -- [Nullable props (OpenAPI v2)](docs/nullable-props.md) -- [Authorization](docs/authorization.md) -- [External references](docs/external-references.md) -- [Canceling requests](docs/canceling-requests.md) -- [Custom request file](docs/custom-request-file.md) - -Support -=== -- [Babel support](docs/babel-support.md) -- [Axios support](docs/axios-support.md) -- [Angular support](docs/angular-support.md) -- [Node-Fetch support](docs/node-fetch-support.md) - -[npm-url]: https://npmjs.org/package/openapi-typescript-codegen -[npm-image]: https://img.shields.io/npm/v/openapi-typescript-codegen.svg -[license-url]: LICENSE -[license-image]: http://img.shields.io/npm/l/openapi-typescript-codegen.svg -[coverage-url]: https://codecov.io/gh/ferdikoomen/openapi-typescript-codegen -[coverage-image]: https://img.shields.io/codecov/c/github/ferdikoomen/openapi-typescript-codegen.svg -[downloads-url]: http://npm-stat.com/charts.html?package=openapi-typescript-codegen -[downloads-image]: http://img.shields.io/npm/dm/openapi-typescript-codegen.svg -[build-url]: https://circleci.com/gh/ferdikoomen/openapi-typescript-codegen/tree/master -[build-image]: https://circleci.com/gh/ferdikoomen/openapi-typescript-codegen/tree/master.svg?style=svg +Copy and paste the file diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 99d0a7b67..33f191302 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -22,6 +22,11 @@ export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpCl const url = `${baseUrl}{{{escapePath path}}}`; return httpClient.{{{lowerCase method}}}(url, undefined, timeout); }, + {{else if (isEqual name 'createTrackingEvent')}} + {{{name}}}: async ({username, password, {{>deconstruction}}timeout}: {username: string, password: string, {{>parameters}}timeout?: number}): Promiseresult}}>> => { + const url = `${baseUrl}{{{escapePath path}}}`; + return httpClient.{{{lowerCase method}}}(url, {{>requestBodyOrUndefined}} {username, password}, timeout); + }, {{else if (isEqual name 'createAuthToken')}} {{{name}}}: async ({clientId, clientSecret, scopes, actor, subject, timeout}:{clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; From 0dad2eaafafb896f6b8ef5e67347dee163b9e0e0 Mon Sep 17 00:00:00 2001 From: Vladimir Bykovski <113101041+v-bykovski@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:45:43 +0200 Subject: [PATCH 46/48] 0.35.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 81dc22113..4ac987575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.34.0", + "version": "0.35.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.34.0", + "version": "0.35.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 6fe5d8af2..9d24abc9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.34.0", + "version": "0.35.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", From 2c8ae71e259053080d809e3b9167a96dbebd8528 Mon Sep 17 00:00:00 2001 From: Dennis Wehrle Date: Wed, 19 Feb 2025 10:29:37 +0100 Subject: [PATCH 47/48] updated import order --- hypoport-openapi-typescript-codegen-0.36.0.tgz | Bin 0 -> 30967 bytes package-lock.json | 4 ++-- package.json | 2 +- src/templates/client.hbs | 2 +- src/templates/exportService.hbs | 1 - 5 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 hypoport-openapi-typescript-codegen-0.36.0.tgz diff --git a/hypoport-openapi-typescript-codegen-0.36.0.tgz b/hypoport-openapi-typescript-codegen-0.36.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6d321239cc9c6fec1523351c36dc0d72dcce19f0 GIT binary patch literal 30967 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

Q5UZI8*=EXDNi2 zgL*6XY{r!fHZ%Lr3fKQFx2IX|CeLX&)7sj;XUlw*z zE9heFY2GLEkS#Cx$3KVRgdHoleg-XJUo-ejPnZ-$n>90}Piy95=+sm3v|uWpWvAi| z)5%`J1xGhn-CDuw)@HZ5wSv{H6|QcQfzRcFz0i+ncQ9ERuc~W%zbQbcD~lf zs2^=^g%?|zZ=tb+^=D?hfDrNPWD1csZ`QCrDUzr_<*K>!XB)Rg678f}&_^|Q*3>Tq zgJj~9&~IQFOdmfP37<|$rQ*HP?nebms?yLI?bf|N<6Gz&={yz2lPc#H`vxp9E4LKw zuH{av#(?vQ`&oNt>?eolOW9NePYS)^#rQQ@3f)HDd88qE6qUMOe1u#5$fs8`57ZfR z_sZH+{fMKl%jYTAWo=YlWpA6WpkW0w*V5c@EjKoc*7D^PYbpI0<|{Shy|!MsKJOoS zM9@9mDpi~1txOwh_kOEXZI*X3ZB!rNR;k)7Z)BR?3QTpYRBe`*GHqQttehtNr~SN-

1)CQKl}>%)MOQbx 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 4ac987575..ec99c0940 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.35.0", + "version": "0.36.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.35.0", + "version": "0.36.0", "license": "MIT", "dependencies": { "camelcase": "^6.3.0", diff --git a/package.json b/package.json index 9d24abc9e..126570041 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hypoport/openapi-typescript-codegen", - "version": "0.35.0", + "version": "0.36.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", diff --git a/src/templates/client.hbs b/src/templates/client.hbs index a1bfe98b4..ad6d74bc6 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -1,9 +1,9 @@ import { createContainer } from 'thirty/inject'; +import { httpClientFactory } from '../http/http-client'; {{#each services}} import { {{{name}}}{{{@root.postfix}}}, {{{lowerCase name}}}{{{@root.postfix}}}Factory } from './services/{{{name}}}{{{@root.postfix}}}'; {{/each}} -import { httpClientFactory } from '../http/http-client'; type ApiServiceOptions = { stage: 'prod' | 'test' | 'int' } | { baseUrl: string }; diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 33f191302..2484b907f 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -14,7 +14,6 @@ export type {{{name}}}{{{@root.postfix}}}Options = { httpClient: HttpClient; }; -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type export const {{{lowerCase name}}}{{{@root.postfix}}}Factory = ({ baseUrl, httpClient }: {{{name}}}{{{@root.postfix}}}Options) => ({ {{#each operations}} {{#if (isEqual name 'getStatus')}} From 9a2d37447aaf53b0c4447a578f313b9ce8e4f2e9 Mon Sep 17 00:00:00 2001 From: Daniel Mohr Date: Thu, 12 Jun 2025 08:13:50 +0200 Subject: [PATCH 48/48] update export service --- hypoport-openapi-typescript-codegen-0.36.0.tgz | Bin 30967 -> 0 bytes hypoport-openapi-typescript-codegen-0.37.0.tgz | Bin 0 -> 31095 bytes package-lock.json | 4 ++-- package.json | 2 +- src/templates/exportService.hbs | 7 ++++++- 5 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 hypoport-openapi-typescript-codegen-0.36.0.tgz create mode 100644 hypoport-openapi-typescript-codegen-0.37.0.tgz diff --git a/hypoport-openapi-typescript-codegen-0.36.0.tgz b/hypoport-openapi-typescript-codegen-0.36.0.tgz deleted file mode 100644 index 6d321239cc9c6fec1523351c36dc0d72dcce19f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30967 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

Q5UZI8*=EXDNi2 zgL*6XY{r!fHZ%Lr3fKQFx2IX|CeLX&)7sj;XUlw*z zE9heFY2GLEkS#Cx$3KVRgdHoleg-XJUo-ejPnZ-$n>90}Piy95=+sm3v|uWpWvAi| z)5%`J1xGhn-CDuw)@HZ5wSv{H6|QcQfzRcFz0i+ncQ9ERuc~W%zbQbcD~lf zs2^=^g%?|zZ=tb+^=D?hfDrNPWD1csZ`QCrDUzr_<*K>!XB)Rg678f}&_^|Q*3>Tq zgJj~9&~IQFOdmfP37<|$rQ*HP?nebms?yLI?bf|N<6Gz&={yz2lPc#H`vxp9E4LKw zuH{av#(?vQ`&oNt>?eolOW9NePYS)^#rQQ@3f)HDd88qE6qUMOe1u#5$fs8`57ZfR z_sZH+{fMKl%jYTAWo=YlWpA6WpkW0w*V5c@EjKoc*7D^PYbpI0<|{Shy|!MsKJOoS zM9@9mDpi~1txOwh_kOEXZI*X3ZB!rNR;k)7Z)BR?3QTpYRBe`*GHqQttehtNr~SN-

1)CQKl}>%)MOQbx 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 diff --git a/hypoport-openapi-typescript-codegen-0.37.0.tgz b/hypoport-openapi-typescript-codegen-0.37.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6eccebfa227d95474c9dbb42a21522e4f30f5cb7 GIT binary patch literal 31095 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 w4<>4lVCyt?556G^ z(N4I>G>E-`*$%Fy4b^>KdX|#j%t-tAdT7sPd`I*XF{hamu`};i)CORpTMT#pBD4J@ z-@$z=@|gLFB(5YQDQEsg_Se3<|GSmH(6Udh0j|gY8=q+4U-vs2jmCDnjmpv+jb^j4 z*+SoKZf!T3&F$?*8-3SkHn-ZF=)1;E2q1!Zg6|rQYhbd`XrT1}ujFsK#sii3v8xWM z{WzS20d&uL?BUj7sVX7>bvtnI06dif6FZ#&)-X1Aj7E}?KLy%BwU=&>SY(3O&|)a* z^c1~I2_xZirU=#*4hno8nh^&wAR1!Z?Yp)G^o-;kR>Xz@0rJlD>y zT=~@o(Bvd%aV2`ufXc6r-*e@6)Llv=Oy$>ju8n=l*?RTjT_S-~JUI)90~Po!t3XUT z&wIQ>l23{oJdhHz+T>Fw*2v5MhOsFBo3D2A3FkwJDz}TI1Tl^0lfWbuEdL%e2WKK6 z#v4qcJb#&}r5;kEZfO}jvRvLMuHO%S99a(TO?YEKv((bEv$^*J#&IdDi+#UO2^T_8 zkjo$9YzH<56TRTz>3pkncwR{KwMLAD{rjpT8QM7(K0 zib(^MHapnEP%a!H68VVB18r=ePY@NP>lAy~W+&pc6up0)4kIbN6NO17t3gQDMX|TO z71CkA=BT7?u#m`{tT{GOo2BryV37iDEdU?2j*zaC$baEKv3v*V`WTa5KqWGmdalo9 zDV~rqpWErX=lK#y*C8cWE+jaNdY(&%e9I}wyw>fjJV6oc*J;?M_&8SJ=^|FO-_<4Nr>8d<(0zEk}u zEF7BzlY&>090MZ%Q#=K? z_KdC4x^N>Gc-l3Z+s0-^30>IJK*%UB^%oT!?-?b`h|yb2Om*>}E+h+}En~ZsISG{w zL%g`etJMn#Ob$MSRuiQ*i^HO@_<>WST^vx;iEY!^mANal=#J5l^RtP0*Ju|8>X=bs zOu-z%m@6u`YwVU5jkPUbv~9Fx*~mqy3wEyVj$k3K!$}d&;@qSltK6=v3VghPbHyUN z08Lb^*(lCLl5)-EBtztU?z~3r70i^B{g$z7>`IwY7-ELwv1-p~7J6c$hs~zUqgX}= z{V8ah=<1^RTZJAg@)BwDU3iixf?V)ij6FNXu1uX#J?&!+W3QO$xxGXPjf!P2Z}+op{lAT^_RhWk_a^@Sk@{J4{@6pYBwJg17LZdoXi?&1T)|Piw)PM7JUBxv zK(J(9du5$sL?eR5(Yt`aSvzEfF8A@mLA~??swjfR5bEar5KstCARwh55QNXUHwblO zUj?{)Z7+x%9V!E5Dfe}Bk=sX;AVO!B&yuPjYXG-8z^OofdXk@JQrFhr4YA0N*JJ3+ z^}N()&8wY6^CvZwT~}QMC?`NP7-8^dyEclQGO)me!qiyncDry0pkR48jSoP-xM(`oQQ~N&hc;^KP#HH@Dl3V*hV#wzlv4|4saf z%~<4M+p`Epa6Jaf_Htu8gP#;ZCi#moz8 z**ToY@@uj;hT| z{%!Gpp*=*w!oi*byVB8~LS7t>QAp+Iee$)L?awJw5`>tJdeconstruction}}timeout}: {username: string, password: string, {{>parameters}}timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`; return httpClient.{{{lowerCase method}}}(url, {{>requestBodyOrUndefined}} {username, password}, timeout); }, + {{else if (isEqual name 'patchUserProfilePicture')}} + {{{name}}}: async ({ {{>accessToken}} formData, timeout}: { {{>accessTokenParam}}{{>parameters}}timeout?: number}): Promiseresult}}>> => { + const url = `${baseUrl}{{{escapePath path}}}`; + return httpClient.{{{lowerCase method}}}(url, formData, {{>accessTokenOrUndefined}}timeout, 'multipart/form-data'); + }, {{else if (isEqual name 'createAuthToken')}} {{{name}}}: async ({clientId, clientSecret, scopes, actor, subject, timeout}:{clientId: string, clientSecret: string, scopes: string, actor?: string, subject?: string, timeout?: number}): Promiseresult}}>> => { const url = `${baseUrl}{{{escapePath path}}}`;