diff --git a/.env b/.env index 3610881c360..2bc55dbaee6 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ # The following are sample settings of REACT_APP_DEFINITION_FILE and REACT_APP_DEFINITION_URL -# Note that applying changes to REACT_APP_DEFINITION_FILE or REACT_APP_DEFINITION_URL flags requires restart of applicaton +# Note that applying changes to REACT_APP_DEFINITION_FILE or REACT_APP_DEFINITION_URL flags requires restart of application # Tip: Should not set both REACT_APP_DEFINITION_FILE and REACT_APP_DEFINITION_URL flags # Create-React-App expects static directory within /public to contain FILE @@ -14,6 +14,16 @@ # AsyncAPI 2.x.x remote absolute URI # REACT_APP_DEFINITION_URL=https://raw.githubusercontent.com/asyncapi/spec/v2.6.0/examples/streetlights-kafka.yml +# Swagger 2.0 to OpenAPI 3.0.x Converter URL +# Set this to use a custom converter service instead of the default +# Set to 'null' (without quotes) to disable the converter feature +# REACT_APP_SWAGGER2_CONVERTER_URL=https://converter.swagger.io/api/convert + +# Generator base URLs (optional) +# Set these to use custom generator instances for OpenAPI 3.0 and 2.0 code generation +# REACT_APP_OPENAPI3_GENERATOR_BASE_URL=https://custom-generator3.example.com/api +# REACT_APP_OPENAPI2_GENERATOR_BASE_URL=https://custom-generator2.example.com/api/gen + REACT_APP_VERSION=$npm_package_version REACT_APP_APIDOM_WORKER_PATH=./src/plugins/editor-monaco-language-apidom/language/apidom.worker.js diff --git a/README.md b/README.md index 9c26ed7997e..f8b15bb9c68 100644 --- a/README.md +++ b/README.md @@ -576,11 +576,14 @@ These environment variables will get baked in during build time into build artif Environment variables currently available: -| Variable name | Description | -|-----------------------------|:----------------------------------------------------------------------------------------------------------:| -| `REACT_APP_DEFINITION_FILE` | Specifies a local file path, and the specified file must also be present in the `/public/static` directory | -| `REACT_APP_DEFINITION_URL` | Specifies a remote URL. This environment variable currently takes precedence over `REACT_APP_SWAGGER_FILE` | -| `REACT_APP_VERSION` | Specifies the version of this app. The version is read from `package.json` file. | +| Variable name | Description | +|-----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| `REACT_APP_DEFINITION_FILE` | Specifies a local file path, and the specified file must also be present in the `/public/static` directory | +| `REACT_APP_DEFINITION_URL` | Specifies a remote URL. This environment variable currently takes precedence over `REACT_APP_SWAGGER_FILE` | +| `REACT_APP_VERSION` | Specifies the version of this app. The version is read from `package.json` file. | +| `REACT_APP_SWAGGER2_CONVERTER_URL` | Specifies the URL for the OpenAPI 2.0 to OpenAPI 3.0 converter service. Defaults to `https://converter.swagger.io/api/convert`. Set to `null` to disable conversion. | +| `REACT_APP_OPENAPI3_GENERATOR_BASE_URL` | Specifies the base URL for the OpenAPI 3.0 code generator service. Defaults to `https://generator3.swagger.io/api`. Set to `null` to disable the generator. | +| `REACT_APP_OPENAPI2_GENERATOR_BASE_URL` | Specifies the base URL for the OpenAPI 2.0 code generator service. Defaults to `https://generator.swagger.io/api/gen`. Set to `null` to disable the generator. | Sample environment variable values can be found in `.env` file. For more information about using environment variables, please refer to [adding Custom Environment Variables](https://create-react-app.dev/docs/adding-custom-environment-variables/) diff --git a/src/plugins/top-bar/components/EditMenu/items/ConvertToOpenAPI30xMenuItem.jsx b/src/plugins/top-bar/components/EditMenu/items/ConvertToOpenAPI30xMenuItem.jsx index af67931b6ca..3c2c239cc60 100644 --- a/src/plugins/top-bar/components/EditMenu/items/ConvertToOpenAPI30xMenuItem.jsx +++ b/src/plugins/top-bar/components/EditMenu/items/ConvertToOpenAPI30xMenuItem.jsx @@ -8,8 +8,9 @@ const ConvertToOpenAPI30xMenuItem = ({ }) => { const DropdownMenuItem = getComponent('DropdownMenuItem'); const isContentTypeOpenAPI20 = editorSelectors.selectIsContentTypeOpenAPI20(); + const converterURL = editorSelectors.selectOpenAPI20ConverterURL(); - return isContentTypeOpenAPI20 ? ( + return isContentTypeOpenAPI20 && converterURL ? ( {children || 'Convert to OpenAPI 3.0.x'} ) : null; }; @@ -18,6 +19,7 @@ ConvertToOpenAPI30xMenuItem.propTypes = { getComponent: PropTypes.func.isRequired, editorSelectors: PropTypes.shape({ selectIsContentTypeOpenAPI20: PropTypes.func.isRequired, + selectOpenAPI20ConverterURL: PropTypes.func.isRequired, }).isRequired, children: PropTypes.node, onClick: PropTypes.func.isRequired, diff --git a/src/plugins/top-bar/selectors.js b/src/plugins/top-bar/selectors.js index 168055b0ccb..943630963ae 100644 --- a/src/plugins/top-bar/selectors.js +++ b/src/plugins/top-bar/selectors.js @@ -6,7 +6,13 @@ import { SUCCESS_STATUS, IDLE_STATUS } from './reducers.js'; * editor state plugin selectors. */ -export const selectOpenAPI20ConverterURL = () => 'https://converter.swagger.io/api/convert'; +export const selectOpenAPI20ConverterURL = () => { + const converterUrl = process.env.REACT_APP_SWAGGER2_CONVERTER_URL; + if (converterUrl === 'null') { + return null; + } + return converterUrl || 'https://converter.swagger.io/api/convert'; +}; /** * editorTopBar state plugin selectors. @@ -14,10 +20,25 @@ export const selectOpenAPI20ConverterURL = () => 'https://converter.swagger.io/a export const selectEditorTopBarState = (state) => state; -export const selectOpenAPI3GeneratorServerListURL = () => - 'https://generator3.swagger.io/api/servers'; +export const selectOpenAPI3GeneratorBaseURL = () => { + return process.env.REACT_APP_OPENAPI3_GENERATOR_BASE_URL || 'https://generator3.swagger.io/api'; +}; + +export const selectOpenAPI2GeneratorBaseURL = () => { + return ( + process.env.REACT_APP_OPENAPI2_GENERATOR_BASE_URL || 'https://generator.swagger.io/api/gen' + ); +}; + +export const selectOpenAPI3GeneratorServerListURL = () => { + const baseUrl = selectOpenAPI3GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/servers` : 'https://generator3.swagger.io/api/servers'; +}; -export const selectOpenAPI3GenerateServerURL = () => 'https://generator3.swagger.io/api/generate'; +export const selectOpenAPI3GenerateServerURL = () => { + const baseUrl = selectOpenAPI3GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/generate` : 'https://generator3.swagger.io/api/generate'; +}; export const selectOpenAPI3GeneratorServerListStatus = (state) => state.get('openAPI3GeneratorServerListStatus') || IDLE_STATUS; @@ -34,10 +55,15 @@ export const selectOpenAPI3GeneratorServerList = createSelector( } ); -export const selectOpenAPI3GeneratorClientListURL = () => - 'https://generator3.swagger.io/api/clients'; +export const selectOpenAPI3GeneratorClientListURL = () => { + const baseUrl = selectOpenAPI3GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/clients` : 'https://generator3.swagger.io/api/clients'; +}; -export const selectOpenAPI3GenerateClientURL = () => 'https://generator3.swagger.io/api/generate'; +export const selectOpenAPI3GenerateClientURL = () => { + const baseUrl = selectOpenAPI3GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/generate` : 'https://generator3.swagger.io/api/generate'; +}; export const selectOpenAPI3GeneratorClientListStatus = (state) => state.get('openAPI3GeneratorClientListStatus') || IDLE_STATUS; @@ -54,10 +80,15 @@ export const selectOpenAPI3GeneratorClientList = createSelector( } ); -export const selectOpenAPI2GeneratorServerListURL = () => - 'https://generator.swagger.io/api/gen/servers'; +export const selectOpenAPI2GeneratorServerListURL = () => { + const baseUrl = selectOpenAPI2GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/servers` : 'https://generator.swagger.io/api/gen/servers'; +}; -export const selectOpenAPI2GenerateServerURL = () => 'https://generator.swagger.io/api/gen/servers'; +export const selectOpenAPI2GenerateServerURL = () => { + const baseUrl = selectOpenAPI2GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/servers` : 'https://generator.swagger.io/api/gen/servers'; +}; export const selectOpenAPI2GeneratorServerListStatus = (state) => state.get('openAPI2GeneratorServerListStatus') || IDLE_STATUS; @@ -74,10 +105,15 @@ export const selectOpenAPI2GeneratorServerList = createSelector( } ); -export const selectOpenAPI2GeneratorClientListURL = () => - 'https://generator.swagger.io/api/gen/clients'; +export const selectOpenAPI2GeneratorClientListURL = () => { + const baseUrl = selectOpenAPI2GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/clients` : 'https://generator.swagger.io/api/gen/clients'; +}; -export const selectOpenAPI2GenerateClientURL = () => 'https://generator.swagger.io/api/gen/clients'; +export const selectOpenAPI2GenerateClientURL = () => { + const baseUrl = selectOpenAPI2GeneratorBaseURL(); + return baseUrl ? `${baseUrl}/clients` : 'https://generator.swagger.io/api/gen/clients'; +}; export const selectOpenAPI2GeneratorClientListStatus = (state) => state.get('openAPI2GeneratorClientListStatus') || IDLE_STATUS;