diff --git a/docs/usage.md b/docs/usage.md index 9e261882a78..019a0d93919 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -3,9 +3,9 @@ title: 'Usage' weight: 40 --- - The AsyncAPI CLI makes it easier to work with AsyncAPI documents. + # Usage + ```sh-session $ npm install -g @asyncapi/cli $ asyncapi COMMAND @@ -33,38 +35,40 @@ USAGE $ asyncapi COMMAND ... ``` + # Commands -* [`asyncapi bundle`](#asyncapi-bundle) -* [`asyncapi config`](#asyncapi-config) -* [`asyncapi config analytics`](#asyncapi-config-analytics) -* [`asyncapi config context`](#asyncapi-config-context) -* [`asyncapi config context add CONTEXT-NAME SPEC-FILE-PATH`](#asyncapi-config-context-add-context-name-spec-file-path) -* [`asyncapi config context current`](#asyncapi-config-context-current) -* [`asyncapi config context edit CONTEXT-NAME NEW-SPEC-FILE-PATH`](#asyncapi-config-context-edit-context-name-new-spec-file-path) -* [`asyncapi config context init [CONTEXT-FILE-PATH]`](#asyncapi-config-context-init-context-file-path) -* [`asyncapi config context list`](#asyncapi-config-context-list) -* [`asyncapi config context remove CONTEXT-NAME`](#asyncapi-config-context-remove-context-name) -* [`asyncapi config context use CONTEXT-NAME`](#asyncapi-config-context-use-context-name) -* [`asyncapi config versions`](#asyncapi-config-versions) -* [`asyncapi convert [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-convert-spec-file-proxyhost-proxyport) -* [`asyncapi diff OLD NEW`](#asyncapi-diff-old-new) -* [`asyncapi format [SPEC-FILE]`](#asyncapi-format-spec-file) -* [`asyncapi generate`](#asyncapi-generate) -* [`asyncapi generate fromTemplate ASYNCAPI TEMPLATE`](#asyncapi-generate-fromtemplate-asyncapi-template) -* [`asyncapi generate models LANGUAGE FILE`](#asyncapi-generate-models-language-file) -* [`asyncapi new`](#asyncapi-new) -* [`asyncapi new file`](#asyncapi-new-file) -* [`asyncapi new glee`](#asyncapi-new-glee) -* [`asyncapi new template`](#asyncapi-new-template) -* [`asyncapi optimize [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-optimize-spec-file-proxyhost-proxyport) -* [`asyncapi pretty SPEC-FILE`](#asyncapi-pretty-spec-file) -* [`asyncapi start`](#asyncapi-start) -* [`asyncapi start studio`](#asyncapi-start-studio) -* [`asyncapi validate [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-validate-spec-file-proxyhost-proxyport) + +- [`asyncapi bundle`](#asyncapi-bundle) +- [`asyncapi config`](#asyncapi-config) +- [`asyncapi config analytics`](#asyncapi-config-analytics) +- [`asyncapi config context`](#asyncapi-config-context) +- [`asyncapi config context add CONTEXT-NAME SPEC-FILE-PATH`](#asyncapi-config-context-add-context-name-spec-file-path) +- [`asyncapi config context current`](#asyncapi-config-context-current) +- [`asyncapi config context edit CONTEXT-NAME NEW-SPEC-FILE-PATH`](#asyncapi-config-context-edit-context-name-new-spec-file-path) +- [`asyncapi config context init [CONTEXT-FILE-PATH]`](#asyncapi-config-context-init-context-file-path) +- [`asyncapi config context list`](#asyncapi-config-context-list) +- [`asyncapi config context remove CONTEXT-NAME`](#asyncapi-config-context-remove-context-name) +- [`asyncapi config context use CONTEXT-NAME`](#asyncapi-config-context-use-context-name) +- [`asyncapi config versions`](#asyncapi-config-versions) +- [`asyncapi convert [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-convert-spec-file-proxyhost-proxyport) +- [`asyncapi diff OLD NEW`](#asyncapi-diff-old-new) +- [`asyncapi format [SPEC-FILE]`](#asyncapi-format-spec-file) +- [`asyncapi generate`](#asyncapi-generate) +- [`asyncapi generate fromTemplate ASYNCAPI TEMPLATE`](#asyncapi-generate-fromtemplate-asyncapi-template) +- [`asyncapi generate models LANGUAGE FILE`](#asyncapi-generate-models-language-file) +- [`asyncapi new`](#asyncapi-new) +- [`asyncapi new file`](#asyncapi-new-file) +- [`asyncapi new glee`](#asyncapi-new-glee) +- [`asyncapi new template`](#asyncapi-new-template) +- [`asyncapi optimize [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-optimize-spec-file-proxyhost-proxyport) +- [`asyncapi pretty SPEC-FILE`](#asyncapi-pretty-spec-file) +- [`asyncapi start`](#asyncapi-start) +- [`asyncapi start studio`](#asyncapi-start-studio) +- [`asyncapi validate [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-validate-spec-file-proxyhost-proxyport) ## `asyncapi bundle` @@ -799,8 +803,27 @@ DESCRIPTION _See code: [src/commands/start/studio.ts](https://github.com/asyncapi/cli/blob/v2.14.1/src/commands/start/studio.ts)_ +## `asyncapi start preview` + +starts a new local instance of studio in readonly mode + +``` +USAGE + $ asyncapi start studio [-h] [-f ] [-p ] + +FLAGS + -f, --file= path to the AsyncAPI file to link with Studio + -h, --help Show CLI help. + -p, --port= port in which to start Studio + +DESCRIPTION + starts a new local instance of studio in readonly mode +``` + ## `asyncapi validate [SPEC-FILE] [PROXYHOST] [PROXYPORT]` +_See code: [src/commands/start/preview.ts](https://github.com/asyncapi/cli/blob/v2.14.1/src/commands/start/preview.ts)_ + validate asyncapi file ``` @@ -834,4 +857,5 @@ DESCRIPTION ``` _See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v2.14.1/src/commands/validate.ts)_ + diff --git a/src/commands/start/preview.ts b/src/commands/start/preview.ts new file mode 100644 index 00000000000..d08251cc006 --- /dev/null +++ b/src/commands/start/preview.ts @@ -0,0 +1,65 @@ +import Command from '../../core/base'; +import bundle from '@asyncapi/bundler'; +import path from 'path'; +import open from 'open'; +import { createServer } from 'http'; +import serveHandler from 'serve-handler'; +import { version as studioVersion } from '@asyncapi/studio/package.json'; +import { previewFlags } from '../../core/flags/start/preview.flags'; + +class preview extends Command { + static description = + 'Preview AsyncAPI document with local references in Studio.'; + static strict = false; + + static flags = previewFlags(); + + async run() { + const { argv, flags } = await this.parse(preview); + const port = flags.port; + + const AsyncAPIFiles = argv as string[]; + + this.startServer(AsyncAPIFiles, flags, port ? port : 3210); + } + + async startServer(AsyncAPIFiles: string[], flags: any, port: number) { + const server = createServer(async (request, response) => { + const indexLocation = require.resolve( + '@asyncapi/studio/build/index.html', + ); + const hostFolder = indexLocation.substring( + 0, + indexLocation.lastIndexOf(path.sep), + ); + + if (request.url && request.url.includes('/file.yml')) { + response.setHeader('Content-Type', 'application/x-yaml'); + const bundledDocument = await bundle(AsyncAPIFiles, { + base: flags.base, + baseDir: flags.baseDir, + xOrigin: flags.xOrigin, + }); + + const yamlContent = bundledDocument.yml(); + + response.end(yamlContent); + } else { + return serveHandler(request, response, { + public: hostFolder, + }); + } + }); + + server.listen(port, () => { + const url = `http://localhost:${port}?liveServer=${port}&studio-version=${studioVersion}&url=file.yml&readOnly=true`; + console.log(`Studio is now running at ${url}`); + console.log( + 'You can open this URL in your web browser, and if needed, press Ctrl + C to stop the process.', + ); + open(url); + }); + } +} + +export default preview; diff --git a/src/core/flags/start/preview.flags.ts b/src/core/flags/start/preview.flags.ts new file mode 100644 index 00000000000..361395a9d39 --- /dev/null +++ b/src/core/flags/start/preview.flags.ts @@ -0,0 +1,15 @@ +import { Flags } from '@oclif/core'; + +export const previewFlags = () => { + return { + help: Flags.help({ char: 'h' }), + file: Flags.string({ + char: 'f', + description: 'path to the AsyncAPI file to link with Studio', + }), + port: Flags.integer({ + char: 'p', + description: 'port in which to start Studio', + }), + }; +};