- Working on e2e tests

This commit is contained in:
Ferdi Koomen 2020-09-25 10:54:39 +02:00
parent d32b4c0d7a
commit 1785e3ed90
36 changed files with 594 additions and 5121 deletions

6
.gitignore vendored
View File

@ -10,8 +10,8 @@ junit.xml
*.iml
dist
coverage
samples/dist
test/generated
test/e2e/generated
samples/generated
samples/swagger-codegen-cli-v2.jar
samples/swagger-codegen-cli-v3.jar
test/generator/dist
test/server/dist

View File

@ -33,7 +33,7 @@ if (OpenAPI) {
exportCore: JSON.parse(program.exportCore) === true,
exportServices: JSON.parse(program.exportServices) === true,
exportModels: JSON.parse(program.exportModels) === true,
exportSchemas: JSON.parse(program.exportSchemas) === true,
exportSchemas: JSON.parse(program.exportSchemas) === true
})
.then(() => {
process.exit(0);

View File

@ -1,17 +1,29 @@
module.exports = {
testRegex: '.*\\.spec\\.(js|js)$',
testPathIgnorePatterns: [
'/node_modules/',
'<rootDir>/dist/',
'<rootDir>/samples/',
],
testEnvironment: 'node',
moduleNameMapper: {
'\\.hbs$': '<rootDir>/src/templates/__mocks__/index.js',
},
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/*.d.ts',
'!**/node_modules/**',
projects: [
{
displayName: 'UNIT',
testEnvironment: 'node',
testMatch: [
'<rootDir>/src/**/*.spec.ts',
'<rootDir>/test/**/*.spec.js',
],
moduleNameMapper: {
'\\.hbs$': '<rootDir>/src/templates/__mocks__/index.js',
},
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/*.d.ts',
],
},
{
displayName: 'E2E',
testEnvironment: 'node',
testMatch: [
'<rootDir>/test/e2e/index.js',
],
globals: {
URL: 'http://localhost:3000',
},
},
],
};

View File

@ -43,17 +43,18 @@
"src/templates/**/*.ts"
],
"scripts": {
"clean": "rimraf ./dist ./test/generator/dist ./test/server/dist ./coverage ./samples/dist ./node_modules/.cache",
"clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache",
"build": "rollup --config --environment NODE_ENV:development",
"build:watch": "rollup --config --environment NODE_ENV:development --watch",
"release": "rollup --config --environment NODE_ENV:production",
"start": "nest start --path ./test/server/tsconfig.json",
"start:watch": "nest start --path ./test/server/tsconfig.json --watch",
"run": "node ./test/index.js",
"test": "jest",
"test:update": "jest --updateSnapshot",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"test": "jest --selectProjects UNIT",
"test:update": "jest --selectProjects UNIT --updateSnapshot",
"test:watch": "jest --selectProjects UNIT --watch",
"test:coverage": "jest --selectProjects UNIT --coverage",
"test:e2e": "jest --selectProjects E2E",
"eslint": "eslint \"./src/**/*.ts\" \"./test/**/*.ts\" \"./bin/index.js\"",
"eslint:fix": "eslint \"./src/**/*.ts\" \"./test/**/*.ts\" \"./bin/index.js\" --fix",
"prettier": "prettier \"./src/**/*.ts\" \"./test/**/*.ts\" \"./bin/index.js\" --check",
@ -74,13 +75,6 @@
"@babel/core": "7.11.6",
"@babel/preset-env": "7.11.5",
"@babel/preset-typescript": "7.10.4",
"@nestjs/cli": "7.5.1",
"@nestjs/common": "7.4.4",
"@nestjs/core": "7.4.4",
"@nestjs/platform-express": "7.4.4",
"@nestjs/schematics": "7.1.2",
"@nestjs/swagger": "4.6.1",
"@nestjs/testing": "7.4.4",
"@rollup/plugin-commonjs": "15.1.0",
"@rollup/plugin-node-resolve": "9.0.0",
"@types/express": "4.17.8",
@ -91,8 +85,6 @@
"@types/rimraf": "3.0.0",
"@typescript-eslint/eslint-plugin": "4.2.0",
"@typescript-eslint/parser": "4.2.0",
"class-transformer": "0.3.1",
"class-validator": "0.12.2",
"codecov": "3.7.2",
"eslint": "7.9.0",
"eslint-config-prettier": "6.11.0",
@ -104,12 +96,9 @@
"jest-cli": "26.4.2",
"prettier": "2.1.2",
"puppeteer": "5.3.1",
"reflect-metadata": "0.1.13",
"rollup": "2.28.2",
"rollup-plugin-terser": "7.0.2",
"rollup-plugin-typescript2": "0.27.2",
"swagger-ui-express": "4.1.4",
"testcafe": "1.9.3",
"typescript": "4.0.3"
}
}

View File

@ -11,7 +11,6 @@ const fs = require('fs');
const pkg = require('./package.json');
const external = Object.keys(pkg.dependencies);
/**
* Custom plugin to parse handlebar imports and precompile
* the template on the fly. This reduces runtime by about
@ -56,7 +55,7 @@ const getPlugins = () => {
return [...plugins, terser()];
}
export default {
module.exports = {
input: './src/index.ts',
output: {
file: './dist/index.js',

View File

@ -4,18 +4,18 @@ rm -rf dist
rm swagger-codegen-cli-v2.jar
rm swagger-codegen-cli-v3.jar
#curl https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.15/swagger-codegen-cli-2.4.15.jar -o swagger-codegen-cli-v2.jar
#curl https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.21/swagger-codegen-cli-3.0.21.jar -o swagger-codegen-cli-v3.jar
curl https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.15/swagger-codegen-cli-2.4.15.jar -o swagger-codegen-cli-v2.jar
curl https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.21/swagger-codegen-cli-3.0.21.jar -o swagger-codegen-cli-v3.jar
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-aurelia -o dist/v2/typescript-aurelia/
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-angular -o dist/v2/typescript-angular/
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-inversify -o dist/v2/typescript-inversify/
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-fetch -o dist/v2/typescript-fetch/
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-jquery -o dist/v2/typescript-jquery/
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-node -o dist/v2/typescript-node/
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-aurelia -o generated/v2/typescript-aurelia/
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-angular -o generated/v2/typescript-angular/
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-inversify -o generated/v2/typescript-inversify/
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-fetch -o generated/v2/typescript-fetch/
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-jquery -o generated/v2/typescript-jquery/
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-node -o generated/v2/typescript-node/
#java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-angular -o dist/v3/typescript-angular/
#java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-fetch -o dist/v3/typescript-fetch/
java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-angular -o generated/v3/typescript-angular/
java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-fetch -o generated/v3/typescript-fetch/
node ../bin/index.js --input spec/v2.json --output dist/v2/openapi-typescript-codegen/
node ../bin/index.js --input spec/v3.json --output dist/v3/openapi-typescript-codegen/
node ../bin/index.js --input spec/v2.json --output generated/v2/openapi-typescript-codegen/
node ../bin/index.js --input spec/v3.json --output generated/v3/openapi-typescript-codegen/

View File

@ -4,7 +4,7 @@ describe('index', () => {
it('parses v2 without issues', async () => {
await OpenAPI.generate({
input: './test/spec/v3.json',
output: './temp/v3/',
output: './generated/v3/',
write: false,
});
});
@ -12,7 +12,7 @@ describe('index', () => {
it('parses v3 without issues', async () => {
await OpenAPI.generate({
input: './test/spec/v3.json',
output: './temp/v3/',
output: './generated/v3/',
write: false,
});
});
@ -20,7 +20,7 @@ describe('index', () => {
it('downloads and parses v2 without issues', async () => {
await OpenAPI.generate({
input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v2.json',
output: './temp/v2-downloaded/',
output: './generated/v2-downloaded/',
write: false,
});
});
@ -28,7 +28,7 @@ describe('index', () => {
it('downloads and parses v3 without issues', async () => {
await OpenAPI.generate({
input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v3.json',
output: './temp/v3-downloaded/',
output: './generated/v3-downloaded/',
write: false,
});
});

29
test/e2e/index.js Normal file
View File

@ -0,0 +1,29 @@
'use strict';
const generate = require('./scripts/generate');
const compile = require('./scripts/compile');
describe('e2e', () => {
beforeAll(async () => {
await generate('v2', 'fetch');
await generate('v2', 'xhr');
await generate('v2', 'node');
await generate('v3', 'fetch');
await generate('v3', 'xhr');
await generate('v3', 'node');
});
afterAll(async () => {
//
});
it('runs in chrome', async () => {
expect(true).toBeTruthy();
});
it('runs in node', async () => {
expect(true).toBeTruthy();
});
})

69
test/e2e/index.txt Normal file
View File

@ -0,0 +1,69 @@
'use strict';
const express = require('express');
const puppeteer = require('puppeteer');
const fs = require('fs');
const path = require('path');
const http = require('http');
const compile = require('./scripts/compiler');
const browser = require('./scripts/browser');
const server = require('./scripts/server');
describe('e2e', () => {
let app;
let browser;
let page;
let server;
beforeAll(async () => {
app = express();
app.all('/api/*', (req, res) => {
res.send({
method: req.method,
protocol: req.protocol,
hostname: req.hostname,
path: req.path,
url: req.url,
query: req.query,
body: req.body,
headers: req.headers,
});
});
server = app.listen(3000);
browser = await puppeteer.launch();
page = await browser.newPage();
});
afterAll(async () => {
await page.close();
await browser.close();
await server.close();
});
it('runs in chrome', async () => {
await page.goto('http://localhost:3000/api/test', {
waitUntil: 'networkidle0',
});
const content = await page.content();
expect(content).toBeDefined();
});
it('runs in node', async () => {
return new Promise((resolve) => {
http.get('http://localhost:3000/api/test', (res) => {
const chunks = [];
res.on('data', (chunk) => {
chunks.push(chunk);
});
res.on('end', () => {
const content = Buffer.concat(chunks).toString();
console.log(content);
expect(content).toBeDefined();
resolve();
});
})
});
});
})

View File

@ -0,0 +1,7 @@
function compile(dir) {
}
module.exports = {
compile,
};

View File

@ -0,0 +1,22 @@
'use strict';
const path = require('path');
const ts = require('typescript');
function compile(dir) {
const config = {
compilerOptions: {
target: 'esnext',
module: 'commonjs',
moduleResolution: 'node',
},
include: ['./index.ts'],
};
const configFile = ts.parseConfigFileTextToJson('tsconfig.json', JSON.stringify(config));
const configFileResult = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.resolve(process.cwd(), dir), undefined, 'tsconfig.json');
const compilerHost = ts.createCompilerHost(configFileResult.options);
const compiler = ts.createProgram(configFileResult.fileNames, configFileResult.options, compilerHost);
compiler.emit();
}
module.exports = compile;

View File

@ -0,0 +1,19 @@
'use strict';
const OpenAPI = require('../../../dist');
async function generate(version, client) {
await OpenAPI.generate({
input: `./test/spec/${version}.json`,
output: `./test/e2e/generated/src/${version}/${client}`,
httpClient: client,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
}
module.exports = generate;

View File

@ -0,0 +1,7 @@
function compile(dir) {
}
module.exports = {
compile,
};

View File

@ -1,62 +0,0 @@
'use strict';
const path = require('path');
const ts = require('typescript');
const OpenAPI = require('../../dist');
function compile(dir) {
const config = {
compilerOptions: {
target: 'esnext',
module: 'commonjs',
moduleResolution: 'node',
},
include: ['./index.ts'],
};
const configFile = ts.parseConfigFileTextToJson('tsconfig.json', JSON.stringify(config));
const configFileResult = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.resolve(process.cwd(), dir), undefined, 'tsconfig.json');
const compilerHost = ts.createCompilerHost(configFileResult.options);
const compiler = ts.createProgram(configFileResult.fileNames, configFileResult.options, compilerHost);
compiler.emit();
}
async function generateV2() {
console.time('generate v2');
await OpenAPI.generate({
input: './test/spec/v2.json',
output: './test/generator/dist/v2/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
console.timeEnd('generate v2');
compile('test/generator/dist/v2/');
}
async function generateV3() {
console.time('generate v3');
await OpenAPI.generate({
input: './test/spec/v3.json',
output: './test/generator/dist/v3/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
console.timeEnd('generate v3');
compile('test/generator/dist/v3/');
}
async function generate() {
await generateV2();
await generateV3();
}
generate();

View File

@ -1,51 +0,0 @@
'use strict';
const OpenAPI = require('../../dist');
const glob = require('glob');
const fs = require('fs');
describe('v2', () => {
it('should generate', async () => {
await OpenAPI.generate({
input: './test/spec/v2.json',
output: './test/generator/dist/v2/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
const files = glob.sync('./test/generator/dist/v2/**/*.ts');
files.forEach(file => {
const content = fs.readFileSync(file, 'utf8').toString();
expect(content).toMatchSnapshot(file);
});
});
});
describe('v3', () => {
it('should generate', async () => {
await OpenAPI.generate({
input: './test/spec/v3.json',
output: './test/generator/dist/v3/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
const files = glob.sync('./test/generator/dist/v3/**/*.ts');
files.forEach(file => {
const content = fs.readFileSync(file, 'utf8').toString();
expect(content).toMatchSnapshot(file);
});
});
});

38
test/index.js Normal file
View File

@ -0,0 +1,38 @@
'use strict';
const OpenAPI = require('../dist');
async function generateV2() {
await OpenAPI.generate({
input: './test/spec/v2.json',
output: './test/generated/v2/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
}
async function generateV3() {
await OpenAPI.generate({
input: './test/spec/v3.json',
output: './test/generated/v3/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
}
async function generate() {
await generateV2();
await generateV3();
}
generate();

View File

@ -1,66 +1,47 @@
'use strict';
const express = require('express');
const puppeteer = require('puppeteer');
const OpenAPI = require('../dist');
const glob = require('glob');
const fs = require('fs');
const path = require('path');
const http = require('http');
describe('e2e', () => {
let app;
let browser;
let page;
let server;
beforeAll(async () => {
app = express();
app.all('/api/*', (req, res) => {
res.send({
method: req.method,
protocol: req.protocol,
hostname: req.hostname,
path: req.path,
url: req.url,
query: req.query,
body: req.body,
headers: req.headers,
});
describe('v2', () => {
it('should generate', async () => {
await OpenAPI.generate({
input: './test/spec/v2.json',
output: './test/generated/v2/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
server = app.listen(3000);
browser = await puppeteer.launch();
page = await browser.newPage();
});
afterAll(async () => {
await page.close();
await browser.close();
await server.close();
});
it('runs in chrome', async () => {
await page.goto('http://localhost:3000/api/test', {
waitUntil: 'networkidle0',
});
const content = await page.content();
expect(content).toBeDefined();
});
it('runs in node', async () => {
return new Promise((resolve) => {
http.get('http://localhost:3000/api/test', (res) => {
const chunks = [];
res.on('data', (chunk) => {
chunks.push(chunk);
});
res.on('end', () => {
const content = Buffer.concat(chunks).toString();
console.log(content);
expect(content).toBeDefined();
resolve();
});
})
glob.sync('./test/generated/v2/**/*.ts').forEach(file => {
const content = fs.readFileSync(file, 'utf8').toString();
expect(content).toMatchSnapshot(file);
});
});
});
})
describe('v3', () => {
it('should generate', async () => {
await OpenAPI.generate({
input: './test/spec/v3.json',
output: './test/generated/v3/',
httpClient: OpenAPI.HttpClient.FETCH,
useOptions: false,
useUnionTypes: false,
exportCore: true,
exportSchemas: true,
exportModels: true,
exportServices: true,
});
glob.sync('./test/generated/v3/**/*.ts').forEach(file => {
const content = fs.readFileSync(file, 'utf8').toString();
expect(content).toMatchSnapshot(file);
});
});
});

View File

@ -1,12 +0,0 @@
import { Module } from '@nestjs/common';
import { ParametersController } from './controllers/ParametersController';
import { ResponseController } from './controllers/ResponseController';
import { SimpleController } from './controllers/SimpleController';
@Module({
controllers: [SimpleController, ParametersController, ResponseController],
})
export class AppModule {
//
}

View File

@ -1,78 +0,0 @@
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { ApiResponse, ApiTags } from '@nestjs/swagger';
import { ModelWithString } from '../models/ModelWithString';
/* eslint-disable @typescript-eslint/no-unused-vars */
@ApiTags('parameters')
@Controller('parameters')
export class ParametersController {
@Get('callWithParameters')
public callWithParameters(
@Param('parameterString') parameterString: string,
@Param('parameterNumber') parameterNumber: number,
@Param('parameterBoolean') parameterBoolean: boolean,
@Param('parameterDictionary') parameterDictionary: Record<string, string>
): any {
return {
parameterString,
parameterNumber,
parameterBoolean,
parameterDictionary,
};
}
@Get('callWithWeirdParameterNames')
public callWithWeirdParameterNames(
@Param('parameter.1') parameter1: string,
@Param('parameter-2') parameter2: string,
@Param('parameter_3') parameter3: string,
@Param('PARAMETER.4') parameter4: string,
@Param('PARAMETER+5') parameter5: string,
@Param('PARAMETER&6') parameter6: string
): any {
return {
parameter1,
parameter2,
parameter3,
parameter4,
parameter5,
parameter6,
};
}
@Get('callWithDefaultParameters')
@ApiResponse({
status: 200,
type: ModelWithString,
})
public callWithDefaultParameters(
@Param('parameterNumberWithDefault') parameterNumberWithDefault: number = 123,
@Param('parameterBooleanWithDefault') parameterBooleanWithDefault: boolean = true,
@Param('parameterStringWithDefault') parameterStringWithDefault: string = 'Hello World!'
): any {
return {
parameterNumberWithDefault,
parameterBooleanWithDefault,
parameterStringWithDefault,
};
}
@Get('getCallWithBody')
@ApiResponse({
status: 200,
type: ModelWithString,
})
public getCallWithBody(@Body() body: ModelWithString): ModelWithString {
return body;
}
@Post('postCallWithBody')
@ApiResponse({
status: 200,
type: ModelWithString,
})
public postCallWithBody(@Body() body: ModelWithString): ModelWithString {
return body;
}
}

View File

@ -1,129 +0,0 @@
import { Controller, Get } from '@nestjs/common';
import { ApiResponse, ApiTags } from '@nestjs/swagger';
import { ModelThatExtends } from '../models/ModelThatExtends';
import { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends';
import { ModelWithArray } from '../models/ModelWithArray';
import { ModelWithBoolean } from '../models/ModelWithBoolean';
import { ModelWithDictionary } from '../models/ModelWithDictionary';
import { ModelWithInteger } from '../models/ModelWithInteger';
import { ModelWithProperties } from '../models/ModelWithProperties';
import { ModelWithReference } from '../models/ModelWithReference';
import { ModelWithString } from '../models/ModelWithString';
/* eslint-disable @typescript-eslint/no-unused-vars */
@ApiTags('response')
@Controller('response')
export class ResponseController {
@Get('getString')
@ApiResponse({ status: 200, type: String })
public getString(): string {
return 'Hello World!';
}
@Get('getNumber')
@ApiResponse({ status: 200, type: Number })
public getNumber(): number {
return 123;
}
@Get('getBoolean')
@ApiResponse({ status: 200, type: Boolean })
public getBoolean(): boolean {
return true;
}
@Get('getModelWithString')
@ApiResponse({ status: 200, type: ModelWithString })
public getModelWithString(): ModelWithString {
return {
prop: 'Hello World!',
};
}
@Get('getModelWithInteger')
@ApiResponse({ status: 200, type: ModelWithInteger })
public getModelWithInteger(): ModelWithInteger {
return {
prop: 123,
};
}
@Get('getModelWithBoolean')
@ApiResponse({ status: 200, type: ModelWithBoolean })
public getModelWithBoolean(): ModelWithBoolean {
return {
prop: true,
};
}
@Get('getModelWithArray')
@ApiResponse({ status: 200, type: ModelWithArray })
public getModelWithArray(): ModelWithArray {
return {
prop: ['foo', 'bar'],
};
}
@Get('getModelWithDictionary')
@ApiResponse({ status: 200, type: ModelWithDictionary })
public getModelWithDictionary(): ModelWithDictionary {
return {
prop: {
foo: 'bar',
},
};
}
@Get('getModelWithReference')
@ApiResponse({ status: 200, type: ModelWithReference })
public getModelWithReference(): ModelWithReference {
return {
prop: {
prop: 'Hello World!',
},
};
}
@Get('getModelWithProperties')
@ApiResponse({ status: 200, type: ModelWithProperties })
public getModelWithProperties(): ModelWithProperties {
return {
string: 'Hello World!',
number: 123,
boolean: true,
array: ['foo', 'bar'],
dictionary: {
foo: 'bar',
},
};
}
@Get('getModelThatExtends')
@ApiResponse({ status: 200, type: ModelThatExtends })
public getModelThatExtends(): ModelThatExtends {
return {
prop: 'prop',
propertyA: 'propertyA',
propertyB: {
prop: 'propertyB',
},
};
}
@Get('getModelThatExtendsExtends')
@ApiResponse({ status: 200, type: ModelThatExtendsExtends })
public getModelThatExtendsExtends(): ModelThatExtendsExtends {
return {
prop: 'prop',
propertyA: 'propertyA',
propertyB: {
prop: 'propertyB',
},
propertyC: 'propertyC',
propertyD: {
prop: 'propertyD',
},
};
}
}

View File

@ -1,42 +0,0 @@
import { Controller, Delete, Get, Head, Options, Patch, Post, Put } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
/* eslint-disable @typescript-eslint/no-unused-vars */
@ApiTags('simple')
@Controller('simple')
export class SimpleController {
@Get('getCallWithoutParametersAndResponse')
public getCallWithoutParametersAndResponse(): void {
//
}
@Put('putCallWithoutParametersAndResponse')
public putCallWithoutParametersAndResponse(): void {
//
}
@Post('postCallWithoutParametersAndResponse')
public postCallWithoutParametersAndResponse(): void {
//
}
@Delete('deleteCallWithoutParametersAndResponse')
public deleteCallWithoutParametersAndResponse(): void {
//
}
@Options('optionsCallWithoutParametersAndResponse')
public optionsCallWithoutParametersAndResponse(): void {
//
}
@Head('headCallWithoutParametersAndResponse')
public headCallWithoutParametersAndResponse(): void {
//
}
@Patch('patchCallWithoutParametersAndResponse')
public patchCallWithoutParametersAndResponse(): void {
//
}
}

View File

@ -1,25 +0,0 @@
import { NestFactory } from '@nestjs/core';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { AppModule } from './AppModule';
/**
* This is a simple OpenAPI test server that we use to run e2e tests. You can find
* more information inside the controllers and models of this server.
* When you run this server the following urls are available:
* - Swagger UI: http://localhost:3000/api
* - Swagger Specification: http://localhost:3000/api-json
*/
async function bootstrap(): Promise<void> {
const app = await NestFactory.create(AppModule);
const options = new DocumentBuilder().setTitle('OpenAPI').setVersion('1.0').build();
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup('api', app, document);
await app.listen(3000);
}
bootstrap();

View File

@ -1,11 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
import { ModelWithString } from './ModelWithString';
export class ModelThatExtends extends ModelWithString {
@ApiProperty()
public readonly propertyA?: string;
@ApiProperty()
public readonly propertyB?: ModelWithString;
}

View File

@ -1,12 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
import { ModelThatExtends } from './ModelThatExtends';
import { ModelWithString } from './ModelWithString';
export class ModelThatExtendsExtends extends ModelThatExtends {
@ApiProperty()
public readonly propertyC?: string;
@ApiProperty()
public readonly propertyD?: ModelWithString;
}

View File

@ -1,6 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
export class ModelWithArray {
@ApiProperty()
public readonly prop?: string[];
}

View File

@ -1,6 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
export class ModelWithBoolean {
@ApiProperty()
public readonly prop?: boolean;
}

View File

@ -1,6 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
export class ModelWithDictionary {
@ApiProperty()
public readonly prop?: Record<string, string>;
}

View File

@ -1,6 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
export class ModelWithInteger {
@ApiProperty()
public readonly prop?: number;
}

View File

@ -1,18 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
export class ModelWithProperties {
@ApiProperty()
public readonly number?: number;
@ApiProperty()
public readonly string?: string;
@ApiProperty()
public readonly boolean?: boolean;
@ApiProperty()
public readonly array?: string[];
@ApiProperty()
public readonly dictionary?: Record<string, string>;
}

View File

@ -1,8 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
import { ModelWithString } from './ModelWithString';
export class ModelWithReference {
@ApiProperty()
public readonly prop?: ModelWithString;
}

View File

@ -1,6 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
export class ModelWithString {
@ApiProperty()
public readonly prop?: string;
}

View File

@ -1,13 +0,0 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"module": "commonjs"
},
"include": [
"./src/**/*.ts"
]
}

View File

@ -17,8 +17,6 @@
"strictNullChecks": true,
"strictFunctionTypes": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true
},

4412
yarn.lock

File diff suppressed because it is too large Load Diff