From 868f5d72f289ba11a2d5e24801fa061938f44d4b Mon Sep 17 00:00:00 2001 From: neoandmatrix Date: Fri, 14 Feb 2025 23:40:34 +0530 Subject: [PATCH 1/4] feat: added proxy support for generate --- src/commands/generate/fromTemplate.ts | 12 +++++++++- src/commands/generate/models.ts | 13 +++++++++-- .../integration/generate/fromTemplate.test.ts | 22 +++++++++++++++++++ test/integration/generate/models.test.ts | 10 +++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/commands/generate/fromTemplate.ts b/src/commands/generate/fromTemplate.ts index 8bfe3471f64..166be7e0286 100644 --- a/src/commands/generate/fromTemplate.ts +++ b/src/commands/generate/fromTemplate.ts @@ -16,6 +16,7 @@ import { intro, isCancel, spinner, text } from '@clack/prompts'; import { inverse, yellow, magenta, green, red } from 'picocolors'; import fetch from 'node-fetch'; import { fromTemplateFlags } from '../../core/flags/generate/fromTemplate.flags'; +import { proxyFlags } from '../../core/flags/proxy.flags'; interface IMapBaseUrlToFlag { url: string, @@ -57,7 +58,10 @@ export default class Template extends Command { 'asyncapi generate fromTemplate asyncapi.yaml @asyncapi/html-template --param version=1.0.0 singleFile=true --output ./docs --force-write' ]; - static flags = fromTemplateFlags(); + static flags = { + ...fromTemplateFlags(), + ...proxyFlags() + }; static args = { asyncapi: Args.string({ description: '- Local path, url or context-name pointing to AsyncAPI file', required: true }), @@ -72,6 +76,7 @@ export default class Template extends Command { let { asyncapi, template } = args; let output = flags.output as string; + const {proxyPort,proxyHost} = flags; if (interactive) { intro(inverse('AsyncAPI Generator')); @@ -96,6 +101,11 @@ export default class Template extends Command { token: flags['registry-token'] } }; + + if (proxyHost && proxyPort) { + const proxyUrl = `http://${proxyHost}:${proxyPort}`; + asyncapi = `${asyncapi}+${proxyUrl}`; + } const asyncapiInput = (await load(asyncapi)) || (await load()); this.specFile = asyncapiInput; diff --git a/src/commands/generate/models.ts b/src/commands/generate/models.ts index 5c7a04f82a2..11baba28525 100644 --- a/src/commands/generate/models.ts +++ b/src/commands/generate/models.ts @@ -5,18 +5,23 @@ import { cancel, intro, isCancel, select, spinner, text } from '@clack/prompts'; import { green, inverse } from 'picocolors'; import { generateModels, Languages, ModelinaArgs } from '@asyncapi/modelina-cli'; import { modelsFlags } from '../../core/flags/generate/models.flags'; +import { proxyFlags } from '../../core/flags/proxy.flags'; export default class Models extends Command { static description = 'Generates typed models'; static readonly args = ModelinaArgs as any; - static flags = modelsFlags(); + static flags = { + ...modelsFlags(), + ...proxyFlags(), + }; async run() { const { args, flags } = await this.parse(Models); - let { language, file } = args; + let { language, file} = args; let { output } = flags; + const {proxyPort,proxyHost} = flags; const interactive = !flags['no-interactive']; @@ -29,6 +34,10 @@ export default class Models extends Command { output = parsedArgs.output; } + if (proxyHost && proxyPort) { + const proxyUrl = `http://${proxyHost}:${proxyPort}`; + file = `${file}+${proxyUrl}`; + } const inputFile = (await load(file)) || (await load()); const { document, diagnostics ,status } = await parse(this, inputFile, flags as ValidateOptions); diff --git a/test/integration/generate/fromTemplate.test.ts b/test/integration/generate/fromTemplate.test.ts index dd3535d1696..b321aacc331 100644 --- a/test/integration/generate/fromTemplate.test.ts +++ b/test/integration/generate/fromTemplate.test.ts @@ -69,6 +69,28 @@ describe('template', () => { }); }); + describe('should error out on proxy port', () => { + test + .stderr() + .stdout() + .command([ + 'generate:fromTemplate', + 'http://localhost:8080/dummySpec.yml', + '@asyncapi/newtemplate', + '--output=./test/docs/2', + '--force-write', + '--proxyHost=host', + '--proxyPort=8080', + '--use-new-generator', + ]) + .it('should throw error when url is passed with proxyHost and proxyPort with invalid host', (ctx, done) => { + expect(ctx.stdout).to.contain(''); + expect(ctx.stderr).to.equal('error loading AsyncAPI document from url: Failed to download http://localhost:8080/dummySpec.yml.\n'); + cleanup('./test/docs/2'); + done(); + }); + }); + describe('git clash', () => { const pathToOutput = './test/docs/2'; before(() => { diff --git a/test/integration/generate/models.test.ts b/test/integration/generate/models.test.ts index d02be248814..2aa4bf59fab 100644 --- a/test/integration/generate/models.test.ts +++ b/test/integration/generate/models.test.ts @@ -35,6 +35,16 @@ describe('models', () => { ); done(); }); + + test + .stderr() + .stdout() + .command([...generalOptions,'typescript','http://localhost:8080/dummySpec.yml --proxyHost=host --proxyPort=8080']) + .it('should throw error when url is passed with proxyHost and proxyPort with invalid host ', (ctx, done) => { + expect(ctx.stdout).to.contain(''); + expect(ctx.stderr).to.equal('error loading AsyncAPI document from url: Failed to download http://localhost:8080/dummySpec.yml --proxyHost=host --proxyPort=8080.\n'); + done(); + }); describe('with logging diagnostics', () => { test From 715303c13e4359e5cc46f944f16a42db471974dd Mon Sep 17 00:00:00 2001 From: neoandmatrix Date: Fri, 14 Feb 2025 23:48:44 +0530 Subject: [PATCH 2/4] chore:updated docs --- docs/usage.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index a2e14356224..a7f9f788d24 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -428,7 +428,7 @@ Generates whatever you want using templates compatible with AsyncAPI Generator. USAGE $ asyncapi generate fromTemplate ASYNCAPI TEMPLATE [-h] [-d ...] [--no-interactive] [-i] [--debug] [-n ...] [-o ] [--force-write] [-w] [-p ...] [--map-base-url ] [--registry-url ] [--registry-auth - ] [--registry-token ] [--use-new-generator] + ] [--registry-token ] [--proxyHost ] [--proxyPort ] [--use-new-generator] ARGUMENTS ASYNCAPI - Local path, url or context-name pointing to AsyncAPI file @@ -454,6 +454,8 @@ FLAGS username and password --registry-url= [default: https://registry.npmjs.org] Specifies the URL of the private registry for fetching templates and dependencies + --proxyHost= Name of the ProxyHost + --proxyPort= Port number number for the proxyHost. --use-new-generator Use v2 generator, for generating from newer templates DESCRIPTION @@ -477,7 +479,7 @@ USAGE [--csharpAutoImplement] [--csharpNewtonsoft] [--csharpArrayType Array|List] [--csharpHashcode] [--csharpEqual] [--csharpSystemJson] [--javaIncludeComments] [--javaJackson] [--javaConstraints] [--javaArrayType Array|List] [--pyDantic] [--no-interactive] [--log-diagnostics] [--diagnostics-format - json|stylish|junit|html|text|teamcity|pretty] [--fail-severity error|warn|info|hint] + json|stylish|junit|html|text|teamcity|pretty] [--proxyHost ] [--proxyPort ] [--fail-severity error|warn|info|hint] ARGUMENTS LANGUAGE (typescript|csharp|golang|java|javascript|dart|python|rust|kotlin|php|cplusplus|scala) The language you want @@ -528,6 +530,8 @@ FLAGS --tsModuleSystem=