diff --git a/.github/workflows/devworkspace-generator-publish-next.yml b/.github/workflows/devworkspace-generator-publish-next.yml deleted file mode 100644 index fad2a43b1..000000000 --- a/.github/workflows/devworkspace-generator-publish-next.yml +++ /dev/null @@ -1,61 +0,0 @@ -# -# Copyright (c) 2022 Red Hat, Inc. -# This program and the accompanying materials are made -# available under the terms of the Eclipse Public License 2.0 -# which is available at https://www.eclipse.org/legal/epl-2.0/ -# -# SPDX-License-Identifier: EPL-2.0 -# - -name: devworkspace-generator-publish-next - -on: - push: - branches: - - main - - 7.**.x - paths: - - 'tools/devworkspace-generator/**' - - '.github/workflows/devworkspace-generator-publish-next.yml' - -jobs: - publish: - runs-on: ubuntu-22.04 - steps: - - uses: actions/setup-node@v4 - with: - node-version: '16' - registry-url: 'https://registry.npmjs.org' - scope: '@eclipse-che' - - name: Clone source code - uses: actions/checkout@v4 - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT - - uses: actions/cache@v4 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: yarn-${{ hashFiles('tools/devworkspace-generator/yarn.lock') }} - restore-keys: yarn- - - name: publish - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - run: | - if [[ ${GITHUB_REF##*/} == "7."**".x" ]]; then - echo "[INFO] using ${GITHUB_REF##*/} tag" - DIST_TAG="next-${GITHUB_REF##*/}" - else - echo "[INFO] using "next" tag" - DIST_TAG=next - fi - - cd tools/devworkspace-generator - yarn - yarn compile - SHORT_SHA1=$(git rev-parse --short=7 HEAD) - CURRENT_VERSION=$(jq -r '.version' package.json) - NEW_VERSION="${CURRENT_VERSION}-${SHORT_SHA1}" - echo New version is ${NEW_VERSION} - sed -i -r -e "s/(\"version\": )(\".*\")/\1\"$NEW_VERSION\"/" package.json - npm publish --tag $DIST_TAG diff --git a/.github/workflows/devworkspace-generator-release.yml b/.github/workflows/devworkspace-generator-release.yml deleted file mode 100644 index 4c01c854b..000000000 --- a/.github/workflows/devworkspace-generator-release.yml +++ /dev/null @@ -1,90 +0,0 @@ -# -# Copyright (c) 2023 Red Hat, Inc. -# This program and the accompanying materials are made -# available under the terms of the Eclipse Public License 2.0 -# which is available at https://www.eclipse.org/legal/epl-2.0/ -# -# SPDX-License-Identifier: EPL-2.0 -# - -name: Release Che Devworkspace Generator - -on: - workflow_dispatch: - inputs: - version: - description: 'release version in format 7.y.z' - required: true - forceRecreateTags: - description: If true, tags will be recreated. Use with caution - required: false - default: 'false' - -jobs: - build: - name: Create Che Devfile Registry Release - runs-on: ubuntu-22.04 - steps: - - - uses: actions/setup-node@v4 - with: - node-version: '16' - registry-url: 'https://registry.npmjs.org' - scope: '@eclipse-che' - - - name: "Checkout source code" - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Check existing tags - if: github.event.inputs.performRelease == 'true' - run: | - set +e - RECREATE_TAGS=${{ github.event.inputs.forceRecreateTags }} - VERSION=${{ github.event.inputs.version }} - EXISTING_TAG=$(git ls-remote --exit-code origin refs/tags/${VERSION}) - if [[ -n ${EXISTING_TAG} ]]; then - if [[ ${RECREATE_TAGS} == "true" ]]; then - echo "[INFO] Removing tag for ${VERSION} version. New tag will be recreated during release." - git push origin :$VERSION - else - echo "[ERROR] Cannot proceed with release - tag ${EXISTING_TAG} already exists." - exit 1 - fi - else - echo "[INFO] No existing tags detected for $VERSION" - fi - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT - - uses: actions/cache@v4 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: yarn-${{ hashFiles('tools/devworkspace-generator/yarn.lock') }} - restore-keys: yarn- - - name: publish DevWorkspace Generator - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - run: | - cd tools/devworkspace-generator - sed -i -r -e "s/(\"version\": )(\".*\")/\1\"${{ github.event.inputs.version }}\"/" package.json - yarn - yarn compile - npm publish --tag latest - # che-22407 - mattermost steps are commented out, until we find a replacement for it - # - name: Create failure MM message - # if: ${{ failure() }} - # run: | - # echo "{\"text\":\":no_entry_sign: Che Devworkspace Generator ${{ github.event.inputs.version }} release has failed: https://github.com/eclipse-che/che-devfile-registry/actions/workflows/release.yml\"}" > mattermost.json - # - name: Create success MM message - # run: | - # echo "{\"text\":\":white_check_mark: Che Devworkspace Generator ${{ github.event.inputs.version }} has been released: https://www.npmjs.com/package/@eclipse-che/che-devworkspace-generator/v/${{ github.event.inputs.version }}\"}" > mattermost.json - # - name: Send MM message - # if: ${{ success() }} || ${{ failure() }} - # uses: mattermost/action-mattermost-notify@1.1.0 - # env: - # MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }} - # MATTERMOST_CHANNEL: eclipse-che-releases - # MATTERMOST_USERNAME: che-bot diff --git a/build.sh b/build.sh index 00a638cdc..19231543d 100755 --- a/build.sh +++ b/build.sh @@ -10,8 +10,6 @@ set -e -base_dir=$(cd "$(dirname "$0")"; pwd) - REGISTRY="quay.io" ORGANIZATION="eclipse" TAG="next" @@ -73,10 +71,6 @@ function parse_arguments() { parse_arguments "$@" -echo "Build tooling..." -pushd "${base_dir}"/tools/devworkspace-generator > /dev/null -yarn - BUILD_COMMAND="build" if [[ -z $BUILDER ]]; then echo "BUILDER not specified, trying with podman" @@ -108,8 +102,6 @@ else fi fi -pushd "${base_dir}" > /dev/null - IMAGE="${REGISTRY}/${ORGANIZATION}/che-devfile-registry:${TAG}" VERSION=$(head -n 1 VERSION) ${BUILDER} ${BUILD_COMMAND} \ diff --git a/build/scripts/generate_devworkspace_templates.sh b/build/scripts/generate_devworkspace_templates.sh index 0bee53c40..d563b5164 100755 --- a/build/scripts/generate_devworkspace_templates.sh +++ b/build/scripts/generate_devworkspace_templates.sh @@ -17,9 +17,12 @@ if [[ -z "$VERSION" || "$VERSION" == *"-next" ]]; then VERSION="main" fi -CHE_DEVWORKSPACE_GENERATOR_VERSION=next PLUGIN_REGISTRY_URL=https://eclipse-che.github.io/che-plugin-registry/${VERSION}/v3 +# Install che-devworkspace-generator +CHE_DEVWORKSPACE_GENERATOR_VERSION=next +npm install @eclipse-che/che-devworkspace-generator@${CHE_DEVWORKSPACE_GENERATOR_VERSION} + for dir in /build/devfiles/*/ do devfile_url=$(grep "v2:" "${dir}"meta.yaml) || : @@ -27,30 +30,30 @@ do devfile_url=${devfile_url##*v2: } devfile_url=${devfile_url%/} #generate a temporary devworkspace yaml to fetch git repository name and clone url. - npm_config_yes=true npx @eclipse-che/che-devworkspace-generator@${CHE_DEVWORKSPACE_GENERATOR_VERSION} \ + npm_config_yes=true npx @eclipse-che/che-devworkspace-generator \ --devfile-url:"${devfile_url}" \ --plugin-registry-url:"${PLUGIN_REGISTRY_URL}" \ --editor-entry:che-incubator/che-code/latest \ --output-file:"${dir}"temp.yaml - + name=$(yq -r '.spec.template.projects[0].name' "${dir}temp.yaml" | sed -n '2 p') project="${name}={{_INTERNAL_URL_}}/resources/v2/${name}.zip" - npm_config_yes=true npx @eclipse-che/che-devworkspace-generator@${CHE_DEVWORKSPACE_GENERATOR_VERSION} \ + npm_config_yes=true npx @eclipse-che/che-devworkspace-generator \ --devfile-url:"${devfile_url}" \ --editor-entry:che-incubator/che-code/insiders \ --plugin-registry-url:"${PLUGIN_REGISTRY_URL}" \ --output-file:"${dir}"/devworkspace-che-code-insiders.yaml \ --project."${project}" - npm_config_yes=true npx @eclipse-che/che-devworkspace-generator@${CHE_DEVWORKSPACE_GENERATOR_VERSION} \ + npm_config_yes=true npx @eclipse-che/che-devworkspace-generator \ --devfile-url:"${devfile_url}" \ --editor-entry:che-incubator/che-code/latest \ --plugin-registry-url:"${PLUGIN_REGISTRY_URL}" \ --output-file:"${dir}"/devworkspace-che-code-latest.yaml \ --project."${project}" - npm_config_yes=true npx @eclipse-che/che-devworkspace-generator@${CHE_DEVWORKSPACE_GENERATOR_VERSION} \ + npm_config_yes=true npx @eclipse-che/che-devworkspace-generator \ --devfile-url:"${devfile_url}" \ --editor-entry:che-incubator/che-idea/next \ --plugin-registry-url:"${PLUGIN_REGISTRY_URL}" \ diff --git a/make-release.sh b/make-release.sh index a8363106c..460efa78a 100755 --- a/make-release.sh +++ b/make-release.sh @@ -1,10 +1,10 @@ #!/bin/bash -# Release process automation script. +# Release process automation script. # Used to create branch/tag, update VERSION files -# and and trigger release by force pushing changes to the release branch +# and and trigger release by force pushing changes to the release branch # set to 1 to actually trigger changes in the release branch -TRIGGER_RELEASE=0 +TRIGGER_RELEASE=0 NOCOMMIT=0 TMP="" REPO=git@github.com:eclipse-che/che-devfile-registry @@ -37,7 +37,7 @@ verifyContainerExistsWithTimeout() count=1 (( timeout_intervals=this_timeout*3 )) while [[ $count -le $timeout_intervals ]]; do # echo $count - echo "[INFO] [$count/$timeout_intervals] Verify ${container_to_check} exists..." + echo "[INFO] [$count/$timeout_intervals] Verify ${container_to_check} exists..." # check if the container exists verifyContainerExists "${container_to_check}" @@ -65,7 +65,7 @@ verifyContainerExistsWithTimeout() # Checks the container existence # # Returns -# 1: found; 0: not found; -1: unknown manifest +# 1: found; 0: not found; -1: unknown manifest # verifyContainerExists() { @@ -124,7 +124,7 @@ checkRequiredImagesExist() done } -performRelease() +performRelease() { set -xe @@ -134,7 +134,7 @@ performRelease() # Build and push happy path image, which depends on the above ./happy-path/build_happy_path_image.sh --push --rm - + echo "[INFO] Checking images..." checkRequiredImagesExist @@ -170,9 +170,6 @@ updateVersion () { thisVERSION="$1" # update main VERSION file of devfile registry echo "${thisVERSION}" > VERSION - # update version of devworkspace-generator in package.json - jq ".\"version\" = \"${thisVERSION}\"" tools/devworkspace-generator/package.json > tools/devworkspace-generator/package.json.update - mv tools/devworkspace-generator/package.json.update tools/devworkspace-generator/package.json } if [[ ! ${VERSION} ]]; then @@ -186,7 +183,7 @@ BRANCH=${VERSION%.*}.x # if doing a .0 release, use main; if doing a .z release, use $BRANCH if [[ ${VERSION} == *".0" ]]; then BASEBRANCH="main" -else +else BASEBRANCH="${BRANCH}" fi @@ -218,7 +215,7 @@ commitChangeOrCreatePR() if [[ ${PR_BRANCH} == *"add"* ]]; then COMMIT_MSG="chore: release: add ${aVERSION} plugins in ${aBRANCH}" - else + else COMMIT_MSG="chore: release: bump to ${aVERSION} in ${aBRANCH}" fi diff --git a/tools/devworkspace-generator/.deps/EXCLUDED/dev.md b/tools/devworkspace-generator/.deps/EXCLUDED/dev.md deleted file mode 100644 index f18b96e72..000000000 --- a/tools/devworkspace-generator/.deps/EXCLUDED/dev.md +++ /dev/null @@ -1,7 +0,0 @@ -This file contains a manual contribution to .deps/dev.md and it's needed because eclipse/dash-licenses does not deal with work-with CQs (more see https://github.com/eclipse/dash-licenses/issues/13) - -| Packages | Resolved CQs | -| --- | --- | -| `eslint-visitor-keys@3.0.0` | [clearlydefined](https://clearlydefined.io/definitions/npm/npmjs/-/eslint-visitor-keys/3.0.0) | -| `fs-monkey@1.0.3` | [clearlydefined](https://clearlydefined.io/definitions/npm/npmjs/-/fs-monkey/1.0.3) | -| `fsevents@2.3.2` | [clearlydefined](https://clearlydefined.io/definitions/npm/npmjs/-/fsevents/2.3.2) | diff --git a/tools/devworkspace-generator/.deps/EXCLUDED/prod.md b/tools/devworkspace-generator/.deps/EXCLUDED/prod.md deleted file mode 100644 index b8e9bc6bf..000000000 --- a/tools/devworkspace-generator/.deps/EXCLUDED/prod.md +++ /dev/null @@ -1,5 +0,0 @@ -This file lists dependencies that do not need CQs or auto-detection does not work due to a bug in https://github.com/eclipse/dash-licenses - -| Packages | Resolved CQs | -| --- | --- | -| `@devfile/api@2.2.1-alpha-1667236163` | N/A | \ No newline at end of file diff --git a/tools/devworkspace-generator/.deps/dev.md b/tools/devworkspace-generator/.deps/dev.md deleted file mode 100644 index c99c86ff5..000000000 --- a/tools/devworkspace-generator/.deps/dev.md +++ /dev/null @@ -1,335 +0,0 @@ -# Development dependencies - -| Packages | License | Resolved CQs | -| --- | --- | --- | -| [`@babel/code-frame@7.15.8`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/compat-data@7.15.0`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/core@7.15.8`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/generator@7.15.8`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-compilation-targets@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-function-name@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-get-function-arity@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-hoist-variables@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-member-expression-to-functions@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-module-imports@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-module-transforms@7.15.8`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-optimise-call-expression@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-plugin-utils@7.14.5`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-replace-supers@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-simple-access@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-split-export-declaration@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-validator-identifier@7.15.7`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helper-validator-option@7.14.5`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/helpers@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/highlight@7.14.5`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/parser@7.15.8`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/plugin-syntax-async-generators@7.8.4`](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators) | MIT | #1973 | -| [`@babel/plugin-syntax-bigint@7.8.3`](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-bigint) | MIT | clearlydefined | -| [`@babel/plugin-syntax-class-properties@7.12.13`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/plugin-syntax-import-meta@7.10.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/plugin-syntax-json-strings@7.8.3`](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings) | MIT | clearlydefined | -| [`@babel/plugin-syntax-logical-assignment-operators@7.10.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/plugin-syntax-nullish-coalescing-operator@7.8.3`](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator) | MIT | clearlydefined | -| [`@babel/plugin-syntax-numeric-separator@7.10.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/plugin-syntax-object-rest-spread@7.8.3`](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread) | MIT | clearlydefined | -| [`@babel/plugin-syntax-optional-catch-binding@7.8.3`](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding) | MIT | clearlydefined | -| [`@babel/plugin-syntax-optional-chaining@7.8.3`](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining) | MIT | clearlydefined | -| [`@babel/plugin-syntax-top-level-await@7.14.5`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/plugin-syntax-typescript@7.14.5`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/template@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/traverse@7.15.4`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@babel/types@7.15.6`](https://github.com/babel/babel.git) | MIT | clearlydefined | -| [`@bcoe/v8-coverage@0.2.3`](git://github.com/demurgos/v8-coverage.git) | MIT | clearlydefined | -| [`@eslint/eslintrc@1.0.3`](https://github.com/eslint/eslintrc.git) | MIT | clearlydefined | -| [`@humanwhocodes/config-array@0.6.0`](git+https://github.com/humanwhocodes/config-array.git) | Apache-2.0 | clearlydefined | -| [`@humanwhocodes/object-schema@1.2.0`](git+https://github.com/humanwhocodes/object-schema.git) | BSD-3-Clause | clearlydefined | -| [`@istanbuljs/load-nyc-config@1.1.0`](git+https://github.com/istanbuljs/load-nyc-config.git) | ISC | clearlydefined | -| [`@istanbuljs/schema@0.1.3`](git+https://github.com/istanbuljs/schema.git) | MIT | clearlydefined | -| [`@jest/console@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/core@27.3.1`](https://github.com/facebook/jest) | MIT | clearlydefined | -| [`@jest/environment@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/fake-timers@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/globals@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/reporters@27.3.1`](https://github.com/facebook/jest) | MIT | clearlydefined | -| [`@jest/source-map@27.0.6`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/test-result@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/test-sequencer@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/transform@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@jest/types@27.2.5`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`@sinonjs/commons@1.8.3`](git+https://github.com/sinonjs/commons.git) | BSD-3-Clause | #4340 | -| [`@sinonjs/fake-timers@8.0.1`](https://github.com/sinonjs/fake-timers.git) | BSD-3-Clause | clearlydefined | -| [`@tootallnate/once@1.1.2`](git://github.com/TooTallNate/once.git) | MIT | clearlydefined | -| [`@types/babel__core@7.1.16`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/babel__generator@7.6.3`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/babel__template@7.4.1`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/babel__traverse@7.14.2`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/graceful-fs@4.1.5`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/istanbul-lib-coverage@2.0.3`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/istanbul-lib-report@3.0.0`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/istanbul-reports@3.0.1`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/jest@27.0.2`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/prettier@2.4.1`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/stack-utils@2.0.1`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/yargs-parser@20.2.1`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/yargs@16.0.4`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`abab@2.0.5`](git+https://github.com/jsdom/abab.git) | BSD-3-Clause | clearlydefined | -| [`acorn-globals@6.0.0`](https://github.com/ForbesLindesay/acorn-globals.git) | MIT | clearlydefined | -| [`acorn-jsx@5.3.2`](https://github.com/acornjs/acorn-jsx) | MIT | clearlydefined | -| [`acorn-walk@7.2.0`](https://github.com/acornjs/acorn.git) | MIT | clearlydefined | -| [`acorn@8.5.0`](https://github.com/acornjs/acorn.git) | MIT | clearlydefined | -| [`agent-base@6.0.2`](git://github.com/TooTallNate/node-agent-base.git) | MIT | clearlydefined | -| [`ansi-colors@4.1.1`](https://github.com/doowb/ansi-colors.git) | MIT | clearlydefined | -| [`ansi-escapes@4.3.2`](https://github.com/sindresorhus/ansi-escapes.git) | MIT | clearlydefined | -| [`ansi-styles@4.3.0`](https://github.com/chalk/ansi-styles.git) | MIT | clearlydefined | -| [`anymatch@3.1.2`](https://github.com/micromatch/anymatch) | ISC | #5050 | -| [`babel-jest@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`babel-plugin-istanbul@6.1.1`](git+https://github.com/istanbuljs/babel-plugin-istanbul.git) | BSD-3-Clause | clearlydefined | -| [`babel-plugin-jest-hoist@27.2.0`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`babel-polyfill@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-polyfill) | MIT | #71 | -| [`babel-preset-current-node-syntax@1.0.1`](https://github.com/nicolo-ribaudo/babel-preset-current-node-syntax.git) | MIT | clearlydefined | -| [`babel-preset-jest@27.2.0`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`braces@3.0.2`](https://github.com/micromatch/braces.git) | MIT | clearlydefined | -| [`browser-process-hrtime@1.0.0`](git://github.com/kumavis/browser-process-hrtime.git) | BSD-2-Clause | clearlydefined | -| [`browserslist@4.17.4`](https://github.com/browserslist/browserslist.git) | MIT | #1213 | -| [`bs-logger@0.2.6`](git+https://github.com/huafu/bs-logger.git) | MIT | clearlydefined | -| [`bser@2.1.1`](https://github.com/facebook/watchman) | Apache-2.0 | clearlydefined | -| [`buffer-from@1.1.2`](https://github.com/LinusU/buffer-from.git) | MIT | clearlydefined | -| [`callsites@3.1.0`](https://github.com/sindresorhus/callsites.git) | MIT | clearlydefined | -| [`camelcase@6.2.0`](https://github.com/sindresorhus/camelcase.git) | MIT | clearlydefined | -| [`caniuse-lite@1.0.30001270`](https://github.com/browserslist/caniuse-lite.git) | CC-BY-4.0 | #1196 | -| [`chalk@4.1.2`](https://github.com/chalk/chalk.git) | MIT | clearlydefined | -| [`char-regex@1.0.2`](https://github.com/Richienb/char-regex.git) | MIT | clearlydefined | -| [`ci-info@3.2.0`](https://github.com/watson/ci-info.git) | MIT | clearlydefined | -| [`cjs-module-lexer@1.2.2`](git+https://github.com/guybedford/cjs-module-lexer.git) | MIT | clearlydefined | -| [`cliui@7.0.4`](https://github.com/yargs/cliui.git) | ISC | #2724 | -| [`co@4.6.0`](https://github.com/tj/co.git) | MIT | clearlydefined | -| [`collect-v8-coverage@1.0.1`](https://github.com/SimenB/collect-v8-coverage.git) | MIT | clearlydefined | -| [`color-convert@2.0.1`](https://github.com/Qix-/color-convert.git) | MIT | clearlydefined | -| [`color-name@1.1.4`](git@github.com:colorjs/color-name.git) | MIT | clearlydefined | -| [`cross-spawn@7.0.3`](git@github.com:moxystudio/node-cross-spawn.git) | MIT | clearlydefined | -| [`cssom@0.4.4`](https://github.com/NV/CSSOM.git) | MIT | clearlydefined | -| [`cssstyle@2.3.0`](https://github.com/jsdom/cssstyle.git) | MIT | clearlydefined | -| [`data-urls@2.0.0`](https://github.com/jsdom/data-urls.git) | MIT | clearlydefined | -| [`debug@4.3.2`](git://github.com/visionmedia/debug.git) | MIT | clearlydefined | -| [`decimal.js@10.3.1`](https://github.com/MikeMcl/decimal.js.git) | MIT | clearlydefined | -| [`dedent@0.7.0`](git://github.com/dmnd/dedent.git) | MIT | clearlydefined | -| [`deep-is@0.1.4`](http://github.com/thlorenz/deep-is.git) | MIT | #2130 | -| [`deepmerge@4.2.2`](git://github.com/TehShrike/deepmerge.git) | MIT | clearlydefined | -| [`detect-newline@3.1.0`](https://github.com/sindresorhus/detect-newline.git) | MIT | clearlydefined | -| [`diff-sequences@27.0.6`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`doctrine@3.0.0`](https://github.com/eslint/doctrine.git) | Apache-2.0 | [CQ22628](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22628) | -| [`domexception@2.0.1`](https://github.com/jsdom/domexception.git) | MIT | clearlydefined | -| [`duplexer@0.1.2`](git://github.com/Raynos/duplexer.git) | MIT | #1002 | -| [`electron-to-chromium@1.3.873`](https://github.com/kilian/electron-to-chromium/) | ISC | #1204 | -| [`emittery@0.8.1`](https://github.com/sindresorhus/emittery.git) | MIT | clearlydefined | -| [`emoji-regex@8.0.0`](https://github.com/mathiasbynens/emoji-regex.git) | MIT | clearlydefined | -| [`enquirer@2.3.6`](https://github.com/enquirer/enquirer.git) | MIT | #2727 | -| [`escalade@3.1.1`](https://github.com/lukeed/escalade.git) | MIT | clearlydefined | -| [`escodegen@2.0.0`](http://github.com/estools/escodegen.git) | BSD-2-Clause | clearlydefined | -| [`eslint-scope@6.0.0`](https://github.com/eslint/eslint-scope.git) | BSD-2-Clause | clearlydefined | -| [`eslint-utils@3.0.0`](git+https://github.com/mysticatea/eslint-utils.git) | MIT | #2431 | -| [`eslint-visitor-keys@3.0.0`](https://github.com/eslint/eslint-visitor-keys.git) | Apache-2.0 | [clearlydefined](https://clearlydefined.io/definitions/npm/npmjs/-/eslint-visitor-keys/3.0.0) | -| [`eslint@8.1.0`](https://github.com/eslint/eslint.git) | MIT | clearlydefined | -| [`espree@9.0.0`](https://github.com/eslint/espree.git) | BSD-2-Clause | clearlydefined | -| [`esprima@4.0.1`](https://github.com/jquery/esprima.git) | BSD-2-Clause | #995 | -| [`esquery@1.4.0`](https://github.com/estools/esquery.git) | BSD-3-Clause | #1100 | -| [`esrecurse@4.3.0`](https://github.com/estools/esrecurse.git) | BSD-2-Clause | clearlydefined | -| [`estraverse@5.2.0`](http://github.com/estools/estraverse.git) | BSD-2-Clause | #881 | -| [`event-stream@3.3.4`](git://github.com/dominictarr/event-stream.git) | MIT | clearlydefined | -| [`execa@5.1.1`](https://github.com/sindresorhus/execa.git) | MIT | clearlydefined | -| [`exit@0.1.2`](git://github.com/cowboy/node-exit.git) | MIT | clearlydefined | -| [`expect@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`fast-levenshtein@2.0.6`](https://github.com/hiddentao/fast-levenshtein.git) | MIT | #2428 | -| [`fb-watchman@2.0.1`](git@github.com:facebook/watchman.git) | Apache-2.0 | #5379 | -| [`file-entry-cache@6.0.1`](https://github.com/royriojas/file-entry-cache.git) | MIT | clearlydefined | -| [`fill-range@7.0.1`](https://github.com/jonschlinkert/fill-range.git) | MIT | clearlydefined | -| [`find-up@4.1.0`](https://github.com/sindresorhus/find-up.git) | MIT | clearlydefined | -| [`flat-cache@3.0.4`](https://github.com/royriojas/flat-cache.git) | MIT | clearlydefined | -| [`flatted@3.2.2`](git+https://github.com/WebReflection/flatted.git) | ISC | #2430 | -| [`from@0.1.7`](git://github.com/dominictarr/from.git) | MIT | #1048 | -| [`fs.realpath@1.0.0`](git+https://github.com/isaacs/fs.realpath.git) | ISC | clearlydefined | -| `fsevents@2.3.2` | | [clearlydefined](https://clearlydefined.io/definitions/npm/npmjs/-/fsevents/2.3.2) | -| [`function-bind@1.1.1`](git://github.com/Raynos/function-bind.git) | MIT | clearlydefined | -| [`functional-red-black-tree@1.0.1`](git://github.com/mikolalysenko/functional-red-black-tree.git) | MIT | clearlydefined | -| [`gensync@1.0.0-beta.2`](https://github.com/loganfsmyth/gensync.git) | MIT | clearlydefined | -| [`get-caller-file@2.0.5`](git+https://github.com/stefanpenner/get-caller-file.git) | ISC | clearlydefined | -| [`get-package-type@0.1.0`](git+https://github.com/cfware/get-package-type.git) | MIT | clearlydefined | -| [`get-stream@6.0.1`](https://github.com/sindresorhus/get-stream.git) | MIT | clearlydefined | -| [`glob-parent@6.0.2`](https://github.com/gulpjs/glob-parent.git) | ISC | clearlydefined | -| [`glob@7.2.0`](git://github.com/isaacs/node-glob.git) | ISC | clearlydefined | -| [`globals@13.11.0`](https://github.com/sindresorhus/globals.git) | MIT | clearlydefined | -| [`has-flag@4.0.0`](https://github.com/sindresorhus/has-flag.git) | MIT | clearlydefined | -| [`has@1.0.3`](git://github.com/tarruda/has.git) | MIT | clearlydefined | -| [`html-encoding-sniffer@2.0.1`](https://github.com/jsdom/html-encoding-sniffer.git) | MIT | clearlydefined | -| [`html-escaper@2.0.2`](https://github.com/WebReflection/html-escaper.git) | MIT | clearlydefined | -| [`http-proxy-agent@4.0.1`](git://github.com/TooTallNate/node-http-proxy-agent.git) | MIT | clearlydefined | -| [`https-proxy-agent@5.0.0`](git://github.com/TooTallNate/node-https-proxy-agent.git) | MIT | clearlydefined | -| [`human-signals@2.1.0`](https://github.com/ehmicky/human-signals.git) | Apache-2.0 | clearlydefined | -| [`iconv-lite@0.4.24`](git://github.com/ashtuchkin/iconv-lite.git) | MIT | clearlydefined | -| [`if-env@1.0.4`](git+https://github.com/ericclemmons/if-env.git) | MIT | clearlydefined | -| [`ignore@4.0.6`](git@github.com:kaelzhang/node-ignore.git) | MIT | clearlydefined | -| [`import-fresh@3.3.0`](https://github.com/sindresorhus/import-fresh.git) | MIT | clearlydefined | -| [`import-local@3.0.3`](https://github.com/sindresorhus/import-local.git) | MIT | clearlydefined | -| [`imurmurhash@0.1.4`](https://github.com/jensyt/imurmurhash-js) | MIT | clearlydefined | -| [`inflight@1.0.6`](https://github.com/npm/inflight.git) | ISC | clearlydefined | -| [`inherits@2.0.4`](git://github.com/isaacs/inherits) | ISC | clearlydefined | -| [`is-core-module@2.8.0`](git+https://github.com/inspect-js/is-core-module.git) | MIT | clearlydefined | -| [`is-extglob@2.1.1`](https://github.com/jonschlinkert/is-extglob.git) | MIT | clearlydefined | -| [`is-fullwidth-code-point@3.0.0`](https://github.com/sindresorhus/is-fullwidth-code-point.git) | MIT | clearlydefined | -| [`is-generator-fn@2.1.0`](https://github.com/sindresorhus/is-generator-fn.git) | MIT | clearlydefined | -| [`is-glob@4.0.3`](https://github.com/micromatch/is-glob.git) | MIT | clearlydefined | -| [`is-number@7.0.0`](https://github.com/jonschlinkert/is-number.git) | MIT | clearlydefined | -| [`is-potential-custom-element-name@1.0.1`](https://github.com/mathiasbynens/is-potential-custom-element-name.git) | MIT | clearlydefined | -| [`is-stream@2.0.1`](https://github.com/sindresorhus/is-stream.git) | MIT | clearlydefined | -| [`isexe@2.0.0`](git+https://github.com/isaacs/isexe.git) | ISC | clearlydefined | -| [`istanbul-lib-coverage@3.2.0`](git+ssh://git@github.com/istanbuljs/istanbuljs.git) | BSD-3-Clause | clearlydefined | -| [`istanbul-lib-instrument@4.0.3`](git+ssh://git@github.com/istanbuljs/istanbuljs.git) | BSD-3-Clause | clearlydefined | -| [`istanbul-lib-report@3.0.0`](git+ssh://git@github.com/istanbuljs/istanbuljs.git) | BSD-3-Clause | clearlydefined | -| [`istanbul-lib-source-maps@4.0.1`](git+ssh://git@github.com/istanbuljs/istanbuljs.git) | BSD-3-Clause | clearlydefined | -| [`istanbul-reports@3.0.5`](git+ssh://git@github.com/istanbuljs/istanbuljs.git) | BSD-3-Clause | #74 | -| [`jest-changed-files@27.3.0`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-circus@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-cli@27.3.1`](https://github.com/facebook/jest) | MIT | clearlydefined | -| [`jest-config@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-diff@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-docblock@27.0.6`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-each@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-environment-jsdom@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-environment-node@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-get-type@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-haste-map@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-jasmine2@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-leak-detector@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-matcher-utils@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-message-util@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-mock@27.3.0`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-pnp-resolver@1.2.2`](https://github.com/arcanis/jest-pnp-resolver.git) | MIT | clearlydefined | -| [`jest-regex-util@27.0.6`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-resolve-dependencies@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-resolve@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-runner@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-runtime@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-serializer@27.0.6`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-snapshot@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-util@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-validate@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest-watcher@27.3.1`](https://github.com/facebook/jest) | MIT | clearlydefined | -| [`jest-worker@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`jest@27.3.1`](https://github.com/facebook/jest) | MIT | clearlydefined | -| [`js-tokens@4.0.0`](https://github.com/lydell/js-tokens.git) | MIT | #2401 | -| [`jsdom@16.7.0`](https://github.com/jsdom/jsdom.git) | MIT | #1370 | -| [`json-stable-stringify-without-jsonify@1.0.1`](git://github.com/samn/json-stable-stringify.git) | MIT | clearlydefined | -| [`json5@2.2.0`](git+https://github.com/json5/json5.git) | MIT | #2126 | -| [`kleur@3.0.3`](https://github.com/lukeed/kleur.git) | MIT | clearlydefined | -| [`leven@3.1.0`](https://github.com/sindresorhus/leven.git) | MIT | clearlydefined | -| [`levn@0.4.1`](git://github.com/gkz/levn.git) | MIT | clearlydefined | -| [`locate-path@5.0.0`](https://github.com/sindresorhus/locate-path.git) | MIT | clearlydefined | -| [`lodash.memoize@4.1.2`](https://github.com/lodash/lodash.git) | MIT | clearlydefined | -| [`lodash.merge@4.6.2`](https://github.com/lodash/lodash.git) | MIT | clearlydefined | -| [`lru-cache@6.0.0`](git://github.com/isaacs/node-lru-cache.git) | ISC | clearlydefined | -| [`make-dir@3.1.0`](https://github.com/sindresorhus/make-dir.git) | MIT | clearlydefined | -| [`make-error@1.3.6`](git://github.com/JsCommunity/make-error.git) | ISC | clearlydefined | -| [`makeerror@1.0.11`](https://github.com/daaku/nodejs-makeerror) | BSD-3-Clause | clearlydefined | -| [`map-stream@0.1.0`](git://github.com/dominictarr/map-stream.git) | UNKNOWN | clearlydefined | -| [`merge-stream@2.0.0`](https://github.com/grncdr/merge-stream.git) | MIT | clearlydefined | -| [`micromatch@4.0.4`](https://github.com/micromatch/micromatch.git) | MIT | clearlydefined | -| [`mimic-fn@2.1.0`](https://github.com/sindresorhus/mimic-fn.git) | MIT | clearlydefined | -| [`ms@2.1.2`](https://github.com/zeit/ms.git) | MIT | #5895 | -| [`natural-compare@1.4.0`](git://github.com/litejs/natural-compare-lite.git) | MIT | clearlydefined | -| [`node-int64@0.4.0`](https://github.com/broofa/node-int64) | MIT | clearlydefined | -| [`node-modules-regexp@1.0.0`](https://github.com/jamestalmage/node-modules-regexp.git) | MIT | clearlydefined | -| [`node-releases@2.0.0`](https://github.com/chicoxyzzy/node-releases.git) | MIT | #1954 | -| [`normalize-path@3.0.0`](https://github.com/jonschlinkert/normalize-path.git) | MIT | clearlydefined | -| [`npm-run-all@1.4.0`](https://github.com/mysticatea/npm-run-all.git) | MIT | clearlydefined | -| [`npm-run-path@4.0.1`](https://github.com/sindresorhus/npm-run-path.git) | MIT | clearlydefined | -| [`nwsapi@2.2.0`](git://github.com/dperini/nwsapi.git) | MIT | clearlydefined | -| [`once@1.4.0`](git://github.com/isaacs/once) | ISC | clearlydefined | -| [`onetime@5.1.2`](https://github.com/sindresorhus/onetime.git) | MIT | clearlydefined | -| [`optionator@0.9.1`](git://github.com/gkz/optionator.git) | MIT | clearlydefined | -| [`p-limit@2.3.0`](https://github.com/sindresorhus/p-limit.git) | MIT | clearlydefined | -| [`p-locate@4.1.0`](https://github.com/sindresorhus/p-locate.git) | MIT | clearlydefined | -| [`p-try@2.2.0`](https://github.com/sindresorhus/p-try.git) | MIT | clearlydefined | -| [`parent-module@1.0.1`](https://github.com/sindresorhus/parent-module.git) | MIT | clearlydefined | -| [`parse5@6.0.1`](git://github.com/inikulin/parse5.git) | MIT | clearlydefined | -| [`path-exists@4.0.0`](https://github.com/sindresorhus/path-exists.git) | MIT | clearlydefined | -| [`path-key@3.1.1`](https://github.com/sindresorhus/path-key.git) | MIT | clearlydefined | -| [`path-parse@1.0.7`](https://github.com/jbgutierrez/path-parse.git) | MIT | clearlydefined | -| [`pause-stream@0.0.11`](git://github.com/dominictarr/pause-stream.git) | Apache-2.0 | clearlydefined | -| [`picocolors@1.0.0`](https://github.com/alexeyraspopov/picocolors.git) | ISC | clearlydefined | -| [`picomatch@2.3.0`](https://github.com/micromatch/picomatch.git) | MIT | clearlydefined | -| [`pirates@4.0.1`](https://github.com/ariporad/pirates.git) | MIT | #680 | -| [`pkg-dir@4.2.0`](https://github.com/sindresorhus/pkg-dir.git) | MIT | clearlydefined | -| [`prelude-ls@1.1.2`](git://github.com/gkz/prelude-ls.git) | MIT | clearlydefined | -| [`prettier@2.4.1`](https://github.com/prettier/prettier.git) | MIT | #1585 | -| [`pretty-format@27.3.1`](https://github.com/facebook/jest.git) | MIT | clearlydefined | -| [`progress@2.0.3`](git://github.com/visionmedia/node-progress) | MIT | clearlydefined | -| [`prompts@2.4.2`](https://github.com/terkelg/prompts.git) | MIT | clearlydefined | -| [`ps-tree@1.2.0`](https://github.com/indexzero/ps-tree.git) | MIT | clearlydefined | -| [`react-is@17.0.2`](https://github.com/facebook/react.git) | MIT | clearlydefined | -| [`regenerator-runtime@0.10.5`](https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime) | MIT | #270 | -| [`regexpp@3.2.0`](git+https://github.com/mysticatea/regexpp.git) | MIT | clearlydefined | -| [`require-directory@2.1.1`](git://github.com/troygoode/node-require-directory.git) | MIT | clearlydefined | -| [`resolve-cwd@3.0.0`](https://github.com/sindresorhus/resolve-cwd.git) | MIT | clearlydefined | -| [`resolve-from@5.0.0`](https://github.com/sindresorhus/resolve-from.git) | MIT | clearlydefined | -| [`resolve.exports@1.1.0`](https://github.com/lukeed/resolve.exports.git) | MIT | clearlydefined | -| [`resolve@1.20.0`](git://github.com/browserify/resolve.git) | MIT | #4519 | -| [`rimraf@3.0.2`](git://github.com/isaacs/rimraf.git) | ISC | clearlydefined | -| [`rollup@2.58.0`](https://github.com/rollup/rollup.git) | MIT | clearlydefined | -| [`saxes@5.0.1`](https://github.com/lddubeau/saxes.git) | ISC | clearlydefined | -| [`semver@6.3.0`](https://github.com/npm/node-semver) | ISC | clearlydefined | -| [`shebang-command@2.0.0`](https://github.com/kevva/shebang-command.git) | MIT | clearlydefined | -| [`shebang-regex@3.0.0`](https://github.com/sindresorhus/shebang-regex.git) | MIT | clearlydefined | -| [`shell-quote@1.7.4`](http://github.com/ljharb/shell-quote.git) | MIT | clearlydefined | -| [`signal-exit@3.0.5`](https://github.com/tapjs/signal-exit.git) | ISC | #5892 | -| [`sisteransi@1.0.5`](https://github.com/terkelg/sisteransi) | MIT | clearlydefined | -| [`slash@3.0.0`](https://github.com/sindresorhus/slash.git) | MIT | clearlydefined | -| [`source-map-support@0.5.20`](https://github.com/evanw/node-source-map-support) | MIT | clearlydefined | -| [`source-map@0.6.1`](http://github.com/mozilla/source-map.git) | BSD-3-Clause | #2417 | -| [`split@0.3.3`](git://github.com/dominictarr/split.git) | MIT | clearlydefined | -| [`sprintf-js@1.0.3`](https://github.com/alexei/sprintf.js.git) | BSD-3-Clause | #949 | -| [`stack-utils@2.0.5`](https://github.com/tapjs/stack-utils.git) | MIT | clearlydefined | -| [`stream-combiner@0.0.4`](git://github.com/dominictarr/stream-combiner.git) | MIT | clearlydefined | -| [`string-length@4.0.2`](https://github.com/sindresorhus/string-length.git) | MIT | clearlydefined | -| [`string-width@4.2.3`](https://github.com/sindresorhus/string-width.git) | MIT | clearlydefined | -| [`strip-ansi@6.0.1`](https://github.com/chalk/strip-ansi.git) | MIT | clearlydefined | -| [`strip-bom@4.0.0`](https://github.com/sindresorhus/strip-bom.git) | MIT | clearlydefined | -| [`strip-final-newline@2.0.0`](https://github.com/sindresorhus/strip-final-newline.git) | MIT | clearlydefined | -| [`strip-json-comments@3.1.1`](https://github.com/sindresorhus/strip-json-comments.git) | MIT | clearlydefined | -| [`supports-color@7.2.0`](https://github.com/chalk/supports-color.git) | MIT | clearlydefined | -| [`supports-hyperlinks@2.2.0`](https://github.com/jamestalmage/supports-hyperlinks.git) | MIT | clearlydefined | -| [`symbol-tree@3.2.4`](https://github.com/jsdom/js-symbol-tree.git) | MIT | clearlydefined | -| [`terminal-link@2.1.1`](https://github.com/sindresorhus/terminal-link.git) | MIT | clearlydefined | -| [`test-exclude@6.0.0`](git+https://github.com/istanbuljs/test-exclude.git) | ISC | clearlydefined | -| [`text-table@0.2.0`](git://github.com/substack/text-table.git) | MIT | clearlydefined | -| [`throat@6.0.1`](https://github.com/ForbesLindesay/throat.git) | MIT | clearlydefined | -| [`through@2.3.8`](https://github.com/dominictarr/through.git) | MIT | #1036 | -| [`tmpl@1.0.5`](https://github.com/daaku/nodejs-tmpl) | BSD-3-Clause | clearlydefined | -| [`to-regex-range@5.0.1`](https://github.com/micromatch/to-regex-range.git) | MIT | clearlydefined | -| [`tr46@2.1.0`](https://github.com/jsdom/tr46) | MIT | clearlydefined | -| [`ts-jest@27.0.7`](git+https://github.com/kulshekhar/ts-jest.git) | MIT | clearlydefined | -| [`type-check@0.3.2`](git://github.com/gkz/type-check.git) | MIT | clearlydefined | -| [`type-detect@4.0.8`](git+ssh://git@github.com/chaijs/type-detect.git) | MIT | clearlydefined | -| [`type-fest@0.20.2`](https://github.com/sindresorhus/type-fest.git) | (MIT OR CC0-1.0) | clearlydefined | -| [`typedarray-to-buffer@3.1.5`](git://github.com/feross/typedarray-to-buffer.git) | MIT | clearlydefined | -| [`typescript@4.4.4`](https://github.com/Microsoft/TypeScript.git) | Apache-2.0 | #1524 | -| [`v8-compile-cache@2.3.0`](https://github.com/zertosh/v8-compile-cache.git) | MIT | clearlydefined | -| [`v8-to-istanbul@8.1.0`](https://github.com/istanbuljs/v8-to-istanbul.git) | ISC | clearlydefined | -| [`w3c-hr-time@1.0.2`](https://github.com/jsdom/w3c-hr-time) | MIT | clearlydefined | -| [`w3c-xmlserializer@2.0.0`](https://github.com/jsdom/w3c-xmlserializer.git) | MIT | clearlydefined | -| [`walker@1.0.7`](https://github.com/daaku/nodejs-walker) | Apache-2.0 | clearlydefined | -| [`webidl-conversions@6.1.0`](https://github.com/jsdom/webidl-conversions.git) | BSD-2-Clause | clearlydefined | -| [`whatwg-encoding@1.0.5`](https://github.com/jsdom/whatwg-encoding.git) | MIT | clearlydefined | -| [`whatwg-mimetype@2.3.0`](https://github.com/jsdom/whatwg-mimetype.git) | MIT | clearlydefined | -| [`whatwg-url@8.7.0`](https://github.com/jsdom/whatwg-url.git) | MIT | clearlydefined | -| [`which@1.3.1`](git://github.com/isaacs/node-which.git) | ISC | clearlydefined | -| [`word-wrap@1.2.3`](https://github.com/jonschlinkert/word-wrap.git) | MIT | clearlydefined | -| [`wrap-ansi@7.0.0`](https://github.com/chalk/wrap-ansi.git) | MIT | clearlydefined | -| [`wrappy@1.0.2`](https://github.com/npm/wrappy) | ISC | clearlydefined | -| [`write-file-atomic@3.0.3`](git://github.com/npm/write-file-atomic.git) | ISC | clearlydefined | -| [`ws@7.5.5`](https://github.com/websockets/ws.git) | MIT | #1940 | -| [`xml-name-validator@3.0.0`](https://github.com/jsdom/xml-name-validator.git) | Apache-2.0 | clearlydefined | -| [`xmlchars@2.2.0`](https://github.com/lddubeau/xmlchars.git) | MIT | clearlydefined | -| [`y18n@5.0.8`](https://github.com/yargs/y18n.git) | ISC | clearlydefined | -| [`yallist@4.0.0`](git+https://github.com/isaacs/yallist.git) | ISC | clearlydefined | -| [`yargs-parser@20.2.9`](https://github.com/yargs/yargs-parser.git) | ISC | clearlydefined | -| [`yargs@16.2.0`](https://github.com/yargs/yargs.git) | MIT | clearlydefined | diff --git a/tools/devworkspace-generator/.deps/prod.md b/tools/devworkspace-generator/.deps/prod.md deleted file mode 100644 index fc5f3aa57..000000000 --- a/tools/devworkspace-generator/.deps/prod.md +++ /dev/null @@ -1,121 +0,0 @@ -# Production dependencies - -| Packages | License | Resolved CQs | -| --- | --- | --- | -| [`@devfile/api@2.2.1-alpha-1667236163`](https://github.com/devfile/api.git) | Apache-2.0 | N/A | -| [`@types/bluebird@3.5.21`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/caseless@0.12.2`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/node@16.11.1`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/request@2.48.7`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`@types/tough-cookie@4.0.1`](https://github.com/DefinitelyTyped/DefinitelyTyped.git) | MIT | clearlydefined | -| [`ajv@6.12.6`](https://github.com/ajv-validator/ajv.git) | MIT | #979 | -| [`ansi-regex@2.1.1`](https://github.com/chalk/ansi-regex.git) | MIT | #5896 | -| [`ansi-styles@2.2.1`](https://github.com/chalk/ansi-styles.git) | MIT | clearlydefined | -| [`argparse@2.0.1`](https://github.com/nodeca/argparse.git) | Python-2.0 | [CQ22954](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22954) | -| [`asn1@0.2.4`](git://github.com/joyent/node-asn1.git) | MIT | clearlydefined | -| [`assert-plus@1.0.0`](https://github.com/mcavage/node-assert-plus.git) | MIT | clearlydefined | -| [`asynckit@0.4.0`](git+https://github.com/alexindigo/asynckit.git) | MIT | clearlydefined | -| [`aws-sign2@0.7.0`](https://github.com/mikeal/aws-sign) | Apache-2.0 | clearlydefined | -| [`aws4@1.11.0`](https://github.com/mhart/aws4.git) | MIT | clearlydefined | -| [`axios@0.21.2`](https://github.com/axios/axios.git) | MIT | [CQ23019](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23019) | -| [`babel-code-frame@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-code-frame) | MIT | clearlydefined | -| [`babel-core@6.26.3`](https://github.com/babel/babel/tree/master/packages/babel-core) | MIT | clearlydefined | -| [`babel-generator@6.26.1`](https://github.com/babel/babel/tree/master/packages/babel-generator) | MIT | clearlydefined | -| [`babel-helpers@6.24.1`](https://github.com/babel/babel/tree/master/packages/babel-helpers) | MIT | clearlydefined | -| [`babel-messages@6.23.0`](https://github.com/babel/babel/tree/master/packages/babel-messages) | MIT | clearlydefined | -| [`babel-plugin-transform-es2015-block-scoping@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-block-scoping) | MIT | clearlydefined | -| [`babel-register@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-register) | MIT | clearlydefined | -| [`babel-runtime@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-runtime) | MIT | #943 | -| [`babel-template@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-template) | MIT | clearlydefined | -| [`babel-traverse@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-traverse) | MIT | clearlydefined | -| [`babel-types@6.26.0`](https://github.com/babel/babel/tree/master/packages/babel-types) | MIT | clearlydefined | -| [`babylon@6.18.0`](https://github.com/babel/babylon) | MIT | #1052 | -| [`balanced-match@1.0.2`](git://github.com/juliangruber/balanced-match.git) | MIT | clearlydefined | -| [`bcrypt-pbkdf@1.0.2`](git://github.com/joyent/node-bcrypt-pbkdf.git) | BSD-3-Clause | #2725 | -| [`bluebird@3.7.2`](git://github.com/petkaantonov/bluebird.git) | MIT | clearlydefined | -| [`brace-expansion@1.1.11`](git://github.com/juliangruber/brace-expansion.git) | MIT | clearlydefined | -| [`caseless@0.12.0`](https://github.com/mikeal/caseless) | Apache-2.0 | clearlydefined | -| [`chalk@1.1.3`](https://github.com/chalk/chalk.git) | MIT | clearlydefined | -| [`combined-stream@1.0.8`](git://github.com/felixge/node-combined-stream.git) | MIT | clearlydefined | -| [`concat-map@0.0.1`](git://github.com/substack/node-concat-map.git) | MIT | clearlydefined | -| [`convert-source-map@1.8.0`](git://github.com/thlorenz/convert-source-map.git) | MIT | clearlydefined | -| [`core-js@2.6.12`](https://github.com/zloirock/core-js.git) | MIT | #2912 | -| [`core-util-is@1.0.2`](git://github.com/isaacs/core-util-is) | MIT | #5898 | -| [`dashdash@1.14.1`](git://github.com/trentm/node-dashdash.git) | MIT | clearlydefined | -| [`debug@2.6.9`](git://github.com/visionmedia/debug.git) | MIT | clearlydefined | -| [`delayed-stream@1.0.0`](git://github.com/felixge/node-delayed-stream.git) | MIT | clearlydefined | -| [`detect-indent@4.0.0`](https://github.com/sindresorhus/detect-indent.git) | MIT | clearlydefined | -| [`ecc-jsbn@0.1.2`](https://github.com/quartzjer/ecc-jsbn.git) | MIT | clearlydefined | -| [`escape-string-regexp@1.0.5`](https://github.com/sindresorhus/escape-string-regexp.git) | MIT | clearlydefined | -| [`esutils@2.0.3`](http://github.com/estools/esutils.git) | BSD-2-Clause | #120 | -| [`extend@3.0.2`](https://github.com/justmoon/node-extend.git) | MIT | clearlydefined | -| [`extsprintf@1.3.0`](git://github.com/davepacheco/node-extsprintf.git) | MIT | #1813 | -| [`fast-deep-equal@3.1.3`](git+https://github.com/epoberezkin/fast-deep-equal.git) | MIT | clearlydefined | -| [`fast-json-stable-stringify@2.1.0`](git://github.com/epoberezkin/fast-json-stable-stringify.git) | MIT | clearlydefined | -| [`follow-redirects@1.15.2`](git@github.com:follow-redirects/follow-redirects.git) | MIT | clearlydefined | -| [`forever-agent@0.6.1`](https://github.com/mikeal/forever-agent) | Apache-2.0 | clearlydefined | -| [`form-data@2.5.1`](git://github.com/form-data/form-data.git) | MIT | clearlydefined | -| [`fs-extra@10.0.0`](https://github.com/jprichardson/node-fs-extra) | MIT | clearlydefined | -| [`getpass@0.1.7`](https://github.com/arekinath/node-getpass.git) | MIT | clearlydefined | -| [`globals@9.18.0`](https://github.com/sindresorhus/globals.git) | MIT | clearlydefined | -| [`graceful-fs@4.2.8`](https://github.com/isaacs/node-graceful-fs) | ISC | clearlydefined | -| [`har-schema@2.0.0`](https://github.com/ahmadnassri/har-schema.git) | ISC | clearlydefined | -| [`har-validator@5.1.5`](https://github.com/ahmadnassri/node-har-validator.git) | MIT | clearlydefined | -| [`has-ansi@2.0.0`](https://github.com/sindresorhus/has-ansi.git) | MIT | clearlydefined | -| [`home-or-tmp@2.0.0`](https://github.com/sindresorhus/home-or-tmp.git) | MIT | clearlydefined | -| [`http-signature@1.2.0`](git://github.com/joyent/node-http-signature.git) | MIT | #2732 | -| [`invariant@2.2.4`](https://github.com/zertosh/invariant) | MIT | #1034 | -| [`inversify@5.1.1`](https://github.com/inversify/InversifyJS.git) | MIT | clearlydefined | -| [`is-finite@1.1.0`](https://github.com/sindresorhus/is-finite.git) | MIT | clearlydefined | -| [`is-typedarray@1.0.0`](git://github.com/hughsk/is-typedarray.git) | MIT | #2531 | -| [`isstream@0.1.2`](https://github.com/rvagg/isstream.git) | MIT | clearlydefined | -| [`js-tokens@3.0.2`](https://github.com/lydell/js-tokens.git) | MIT | #2181 | -| [`js-yaml@4.1.0`](https://github.com/nodeca/js-yaml.git) | MIT | clearlydefined | -| [`jsbn@0.1.1`](https://github.com/andyperlitch/jsbn.git) | MIT | clearlydefined | -| [`jsesc@1.3.0`](https://github.com/mathiasbynens/jsesc.git) | MIT | clearlydefined | -| [`json-schema-traverse@0.4.1`](git+https://github.com/epoberezkin/json-schema-traverse.git) | MIT | clearlydefined | -| [`json-schema@0.2.3`](http://github.com/kriszyp/json-schema) | BSD* | #1046 | -| [`json-stringify-safe@5.0.1`](git://github.com/isaacs/json-stringify-safe) | ISC | clearlydefined | -| [`json5@0.5.1`](https://github.com/aseemk/json5.git) | MIT | #1040 | -| [`jsonc-parser@3.0.0`](https://github.com/microsoft/node-jsonc-parser) | MIT | clearlydefined | -| [`jsonfile@6.1.0`](git@github.com:jprichardson/node-jsonfile.git) | MIT | clearlydefined | -| [`jsprim@1.4.1`](git://github.com/joyent/node-jsprim.git) | MIT | clearlydefined | -| [`lodash@4.17.21`](https://github.com/lodash/lodash.git) | MIT | #2096 | -| [`loose-envify@1.4.0`](git://github.com/zertosh/loose-envify.git) | MIT | clearlydefined | -| [`mime-db@1.50.0`](https://github.com/jshttp/mime-db.git) | MIT | clearlydefined | -| [`mime-types@2.1.33`](https://github.com/jshttp/mime-types.git) | MIT | clearlydefined | -| [`minimatch@3.1.2`](git://github.com/isaacs/minimatch.git) | ISC | clearlydefined | -| [`minimist@1.2.7`](git://github.com/minimistjs/minimist.git) | MIT | #5886 | -| [`mkdirp@0.5.5`](https://github.com/substack/node-mkdirp.git) | MIT | clearlydefined | -| [`ms@2.0.0`](https://github.com/zeit/ms.git) | MIT | clearlydefined | -| [`oauth-sign@0.9.0`](https://github.com/mikeal/oauth-sign) | Apache-2.0 | clearlydefined | -| [`os-homedir@1.0.2`](https://github.com/sindresorhus/os-homedir.git) | MIT | clearlydefined | -| [`os-tmpdir@1.0.2`](https://github.com/sindresorhus/os-tmpdir.git) | MIT | clearlydefined | -| [`path-is-absolute@1.0.1`](https://github.com/sindresorhus/path-is-absolute.git) | MIT | clearlydefined | -| [`performance-now@2.1.0`](git://github.com/braveg1rl/performance-now.git) | MIT | clearlydefined | -| [`private@0.1.8`](git://github.com/benjamn/private.git) | MIT | clearlydefined | -| [`psl@1.8.0`](git@github.com:lupomontero/psl.git) | MIT | clearlydefined | -| [`punycode@2.1.1`](https://github.com/bestiejs/punycode.js.git) | MIT | clearlydefined | -| [`qs@6.5.3`](https://github.com/ljharb/qs.git) | BSD-3-Clause | clearlydefined | -| [`reflect-metadata@0.1.13`](https://github.com/rbuckton/reflect-metadata.git) | Apache-2.0 | clearlydefined | -| [`regenerator-runtime@0.11.1`](https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime) | MIT | clearlydefined | -| [`repeating@2.0.1`](https://github.com/sindresorhus/repeating.git) | MIT | clearlydefined | -| [`request@2.88.2`](https://github.com/request/request.git) | Apache-2.0 | #997 | -| [`rewire@3.0.2`](git://github.com/jhnns/rewire.git) | MIT | clearlydefined | -| [`safe-buffer@5.2.1`](git://github.com/feross/safe-buffer.git) | MIT | clearlydefined | -| [`safer-buffer@2.1.2`](git+https://github.com/ChALkeR/safer-buffer.git) | MIT | clearlydefined | -| [`slash@1.0.0`](https://github.com/sindresorhus/slash.git) | MIT | clearlydefined | -| [`source-map-support@0.4.18`](https://github.com/evanw/node-source-map-support) | MIT | clearlydefined | -| [`source-map@0.5.7`](http://github.com/mozilla/source-map.git) | BSD-3-Clause | #2400 | -| [`sshpk@1.16.1`](git+https://github.com/joyent/node-sshpk.git) | MIT | clearlydefined | -| [`strip-ansi@3.0.1`](https://github.com/chalk/strip-ansi.git) | MIT | clearlydefined | -| [`supports-color@2.0.0`](https://github.com/chalk/supports-color.git) | MIT | clearlydefined | -| [`to-fast-properties@1.0.3`](https://github.com/sindresorhus/to-fast-properties.git) | MIT | clearlydefined | -| [`tough-cookie@2.5.0`](git://github.com/salesforce/tough-cookie.git) | BSD-3-Clause | clearlydefined | -| [`trim-right@1.0.1`](https://github.com/sindresorhus/trim-right.git) | MIT | clearlydefined | -| [`tunnel-agent@0.6.0`](https://github.com/mikeal/tunnel-agent) | Apache-2.0 | clearlydefined | -| [`tweetnacl@0.14.5`](https://github.com/dchest/tweetnacl-js.git) | Unlicense | #1035 | -| [`universalify@2.0.0`](git+https://github.com/RyanZim/universalify.git) | MIT | clearlydefined | -| [`uri-js@4.4.1`](http://github.com/garycourt/uri-js) | BSD-2-Clause | #1086 | -| [`uuid@3.4.0`](https://github.com/uuidjs/uuid.git) | MIT | #2733 | -| [`verror@1.10.0`](git://github.com/davepacheco/node-verror.git) | MIT | clearlydefined | diff --git a/tools/devworkspace-generator/.gitignore b/tools/devworkspace-generator/.gitignore deleted file mode 100644 index d63643222..000000000 --- a/tools/devworkspace-generator/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -coverage -lib diff --git a/tools/devworkspace-generator/.vscode/launch.json b/tools/devworkspace-generator/.vscode/launch.json deleted file mode 100644 index 866953ea7..000000000 --- a/tools/devworkspace-generator/.vscode/launch.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Attach by Process ID", - "processId": "${command:PickProcess}", - "request": "attach", - "skipFiles": [ - "/**" - ], - "type": "pwa-node" - }, - { - "type": "pwa-node", - "request": "launch", - "name": "Launch Program", - "skipFiles": [ - "/**" - ], - "program": "${workspaceFolder}/tests/generate.spec.ts", - "outFiles": [ - "${workspaceFolder}/**/*.js" - ] - } - ] -} diff --git a/tools/devworkspace-generator/README.md b/tools/devworkspace-generator/README.md deleted file mode 100644 index c0a343059..000000000 --- a/tools/devworkspace-generator/README.md +++ /dev/null @@ -1,56 +0,0 @@ -## DevWorkspace Generator -The library is used by Devfile registry component to generate the DevWorkspace components and DevWorkspace templates. It requires editor definitions from the -[che-plugin-registry](https://github.com/eclipse-che/che-plugin-registry/). - -## How to use the library -The library can be used as a standalone library. - -``` -USAGE - $ node lib/entrypoint.js [OPTIONS] - -OPTIONS - --devfile-url: URL to the git repository that contains devfile.yaml - or - --devfile-path: path to the devfile.yaml file - - --plugin-registry-url: URL to the plugin registry that contains editor definitions (devfile.yaml) - --editor-entry: editor ID, found on the , to resolve the devfile.yaml - or - --editor-path: local file path of the editor devfile.yaml - - --output-file: local file path for the generated devworkspace yaml - - --project. local file path for the sample project zip (for airgapped/offline registry builds) - - --injectDefaultComponent: inject a default dev container component if no component is defined in the devfile and it doesn't provide a parent, the value can be true or false, default is false - - --defaultComponentImage: image to use for the default dev container component that will be injected if no componetn is defined in the devfile and it doesn't provide a parent devfile, default is quay.io/devfile/universal-developer-image:ubi8-latest - -EXAMPLES - - # online example, using editor definition from https://che-plugin-registry-main.surge.sh/ - - $ node lib/entrypoint.js \ - --devfile-url:https://github.com/che-samples/java-spring-petclinic/tree/main \ - --plugin-registry-url:https://che-plugin-registry-main.surge.sh/v3/ \ - --editor-entry:che-incubator/che-code/latest \ - --output-file:/tmp/devworkspace-che-code-latest.yaml \ - --injectDefaultComponent:true \ - --defaultComponentImage:registry.access.redhat.com/ubi8/openjdk-11:latest - - # offline example with devfile.yaml files and zipped project available locally - - $ node lib/entrypoint.js \ - --devfile-path:/remote-source/python-hello-world/app/devfile.yaml \ - --editor-path:/build/plugins/che-incubator/che-code/latest/devfile.yaml \ - --output-file:./devfiles/python__python-hello-world/devworkspace-che-code-latest.yaml \ - --project.python-hello-world='{{_INTERNAL_URL_}}/resources/v2/python-hello-world.zip' - -``` - -The output file `devworkspace-che-code-latest.yaml` contains a DevWorkspace based on the repository devfile and a Che-Code DevWorkspaceTemplate. - -If the DevWorkspace engine is installed on the cluster, the following command will create a DevWorkspace: - -`$ kubectl apply -f /tmp/devworkspace-che-code-latest.yaml` diff --git a/tools/devworkspace-generator/package.json b/tools/devworkspace-generator/package.json deleted file mode 100644 index d027ea831..000000000 --- a/tools/devworkspace-generator/package.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "name": "@eclipse-che/che-devworkspace-generator", - "version": "7.88.0-next", - "private": false, - "description": "Generates DevWorkspaces by transforming existing devfiles", - "main": "lib/entrypoint.js", - "bin": { - "che-devworkspace-generator": "lib/entrypoint.js" - }, - "publishConfig": { - "access": "public" - }, - "files": [ - "lib", - "src" - ], - "scripts": { - "prepare": "yarn run clean && yarn run build", - "clean": "rimraf lib", - "build": "yarn run format && yarn run compile && yarn run lint && yarn run test", - "compile": "tsc --declaration --project .", - "format": "if-env SKIP_FORMAT=true && echo 'skip format check' || prettier --check '{src,tests}/**/*.ts' package.json", - "format:fix": "prettier --write '{src,tests}/**/*.ts' package.json", - "lint": "if-env SKIP_LINT=true && echo 'skip lint check' || eslint --cache=true --no-error-on-unmatched-pattern=true '{src,tests}/(!model|**)/*.ts'", - "lint:fix": "eslint --fix --cache=true --no-error-on-unmatched-pattern=true \"{src,tests}/(!model|**)/*.ts\"", - "test": "if-env SKIP_TEST=true && echo 'skip test' || jest --forceExit", - "watch": "tsc -w", - "license:check": "docker run --rm -t -v ${PWD}/:/workspace/project quay.io/che-incubator/dash-licenses:next --check", - "license:generate": "docker run --rm -t -v ${PWD}/:/workspace/project quay.io/che-incubator/dash-licenses:next", - "publish:next": "yarn publish --registry=https://registry.npmjs.org/ --no-git-tag-version --new-version 0.0.1-\"$(date +%s)\"" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/eclipse-che/che-devfile-registry.git" - }, - "author": "", - "license": "EPL-2.0", - "bugs": { - "url": "https://github.com/eclipse/che/issues" - }, - "homepage": "https://github.com/eclipse-che/che-devfile-registry#readme", - "dependencies": { - "@devfile/api": "2.2.2-1715367693", - "jsonschema": "^1.4.1", - "axios": "^1.7.0", - "fs-extra": "^10.0.0", - "inversify": "^5.0.1", - "js-yaml": "^4.0.0", - "jsonc-parser": "^3.0.0", - "reflect-metadata": "^0.1.13" - }, - "devDependencies": { - "@types/jest": "^27.0.2", - "eslint": "^8.1.0", - "if-env": "^1.0.4", - "jest": "^27.3.1", - "prettier": "^2.4.1", - "rimraf": "^3.0.2", - "rollup": "^2.44.0", - "ts-jest": "^27.0.7", - "typescript": "^4.4.4" - }, - "prettier": { - "printWidth": 120, - "singleQuote": true, - "arrowParens": "avoid" - }, - "importSort": { - ".ts": { - "style": "eslint", - "parser": "typescript" - } - }, - "jest": { - "clearMocks": true, - "collectCoverage": true, - "collectCoverageFrom": [ - "src/**/*.ts" - ], - "coverageThreshold": { - "global": { - "branches": 100, - "functions": 100, - "lines": 100, - "statements": 100 - } - }, - "moduleNameMapper": { - "axios": "axios/dist/node/axios.cjs" - }, - "coverageDirectory": "coverage", - "modulePathIgnorePatterns": [ - "/lib" - ], - "preset": "ts-jest" - } -} diff --git a/tools/devworkspace-generator/src/api/devfile-context.ts b/tools/devworkspace-generator/src/api/devfile-context.ts deleted file mode 100644 index 074aa0f22..000000000 --- a/tools/devworkspace-generator/src/api/devfile-context.ts +++ /dev/null @@ -1,40 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { V1alpha2DevWorkspace, V1alpha2DevWorkspaceTemplate } from '@devfile/api'; - -/** - * Context used on every call to this service to update DevWorkspace - */ -export interface DevfileContext { - // devfile Content - // eslint-disable-next-line @typescript-eslint/no-explicit-any - devfile: any; - - // devWorkspace - devWorkspace: V1alpha2DevWorkspace; - - // devWorkspace templates - devWorkspaceTemplates: V1alpha2DevWorkspaceTemplate[]; - - // suffix to append on generated names - suffix: string; -} - -/** - * Enum for Devfile schema versions - */ -export enum DevfileSchemaVersion { - V200 = '2.0.0', - V210 = '2.1.0', - V220 = '2.2.0', - V221 = '2.2.1', - V222 = '2.2.2', - V230 = '2.3.0', -} diff --git a/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-module.ts b/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-module.ts deleted file mode 100644 index f2b4577bc..000000000 --- a/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-module.ts +++ /dev/null @@ -1,21 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { BitbucketServerResolver } from './bitbucket-server-resolver'; -import { TYPES } from '../types'; - -const { Resolver } = TYPES; - -const bitbucketServerModule = new ContainerModule((bind: interfaces.Bind) => { - bind(Resolver).to(BitbucketServerResolver).inSingletonScope(); -}); - -export { bitbucketServerModule }; diff --git a/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-resolver.ts b/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-resolver.ts deleted file mode 100644 index 60f0c81fd..000000000 --- a/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-resolver.ts +++ /dev/null @@ -1,53 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { BitbucketServerUrl } from './bitbucket-server-url'; -import { injectable } from 'inversify'; -import { Url } from '../resolve/url'; -import { Resolver } from '../resolve/resolver'; - -@injectable() -export class BitbucketServerResolver implements Resolver { - // eslint-disable-next-line max-len - static readonly BITBUCKET_URL_PATTERNS: RegExp[] = [ - /^(?https?):\/\/(?.*)\/scm\/~(?[^\/]+)\/(?.*).git$/, - /^(?https?):\/\/(?.*)\/users\/(?[^\/]+)\/repos\/(?[^\/]+)\/browse(\?at=(?.*))?$/, - /^(?https?):\/\/(?.*)\/scm\/(?[^\/~]+)\/(?[^\/]+).git$/, - /^(?https?):\/\/(?.*)\/projects\/(?[^\/]+)\/repos\/(?[^\/]+)\/browse(\?at=(?.*))?$/, - ]; - - isValid(url: string): boolean { - return BitbucketServerResolver.BITBUCKET_URL_PATTERNS.some(p => p.test(url)); - } - - resolve(url: string): Url { - const regExp = BitbucketServerResolver.BITBUCKET_URL_PATTERNS.find(p => p.test(url)); - if (!regExp) { - throw new Error(`Invalid bitbucket-server URL: ${url}`); - } - const match = regExp.exec(url); - const scheme = this.getGroup(match, 'scheme'); - const hostName = this.getGroup(match, 'host'); - const user = this.getGroup(match, 'user'); - const project = this.getGroup(match, 'project'); - const repo = this.getGroup(match, 'repo'); - let branch = this.getGroup(match, 'branch'); - if (branch !== undefined && branch.startsWith('refs%2Fheads%2F')) { - branch = branch.substring(15); - } - return new BitbucketServerUrl(scheme, hostName, user, project, repo, branch); - } - - private getGroup(match: RegExpExecArray, groupName: string): string | undefined { - if (match.groups && match.groups[groupName]) { - return match.groups[groupName]; - } - } -} diff --git a/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-url.ts b/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-url.ts deleted file mode 100644 index 3ebb58128..000000000 --- a/tools/devworkspace-generator/src/bitbucket-server/bitbucket-server-url.ts +++ /dev/null @@ -1,51 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { Url } from '../resolve/url'; - -export class BitbucketServerUrl implements Url { - constructor( - private readonly scheme: string, - private readonly hostName: string, - private readonly user: string | undefined, - private readonly project: string | undefined, - private readonly repo: string, - private readonly branch: string | undefined - ) {} - - getContentUrl(path: string): string { - const isUser = this.user !== undefined; - return `${this.scheme}://${this.hostName}/${isUser ? 'users' : 'projects'}/${ - isUser ? this.user : this.project - }/repos/${this.repo}/raw/${path}${this.branch !== undefined ? '?/at=' + this.branch : ''}`; - } - - getUrl(): string { - const isUser = this.user !== undefined; - return `${this.scheme}://${this.hostName}/${isUser ? 'users' : 'projects'}/${ - isUser ? this.user : this.project - }/repos/${this.repo}${this.branch !== undefined ? '/browse?at=' + this.branch : ''}`; - } - - getCloneUrl(): string { - const isUser = this.user !== undefined; - return `${this.scheme}://${this.hostName}/scm/${isUser ? '~' + this.user : this.project.toLowerCase()}/${ - this.repo - }.git`; - } - - getRepoName(): string { - return this.repo; - } - - getBranchName(): string { - return this.branch; - } -} diff --git a/tools/devworkspace-generator/src/bitbucket/bitbucket-module.ts b/tools/devworkspace-generator/src/bitbucket/bitbucket-module.ts deleted file mode 100644 index 286b471b1..000000000 --- a/tools/devworkspace-generator/src/bitbucket/bitbucket-module.ts +++ /dev/null @@ -1,21 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { BitbucketResolver } from './bitbucket-resolver'; -import { TYPES } from '../types'; - -const { Resolver } = TYPES; - -const bitbucketModule = new ContainerModule((bind: interfaces.Bind) => { - bind(Resolver).to(BitbucketResolver).inSingletonScope(); -}); - -export { bitbucketModule }; diff --git a/tools/devworkspace-generator/src/bitbucket/bitbucket-resolver.ts b/tools/devworkspace-generator/src/bitbucket/bitbucket-resolver.ts deleted file mode 100644 index fb77b338a..000000000 --- a/tools/devworkspace-generator/src/bitbucket/bitbucket-resolver.ts +++ /dev/null @@ -1,46 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { BitbucketUrl } from './bitbucket-url'; -import { injectable } from 'inversify'; -import { Url } from '../resolve/url'; -import { Resolver } from '../resolve/resolver'; - -@injectable() -export class BitbucketResolver implements Resolver { - // eslint-disable-next-line max-len - static readonly BITBUCKET_URL_PATTERN: RegExp = - /^https:\/\/.*@?bitbucket\.org\/(?[^\/]+)\/(?[^\/]+)(\/(src|branch)\/(?[^\/]+))?\/?$/; - - isValid(url: string): boolean { - return BitbucketResolver.BITBUCKET_URL_PATTERN.test(url); - } - - resolve(url: string): Url { - const match = BitbucketResolver.BITBUCKET_URL_PATTERN.exec(url); - if (!match) { - throw new Error(`Invalid bitbucket URL: ${url}`); - } - const workspaceId = this.getGroup(match, 'workspaceId'); - let repoName = this.getGroup(match, 'repoName'); - if (/^[\w-][\w.-]*?\.git$/.test(repoName)) { - repoName = repoName.substring(0, repoName.length - 4); - } - const branchName = this.getGroup(match, 'branchName', 'HEAD'); - return new BitbucketUrl(workspaceId, repoName, branchName); - } - - private getGroup(match: RegExpExecArray, groupName: string, defaultValue?: string) { - if (match.groups && match.groups[groupName]) { - return match.groups[groupName]; - } - return defaultValue; - } -} diff --git a/tools/devworkspace-generator/src/bitbucket/bitbucket-url.ts b/tools/devworkspace-generator/src/bitbucket/bitbucket-url.ts deleted file mode 100644 index 74a75d636..000000000 --- a/tools/devworkspace-generator/src/bitbucket/bitbucket-url.ts +++ /dev/null @@ -1,41 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { Url } from '../resolve/url'; - -export class BitbucketUrl implements Url { - private static readonly BITBUCKET_URL = 'https://bitbucket.org'; - - constructor( - private readonly workspaceId: string, - private readonly repoName: string, - private readonly branchName: string - ) {} - - getContentUrl(path: string): string { - return `${BitbucketUrl.BITBUCKET_URL}/${this.workspaceId}/${this.repoName}/raw/${this.branchName}/${path}`; - } - - getUrl(): string { - return `${BitbucketUrl.BITBUCKET_URL}/${this.workspaceId}/${this.repoName}/src/${this.branchName}`; - } - - getCloneUrl(): string { - return `${BitbucketUrl.BITBUCKET_URL}/${this.workspaceId}/${this.repoName}.git`; - } - - getRepoName(): string { - return this.repoName; - } - - getBranchName(): string { - return this.branchName; - } -} diff --git a/tools/devworkspace-generator/src/devfile-schema/2.0.0/devfile.json b/tools/devworkspace-generator/src/devfile-schema/2.0.0/devfile.json deleted file mode 100644 index 3f62b9569..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/2.0.0/devfile.json +++ /dev/null @@ -1,2852 +0,0 @@ -{ - "description": "Devfile describes the structure of a cloud-native workspace and development environment.", - "type": "object", - "title": "Devfile schema - Version 2.0.0", - "required": ["schemaVersion"], - "properties": { - "commands": { - "description": "Predefined, ready-to-use, workspace-related commands", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["vscodeTask"] - }, - { - "required": ["vscodeLaunch"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a workspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the workspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at workspace start by default.", - "type": "object", - "required": ["component"], - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "required": ["commandLine", "component"], - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name", "value"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "vscodeLaunch": { - "description": "Command providing the definition of a VsCode launch action", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - }, - "vscodeTask": { - "description": "Command providing the definition of a VsCode Task", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "List of the workspace components, such as editor and plugins, user-provided containers, or other types of components", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - }, - { - "required": ["plugin"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring workspace-related containers", - "type": "object", - "required": ["image"], - "properties": { - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name", "value"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string", - "default": "/projects" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the workspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the workspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "plugin": { - "description": "Allows importing a plugin.\n\nPlugins are mainly imported devfiles that contribute components, commands and events as a consistent single unit. They are defined in either YAML files following the devfile syntax, or as `DevWorkspaceTemplate` Kubernetes Custom Resources", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["id"] - }, - { - "required": ["kubernetes"] - } - ], - "properties": { - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["vscodeTask"] - }, - { - "required": ["vscodeLaunch"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a workspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the workspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at workspace start by default.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "vscodeLaunch": { - "description": "Command providing the definition of a VsCode launch action", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - }, - "vscodeTask": { - "description": "Command providing the definition of a VsCode Task", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring workspace-related containers", - "type": "object", - "properties": { - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the workspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the workspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false - }, - "registryUrl": { - "type": "string" - }, - "uri": { - "description": "Uri of a Devfile yaml file", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "events": { - "description": "Bindings of commands to events. Each command is referred-to by its name.", - "type": "object", - "properties": { - "postStart": { - "description": "IDs of commands that should be executed after the workspace is completely started. In the case of Che-Theia, these commands should be executed after all plugins and extensions have started, including project cloning. This means that those commands are not triggered until the user opens the IDE in his browser.", - "type": "array", - "items": { - "type": "string" - } - }, - "postStop": { - "description": "IDs of commands that should be executed after stopping the workspace.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStart": { - "description": "IDs of commands that should be executed before the workspace start. Kubernetes-wise, these commands would typically be executed in init containers of the workspace POD.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStop": { - "description": "IDs of commands that should be executed before stopping the workspace.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "metadata": { - "description": "Optional metadata", - "type": "object", - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Optional devfile description", - "type": "string" - }, - "displayName": { - "description": "Optional devfile display name", - "type": "string" - }, - "globalMemoryLimit": { - "description": "Optional devfile global memory limit", - "type": "string" - }, - "icon": { - "description": "Optional devfile icon", - "type": "string" - }, - "name": { - "description": "Optional devfile name", - "type": "string" - }, - "tags": { - "description": "Optional devfile tags", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "description": "Optional semver-compatible version", - "type": "string", - "pattern": "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - } - }, - "additionalProperties": true - }, - "parent": { - "description": "Parent workspace template", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["id"] - }, - { - "required": ["kubernetes"] - } - ], - "properties": { - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["vscodeTask"] - }, - { - "required": ["vscodeLaunch"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a workspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the workspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at workspace start by default.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "vscodeLaunch": { - "description": "Command providing the definition of a VsCode launch action", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - }, - "vscodeTask": { - "description": "Command providing the definition of a VsCode Task", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - }, - { - "required": ["plugin"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring workspace-related containers", - "type": "object", - "properties": { - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the workspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the workspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "plugin": { - "description": "Allows importing a plugin.\n\nPlugins are mainly imported devfiles that contribute components, commands and events as a consistent single unit. They are defined in either YAML files following the devfile syntax, or as `DevWorkspaceTemplate` Kubernetes Custom Resources", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["id"] - }, - { - "required": ["kubernetes"] - } - ], - "properties": { - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["vscodeTask"] - }, - { - "required": ["vscodeLaunch"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a workspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the workspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at workspace start by default.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "vscodeLaunch": { - "description": "Command providing the definition of a VsCode launch action", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - }, - "vscodeTask": { - "description": "Command providing the definition of a VsCode Task", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "inlined": { - "description": "Inlined content of the VsCode configuration", - "type": "string" - }, - "uri": { - "description": "Location as an absolute of relative URI the VsCode configuration will be fetched from", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring workspace-related containers", - "type": "object", - "properties": { - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the workspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the workspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main workspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main workspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false - }, - "registryUrl": { - "type": "string" - }, - "uri": { - "description": "Uri of a Devfile yaml file", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Overrides of projects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["github"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "github": { - "description": "Project's GitHub source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "sparseCheckoutDirs": { - "description": "Populate the project sparsely with selected directories.", - "type": "array", - "items": { - "type": "string" - } - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "registryUrl": { - "type": "string" - }, - "starterProjects": { - "description": "Overrides of starterProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["github"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "github": { - "description": "Project's GitHub source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "uri": { - "description": "Uri of a Devfile yaml file", - "type": "string" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Projects worked on in the workspace, containing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["github"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "github": { - "description": "Project's GitHub source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "sparseCheckoutDirs": { - "description": "Populate the project sparsely with selected directories.", - "type": "array", - "items": { - "type": "string" - } - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "schemaVersion": { - "description": "Devfile schema version", - "type": "string", - "pattern": "^2\\.0\\.0$" - }, - "starterProjects": { - "description": "StarterProjects is a project that can be used as a starting point when bootstrapping new projects", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["github"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "github": { - "description": "Project's GitHub source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false -} diff --git a/tools/devworkspace-generator/src/devfile-schema/2.1.0/devfile.json b/tools/devworkspace-generator/src/devfile-schema/2.1.0/devfile.json deleted file mode 100644 index bc55619d3..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/2.1.0/devfile.json +++ /dev/null @@ -1,1430 +0,0 @@ -{ - "description": "Devfile describes the structure of a cloud-native devworkspace and development environment.", - "type": "object", - "title": "Devfile schema - Version 2.1.0", - "required": ["schemaVersion"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Predefined, ready-to-use, devworkspace-related commands", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default.", - "type": "object", - "required": ["component"], - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "required": ["commandLine", "component"], - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name", "value"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "List of the devworkspace components, such as editor and plugins, user-provided containers, or other types of components", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "required": ["image"], - "properties": { - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name", "value"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string", - "default": "/projects" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "events": { - "description": "Bindings of commands to events. Each command is referred-to by its name.", - "type": "object", - "properties": { - "postStart": { - "description": "IDs of commands that should be executed after the devworkspace is completely started. In the case of Che-Theia, these commands should be executed after all plugins and extensions have started, including project cloning. This means that those commands are not triggered until the user opens the IDE in his browser.", - "type": "array", - "items": { - "type": "string" - } - }, - "postStop": { - "description": "IDs of commands that should be executed after stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStart": { - "description": "IDs of commands that should be executed before the devworkspace start. Kubernetes-wise, these commands would typically be executed in init containers of the devworkspace POD.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStop": { - "description": "IDs of commands that should be executed before stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "metadata": { - "description": "Optional metadata", - "type": "object", - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes. Deprecated, use the top-level attributes field instead.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Optional devfile description", - "type": "string" - }, - "displayName": { - "description": "Optional devfile display name", - "type": "string" - }, - "globalMemoryLimit": { - "description": "Optional devfile global memory limit", - "type": "string" - }, - "icon": { - "description": "Optional devfile icon, can be a URI or a relative path in the project", - "type": "string" - }, - "language": { - "description": "Optional devfile language", - "type": "string" - }, - "name": { - "description": "Optional devfile name", - "type": "string" - }, - "projectType": { - "description": "Optional devfile project type", - "type": "string" - }, - "tags": { - "description": "Optional devfile tags", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "description": "Optional semver-compatible version", - "type": "string", - "pattern": "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - }, - "website": { - "description": "Optional devfile website", - "type": "string" - } - }, - "additionalProperties": true - }, - "parent": { - "description": "Parent devworkspace template", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["id"] - }, - { - "required": ["kubernetes"] - } - ], - "properties": { - "attributes": { - "description": "Overrides of attributes encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug"] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "properties": { - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"] - }, - "name": { - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Overrides of projects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "registryUrl": { - "description": "Registry URL to pull the parent devfile from when using id in the parent reference. To ensure the parent devfile gets resolved consistently in different environments, it is recommended to always specify the `regsitryURL` when `Id` is used.", - "type": "string" - }, - "starterProjects": { - "description": "Overrides of starterProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "uri": { - "description": "URI Reference of a parent devfile YAML file. It can be a full URL or a relative URI with the current devfile as the base URI.", - "type": "string" - }, - "variables": { - "description": "Overrides of variables encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Projects worked on in the devworkspace, containing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "schemaVersion": { - "description": "Devfile schema version", - "type": "string", - "pattern": "^2\\.1\\.0$" - }, - "starterProjects": { - "description": "StarterProjects is a project that can be used as a starting point when bootstrapping new projects", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Must have at least one remote configured", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "variables": { - "description": "Map of key-value variables used for string replacement in the devfile. Values can can be referenced via {{variable-key}} to replace the corresponding value in string fields in the devfile. Replacement cannot be used for\n\n - schemaVersion, metadata, parent source - element identifiers, e.g. command id, component name, endpoint name, project name - references to identifiers, e.g. in events, a command's component, container's volume mount name - string enums, e.g. command group kind, endpoint exposure", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false -} diff --git a/tools/devworkspace-generator/src/devfile-schema/2.2.0/devfile.json b/tools/devworkspace-generator/src/devfile-schema/2.2.0/devfile.json deleted file mode 100644 index ed4afd332..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/2.2.0/devfile.json +++ /dev/null @@ -1,2037 +0,0 @@ -{ - "description": "Devfile describes the structure of a cloud-native devworkspace and development environment.\n\nIDE-targeted variants of the schemas provide the following difference compared to the main schemas:\n- They contain additional non-standard `markdownDescription` attributes that are used by IDEs such a VSCode\nto provide markdown-rendered documentation hovers. \n- They don't contain `default` attributes, since this triggers unwanted addition of defaulted fields during completion in IDEs.", - "type": "object", - "title": "Devfile schema - Version 2.2.0 - IDE-targeted variant", - "required": ["schemaVersion"], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "commands": { - "description": "Predefined, ready-to-use, devworkspace-related commands", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "required": ["component"], - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string", - "markdownDescription": "Describes component that will be applied" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean", - "markdownDescription": "Identifies the default command for a given group kind" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug", "deploy"], - "markdownDescription": "Kind of group the command is part of" - } - }, - "additionalProperties": false, - "markdownDescription": "Defines the group this command is part of" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string", - "markdownDescription": "Optional label that provides a label for this command to be used in Editor UI menus for example" - } - }, - "additionalProperties": false, - "markdownDescription": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false." - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The commands that comprise this composite command" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean", - "markdownDescription": "Identifies the default command for a given group kind" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug", "deploy"], - "markdownDescription": "Kind of group the command is part of" - } - }, - "additionalProperties": false, - "markdownDescription": "Defines the group this command is part of" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string", - "markdownDescription": "Optional label that provides a label for this command to be used in Editor UI menus for example" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean", - "markdownDescription": "Indicates if the sub-commands should be executed concurrently" - } - }, - "additionalProperties": false, - "markdownDescription": "Composite command that allows executing several sub-commands either sequentially or concurrently" - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "required": ["commandLine", "component"], - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string", - "markdownDescription": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one." - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string", - "markdownDescription": "Describes component to which given action relates" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name", "value"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Optional list of environment variables that have to be set before running the command" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": ["kind"], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean", - "markdownDescription": "Identifies the default command for a given group kind" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug", "deploy"], - "markdownDescription": "Kind of group the command is part of" - } - }, - "additionalProperties": false, - "markdownDescription": "Defines the group this command is part of" - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string", - "markdownDescription": "Optional label that provides a label for this command to be used in Editor UI menus for example" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string", - "markdownDescription": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one." - } - }, - "additionalProperties": false, - "markdownDescription": "CLI Command executed in an existing component container" - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events." - } - }, - "additionalProperties": false - }, - "markdownDescription": "Predefined, ready-to-use, devworkspace-related commands" - }, - "components": { - "description": "List of the devworkspace components, such as editor and plugins, user-provided containers, or other types of components", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - }, - { - "required": ["image"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "required": ["image"], - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to deployment" - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to service" - } - }, - "additionalProperties": false, - "markdownDescription": "Annotations that should be added to specific resources for this container" - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image." - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image." - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to Kubernetes Ingress or Openshift Route" - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\"," - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"], - "markdownDescription": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`" - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string", - "markdownDescription": "Path of the endpoint URL" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"], - "markdownDescription": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`" - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean", - "markdownDescription": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`." - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer", - "markdownDescription": "Port number to be used within the container component. The same port cannot be used by two different container components." - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name", "value"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`" - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean", - "markdownDescription": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true." - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string", - "markdownDescription": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used." - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files." - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string", - "markdownDescription": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`." - } - }, - "additionalProperties": false, - "markdownDescription": "Volume that should be mounted to a component container" - }, - "markdownDescription": "List of volumes mounts that should be mounted is this container." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows adding and configuring devworkspace-related containers" - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "required": ["imageName"], - "oneOf": [ - { - "required": ["dockerfile"] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Defines if the image should be built during startup.\n\nDefault value is `false`" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["devfileRegistry"] - }, - { - "required": ["git"] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The arguments to supply to the dockerfile build." - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string", - "markdownDescription": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "required": ["id"], - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string", - "markdownDescription": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image." - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string", - "markdownDescription": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used." - } - }, - "additionalProperties": false, - "markdownDescription": "Dockerfile's Devfile Registry source" - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string", - "markdownDescription": "The remote name should be used as init. Required if there are more than one remote configured" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string", - "markdownDescription": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found." - } - }, - "additionalProperties": false, - "markdownDescription": "Defines from what the project should be checked out. Required if there are more than one remote configured" - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string", - "markdownDescription": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile." - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured." - } - }, - "additionalProperties": false, - "markdownDescription": "Dockerfile's Git source" - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Specify if a privileged builder pod is required.\n\nDefault value is `false`" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string", - "markdownDescription": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows specifying dockerfile type build" - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string", - "markdownDescription": "Name of the image for the resulting outerloop build" - } - }, - "additionalProperties": false, - "markdownDescription": "Allows specifying the definition of an image for outer loop builds" - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Defines if the component should be deployed during startup.\n\nDefault value is `false`" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to Kubernetes Ingress or Openshift Route" - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\"," - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"], - "markdownDescription": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`" - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string", - "markdownDescription": "Path of the endpoint URL" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"], - "markdownDescription": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`" - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean", - "markdownDescription": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`." - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer", - "markdownDescription": "Port number to be used within the container component. The same port cannot be used by two different container components." - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string", - "markdownDescription": "Inlined manifest" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string", - "markdownDescription": "Location in a file fetched from a uri." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production." - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin." - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Defines if the component should be deployed during startup.\n\nDefault value is `false`" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "targetPort"], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to Kubernetes Ingress or Openshift Route" - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\"," - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"], - "markdownDescription": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`" - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string", - "markdownDescription": "Path of the endpoint URL" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"], - "markdownDescription": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`" - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean", - "markdownDescription": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`." - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer", - "markdownDescription": "Port number to be used within the container component. The same port cannot be used by two different container components." - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string", - "markdownDescription": "Inlined manifest" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string", - "markdownDescription": "Location in a file fetched from a uri." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production." - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean", - "markdownDescription": "Ephemeral volumes are not stored persistently across restarts. Defaults to false" - }, - "size": { - "description": "Size of the volume", - "type": "string", - "markdownDescription": "Size of the volume" - } - }, - "additionalProperties": false, - "markdownDescription": "Allows specifying the definition of a volume shared by several other components" - } - }, - "additionalProperties": false - }, - "markdownDescription": "List of the devworkspace components, such as editor and plugins, user-provided containers, or other types of components" - }, - "events": { - "description": "Bindings of commands to events. Each command is referred-to by its name.", - "type": "object", - "properties": { - "postStart": { - "description": "IDs of commands that should be executed after the devworkspace is completely started. In the case of Che-Theia, these commands should be executed after all plugins and extensions have started, including project cloning. This means that those commands are not triggered until the user opens the IDE in his browser.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "IDs of commands that should be executed after the devworkspace is completely started. In the case of Che-Theia, these commands should be executed after all plugins and extensions have started, including project cloning. This means that those commands are not triggered until the user opens the IDE in his browser." - }, - "postStop": { - "description": "IDs of commands that should be executed after stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "IDs of commands that should be executed after stopping the devworkspace." - }, - "preStart": { - "description": "IDs of commands that should be executed before the devworkspace start. Kubernetes-wise, these commands would typically be executed in init containers of the devworkspace POD.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "IDs of commands that should be executed before the devworkspace start. Kubernetes-wise, these commands would typically be executed in init containers of the devworkspace POD." - }, - "preStop": { - "description": "IDs of commands that should be executed before stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "IDs of commands that should be executed before stopping the devworkspace." - } - }, - "additionalProperties": false, - "markdownDescription": "Bindings of commands to events. Each command is referred-to by its name." - }, - "metadata": { - "description": "Optional metadata", - "type": "object", - "properties": { - "architectures": { - "description": "Optional list of processor architectures that the devfile supports, empty list suggests that the devfile can be used on any architecture", - "type": "array", - "uniqueItems": true, - "items": { - "description": "Architecture describes the architecture type", - "type": "string", - "enum": ["amd64", "arm64", "ppc64le", "s390x"], - "markdownDescription": "Architecture describes the architecture type" - }, - "markdownDescription": "Optional list of processor architectures that the devfile supports, empty list suggests that the devfile can be used on any architecture" - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes. Deprecated, use the top-level attributes field instead.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes. Deprecated, use the top-level attributes field instead." - }, - "description": { - "description": "Optional devfile description", - "type": "string", - "markdownDescription": "Optional devfile description" - }, - "displayName": { - "description": "Optional devfile display name", - "type": "string", - "markdownDescription": "Optional devfile display name" - }, - "globalMemoryLimit": { - "description": "Optional devfile global memory limit", - "type": "string", - "markdownDescription": "Optional devfile global memory limit" - }, - "icon": { - "description": "Optional devfile icon, can be a URI or a relative path in the project", - "type": "string", - "markdownDescription": "Optional devfile icon, can be a URI or a relative path in the project" - }, - "language": { - "description": "Optional devfile language", - "type": "string", - "markdownDescription": "Optional devfile language" - }, - "name": { - "description": "Optional devfile name", - "type": "string", - "markdownDescription": "Optional devfile name" - }, - "projectType": { - "description": "Optional devfile project type", - "type": "string", - "markdownDescription": "Optional devfile project type" - }, - "provider": { - "description": "Optional devfile provider information", - "type": "string", - "markdownDescription": "Optional devfile provider information" - }, - "supportUrl": { - "description": "Optional link to a page that provides support information", - "type": "string", - "markdownDescription": "Optional link to a page that provides support information" - }, - "tags": { - "description": "Optional devfile tags", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "Optional devfile tags" - }, - "version": { - "description": "Optional semver-compatible version", - "type": "string", - "pattern": "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$", - "markdownDescription": "Optional semver-compatible version" - }, - "website": { - "description": "Optional devfile website", - "type": "string", - "markdownDescription": "Optional devfile website" - } - }, - "additionalProperties": true, - "markdownDescription": "Optional metadata" - }, - "parent": { - "description": "Parent devworkspace template", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["id"] - }, - { - "required": ["kubernetes"] - } - ], - "properties": { - "attributes": { - "description": "Overrides of attributes encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Overrides of attributes encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules." - }, - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["id"], - "oneOf": [ - { - "required": ["exec"] - }, - { - "required": ["apply"] - }, - { - "required": ["composite"] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string", - "markdownDescription": "Describes component that will be applied" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean", - "markdownDescription": "Identifies the default command for a given group kind" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug", "deploy"], - "markdownDescription": "Kind of group the command is part of" - } - }, - "additionalProperties": false, - "markdownDescription": "Defines the group this command is part of" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string", - "markdownDescription": "Optional label that provides a label for this command to be used in Editor UI menus for example" - } - }, - "additionalProperties": false, - "markdownDescription": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false." - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The commands that comprise this composite command" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean", - "markdownDescription": "Identifies the default command for a given group kind" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug", "deploy"], - "markdownDescription": "Kind of group the command is part of" - } - }, - "additionalProperties": false, - "markdownDescription": "Defines the group this command is part of" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string", - "markdownDescription": "Optional label that provides a label for this command to be used in Editor UI menus for example" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean", - "markdownDescription": "Indicates if the sub-commands should be executed concurrently" - } - }, - "additionalProperties": false, - "markdownDescription": "Composite command that allows executing several sub-commands either sequentially or concurrently" - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string", - "markdownDescription": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one." - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string", - "markdownDescription": "Describes component to which given action relates" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Optional list of environment variables that have to be set before running the command" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean", - "markdownDescription": "Identifies the default command for a given group kind" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": ["build", "run", "test", "debug", "deploy"], - "markdownDescription": "Kind of group the command is part of" - } - }, - "additionalProperties": false, - "markdownDescription": "Defines the group this command is part of" - }, - "hotReloadCapable": { - "description": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Whether the command is capable to reload itself when source code changes. If set to `true` the command won't be restarted and it is expected to handle file changes on its own.\n\nDefault value is `false`" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string", - "markdownDescription": "Optional label that provides a label for this command to be used in Editor UI menus for example" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string", - "markdownDescription": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one." - } - }, - "additionalProperties": false, - "markdownDescription": "CLI Command executed in an existing component container" - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events." - } - }, - "additionalProperties": false - }, - "markdownDescription": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules." - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["container"] - }, - { - "required": ["kubernetes"] - }, - { - "required": ["openshift"] - }, - { - "required": ["volume"] - }, - { - "required": ["image"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to deployment" - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to service" - } - }, - "additionalProperties": false, - "markdownDescription": "Annotations that should be added to specific resources for this container" - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image." - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image." - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to Kubernetes Ingress or Openshift Route" - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\"," - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"], - "markdownDescription": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`" - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string", - "markdownDescription": "Path of the endpoint URL" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"], - "markdownDescription": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`" - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean", - "markdownDescription": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`." - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer", - "markdownDescription": "Port number to be used within the container component. The same port cannot be used by two different container components." - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`" - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean", - "markdownDescription": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true." - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string", - "markdownDescription": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used." - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files." - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string", - "markdownDescription": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`." - } - }, - "additionalProperties": false, - "markdownDescription": "Volume that should be mounted to a component container" - }, - "markdownDescription": "List of volumes mounts that should be mounted is this container." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows adding and configuring devworkspace-related containers" - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "oneOf": [ - { - "required": ["dockerfile"] - }, - { - "required": ["autoBuild"] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Defines if the image should be built during startup.\n\nDefault value is `false`" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["devfileRegistry"] - }, - { - "required": ["git"] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "The arguments to supply to the dockerfile build." - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string", - "markdownDescription": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string", - "markdownDescription": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image." - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string", - "markdownDescription": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used." - } - }, - "additionalProperties": false, - "markdownDescription": "Dockerfile's Devfile Registry source" - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string", - "markdownDescription": "The remote name should be used as init. Required if there are more than one remote configured" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string", - "markdownDescription": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found." - } - }, - "additionalProperties": false, - "markdownDescription": "Defines from what the project should be checked out. Required if there are more than one remote configured" - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string", - "markdownDescription": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile." - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured." - } - }, - "additionalProperties": false, - "markdownDescription": "Dockerfile's Git source" - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Specify if a privileged builder pod is required.\n\nDefault value is `false`" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string", - "markdownDescription": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows specifying dockerfile type build" - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string", - "markdownDescription": "Name of the image for the resulting outerloop build" - } - }, - "additionalProperties": false, - "markdownDescription": "Allows specifying the definition of an image for outer loop builds" - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Defines if the component should be deployed during startup.\n\nDefault value is `false`" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to Kubernetes Ingress or Openshift Route" - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\"," - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"], - "markdownDescription": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`" - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string", - "markdownDescription": "Path of the endpoint URL" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"], - "markdownDescription": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`" - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean", - "markdownDescription": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`." - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer", - "markdownDescription": "Port number to be used within the container component. The same port cannot be used by two different container components." - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string", - "markdownDescription": "Inlined manifest" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string", - "markdownDescription": "Location in a file fetched from a uri." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production." - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin." - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": ["uri"] - }, - { - "required": ["inlined"] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean", - "markdownDescription": "Defines if the component should be deployed during startup.\n\nDefault value is `false`" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Annotations to be added to Kubernetes Ingress or Openshift Route" - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\"," - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": ["public", "internal", "none"], - "markdownDescription": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`" - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string", - "markdownDescription": "Path of the endpoint URL" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": ["http", "https", "ws", "wss", "tcp", "udp"], - "markdownDescription": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`" - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean", - "markdownDescription": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`." - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer", - "markdownDescription": "Port number to be used within the container component. The same port cannot be used by two different container components." - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string", - "markdownDescription": "Inlined manifest" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string", - "markdownDescription": "Location in a file fetched from a uri." - } - }, - "additionalProperties": false, - "markdownDescription": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production." - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean", - "markdownDescription": "Ephemeral volumes are not stored persistently across restarts. Defaults to false" - }, - "size": { - "description": "Size of the volume", - "type": "string", - "markdownDescription": "Size of the volume" - } - }, - "additionalProperties": false, - "markdownDescription": "Allows specifying the definition of a volume shared by several other components" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules." - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string", - "markdownDescription": "Id in a registry that contains a Devfile yaml file" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false, - "markdownDescription": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate" - }, - "projects": { - "description": "Overrides of projects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string", - "markdownDescription": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name." - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string", - "markdownDescription": "The remote name should be used as init. Required if there are more than one remote configured" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string", - "markdownDescription": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found." - } - }, - "additionalProperties": false, - "markdownDescription": "Defines from what the project should be checked out. Required if there are more than one remote configured" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured." - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Git source" - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Project name" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string", - "markdownDescription": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH" - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Zip source" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Overrides of projects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules." - }, - "registryUrl": { - "description": "Registry URL to pull the parent devfile from when using id in the parent reference. To ensure the parent devfile gets resolved consistently in different environments, it is recommended to always specify the `registryUrl` when `id` is used.", - "type": "string", - "markdownDescription": "Registry URL to pull the parent devfile from when using id in the parent reference. To ensure the parent devfile gets resolved consistently in different environments, it is recommended to always specify the `registryUrl` when `id` is used." - }, - "starterProjects": { - "description": "Overrides of starterProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "description": { - "description": "Description of a starter project", - "type": "string", - "markdownDescription": "Description of a starter project" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string", - "markdownDescription": "The remote name should be used as init. Required if there are more than one remote configured" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string", - "markdownDescription": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found." - } - }, - "additionalProperties": false, - "markdownDescription": "Defines from what the project should be checked out. Required if there are more than one remote configured" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured." - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Git source" - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Project name" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string", - "markdownDescription": "Sub-directory from a starter project to be used as root for starter project." - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string", - "markdownDescription": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH" - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Zip source" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Overrides of starterProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules." - }, - "uri": { - "description": "URI Reference of a parent devfile YAML file. It can be a full URL or a relative URI with the current devfile as the base URI.", - "type": "string", - "markdownDescription": "URI Reference of a parent devfile YAML file. It can be a full URL or a relative URI with the current devfile as the base URI." - }, - "variables": { - "description": "Overrides of variables encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Overrides of variables encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules." - }, - "version": { - "description": "Specific stack/sample version to pull the parent devfile from, when using id in the parent reference. To specify `version`, `id` must be defined and used as the import reference source. `version` can be either a specific stack version, or `latest`. If no `version` specified, default version will be used.", - "type": "string", - "pattern": "^(latest)|(([1-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?)$", - "markdownDescription": "Specific stack/sample version to pull the parent devfile from, when using id in the parent reference. To specify `version`, `id` must be defined and used as the import reference source. `version` can be either a specific stack version, or `latest`. If no `version` specified, default version will be used." - } - }, - "additionalProperties": false, - "markdownDescription": "Parent devworkspace template" - }, - "projects": { - "description": "Projects worked on in the devworkspace, containing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string", - "markdownDescription": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name." - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string", - "markdownDescription": "The remote name should be used as init. Required if there are more than one remote configured" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string", - "markdownDescription": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found." - } - }, - "additionalProperties": false, - "markdownDescription": "Defines from what the project should be checked out. Required if there are more than one remote configured" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured." - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Git source" - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Project name" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string", - "markdownDescription": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH" - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Zip source" - } - }, - "additionalProperties": false - }, - "markdownDescription": "Projects worked on in the devworkspace, containing names and sources locations" - }, - "schemaVersion": { - "description": "Devfile schema version", - "type": "string", - "pattern": "^([2-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$", - "markdownDescription": "Devfile schema version" - }, - "starterProjects": { - "description": "StarterProjects is a project that can be used as a starting point when bootstrapping new projects", - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "oneOf": [ - { - "required": ["git"] - }, - { - "required": ["zip"] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true, - "markdownDescription": "Map of implementation-dependant free-form YAML attributes." - }, - "description": { - "description": "Description of a starter project", - "type": "string", - "markdownDescription": "Description of a starter project" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": ["remotes"], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string", - "markdownDescription": "The remote name should be used as init. Required if there are more than one remote configured" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string", - "markdownDescription": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found." - } - }, - "additionalProperties": false, - "markdownDescription": "Defines from what the project should be checked out. Required if there are more than one remote configured" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured." - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Git source" - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", - "markdownDescription": "Project name" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string", - "markdownDescription": "Sub-directory from a starter project to be used as root for starter project." - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string", - "markdownDescription": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH" - } - }, - "additionalProperties": false, - "markdownDescription": "Project's Zip source" - } - }, - "additionalProperties": false - }, - "markdownDescription": "StarterProjects is a project that can be used as a starting point when bootstrapping new projects" - }, - "variables": { - "description": "Map of key-value variables used for string replacement in the devfile. Values can be referenced via {{variable-key}} to replace the corresponding value in string fields in the devfile. Replacement cannot be used for\n\n - schemaVersion, metadata, parent source\n\n - element identifiers, e.g. command id, component name, endpoint name, project name\n\n - references to identifiers, e.g. in events, a command's component, container's volume mount name\n\n - string enums, e.g. command group kind, endpoint exposure", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "markdownDescription": "Map of key-value variables used for string replacement in the devfile. Values can be referenced via {{variable-key}} to replace the corresponding value in string fields in the devfile. Replacement cannot be used for\n\n - schemaVersion, metadata, parent source\n\n - element identifiers, e.g. command id, component name, endpoint name, project name\n\n - references to identifiers, e.g. in events, a command's component, container's volume mount name\n\n - string enums, e.g. command group kind, endpoint exposure" - } - }, - "additionalProperties": false, - "markdownDescription": "Devfile describes the structure of a cloud-native devworkspace and development environment.\n\nIDE-targeted variants of the schemas provide the following difference compared to the main schemas:\n- They contain additional non-standard `markdownDescription` attributes that are used by IDEs such a VSCode\nto provide markdown-rendered documentation hovers. \n- They don't contain `default` attributes, since this triggers unwanted addition of defaulted fields during completion in IDEs." -} diff --git a/tools/devworkspace-generator/src/devfile-schema/2.2.1/devfile.json b/tools/devworkspace-generator/src/devfile-schema/2.2.1/devfile.json deleted file mode 100644 index 8aff4e382..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/2.2.1/devfile.json +++ /dev/null @@ -1,2048 +0,0 @@ -{ - "description": "Devfile describes the structure of a cloud-native devworkspace and development environment.", - "type": "object", - "title": "Devfile schema - Version 2.2.1", - "required": [ - "schemaVersion" - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Predefined, ready-to-use, devworkspace-related commands", - "type": "array", - "items": { - "type": "object", - "required": [ - "id" - ], - "oneOf": [ - { - "required": [ - "exec" - ] - }, - { - "required": [ - "apply" - ] - }, - { - "required": [ - "composite" - ] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "required": [ - "component" - ], - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "required": [ - "commandLine", - "component" - ], - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Specify whether the command is restarted or not when the source code changes. If set to `true` the command won't be restarted. A *hotReloadCapable* `run` or `debug` command is expected to handle file changes on its own and won't be restarted. A *hotReloadCapable* `build` command is expected to be executed only once and won't be executed again. This field is taken into account only for commands `build`, `run` and `debug` with `isDefault` set to `true`.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "List of the devworkspace components, such as editor and plugins, user-provided containers, or other types of components", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "container" - ] - }, - { - "required": [ - "kubernetes" - ] - }, - { - "required": [ - "openshift" - ] - }, - { - "required": [ - "volume" - ] - }, - { - "required": [ - "image" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "required": [ - "image" - ], - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string", - "default": "/projects" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "required": [ - "imageName" - ], - "oneOf": [ - { - "required": [ - "dockerfile" - ] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "devfileRegistry" - ] - }, - { - "required": [ - "git" - ] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - } - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string" - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string" - } - }, - "additionalProperties": false - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string" - } - }, - "additionalProperties": false - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string" - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "events": { - "description": "Bindings of commands to events. Each command is referred-to by its name.", - "type": "object", - "properties": { - "postStart": { - "description": "IDs of commands that should be executed after the devworkspace is completely started. In the case of Che-Theia, these commands should be executed after all plugins and extensions have started, including project cloning. This means that those commands are not triggered until the user opens the IDE in his browser.", - "type": "array", - "items": { - "type": "string" - } - }, - "postStop": { - "description": "IDs of commands that should be executed after stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStart": { - "description": "IDs of commands that should be executed before the devworkspace start. Kubernetes-wise, these commands would typically be executed in init containers of the devworkspace POD.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStop": { - "description": "IDs of commands that should be executed before stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "metadata": { - "description": "Optional metadata", - "type": "object", - "properties": { - "architectures": { - "description": "Optional list of processor architectures that the devfile supports, empty list suggests that the devfile can be used on any architecture", - "type": "array", - "uniqueItems": true, - "items": { - "description": "Architecture describes the architecture type", - "type": "string", - "enum": [ - "amd64", - "arm64", - "ppc64le", - "s390x" - ] - } - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes. Deprecated, use the top-level attributes field instead.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Optional devfile description", - "type": "string" - }, - "displayName": { - "description": "Optional devfile display name", - "type": "string" - }, - "globalMemoryLimit": { - "description": "Optional devfile global memory limit", - "type": "string" - }, - "icon": { - "description": "Optional devfile icon, can be a URI or a relative path in the project", - "type": "string" - }, - "language": { - "description": "Optional devfile language", - "type": "string" - }, - "name": { - "description": "Optional devfile name", - "type": "string" - }, - "projectType": { - "description": "Optional devfile project type", - "type": "string" - }, - "provider": { - "description": "Optional devfile provider information", - "type": "string" - }, - "supportUrl": { - "description": "Optional link to a page that provides support information", - "type": "string" - }, - "tags": { - "description": "Optional devfile tags", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "description": "Optional semver-compatible version", - "type": "string", - "pattern": "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - }, - "website": { - "description": "Optional devfile website", - "type": "string" - } - }, - "additionalProperties": true - }, - "parent": { - "description": "Parent devworkspace template", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "id" - ] - }, - { - "required": [ - "kubernetes" - ] - } - ], - "properties": { - "attributes": { - "description": "Overrides of attributes encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "id" - ], - "oneOf": [ - { - "required": [ - "exec" - ] - }, - { - "required": [ - "apply" - ] - }, - { - "required": [ - "composite" - ] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Specify whether the command is restarted or not when the source code changes. If set to `true` the command won't be restarted. A *hotReloadCapable* `run` or `debug` command is expected to handle file changes on its own and won't be restarted. A *hotReloadCapable* `build` command is expected to be executed only once and won't be executed again. This field is taken into account only for commands `build`, `run` and `debug` with `isDefault` set to `true`.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "container" - ] - }, - { - "required": [ - "kubernetes" - ] - }, - { - "required": [ - "openshift" - ] - }, - { - "required": [ - "volume" - ] - }, - { - "required": [ - "image" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "oneOf": [ - { - "required": [ - "dockerfile" - ] - }, - { - "required": [ - "autoBuild" - ] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "devfileRegistry" - ] - }, - { - "required": [ - "git" - ] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - } - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string" - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string" - } - }, - "additionalProperties": false - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string" - } - }, - "additionalProperties": false - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string" - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Overrides of projects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "registryUrl": { - "description": "Registry URL to pull the parent devfile from when using id in the parent reference. To ensure the parent devfile gets resolved consistently in different environments, it is recommended to always specify the `registryUrl` when `id` is used.", - "type": "string" - }, - "starterProjects": { - "description": "Overrides of starterProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "uri": { - "description": "URI Reference of a parent devfile YAML file. It can be a full URL or a relative URI with the current devfile as the base URI.", - "type": "string" - }, - "variables": { - "description": "Overrides of variables encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "version": { - "description": "Specific stack/sample version to pull the parent devfile from, when using id in the parent reference. To specify `version`, `id` must be defined and used as the import reference source. `version` can be either a specific stack version, or `latest`. If no `version` specified, default version will be used.", - "type": "string", - "pattern": "^(latest)|(([1-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?)$" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Projects worked on in the devworkspace, containing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "schemaVersion": { - "description": "Devfile schema version", - "type": "string", - "pattern": "^([2-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - }, - "starterProjects": { - "description": "StarterProjects is a project that can be used as a starting point when bootstrapping new projects", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "variables": { - "description": "Map of key-value variables used for string replacement in the devfile. Values can be referenced via {{variable-key}} to replace the corresponding value in string fields in the devfile. Replacement cannot be used for\n\n - schemaVersion, metadata, parent source\n\n - element identifiers, e.g. command id, component name, endpoint name, project name\n\n - references to identifiers, e.g. in events, a command's component, container's volume mount name\n\n - string enums, e.g. command group kind, endpoint exposure", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/tools/devworkspace-generator/src/devfile-schema/2.2.2/devfile.json b/tools/devworkspace-generator/src/devfile-schema/2.2.2/devfile.json deleted file mode 100644 index e025de9ca..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/2.2.2/devfile.json +++ /dev/null @@ -1,2211 +0,0 @@ -{ - "description": "Devfile describes the structure of a cloud-native devworkspace and development environment.", - "type": "object", - "title": "Devfile schema - Version 2.2.2", - "required": [ - "schemaVersion" - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Predefined, ready-to-use, devworkspace-related commands", - "type": "array", - "items": { - "type": "object", - "required": [ - "id" - ], - "oneOf": [ - { - "required": [ - "exec" - ] - }, - { - "required": [ - "apply" - ] - }, - { - "required": [ - "composite" - ] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "required": [ - "component" - ], - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "required": [ - "commandLine", - "component" - ], - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Specify whether the command is restarted or not when the source code changes. If set to `true` the command won't be restarted. A *hotReloadCapable* `run` or `debug` command is expected to handle file changes on its own and won't be restarted. A *hotReloadCapable* `build` command is expected to be executed only once and won't be executed again. This field is taken into account only for commands `build`, `run` and `debug` with `isDefault` set to `true`.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "List of the devworkspace components, such as editor and plugins, user-provided containers, or other types of components", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "container" - ] - }, - { - "required": [ - "kubernetes" - ] - }, - { - "required": [ - "openshift" - ] - }, - { - "required": [ - "volume" - ] - }, - { - "required": [ - "image" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "required": [ - "image" - ], - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string", - "default": "/projects" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "required": [ - "imageName" - ], - "oneOf": [ - { - "required": [ - "dockerfile" - ] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "devfileRegistry" - ] - }, - { - "required": [ - "git" - ] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - } - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string" - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string" - } - }, - "additionalProperties": false - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string" - } - }, - "additionalProperties": false - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string" - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "dependentProjects": { - "description": "Additional projects related to the main project in the devfile, contianing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "events": { - "description": "Bindings of commands to events. Each command is referred-to by its name.", - "type": "object", - "properties": { - "postStart": { - "description": "IDs of commands that should be executed after the devworkspace is completely started. In the case of Che-Theia, these commands should be executed after all plugins and extensions have started, including project cloning. This means that those commands are not triggered until the user opens the IDE in his browser.", - "type": "array", - "items": { - "type": "string" - } - }, - "postStop": { - "description": "IDs of commands that should be executed after stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStart": { - "description": "IDs of commands that should be executed before the devworkspace start. Kubernetes-wise, these commands would typically be executed in init containers of the devworkspace POD.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStop": { - "description": "IDs of commands that should be executed before stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "metadata": { - "description": "Optional metadata", - "type": "object", - "properties": { - "architectures": { - "description": "Optional list of processor architectures that the devfile supports, empty list suggests that the devfile can be used on any architecture", - "type": "array", - "uniqueItems": true, - "items": { - "description": "Architecture describes the architecture type", - "type": "string", - "enum": [ - "amd64", - "arm64", - "ppc64le", - "s390x" - ] - } - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes. Deprecated, use the top-level attributes field instead.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Optional devfile description", - "type": "string" - }, - "displayName": { - "description": "Optional devfile display name", - "type": "string" - }, - "globalMemoryLimit": { - "description": "Optional devfile global memory limit", - "type": "string" - }, - "icon": { - "description": "Optional devfile icon, can be a URI or a relative path in the project", - "type": "string" - }, - "language": { - "description": "Optional devfile language", - "type": "string" - }, - "name": { - "description": "Optional devfile name", - "type": "string" - }, - "projectType": { - "description": "Optional devfile project type", - "type": "string" - }, - "provider": { - "description": "Optional devfile provider information", - "type": "string" - }, - "supportUrl": { - "description": "Optional link to a page that provides support information", - "type": "string" - }, - "tags": { - "description": "Optional devfile tags", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "description": "Optional semver-compatible version", - "type": "string", - "pattern": "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - }, - "website": { - "description": "Optional devfile website", - "type": "string" - } - }, - "additionalProperties": true - }, - "parent": { - "description": "Parent devworkspace template", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "id" - ] - }, - { - "required": [ - "kubernetes" - ] - } - ], - "properties": { - "attributes": { - "description": "Overrides of attributes encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "id" - ], - "oneOf": [ - { - "required": [ - "exec" - ] - }, - { - "required": [ - "apply" - ] - }, - { - "required": [ - "composite" - ] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Specify whether the command is restarted or not when the source code changes. If set to `true` the command won't be restarted. A *hotReloadCapable* `run` or `debug` command is expected to handle file changes on its own and won't be restarted. A *hotReloadCapable* `build` command is expected to be executed only once and won't be executed again. This field is taken into account only for commands `build`, `run` and `debug` with `isDefault` set to `true`.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "container" - ] - }, - { - "required": [ - "kubernetes" - ] - }, - { - "required": [ - "openshift" - ] - }, - { - "required": [ - "volume" - ] - }, - { - "required": [ - "image" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "oneOf": [ - { - "required": [ - "dockerfile" - ] - }, - { - "required": [ - "autoBuild" - ] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "devfileRegistry" - ] - }, - { - "required": [ - "git" - ] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - } - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string" - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string" - } - }, - "additionalProperties": false - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string" - } - }, - "additionalProperties": false - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string" - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "dependentProjects": { - "description": "Overrides of dependentProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Overrides of projects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "registryUrl": { - "description": "Registry URL to pull the parent devfile from when using id in the parent reference. To ensure the parent devfile gets resolved consistently in different environments, it is recommended to always specify the `registryUrl` when `id` is used.", - "type": "string" - }, - "starterProjects": { - "description": "Overrides of starterProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "uri": { - "description": "URI Reference of a parent devfile YAML file. It can be a full URL or a relative URI with the current devfile as the base URI.", - "type": "string" - }, - "variables": { - "description": "Overrides of variables encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "version": { - "description": "Specific stack/sample version to pull the parent devfile from, when using id in the parent reference. To specify `version`, `id` must be defined and used as the import reference source. `version` can be either a specific stack version, or `latest`. If no `version` specified, default version will be used.", - "type": "string", - "pattern": "^(latest)|(([1-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?)$" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Projects worked on in the devworkspace, containing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "schemaVersion": { - "description": "Devfile schema version", - "type": "string", - "pattern": "^([2-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - }, - "starterProjects": { - "description": "StarterProjects is a project that can be used as a starting point when bootstrapping new projects", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "variables": { - "description": "Map of key-value variables used for string replacement in the devfile. Values can be referenced via {{variable-key}} to replace the corresponding value in string fields in the devfile. Replacement cannot be used for\n\n - schemaVersion, metadata, parent source\n\n - element identifiers, e.g. command id, component name, endpoint name, project name\n\n - references to identifiers, e.g. in events, a command's component, container's volume mount name\n\n - string enums, e.g. command group kind, endpoint exposure", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/tools/devworkspace-generator/src/devfile-schema/2.3.0/devfile.json b/tools/devworkspace-generator/src/devfile-schema/2.3.0/devfile.json deleted file mode 100644 index 9e2399598..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/2.3.0/devfile.json +++ /dev/null @@ -1,2211 +0,0 @@ -{ - "description": "Devfile describes the structure of a cloud-native devworkspace and development environment.", - "type": "object", - "title": "Devfile schema - Version 2.3.0", - "required": [ - "schemaVersion" - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Predefined, ready-to-use, devworkspace-related commands", - "type": "array", - "items": { - "type": "object", - "required": [ - "id" - ], - "oneOf": [ - { - "required": [ - "exec" - ] - }, - { - "required": [ - "apply" - ] - }, - { - "required": [ - "composite" - ] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "required": [ - "component" - ], - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "required": [ - "commandLine", - "component" - ], - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Specify whether the command is restarted or not when the source code changes. If set to `true` the command won't be restarted. A *hotReloadCapable* `run` or `debug` command is expected to handle file changes on its own and won't be restarted. A *hotReloadCapable* `build` command is expected to be executed only once and won't be executed again. This field is taken into account only for commands `build`, `run` and `debug` with `isDefault` set to `true`.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "List of the devworkspace components, such as editor and plugins, user-provided containers, or other types of components", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "container" - ] - }, - { - "required": [ - "kubernetes" - ] - }, - { - "required": [ - "openshift" - ] - }, - { - "required": [ - "volume" - ] - }, - { - "required": [ - "image" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "required": [ - "image" - ], - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string", - "default": "/projects" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "required": [ - "imageName" - ], - "oneOf": [ - { - "required": [ - "dockerfile" - ] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "devfileRegistry" - ] - }, - { - "required": [ - "git" - ] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - } - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string" - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string" - } - }, - "additionalProperties": false - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string" - } - }, - "additionalProperties": false - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string" - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name", - "targetPort" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "default": "public", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "default": "http", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "dependentProjects": { - "description": "Additional projects related to the main project in the devfile, contianing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "events": { - "description": "Bindings of commands to events. Each command is referred-to by its name.", - "type": "object", - "properties": { - "postStart": { - "description": "IDs of commands that should be executed after the devworkspace is completely started. In the case of Che-Theia, these commands should be executed after all plugins and extensions have started, including project cloning. This means that those commands are not triggered until the user opens the IDE in his browser.", - "type": "array", - "items": { - "type": "string" - } - }, - "postStop": { - "description": "IDs of commands that should be executed after stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStart": { - "description": "IDs of commands that should be executed before the devworkspace start. Kubernetes-wise, these commands would typically be executed in init containers of the devworkspace POD.", - "type": "array", - "items": { - "type": "string" - } - }, - "preStop": { - "description": "IDs of commands that should be executed before stopping the devworkspace.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "metadata": { - "description": "Optional metadata", - "type": "object", - "properties": { - "architectures": { - "description": "Optional list of processor architectures that the devfile supports, empty list suggests that the devfile can be used on any architecture", - "type": "array", - "uniqueItems": true, - "items": { - "description": "Architecture describes the architecture type", - "type": "string", - "enum": [ - "amd64", - "arm64", - "ppc64le", - "s390x" - ] - } - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes. Deprecated, use the top-level attributes field instead.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Optional devfile description", - "type": "string" - }, - "displayName": { - "description": "Optional devfile display name", - "type": "string" - }, - "globalMemoryLimit": { - "description": "Optional devfile global memory limit", - "type": "string" - }, - "icon": { - "description": "Optional devfile icon, can be a URI or a relative path in the project", - "type": "string" - }, - "language": { - "description": "Optional devfile language", - "type": "string" - }, - "name": { - "description": "Optional devfile name", - "type": "string" - }, - "projectType": { - "description": "Optional devfile project type", - "type": "string" - }, - "provider": { - "description": "Optional devfile provider information", - "type": "string" - }, - "supportUrl": { - "description": "Optional link to a page that provides support information", - "type": "string" - }, - "tags": { - "description": "Optional devfile tags", - "type": "array", - "items": { - "type": "string" - } - }, - "version": { - "description": "Optional semver-compatible version", - "type": "string", - "pattern": "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - }, - "website": { - "description": "Optional devfile website", - "type": "string" - } - }, - "additionalProperties": true - }, - "parent": { - "description": "Parent devworkspace template", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "id" - ] - }, - { - "required": [ - "kubernetes" - ] - } - ], - "properties": { - "attributes": { - "description": "Overrides of attributes encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": true - }, - "commands": { - "description": "Overrides of commands encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "id" - ], - "oneOf": [ - { - "required": [ - "exec" - ] - }, - { - "required": [ - "apply" - ] - }, - { - "required": [ - "composite" - ] - } - ], - "properties": { - "apply": { - "description": "Command that consists in applying a given component definition, typically bound to a devworkspace event.\n\nFor example, when an `apply` command is bound to a `preStart` event, and references a `container` component, it will start the container as a K8S initContainer in the devworkspace POD, unless the component has its `dedicatedPod` field set to `true`.\n\nWhen no `apply` command exist for a given component, it is assumed the component will be applied at devworkspace start by default, unless `deployByDefault` for that component is set to false.", - "type": "object", - "properties": { - "component": { - "description": "Describes component that will be applied", - "type": "string" - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - } - }, - "additionalProperties": false - }, - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "composite": { - "description": "Composite command that allows executing several sub-commands either sequentially or concurrently", - "type": "object", - "properties": { - "commands": { - "description": "The commands that comprise this composite command", - "type": "array", - "items": { - "type": "string" - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "parallel": { - "description": "Indicates if the sub-commands should be executed concurrently", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "exec": { - "description": "CLI Command executed in an existing component container", - "type": "object", - "properties": { - "commandLine": { - "description": "The actual command-line string\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - }, - "component": { - "description": "Describes component to which given action relates", - "type": "string" - }, - "env": { - "description": "Optional list of environment variables that have to be set before running the command", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "group": { - "description": "Defines the group this command is part of", - "type": "object", - "properties": { - "isDefault": { - "description": "Identifies the default command for a given group kind", - "type": "boolean" - }, - "kind": { - "description": "Kind of group the command is part of", - "type": "string", - "enum": [ - "build", - "run", - "test", - "debug", - "deploy" - ] - } - }, - "additionalProperties": false - }, - "hotReloadCapable": { - "description": "Specify whether the command is restarted or not when the source code changes. If set to `true` the command won't be restarted. A *hotReloadCapable* `run` or `debug` command is expected to handle file changes on its own and won't be restarted. A *hotReloadCapable* `build` command is expected to be executed only once and won't be executed again. This field is taken into account only for commands `build`, `run` and `debug` with `isDefault` set to `true`.\n\nDefault value is `false`", - "type": "boolean" - }, - "label": { - "description": "Optional label that provides a label for this command to be used in Editor UI menus for example", - "type": "string" - }, - "workingDir": { - "description": "Working directory where the command should be executed\n\nSpecial variables that can be used:\n\n - `$PROJECTS_ROOT`: A path where projects sources are mounted as defined by container component's sourceMapping.\n\n - `$PROJECT_SOURCE`: A path to a project source ($PROJECTS_ROOT/\u003cproject-name\u003e). If there are multiple projects, this will point to the directory of the first one.", - "type": "string" - } - }, - "additionalProperties": false - }, - "id": { - "description": "Mandatory identifier that allows referencing this command in composite commands, from a parent, or in events.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - } - }, - "additionalProperties": false - } - }, - "components": { - "description": "Overrides of components encapsulated in a parent devfile or a plugin. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "container" - ] - }, - { - "required": [ - "kubernetes" - ] - }, - { - "required": [ - "openshift" - ] - }, - { - "required": [ - "volume" - ] - }, - { - "required": [ - "image" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "container": { - "description": "Allows adding and configuring devworkspace-related containers", - "type": "object", - "properties": { - "annotation": { - "description": "Annotations that should be added to specific resources for this container", - "type": "object", - "properties": { - "deployment": { - "description": "Annotations to be added to deployment", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "service": { - "description": "Annotations to be added to service", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "args": { - "description": "The arguments to supply to the command running the dockerimage component. The arguments are supplied either to the default command provided in the image or to the overridden command.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "command": { - "description": "The command to run in the dockerimage component instead of the default one provided in the image.\n\nDefaults to an empty array, meaning use whatever is defined in the image.", - "type": "array", - "items": { - "type": "string" - } - }, - "cpuLimit": { - "type": "string" - }, - "cpuRequest": { - "type": "string" - }, - "dedicatedPod": { - "description": "Specify if a container should run in its own separated pod, instead of running as part of the main development environment pod.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "env": { - "description": "Environment variables used in this container.\n\nThe following variables are reserved and cannot be overridden via env:\n\n - `$PROJECTS_ROOT`\n\n - `$PROJECT_SOURCE`", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "image": { - "type": "string" - }, - "memoryLimit": { - "type": "string" - }, - "memoryRequest": { - "type": "string" - }, - "mountSources": { - "description": "Toggles whether or not the project source code should be mounted in the component.\n\nDefaults to true for all component types except plugins and components that set `dedicatedPod` to true.", - "type": "boolean" - }, - "sourceMapping": { - "description": "Optional specification of the path in the container where project sources should be transferred/mounted when `mountSources` is `true`. When omitted, the default value of /projects is used.", - "type": "string" - }, - "volumeMounts": { - "description": "List of volumes mounts that should be mounted is this container.", - "type": "array", - "items": { - "description": "Volume that should be mounted to a component container", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The volume mount name is the name of an existing `Volume` component. If several containers mount the same volume name then they will reuse the same volume and will be able to access to the same files.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "The path in the component container where the volume should be mounted. If not path is mentioned, default path is the is `/\u003cname\u003e`.", - "type": "string" - } - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "image": { - "description": "Allows specifying the definition of an image for outer loop builds", - "type": "object", - "oneOf": [ - { - "required": [ - "dockerfile" - ] - }, - { - "required": [ - "autoBuild" - ] - } - ], - "properties": { - "autoBuild": { - "description": "Defines if the image should be built during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "dockerfile": { - "description": "Allows specifying dockerfile type build", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "devfileRegistry" - ] - }, - { - "required": [ - "git" - ] - } - ], - "properties": { - "args": { - "description": "The arguments to supply to the dockerfile build.", - "type": "array", - "items": { - "type": "string" - } - }, - "buildContext": { - "description": "Path of source directory to establish build context. Defaults to ${PROJECT_SOURCE} in the container", - "type": "string" - }, - "devfileRegistry": { - "description": "Dockerfile's Devfile Registry source", - "type": "object", - "properties": { - "id": { - "description": "Id in a devfile registry that contains a Dockerfile. The src in the OCI registry required for the Dockerfile build will be downloaded for building the image.", - "type": "string" - }, - "registryUrl": { - "description": "Devfile Registry URL to pull the Dockerfile from when using the Devfile Registry as Dockerfile src. To ensure the Dockerfile gets resolved consistently in different environments, it is recommended to always specify the `devfileRegistryUrl` when `Id` is used.", - "type": "string" - } - }, - "additionalProperties": false - }, - "git": { - "description": "Dockerfile's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "fileLocation": { - "description": "Location of the Dockerfile in the Git repository when using git as Dockerfile src. Defaults to Dockerfile.", - "type": "string" - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "rootRequired": { - "description": "Specify if a privileged builder pod is required.\n\nDefault value is `false`", - "type": "boolean" - }, - "uri": { - "description": "URI Reference of a Dockerfile. It can be a full URL or a relative URI from the current devfile as the base URI.", - "type": "string" - } - }, - "additionalProperties": false - }, - "imageName": { - "description": "Name of the image for the resulting outerloop build", - "type": "string" - } - }, - "additionalProperties": false - }, - "kubernetes": { - "description": "Allows importing into the devworkspace the Kubernetes resources defined in a given manifest. For example this allows reusing the Kubernetes definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name": { - "description": "Mandatory name that allows referencing the component from other elements (such as commands) or from an external devfile that may reference this component through a parent or a plugin.", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "openshift": { - "description": "Allows importing into the devworkspace the OpenShift resources defined in a given manifest. For example this allows reusing the OpenShift definitions used to deploy some runtime components in production.", - "type": "object", - "oneOf": [ - { - "required": [ - "uri" - ] - }, - { - "required": [ - "inlined" - ] - } - ], - "properties": { - "deployByDefault": { - "description": "Defines if the component should be deployed during startup.\n\nDefault value is `false`", - "type": "boolean" - }, - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "annotation": { - "description": "Annotations to be added to Kubernetes Ingress or Openshift Route", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "attributes": { - "description": "Map of implementation-dependant string-based free-form attributes.\n\nExamples of Che-specific attributes:\n- cookiesAuthEnabled: \"true\" / \"false\",\n- type: \"terminal\" / \"ide\" / \"ide-dev\",", - "type": "object", - "additionalProperties": true - }, - "exposure": { - "description": "Describes how the endpoint should be exposed on the network.\n- `public` means that the endpoint will be exposed on the public network, typically through a K8S ingress or an OpenShift route.\n- `internal` means that the endpoint will be exposed internally outside of the main devworkspace POD, typically by K8S services, to be consumed by other elements running on the same cloud internal network.\n- `none` means that the endpoint will not be exposed and will only be accessible inside the main devworkspace POD, on a local address.\n\nDefault value is `public`", - "type": "string", - "enum": [ - "public", - "internal", - "none" - ] - }, - "name": { - "type": "string", - "maxLength": 15, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "path": { - "description": "Path of the endpoint URL", - "type": "string" - }, - "protocol": { - "description": "Describes the application and transport protocols of the traffic that will go through this endpoint.\n- `http`: Endpoint will have `http` traffic, typically on a TCP connection. It will be automaticaly promoted to `https` when the `secure` field is set to `true`.\n- `https`: Endpoint will have `https` traffic, typically on a TCP connection.\n- `ws`: Endpoint will have `ws` traffic, typically on a TCP connection. It will be automaticaly promoted to `wss` when the `secure` field is set to `true`.\n- `wss`: Endpoint will have `wss` traffic, typically on a TCP connection.\n- `tcp`: Endpoint will have traffic on a TCP connection, without specifying an application protocol.\n- `udp`: Endpoint will have traffic on an UDP connection, without specifying an application protocol.\n\nDefault value is `http`", - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss", - "tcp", - "udp" - ] - }, - "secure": { - "description": "Describes whether the endpoint should be secured and protected by some authentication process. This requires a protocol of `https` or `wss`.", - "type": "boolean" - }, - "targetPort": { - "description": "Port number to be used within the container component. The same port cannot be used by two different container components.", - "type": "integer" - } - }, - "additionalProperties": false - } - }, - "inlined": { - "description": "Inlined manifest", - "type": "string" - }, - "uri": { - "description": "Location in a file fetched from a uri.", - "type": "string" - } - }, - "additionalProperties": false - }, - "volume": { - "description": "Allows specifying the definition of a volume shared by several other components", - "type": "object", - "properties": { - "ephemeral": { - "description": "Ephemeral volumes are not stored persistently across restarts. Defaults to false", - "type": "boolean" - }, - "size": { - "description": "Size of the volume", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "dependentProjects": { - "description": "Overrides of dependentProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "id": { - "description": "Id in a registry that contains a Devfile yaml file", - "type": "string" - }, - "kubernetes": { - "description": "Reference to a Kubernetes CRD of type DevWorkspaceTemplate", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Overrides of projects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "registryUrl": { - "description": "Registry URL to pull the parent devfile from when using id in the parent reference. To ensure the parent devfile gets resolved consistently in different environments, it is recommended to always specify the `registryUrl` when `id` is used.", - "type": "string" - }, - "starterProjects": { - "description": "Overrides of starterProjects encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "uri": { - "description": "URI Reference of a parent devfile YAML file. It can be a full URL or a relative URI with the current devfile as the base URI.", - "type": "string" - }, - "variables": { - "description": "Overrides of variables encapsulated in a parent devfile. Overriding is done according to K8S strategic merge patch standard rules.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "version": { - "description": "Specific stack/sample version to pull the parent devfile from, when using id in the parent reference. To specify `version`, `id` must be defined and used as the import reference source. `version` can be either a specific stack version, or `latest`. If no `version` specified, default version will be used.", - "type": "string", - "pattern": "^(latest)|(([1-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?)$" - } - }, - "additionalProperties": false - }, - "projects": { - "description": "Projects worked on in the devworkspace, containing names and sources locations", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "clonePath": { - "description": "Path relative to the root of the projects to which this project should be cloned into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it is absolute or tries to escape the project root through the usage of '..'. If not specified, defaults to the project name.", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "schemaVersion": { - "description": "Devfile schema version", - "type": "string", - "pattern": "^([2-9])\\.([0-9]+)\\.([0-9]+)(\\-[0-9a-z-]+(\\.[0-9a-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" - }, - "starterProjects": { - "description": "StarterProjects is a project that can be used as a starting point when bootstrapping new projects", - "type": "array", - "items": { - "type": "object", - "required": [ - "name" - ], - "oneOf": [ - { - "required": [ - "git" - ] - }, - { - "required": [ - "zip" - ] - } - ], - "properties": { - "attributes": { - "description": "Map of implementation-dependant free-form YAML attributes.", - "type": "object", - "additionalProperties": true - }, - "description": { - "description": "Description of a starter project", - "type": "string" - }, - "git": { - "description": "Project's Git source", - "type": "object", - "required": [ - "remotes" - ], - "properties": { - "checkoutFrom": { - "description": "Defines from what the project should be checked out. Required if there are more than one remote configured", - "type": "object", - "properties": { - "remote": { - "description": "The remote name should be used as init. Required if there are more than one remote configured", - "type": "string" - }, - "revision": { - "description": "The revision to checkout from. Should be branch name, tag or commit id. Default branch is used if missing or specified revision is not found.", - "type": "string" - } - }, - "additionalProperties": false - }, - "remotes": { - "description": "The remotes map which should be initialized in the git project. Projects must have at least one remote configured while StarterProjects \u0026 Image Component's Git source can only have at most one remote configured.", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "name": { - "description": "Project name", - "type": "string", - "maxLength": 63, - "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" - }, - "subDir": { - "description": "Sub-directory from a starter project to be used as root for starter project.", - "type": "string" - }, - "zip": { - "description": "Project's Zip source", - "type": "object", - "properties": { - "location": { - "description": "Zip project's source location address. Should be file path of the archive, e.g. file://$FILE_PATH", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "variables": { - "description": "Map of key-value variables used for string replacement in the devfile. Values can be referenced via {{variable-key}} to replace the corresponding value in string fields in the devfile. Replacement cannot be used for\n\n - schemaVersion, metadata, parent source\n\n - element identifiers, e.g. command id, component name, endpoint name, project name\n\n - references to identifiers, e.g. in events, a command's component, container's volume mount name\n\n - string enums, e.g. command group kind, endpoint exposure", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false -} diff --git a/tools/devworkspace-generator/src/devfile-schema/devfile-schema-module.ts b/tools/devworkspace-generator/src/devfile-schema/devfile-schema-module.ts deleted file mode 100644 index d45f88848..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/devfile-schema-module.ts +++ /dev/null @@ -1,18 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { DevfileSchemaValidator } from './devfile-schema-validator'; - -const devfileSchemaModule = new ContainerModule((bind: interfaces.Bind) => { - bind(DevfileSchemaValidator).toSelf().inSingletonScope(); -}); - -export { devfileSchemaModule }; diff --git a/tools/devworkspace-generator/src/devfile-schema/devfile-schema-validator.ts b/tools/devworkspace-generator/src/devfile-schema/devfile-schema-validator.ts deleted file mode 100644 index 0cb0f068c..000000000 --- a/tools/devworkspace-generator/src/devfile-schema/devfile-schema-validator.ts +++ /dev/null @@ -1,49 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { injectable } from 'inversify'; - -import * as devfileSchemaV200 from './2.0.0/devfile.json'; -import * as devfileSchemaV210 from './2.1.0/devfile.json'; -import * as devfileSchemaV220 from './2.2.0/devfile.json'; -import * as devfileSchemaV221 from './2.2.1/devfile.json'; -import * as devfileSchemaV222 from './2.2.2/devfile.json'; -import * as devfileSchemaV230 from './2.3.0/devfile.json'; -import * as Validator from 'jsonschema'; -import { DevfileSchemaVersion } from '../api/devfile-context'; - -@injectable() -export class DevfileSchemaValidator { - getDevfileSchema(version: string) { - switch (version) { - case DevfileSchemaVersion.V200: - return devfileSchemaV200; - case DevfileSchemaVersion.V210: - return devfileSchemaV210; - case DevfileSchemaVersion.V220: - return devfileSchemaV220; - case DevfileSchemaVersion.V221: - return devfileSchemaV221; - case DevfileSchemaVersion.V222: - return devfileSchemaV222; - case DevfileSchemaVersion.V230: - return devfileSchemaV230; - default: - throw new Error(`Dev Workspace generator tool doesn't support devfile version: ${version}`); - } - } - - // Validates devfile against schema - validateDevfile(devfile: any, version: string) { - const schema = this.getDevfileSchema(version); - const validatorResult = Validator.validate(devfile, schema, { nestedErrors: true }); - - return validatorResult; - } -} diff --git a/tools/devworkspace-generator/src/devfile/dev-container-component-finder.ts b/tools/devworkspace-generator/src/devfile/dev-container-component-finder.ts deleted file mode 100644 index 98891f28a..000000000 --- a/tools/devworkspace-generator/src/devfile/dev-container-component-finder.ts +++ /dev/null @@ -1,62 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { DevfileContext } from '../api/devfile-context'; -import { V1alpha2DevWorkspaceSpecTemplateComponents } from '@devfile/api'; -import { inject, injectable } from 'inversify'; -import { DevContainerComponentInserter } from './dev-container-component-inserter'; - -/** - * Need to find dev container from main dev workspace - */ -@injectable() -export class DevContainerComponentFinder { - @inject(DevContainerComponentInserter) - private devContainerComponentInserter: DevContainerComponentInserter; - - async find( - devfileContext: DevfileContext, - injectDefaultComponent?: string, - defaultComponentImage?: string - ): Promise { - // if a devfile contains a parent, we should not add a default dev container - if (devfileContext.devfile?.parent) { - return undefined; - } - // search in main devWorkspace - const devComponents = devfileContext.devWorkspace.spec?.template?.components - ?.filter(component => component.container) - .filter( - // we should ignore component that do not mount the sources - component => component.container && component.container.mountSources !== false - ); - - if (!devComponents || devComponents.length === 0) { - // do not inject a default component if injectDefaultComponent parameter is false - if (!injectDefaultComponent || injectDefaultComponent !== 'true') { - return undefined; - } - this.devContainerComponentInserter.insert(devfileContext, defaultComponentImage); - - let devComponents = devfileContext.devWorkspace.spec.template.components.filter(component => component.container); - - return devComponents[0]; - } else if (devComponents.length === 1) { - return devComponents[0]; - } else { - console.warn( - `More than one dev container component has been potentially found, taking the first one of ${devComponents.map( - component => component.name - )}` - ); - return devComponents[0]; - } - } -} diff --git a/tools/devworkspace-generator/src/devfile/dev-container-component-inserter.ts b/tools/devworkspace-generator/src/devfile/dev-container-component-inserter.ts deleted file mode 100644 index 7ea59f00b..000000000 --- a/tools/devworkspace-generator/src/devfile/dev-container-component-inserter.ts +++ /dev/null @@ -1,49 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { DevfileContext } from '../api/devfile-context'; -import { V1alpha2DevWorkspaceSpecTemplateComponents } from '@devfile/api'; -import { injectable } from 'inversify'; - -/** - * Adds a new component on empty devfile with specific name and image - */ -@injectable() -export class DevContainerComponentInserter { - readonly DEFAULT_DEV_CONTAINER_IMAGE = 'quay.io/devfile/universal-developer-image:ubi8-latest'; - readonly DEFAULT_DEV_CONTAINER_NAME = 'dev'; - - async insert(devfileContext: DevfileContext, defaultComponentImage?: string): Promise { - if (!devfileContext.devWorkspace.spec) { - devfileContext.devWorkspace.spec = { - started: true, - }; - } - if (!devfileContext.devWorkspace.spec.template) { - devfileContext.devWorkspace.spec.template = {}; - } - if (!devfileContext.devWorkspace.spec.template.components) { - devfileContext.devWorkspace.spec.template.components = []; - } - - const devContainerImage = defaultComponentImage ? defaultComponentImage : this.DEFAULT_DEV_CONTAINER_IMAGE; - console.log( - `No container component has been found. A default container component with image ${devContainerImage} will be added.` - ); - const devContainerComponent: V1alpha2DevWorkspaceSpecTemplateComponents = { - name: this.DEFAULT_DEV_CONTAINER_NAME, - container: { - image: devContainerImage, - }, - }; - - devfileContext.devWorkspace.spec.template.components.push(devContainerComponent); - } -} diff --git a/tools/devworkspace-generator/src/devfile/devfile-module.ts b/tools/devworkspace-generator/src/devfile/devfile-module.ts deleted file mode 100644 index 80d48b6ea..000000000 --- a/tools/devworkspace-generator/src/devfile/devfile-module.ts +++ /dev/null @@ -1,20 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { DevContainerComponentFinder } from './dev-container-component-finder'; -import { DevContainerComponentInserter } from './dev-container-component-inserter'; - -const devfileModule = new ContainerModule((bind: interfaces.Bind) => { - bind(DevContainerComponentFinder).toSelf().inSingletonScope(); - bind(DevContainerComponentInserter).toSelf().inSingletonScope(); -}); - -export { devfileModule }; diff --git a/tools/devworkspace-generator/src/entrypoint.ts b/tools/devworkspace-generator/src/entrypoint.ts deleted file mode 100644 index 15fe41c71..000000000 --- a/tools/devworkspace-generator/src/entrypoint.ts +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env node -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import 'reflect-metadata'; - -import { Main } from './main'; - -(async (): Promise => { - const main = new Main(); - const success = await main.start(); - if (!success) { - process.exit(1); - } -})(); diff --git a/tools/devworkspace-generator/src/fetch/fetch-module.ts b/tools/devworkspace-generator/src/fetch/fetch-module.ts deleted file mode 100644 index 467edabad..000000000 --- a/tools/devworkspace-generator/src/fetch/fetch-module.ts +++ /dev/null @@ -1,18 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { UrlFetcher } from './url-fetcher'; - -const fetchModule = new ContainerModule((bind: interfaces.Bind) => { - bind(UrlFetcher).toSelf().inSingletonScope(); -}); - -export { fetchModule }; diff --git a/tools/devworkspace-generator/src/fetch/url-fetcher.ts b/tools/devworkspace-generator/src/fetch/url-fetcher.ts deleted file mode 100644 index 3ad245260..000000000 --- a/tools/devworkspace-generator/src/fetch/url-fetcher.ts +++ /dev/null @@ -1,49 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { inject, injectable } from 'inversify'; - -import { AxiosInstance } from 'axios'; - -/** - * Allow to grab external content - * if browser support is enabled, it will update URLs to make them work on browser side. - */ -@injectable() -export class UrlFetcher { - // Can't use AxiosInstance interface there - @inject(Symbol.for('AxiosInstance')) - private axiosInstance: AxiosInstance; - - // fetch content optionally, if the URL is not found, we return undefined without throwing errors - async fetchTextOptionalContent(url: string): Promise { - try { - const response = await this.axiosInstance.get(url, { - responseType: 'text', - }); - return response.data; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - // not found then we return undefined - if (error.response && error.response.status === 404) { - return undefined; - } - throw error; - } - } - - // fetch content - async fetchText(url: string): Promise { - const response = await this.axiosInstance.get(url, { - responseType: 'text', - }); - return response.data; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } -} diff --git a/tools/devworkspace-generator/src/generate.ts b/tools/devworkspace-generator/src/generate.ts deleted file mode 100644 index 17ef13cf3..000000000 --- a/tools/devworkspace-generator/src/generate.ts +++ /dev/null @@ -1,157 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { - V222Devfile, - V222DevfileMetadata, - V1alpha2DevWorkspace, - V1alpha2DevWorkspaceMetadata, - V1alpha2DevWorkspaceSpecContributions, - V1alpha2DevWorkspaceTemplate, - V1alpha2DevWorkspaceTemplateSpec, -} from '@devfile/api'; -import { injectable, inject } from 'inversify'; -import * as jsYaml from 'js-yaml'; -import * as fs from 'fs-extra'; -import { DevfileContext } from './api/devfile-context'; -import { DevContainerComponentFinder } from './devfile/dev-container-component-finder'; - -type DevfileLike = V222Devfile & { - metadata: V222DevfileMetadata & { - generateName?: string; - }; -}; - -@injectable() -export class Generate { - @inject(DevContainerComponentFinder) - private devContainerComponentFinder: DevContainerComponentFinder; - - async generate( - devfileContent: string, - editorContent: string, - outputFile?: string, - injectDefaultComponent?: string, - defaultComponentImage?: string - ): Promise { - const context = await this.generateContent( - devfileContent, - editorContent, - injectDefaultComponent, - defaultComponentImage - ); - - // write the result - if (outputFile) { - // write templates and then DevWorkspace in a single file - const allContentArray = context.devWorkspaceTemplates.map(template => jsYaml.dump(template)); - allContentArray.push(jsYaml.dump(context.devWorkspace)); - - const generatedContent = allContentArray.join('---\n'); - - await fs.writeFile(outputFile, generatedContent, 'utf-8'); - } - - console.log(`DevWorkspace ${context.devWorkspaceTemplates[0].metadata.name} was generated`); - return context; - } - - async generateContent( - devfileContent: string, - editorContent: string, - injectDefaultComponent?: string, - defaultComponentImage?: string - ): Promise { - const devfile = jsYaml.load(devfileContent); - - // sets the suffix to the devfile name - const suffix = devfile.metadata.name || ''; - - // devfile of the editor - const editorDevfile = jsYaml.load(editorContent); - - // transform it into a devWorkspace template - const metadata = this.createDevWorkspaceMetadata(editorDevfile); - // add sufix - metadata.name = `${metadata.name}-${suffix}`; - delete editorDevfile.metadata; - delete editorDevfile.schemaVersion; - const editorDevWorkspaceTemplate: V1alpha2DevWorkspaceTemplate = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspaceTemplate', - metadata, - spec: editorDevfile as V1alpha2DevWorkspaceTemplateSpec, - }; - - // transform it into a devWorkspace - const devfileMetadata = this.createDevWorkspaceMetadata(devfile, true); - const devfileCopy: V222Devfile = Object.assign({}, devfile); - delete devfileCopy.schemaVersion; - delete devfileCopy.metadata; - const editorSpecContribution: V1alpha2DevWorkspaceSpecContributions = { - name: 'editor', - kubernetes: { - name: editorDevWorkspaceTemplate.metadata.name, - }, - }; - const devWorkspace: V1alpha2DevWorkspace = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspace', - metadata: devfileMetadata, - spec: { - started: true, - routingClass: 'che', - template: devfileCopy, - contributions: [editorSpecContribution], - }, - }; - - // if the devfile has a starter project, we use it for the devWorkspace - if (devfileCopy.starterProjects && devfileCopy.starterProjects.length > 0) { - devWorkspace.spec.template.attributes = { - 'controller.devfile.io/use-starter-project': devfileCopy.starterProjects[0].name, - }; - } - - // for now the list of devWorkspace templates is only the editor template - const devWorkspaceTemplates = [editorDevWorkspaceTemplate]; - - const context = { - devfile, - devWorkspace, - devWorkspaceTemplates, - suffix, - }; - - // find devContainer component, add a default one if not found - await this.devContainerComponentFinder.find(context, injectDefaultComponent, defaultComponentImage); - - return context; - } - - private createDevWorkspaceMetadata(devfile: DevfileLike, addDevfileContent = false): V1alpha2DevWorkspaceMetadata { - const devWorkspaceMetadata = {} as V1alpha2DevWorkspaceMetadata; - const devfileMetadata = devfile.metadata; - - if (devfileMetadata.name) { - devWorkspaceMetadata.name = devfileMetadata.name; - } - if (devfileMetadata.generateName) { - devWorkspaceMetadata.generateName = devfileMetadata.generateName; - } - if (addDevfileContent) { - devWorkspaceMetadata.annotations = { - 'che.eclipse.org/devfile': jsYaml.dump(devfile), - }; - } - - return devWorkspaceMetadata; - } -} diff --git a/tools/devworkspace-generator/src/github/github-module.ts b/tools/devworkspace-generator/src/github/github-module.ts deleted file mode 100644 index 5003dfa8f..000000000 --- a/tools/devworkspace-generator/src/github/github-module.ts +++ /dev/null @@ -1,21 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { GithubResolver } from './github-resolver'; -import { TYPES } from '../types'; - -const { Resolver } = TYPES; - -const githubModule = new ContainerModule((bind: interfaces.Bind) => { - bind(Resolver).to(GithubResolver).inSingletonScope(); -}); - -export { githubModule }; diff --git a/tools/devworkspace-generator/src/github/github-resolver.ts b/tools/devworkspace-generator/src/github/github-resolver.ts deleted file mode 100644 index db348b8ab..000000000 --- a/tools/devworkspace-generator/src/github/github-resolver.ts +++ /dev/null @@ -1,49 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { GithubUrl } from './github-url'; -import { injectable } from 'inversify'; -import { Url } from '../resolve/url'; -import { Resolver } from '../resolve/resolver'; - -@injectable() -export class GithubResolver implements Resolver { - // eslint-disable-next-line max-len - static readonly GITHUB_URL_PATTERN = - /^(?https?):\/\/(?github(\..+)?\.[^\/]+)\/(?[^\/]+)\/(?[^\/]+)((\/)|\/(blob|tree)\/(?[^\/]+)(?:\/(?.*))?)?$/; - - isValid(url: string): boolean { - return GithubResolver.GITHUB_URL_PATTERN.test(url); - } - - resolve(link: string): Url { - const match = GithubResolver.GITHUB_URL_PATTERN.exec(link); - if (!match) { - throw new Error(`Invalid github URL: ${link}`); - } - const scheme = this.getGroup(match, 'scheme'); - const hostName = this.getGroup(match, 'host'); - const repoUser = this.getGroup(match, 'repoUser'); - let repoName = this.getGroup(match, 'repoName'); - if (/^[\w-][\w.-]*?\.git$/.test(repoName)) { - repoName = repoName.substring(0, repoName.length - 4); - } - const branchName = this.getGroup(match, 'branchName', 'HEAD'); - const subFolder = this.getGroup(match, 'subFolder'); - return new GithubUrl(scheme, hostName, repoUser, repoName, branchName, subFolder); - } - - private getGroup(match: RegExpExecArray, groupName: string, defaultValue?: string) { - if (match.groups && match.groups[groupName]) { - return match.groups[groupName]; - } - return defaultValue || ''; - } -} diff --git a/tools/devworkspace-generator/src/github/github-url.ts b/tools/devworkspace-generator/src/github/github-url.ts deleted file mode 100644 index 2b4f8507e..000000000 --- a/tools/devworkspace-generator/src/github/github-url.ts +++ /dev/null @@ -1,46 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { Url } from '../resolve/url'; - -export class GithubUrl implements Url { - constructor( - private readonly scheme: string, - private readonly hostName: string, - private readonly repoUser: string, - private readonly repoName: string, - private readonly branchName: string, - private readonly subFolder: string - ) {} - - /** - * Provides the raw link to the given path based on the current repository information - */ - getContentUrl(path: string): string { - const hostName = this.hostName === 'github.com' ? 'githubusercontent.com' : this.hostName; - return `${this.scheme}://raw.${hostName}/${this.repoUser}/${this.repoName}/${this.branchName}/${path}`; - } - - getUrl(): string { - return `${this.scheme}://${this.hostName}/${this.repoUser}/${this.repoName}/tree/${this.branchName}/${this.subFolder}`; - } - - getCloneUrl(): string { - return `${this.scheme}://${this.hostName}/${this.repoUser}/${this.repoName}.git`; - } - - getRepoName(): string { - return this.repoName; - } - - getBranchName(): string { - return this.branchName; - } -} diff --git a/tools/devworkspace-generator/src/inversify/inversify-binding.ts b/tools/devworkspace-generator/src/inversify/inversify-binding.ts deleted file mode 100644 index 47b176c8f..000000000 --- a/tools/devworkspace-generator/src/inversify/inversify-binding.ts +++ /dev/null @@ -1,54 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import 'reflect-metadata'; - -import { AxiosInstance } from 'axios'; -import { Container } from 'inversify'; -import { devfileModule } from '../devfile/devfile-module'; -import { fetchModule } from '../fetch/fetch-module'; -import { githubModule } from '../github/github-module'; -import { resolveModule } from '../resolve/resolve-module'; -import { pluginRegistryModule } from '../plugin-registry/plugin-registry-module'; -import { devfileSchemaModule } from '../devfile-schema/devfile-schema-module'; -import { bitbucketModule } from '../bitbucket/bitbucket-module'; -import { bitbucketServerModule } from '../bitbucket-server/bitbucket-server-module'; - -/** - * Manage all bindings for inversify - */ -export class InversifyBinding { - private container: Container; - - public async initBindings(options: InversifyBindingOptions): Promise { - this.container = new Container(); - - this.container.load(devfileModule); - this.container.load(fetchModule); - this.container.load(githubModule); - this.container.load(bitbucketModule); - this.container.load(bitbucketServerModule); - this.container.load(resolveModule); - this.container.load(pluginRegistryModule); - this.container.load(devfileSchemaModule); - - this.container.bind(Symbol.for('AxiosInstance')).toConstantValue(options.axiosInstance); - this.container.bind('string').toConstantValue(options.pluginRegistryUrl).whenTargetNamed('PLUGIN_REGISTRY_URL'); - - return this.container; - } -} - -/** - * Options for inversify bindings - */ -export interface InversifyBindingOptions { - pluginRegistryUrl: string; - axiosInstance: AxiosInstance; -} diff --git a/tools/devworkspace-generator/src/main.ts b/tools/devworkspace-generator/src/main.ts deleted file mode 100644 index b251560a9..000000000 --- a/tools/devworkspace-generator/src/main.ts +++ /dev/null @@ -1,250 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import * as axios from 'axios'; -import * as fs from 'fs-extra'; -import { Generate } from './generate'; -import { DevfileSchemaValidator } from './devfile-schema/devfile-schema-validator'; -import * as jsYaml from 'js-yaml'; -import { InversifyBinding } from './inversify/inversify-binding'; -import { UrlFetcher } from './fetch/url-fetcher'; -import { PluginRegistryResolver } from './plugin-registry/plugin-registry-resolver'; -import { V1alpha2DevWorkspaceSpecTemplate } from '@devfile/api'; -import { DevfileContext } from './api/devfile-context'; -import { GitUrlResolver } from './resolve/git-url-resolver'; -import { ValidatorResult } from 'jsonschema'; - -export class Main { - /** - * Default constructor. - */ - constructor() { - // no-op - } - // Generates a devfile context object based on params - public async generateDevfileContext( - params: { - devfilePath?: string; - devfileUrl?: string; - devfileContent?: string; - outputFile?: string; - editorPath?: string; - editorContent?: string; - editorEntry?: string; - pluginRegistryUrl?: string; - projects: { name: string; location: string }[]; - injectDefaultComponent?: string; - defaultComponentImage?: string; - }, - axiosInstance: axios.AxiosInstance - ): Promise { - if (!params.editorPath && !params.editorEntry && !params.editorContent) { - throw new Error('missing editorPath or editorEntry or editorContent'); - } - if (!params.devfilePath && !params.devfileUrl && !params.devfileContent) { - throw new Error('missing devfilePath or devfileUrl or devfileContent'); - } - - let pluginRegistryUrl: string; - - if (params.pluginRegistryUrl) { - pluginRegistryUrl = params.pluginRegistryUrl; - } else { - pluginRegistryUrl = 'https://eclipse-che.github.io/che-plugin-registry/main/v3'; - console.log(`No plug-in registry url. Setting to ${pluginRegistryUrl}`); - } - - const inversifyBinbding = new InversifyBinding(); - const container = await inversifyBinbding.initBindings({ - pluginRegistryUrl, - axiosInstance, - }); - container.bind(Generate).toSelf().inSingletonScope(); - - let devfileContent; - let editorContent; - - // gets the repo URL - if (params.devfileUrl) { - const resolver = container.get(GitUrlResolver); - const url = resolver.resolve(params.devfileUrl); - // user devfile - devfileContent = await container.get(UrlFetcher).fetchText(url.getContentUrl('devfile.yaml')); - - // load content - const devfileParsed = jsYaml.load(devfileContent); - - // is there projects in the devfile ? - if (devfileParsed && !devfileParsed.projects) { - // no, so add the current project being cloned - devfileParsed.projects = [ - { - name: url.getRepoName(), - git: { - remotes: { origin: url.getCloneUrl() }, - checkoutFrom: { revision: url.getBranchName() }, - }, - }, - ]; - } - // get back the content - devfileContent = jsYaml.dump(devfileParsed); - } else if (params.devfilePath) { - devfileContent = await fs.readFile(params.devfilePath); - } else { - devfileContent = params.devfileContent; - } - - const jsYamlDevfileContent = jsYaml.load(devfileContent); - const schemaVersion = jsYamlDevfileContent.schemaVersion; - if (!schemaVersion) { - throw new Error(`Devfile is not valid, schemaVersion is required`); - } - - // validate devfile - const devfileSchemaValidator = container.get(DevfileSchemaValidator); - console.log(`Validating devfile`); - const validationResult: ValidatorResult = devfileSchemaValidator.validateDevfile( - jsYamlDevfileContent, - schemaVersion - ); - if (!validationResult.valid) { - throw new Error(`Devfile schema validation failed. Error: ${validationResult.toString()}`); - } - console.log(`Devfile is valid with schema version ${schemaVersion}`); - - // enhance projects - devfileContent = this.replaceIfExistingProjects(devfileContent, params.projects); - - if (params.editorContent) { - editorContent = params.editorContent; - } else if (params.editorEntry) { - // devfile of the editor - const editorDevfile = await container.get(PluginRegistryResolver).loadDevfilePlugin(params.editorEntry); - editorContent = jsYaml.dump(editorDevfile); - } else { - editorContent = await fs.readFile(params.editorPath); - } - - const generate = container.get(Generate); - return generate.generate( - devfileContent, - editorContent, - params.outputFile, - params.injectDefaultComponent, - params.defaultComponentImage - ); - } - - // Update project entry based on the projects passed as parameter - public replaceIfExistingProjects(devfileContent: string, projects: { name: string; location: string }[]): string { - // do nothing if no override - if (projects.length === 0) { - return devfileContent; - } - const devfileParsed: V1alpha2DevWorkspaceSpecTemplate = jsYaml.load(devfileContent); - - if (!devfileParsed || !devfileParsed.projects) { - return devfileContent; - } - devfileParsed.projects = devfileParsed.projects.map(project => { - const userProjectConfiguration = projects.find(p => p.name === project.name); - if (userProjectConfiguration) { - if (userProjectConfiguration.location.endsWith('.zip')) { - // delete git section and use instead zip - delete project.git; - project.zip = { location: userProjectConfiguration.location }; - } else { - project.git.remotes.origin = userProjectConfiguration.location; - } - } - return project; - }); - return jsYaml.dump(devfileParsed); - } - - async start(): Promise { - let devfilePath: string | undefined; - let devfileUrl: string | undefined; - let outputFile: string | undefined; - let editorPath: string | undefined; - let pluginRegistryUrl: string | undefined; - let editorEntry: string | undefined; - let injectDefaultComponent: string | undefined; - let defaultComponentImage: string | undefined; - const projects: { name: string; location: string }[] = []; - - const args = process.argv.slice(2); - args.forEach(arg => { - if (arg.startsWith('--devfile-path:')) { - devfilePath = arg.substring('--devfile-path:'.length); - } - if (arg.startsWith('--devfile-url:')) { - devfileUrl = arg.substring('--devfile-url:'.length); - } - if (arg.startsWith('--plugin-registry-url:')) { - pluginRegistryUrl = arg.substring('--plugin-registry-url:'.length); - } - if (arg.startsWith('--editor-entry:')) { - editorEntry = arg.substring('--editor-entry:'.length); - } - if (arg.startsWith('--editor-path:')) { - editorPath = arg.substring('--editor-path:'.length); - } - if (arg.startsWith('--output-file:')) { - outputFile = arg.substring('--output-file:'.length); - } - if (arg.startsWith('--project.')) { - const name = arg.substring('--project.'.length, arg.indexOf('=')); - let location = arg.substring(arg.indexOf('=') + 1); - location = location.replace('{{_INTERNAL_URL_}}', '{{ INTERNAL_URL }}'); - - projects.push({ name, location }); - } - if (arg.startsWith('--injectDefaultComponent:')) { - injectDefaultComponent = arg.substring('--injectDefaultComponent:'.length); - } - if (arg.startsWith('--defaultComponentImage:')) { - defaultComponentImage = arg.substring('--defaultComponentImage:'.length); - } - }); - - try { - if (!editorPath && !editorEntry) { - throw new Error('missing --editor-path: or --editor-entry: parameter'); - } - if (!devfilePath && !devfileUrl) { - throw new Error('missing --devfile-path: or --devfile-url: parameter'); - } - if (!outputFile) { - throw new Error('missing --output-file: parameter'); - } - await this.generateDevfileContext( - { - devfilePath, - devfileUrl, - editorPath, - outputFile, - pluginRegistryUrl, - editorEntry, - projects, - injectDefaultComponent, - defaultComponentImage, - }, - axios.default - ); - return true; - } catch (error) { - console.error('stack=' + error.stack); - console.error('Unable to start', error); - return false; - } - } -} diff --git a/tools/devworkspace-generator/src/plugin-registry/plugin-registry-module.ts b/tools/devworkspace-generator/src/plugin-registry/plugin-registry-module.ts deleted file mode 100644 index f43eaab46..000000000 --- a/tools/devworkspace-generator/src/plugin-registry/plugin-registry-module.ts +++ /dev/null @@ -1,18 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { PluginRegistryResolver } from './plugin-registry-resolver'; - -const pluginRegistryModule = new ContainerModule((bind: interfaces.Bind) => { - bind(PluginRegistryResolver).toSelf().inSingletonScope(); -}); - -export { pluginRegistryModule }; diff --git a/tools/devworkspace-generator/src/plugin-registry/plugin-registry-resolver.ts b/tools/devworkspace-generator/src/plugin-registry/plugin-registry-resolver.ts deleted file mode 100644 index 6862277f5..000000000 --- a/tools/devworkspace-generator/src/plugin-registry/plugin-registry-resolver.ts +++ /dev/null @@ -1,36 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import * as jsYaml from 'js-yaml'; - -import { inject, injectable, named } from 'inversify'; - -import { UrlFetcher } from '../fetch/url-fetcher'; - -/** - * Resolve plug-ins by grabbing the definition from the plug-in registry. - */ -@injectable() -export class PluginRegistryResolver { - @inject('string') - @named('PLUGIN_REGISTRY_URL') - private pluginRegistryUrl: string; - - @inject(UrlFetcher) - private urlFetcher: UrlFetcher; - - // FQN id (like che-incubator/che-code/next) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async loadDevfilePlugin(devfileId: string): Promise { - const devfileUrl = `${this.pluginRegistryUrl}/plugins/${devfileId}/devfile.yaml`; - const devfileContent = await this.urlFetcher.fetchText(devfileUrl); - return jsYaml.load(devfileContent); - } -} diff --git a/tools/devworkspace-generator/src/resolve/git-url-resolver.ts b/tools/devworkspace-generator/src/resolve/git-url-resolver.ts deleted file mode 100644 index 76804f4fd..000000000 --- a/tools/devworkspace-generator/src/resolve/git-url-resolver.ts +++ /dev/null @@ -1,30 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { injectable, multiInject } from 'inversify'; -import { Url } from './url'; -import { TYPES } from '../types'; -import { Resolver } from './resolver'; - -const { Resolver } = TYPES; - -@injectable() -export class GitUrlResolver { - @multiInject(Resolver) - private resolvers: Resolver[]; - - resolve(link: string): Url { - const resolver = this.resolvers.find(r => r.isValid(link)); - if (resolver) { - return resolver.resolve(link); - } else { - throw new Error('Can not resolver the URL'); - } - } -} diff --git a/tools/devworkspace-generator/src/resolve/resolve-module.ts b/tools/devworkspace-generator/src/resolve/resolve-module.ts deleted file mode 100644 index 82a237d76..000000000 --- a/tools/devworkspace-generator/src/resolve/resolve-module.ts +++ /dev/null @@ -1,18 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import { ContainerModule, interfaces } from 'inversify'; - -import { GitUrlResolver } from './git-url-resolver'; - -const resolveModule = new ContainerModule((bind: interfaces.Bind) => { - bind(GitUrlResolver).toSelf().inSingletonScope(); -}); - -export { resolveModule }; diff --git a/tools/devworkspace-generator/src/resolve/resolver.ts b/tools/devworkspace-generator/src/resolve/resolver.ts deleted file mode 100644 index 3b2cfa636..000000000 --- a/tools/devworkspace-generator/src/resolve/resolver.ts +++ /dev/null @@ -1,25 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import { Url } from './url'; - -export interface Resolver { - /** - * Validates the string url for belonging to a specific Git provider. - * @param url string representation of Url. - */ - isValid(url: string): boolean; - - /** - * Resolves repository string URL to a {@class Url} object. - * @param url string representation of Url. - */ - resolve(url: string): Url; -} diff --git a/tools/devworkspace-generator/src/resolve/url.ts b/tools/devworkspace-generator/src/resolve/url.ts deleted file mode 100644 index 72d320ac2..000000000 --- a/tools/devworkspace-generator/src/resolve/url.ts +++ /dev/null @@ -1,40 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -/** - * Url object - */ -export interface Url { - /** - * Provides RAW file content url - * @param path file path - */ - getContentUrl(path: string); - - /** - * Provides repositories Url - */ - getUrl(): string; - - /** - * Provides Git clone url - */ - getCloneUrl(): string; - - /** - * Provides repository name - */ - getRepoName(): string; - - /** - * Provides branch name if initialised. - */ - getBranchName(): string; -} diff --git a/tools/devworkspace-generator/src/types.ts b/tools/devworkspace-generator/src/types.ts deleted file mode 100644 index 800f65e81..000000000 --- a/tools/devworkspace-generator/src/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -const TYPES = { - Resolver: Symbol.for('Resolver'), -}; - -export { TYPES }; diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.0.0/ansible-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.0.0/ansible-devfile.yaml deleted file mode 100644 index bbac185e8..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.0.0/ansible-devfile.yaml +++ /dev/null @@ -1,50 +0,0 @@ -schemaVersion: 2.0.0 -metadata: - name: ansible-demo - namespace: svor-che -projects: - - name: ansible-devspaces-demo - git: - remotes: - origin: https://github.com/svor/ansible-devspaces-demo.git - checkoutFrom: - revision: sv-test-pr-with-new-ee-image -components: - - name: tooling-container - container: - image: quay.io/vsvydenk/ansible-creator-ee:base20 - memoryLimit: 6Gi - args: - - tail - - '-f' - - /dev/null -commands: - - id: oc-install - exec: - commandLine: /usr/local/bin/ansible-playbook ${PROJECT_SOURCE}/playbooks/install_oc.yml - workingDir: ${PROJECT_SOURCE} - group: - kind: build - isDefault: true - component: tooling-container - - id: molecule-test - exec: - label: 'Molecule: Run Scenario for Backup Role' - commandLine: source $HOME/.bashrc && molecule test - workingDir: ${PROJECTS_ROOT}/ansible-devspaces-demo/collections/example/collection/roles/backup_file - group: - kind: run - isDefault: true - component: tooling-container - - id: molecule-verify - exec: - label: 'Molecule: Validate Backup File Role' - commandLine: source $HOME/.bashrc && molecule verify - workingDir: ${PROJECTS_ROOT}/ansible-devspaces-demo/collections/example/collection/roles/backup_file - group: - kind: run - isDefault: true - component: tooling-container -events: - postStart: - - oc-install diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.0.0/empty-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.0.0/empty-devfile.yaml deleted file mode 100644 index e9f2bfae3..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.0.0/empty-devfile.yaml +++ /dev/null @@ -1,8 +0,0 @@ -schemaVersion: 2.0.0 -metadata: - name: empty - namespace: svor-che -components: - - name: universal-developer-image - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.0.0/quarkus-api-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.0.0/quarkus-api-devfile.yaml deleted file mode 100644 index 71f643c3b..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.0.0/quarkus-api-devfile.yaml +++ /dev/null @@ -1,103 +0,0 @@ -schemaVersion: 2.0.0 -metadata: - generateName: quarkus-api-example -components: - - name: tools - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest - env: - - name: QUARKUS_HTTP_HOST - value: 0.0.0.0 - endpoints: - - exposure: none - name: debug - protocol: tcp - targetPort: 5005 - - exposure: public - name: list-all-food - protocol: http - targetPort: 8080 - path: /food - volumeMounts: - - name: m2 - path: /home/user/.m2 - memoryLimit: 6G - mountSources: true - - - name: postgresql - container: - image: 'quay.io/centos7/postgresql-13-centos7@sha256:994f5c622e2913bda1c4a7fa3b0c7e7f75e7caa3ac66ff1ed70ccfe65c40dd75' - env: - - name: POSTGRESQL_USER - value: user - - name: POSTGRESQL_PASSWORD - value: password - - name: POSTGRESQL_DATABASE - value: food_db - - name: PGDATA - value: /tmp/pgdata - - name: m2 - volume: - size: 1G -commands: - - id: package - exec: - label: "Package" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw clean package -DskipTests=true" - group: - kind: build - isDefault: true - - id: runtests - exec: - label: "Run Tests" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw test" - group: - kind: test - - id: packagenative - exec: - label: "Package Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw package -Dnative -Dmaven.test.skip -Dquarkus.native.native-image-xmx=3G" - group: - kind: build - - id: startdev - exec: - label: "Start Development mode (Hot reload + debug)" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw compile quarkus:dev" - group: - kind: run - isDefault: true - - id: startnative - exec: - label: "Start Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example/target - commandLine: "./quarkus-api-example-1.0.0-SNAPSHOT-runner" - group: - kind: run - - id: buildimage - exec: - label: "Build Image" - component: tools - workingDir: ${PROJECT_SOURCE} - commandLine: "podman build -f src/main/docker/Dockerfile.jvm -t quay.io/che-incubator/quarkus-api-example ." - group: - kind: build - - id: deploypostgres - exec: - label: "Deploy Postrgres" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "oc new-app -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=food_db postgresql:10-el7 -n demo" - group: - kind: test -events: - postStart: - - package diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.1.0/ansible-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.1.0/ansible-devfile.yaml deleted file mode 100644 index 83c28ef08..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.1.0/ansible-devfile.yaml +++ /dev/null @@ -1,53 +0,0 @@ -schemaVersion: 2.1.0 -metadata: - name: ansible-demo - namespace: svor-che -projects: - - name: ansible-devspaces-demo - git: - remotes: - origin: https://github.com/svor/ansible-devspaces-demo.git - checkoutFrom: - revision: sv-test-pr-with-new-ee-image -components: - - name: tooling-container - container: - image: quay.io/vsvydenk/ansible-creator-ee:base20 - memoryRequest: 256M - memoryLimit: 6Gi - cpuRequest: 250m - cpuLimit: 2000m - args: - - tail - - '-f' - - /dev/null -commands: - - id: oc-install - exec: - commandLine: /usr/local/bin/ansible-playbook ${PROJECT_SOURCE}/playbooks/install_oc.yml - workingDir: ${PROJECT_SOURCE} - group: - kind: build - isDefault: true - component: tooling-container - - id: molecule-test - exec: - label: 'Molecule: Run Scenario for Backup Role' - commandLine: source $HOME/.bashrc && molecule test - workingDir: ${PROJECTS_ROOT}/ansible-devspaces-demo/collections/example/collection/roles/backup_file - group: - kind: run - isDefault: true - component: tooling-container - - id: molecule-verify - exec: - label: 'Molecule: Validate Backup File Role' - commandLine: source $HOME/.bashrc && molecule verify - workingDir: ${PROJECTS_ROOT}/ansible-devspaces-demo/collections/example/collection/roles/backup_file - group: - kind: run - isDefault: true - component: tooling-container -events: - postStart: - - oc-install diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.1.0/empty-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.1.0/empty-devfile.yaml deleted file mode 100644 index 9a88323c6..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.1.0/empty-devfile.yaml +++ /dev/null @@ -1,8 +0,0 @@ -schemaVersion: 2.1.0 -metadata: - name: empty - namespace: svor-che -components: - - name: universal-developer-image - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.1.0/quarkus-api-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.1.0/quarkus-api-devfile.yaml deleted file mode 100644 index f22564549..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.1.0/quarkus-api-devfile.yaml +++ /dev/null @@ -1,108 +0,0 @@ -schemaVersion: 2.1.0 -metadata: - generateName: quarkus-api-example -attributes: - controller.devfile.io/storage-type: ephemeral -components: - - name: tools - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest - env: - - name: QUARKUS_HTTP_HOST - value: 0.0.0.0 - endpoints: - - exposure: none - name: debug - protocol: tcp - targetPort: 5005 - - exposure: public - name: list-all-food - protocol: http - targetPort: 8080 - path: /food - volumeMounts: - - name: m2 - path: /home/user/.m2 - memoryLimit: 6G - memoryRequest: 512Mi - cpuRequest: 1000m - cpuLimit: 4000m - mountSources: true - - - name: postgresql - container: - image: 'quay.io/centos7/postgresql-13-centos7@sha256:994f5c622e2913bda1c4a7fa3b0c7e7f75e7caa3ac66ff1ed70ccfe65c40dd75' - env: - - name: POSTGRESQL_USER - value: user - - name: POSTGRESQL_PASSWORD - value: password - - name: POSTGRESQL_DATABASE - value: food_db - - name: PGDATA - value: /tmp/pgdata - - name: m2 - volume: - size: 1G -commands: - - id: package - exec: - label: "Package" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw clean package -DskipTests=true" - group: - kind: build - isDefault: true - - id: runtests - exec: - label: "Run Tests" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw test" - group: - kind: test - - id: packagenative - exec: - label: "Package Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw package -Dnative -Dmaven.test.skip -Dquarkus.native.native-image-xmx=3G" - group: - kind: build - - id: startdev - exec: - label: "Start Development mode (Hot reload + debug)" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw compile quarkus:dev" - group: - kind: run - isDefault: true - - id: startnative - exec: - label: "Start Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example/target - commandLine: "./quarkus-api-example-1.0.0-SNAPSHOT-runner" - group: - kind: run - - id: buildimage - exec: - label: "Build Image" - component: tools - workingDir: ${PROJECT_SOURCE} - commandLine: "podman build -f src/main/docker/Dockerfile.jvm -t quay.io/che-incubator/quarkus-api-example ." - group: - kind: build - - id: deploypostgres - exec: - label: "Deploy Postrgres" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "oc new-app -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=food_db postgresql:10-el7 -n demo" - group: - kind: test -events: - postStart: - - package diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.2.0/ansible-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.2.0/ansible-devfile.yaml deleted file mode 100644 index b655d0e3c..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.2.0/ansible-devfile.yaml +++ /dev/null @@ -1,53 +0,0 @@ -schemaVersion: 2.2.0 -metadata: - name: ansible-demo - namespace: svor-che -projects: - - name: ansible-devspaces-demo - git: - remotes: - origin: https://github.com/svor/ansible-devspaces-demo.git - checkoutFrom: - revision: sv-test-pr-with-new-ee-image -components: - - name: tooling-container - container: - image: quay.io/vsvydenk/ansible-creator-ee:base20 - memoryRequest: 256M - memoryLimit: 6Gi - cpuRequest: 250m - cpuLimit: 2000m - args: - - tail - - '-f' - - /dev/null -commands: - - id: oc-install - exec: - commandLine: /usr/local/bin/ansible-playbook ${PROJECT_SOURCE}/playbooks/install_oc.yml - workingDir: ${PROJECT_SOURCE} - group: - kind: build - isDefault: true - component: tooling-container - - id: molecule-test - exec: - label: 'Molecule: Run Scenario for Backup Role' - commandLine: source $HOME/.bashrc && molecule test - workingDir: ${PROJECTS_ROOT}/ansible-devspaces-demo/collections/example/collection/roles/backup_file - group: - kind: run - isDefault: true - component: tooling-container - - id: molecule-verify - exec: - label: 'Molecule: Validate Backup File Role' - commandLine: source $HOME/.bashrc && molecule verify - workingDir: ${PROJECTS_ROOT}/ansible-devspaces-demo/collections/example/collection/roles/backup_file - group: - kind: run - isDefault: true - component: tooling-container -events: - postStart: - - oc-install diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.2.0/empty-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.2.0/empty-devfile.yaml deleted file mode 100644 index 63f88d1ee..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.2.0/empty-devfile.yaml +++ /dev/null @@ -1,8 +0,0 @@ -schemaVersion: 2.2.0 -metadata: - name: empty - namespace: svor-che -components: - - name: universal-developer-image - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.2.0/quarkus-api-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.2.0/quarkus-api-devfile.yaml deleted file mode 100644 index 86281ec42..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.2.0/quarkus-api-devfile.yaml +++ /dev/null @@ -1,108 +0,0 @@ -schemaVersion: 2.2.0 -metadata: - generateName: quarkus-api-example -attributes: - controller.devfile.io/storage-type: ephemeral -components: - - name: tools - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest - env: - - name: QUARKUS_HTTP_HOST - value: 0.0.0.0 - endpoints: - - exposure: none - name: debug - protocol: tcp - targetPort: 5005 - - exposure: public - name: list-all-food - protocol: http - targetPort: 8080 - path: /food - volumeMounts: - - name: m2 - path: /home/user/.m2 - memoryLimit: 6G - memoryRequest: 512Mi - cpuRequest: 1000m - cpuLimit: 4000m - mountSources: true - - - name: postgresql - container: - image: 'quay.io/centos7/postgresql-13-centos7@sha256:994f5c622e2913bda1c4a7fa3b0c7e7f75e7caa3ac66ff1ed70ccfe65c40dd75' - env: - - name: POSTGRESQL_USER - value: user - - name: POSTGRESQL_PASSWORD - value: password - - name: POSTGRESQL_DATABASE - value: food_db - - name: PGDATA - value: /tmp/pgdata - - name: m2 - volume: - size: 1G -commands: - - id: package - exec: - label: "Package" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw clean package -DskipTests=true" - group: - kind: build - isDefault: true - - id: runtests - exec: - label: "Run Tests" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw test" - group: - kind: test - - id: packagenative - exec: - label: "Package Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw package -Dnative -Dmaven.test.skip -Dquarkus.native.native-image-xmx=3G" - group: - kind: build - - id: startdev - exec: - label: "Start Development mode (Hot reload + debug)" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw compile quarkus:dev" - group: - kind: run - isDefault: true - - id: startnative - exec: - label: "Start Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example/target - commandLine: "./quarkus-api-example-1.0.0-SNAPSHOT-runner" - group: - kind: run - - id: buildimage - exec: - label: "Build Image" - component: tools - workingDir: ${PROJECT_SOURCE} - commandLine: "podman build -f src/main/docker/Dockerfile.jvm -t quay.io/che-incubator/quarkus-api-example ." - group: - kind: build - - id: deploypostgres - exec: - label: "Deploy Postrgres" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "oc new-app -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=food_db postgresql:10-el7 -n demo" - group: - kind: test -events: - postStart: - - package diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.2.1/empty-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.2.1/empty-devfile.yaml deleted file mode 100644 index 6f6cc331d..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.2.1/empty-devfile.yaml +++ /dev/null @@ -1,8 +0,0 @@ -schemaVersion: 2.2.1 -metadata: - name: empty - namespace: svor-che -components: - - name: universal-developer-image - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.2.1/quarkus-api-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.2.1/quarkus-api-devfile.yaml deleted file mode 100644 index 37ebcec2a..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.2.1/quarkus-api-devfile.yaml +++ /dev/null @@ -1,108 +0,0 @@ -schemaVersion: 2.2.1 -metadata: - generateName: quarkus-api-example -attributes: - controller.devfile.io/storage-type: ephemeral -components: - - name: tools - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest - env: - - name: QUARKUS_HTTP_HOST - value: 0.0.0.0 - endpoints: - - exposure: none - name: debug - protocol: tcp - targetPort: 5005 - - exposure: public - name: list-all-food - protocol: http - targetPort: 8080 - path: /food - volumeMounts: - - name: m2 - path: /home/user/.m2 - memoryLimit: 6G - memoryRequest: 512Mi - cpuRequest: 1000m - cpuLimit: 4000m - mountSources: true - - - name: postgresql - container: - image: 'quay.io/centos7/postgresql-13-centos7@sha256:994f5c622e2913bda1c4a7fa3b0c7e7f75e7caa3ac66ff1ed70ccfe65c40dd75' - env: - - name: POSTGRESQL_USER - value: user - - name: POSTGRESQL_PASSWORD - value: password - - name: POSTGRESQL_DATABASE - value: food_db - - name: PGDATA - value: /tmp/pgdata - - name: m2 - volume: - size: 1G -commands: - - id: package - exec: - label: "Package" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw clean package -DskipTests=true" - group: - kind: build - isDefault: true - - id: runtests - exec: - label: "Run Tests" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw test" - group: - kind: test - - id: packagenative - exec: - label: "Package Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw package -Dnative -Dmaven.test.skip -Dquarkus.native.native-image-xmx=3G" - group: - kind: build - - id: startdev - exec: - label: "Start Development mode (Hot reload + debug)" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw compile quarkus:dev" - group: - kind: run - isDefault: true - - id: startnative - exec: - label: "Start Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example/target - commandLine: "./quarkus-api-example-1.0.0-SNAPSHOT-runner" - group: - kind: run - - id: buildimage - exec: - label: "Build Image" - component: tools - workingDir: ${PROJECT_SOURCE} - commandLine: "podman build -f src/main/docker/Dockerfile.jvm -t quay.io/che-incubator/quarkus-api-example ." - group: - kind: build - - id: deploypostgres - exec: - label: "Deploy Postrgres" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "oc new-app -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=food_db postgresql:10-el7 -n demo" - group: - kind: test -events: - postStart: - - package diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.2.2/empty-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.2.2/empty-devfile.yaml deleted file mode 100644 index 8872e6b26..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.2.2/empty-devfile.yaml +++ /dev/null @@ -1,8 +0,0 @@ -schemaVersion: 2.2.2 -metadata: - name: empty - namespace: svor-che -components: - - name: universal-developer-image - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.2.2/quarkus-api-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.2.2/quarkus-api-devfile.yaml deleted file mode 100644 index 79b6b2ea6..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.2.2/quarkus-api-devfile.yaml +++ /dev/null @@ -1,108 +0,0 @@ -schemaVersion: 2.2.2 -metadata: - generateName: quarkus-api-example -attributes: - controller.devfile.io/storage-type: ephemeral -components: - - name: tools - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest - env: - - name: QUARKUS_HTTP_HOST - value: 0.0.0.0 - endpoints: - - exposure: none - name: debug - protocol: tcp - targetPort: 5005 - - exposure: public - name: list-all-food - protocol: http - targetPort: 8080 - path: /food - volumeMounts: - - name: m2 - path: /home/user/.m2 - memoryLimit: 6G - memoryRequest: 512Mi - cpuRequest: 1000m - cpuLimit: 4000m - mountSources: true - - - name: postgresql - container: - image: 'quay.io/centos7/postgresql-13-centos7@sha256:994f5c622e2913bda1c4a7fa3b0c7e7f75e7caa3ac66ff1ed70ccfe65c40dd75' - env: - - name: POSTGRESQL_USER - value: user - - name: POSTGRESQL_PASSWORD - value: password - - name: POSTGRESQL_DATABASE - value: food_db - - name: PGDATA - value: /tmp/pgdata - - name: m2 - volume: - size: 1G -commands: - - id: package - exec: - label: "Package" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw clean package -DskipTests=true" - group: - kind: build - isDefault: true - - id: runtests - exec: - label: "Run Tests" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw test" - group: - kind: test - - id: packagenative - exec: - label: "Package Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw package -Dnative -Dmaven.test.skip -Dquarkus.native.native-image-xmx=3G" - group: - kind: build - - id: startdev - exec: - label: "Start Development mode (Hot reload + debug)" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw compile quarkus:dev" - group: - kind: run - isDefault: true - - id: startnative - exec: - label: "Start Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example/target - commandLine: "./quarkus-api-example-1.0.0-SNAPSHOT-runner" - group: - kind: run - - id: buildimage - exec: - label: "Build Image" - component: tools - workingDir: ${PROJECT_SOURCE} - commandLine: "podman build -f src/main/docker/Dockerfile.jvm -t quay.io/che-incubator/quarkus-api-example ." - group: - kind: build - - id: deploypostgres - exec: - label: "Deploy Postrgres" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "oc new-app -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=food_db postgresql:10-el7 -n demo" - group: - kind: test -events: - postStart: - - package diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.3.0/empty-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.3.0/empty-devfile.yaml deleted file mode 100644 index 084357160..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.3.0/empty-devfile.yaml +++ /dev/null @@ -1,8 +0,0 @@ -schemaVersion: 2.3.0 -metadata: - name: empty - namespace: test-che -components: - - name: universal-developer-image - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest diff --git a/tools/devworkspace-generator/tests/_data/devfile/2.3.0/quarkus-api-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/2.3.0/quarkus-api-devfile.yaml deleted file mode 100644 index 359e520f5..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/2.3.0/quarkus-api-devfile.yaml +++ /dev/null @@ -1,108 +0,0 @@ -schemaVersion: 2.3.0 -metadata: - generateName: quarkus-api-example -attributes: - controller.devfile.io/storage-type: ephemeral -components: - - name: tools - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest - env: - - name: QUARKUS_HTTP_HOST - value: 0.0.0.0 - endpoints: - - exposure: none - name: debug - protocol: tcp - targetPort: 5005 - - exposure: public - name: list-all-food - protocol: http - targetPort: 8080 - path: /food - volumeMounts: - - name: m2 - path: /home/user/.m2 - memoryLimit: 6G - memoryRequest: 512Mi - cpuRequest: 1000m - cpuLimit: 4000m - mountSources: true - - - name: postgresql - container: - image: 'quay.io/centos7/postgresql-13-centos7@sha256:994f5c622e2913bda1c4a7fa3b0c7e7f75e7caa3ac66ff1ed70ccfe65c40dd75' - env: - - name: POSTGRESQL_USER - value: user - - name: POSTGRESQL_PASSWORD - value: password - - name: POSTGRESQL_DATABASE - value: food_db - - name: PGDATA - value: /tmp/pgdata - - name: m2 - volume: - size: 1G -commands: - - id: package - exec: - label: "Package" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw clean package -DskipTests=true" - group: - kind: build - isDefault: true - - id: runtests - exec: - label: "Run Tests" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw test" - group: - kind: test - - id: packagenative - exec: - label: "Package Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw package -Dnative -Dmaven.test.skip -Dquarkus.native.native-image-xmx=3G" - group: - kind: build - - id: startdev - exec: - label: "Start Development mode (Hot reload + debug)" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "./mvnw compile quarkus:dev" - group: - kind: run - isDefault: true - - id: startnative - exec: - label: "Start Native" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example/target - commandLine: "./quarkus-api-example-1.0.0-SNAPSHOT-runner" - group: - kind: run - - id: buildimage - exec: - label: "Build Image" - component: tools - workingDir: ${PROJECT_SOURCE} - commandLine: "podman build -f src/main/docker/Dockerfile.jvm -t quay.io/che-incubator/quarkus-api-example ." - group: - kind: build - - id: deploypostgres - exec: - label: "Deploy Postrgres" - component: tools - workingDir: ${PROJECTS_ROOT}/quarkus-api-example - commandLine: "oc new-app -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=food_db postgresql:10-el7 -n demo" - group: - kind: test -events: - postStart: - - package diff --git a/tools/devworkspace-generator/tests/_data/devfile/invalid-devfile-2.yaml b/tools/devworkspace-generator/tests/_data/devfile/invalid-devfile-2.yaml deleted file mode 100644 index 9073c1bb4..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/invalid-devfile-2.yaml +++ /dev/null @@ -1,16 +0,0 @@ -schemaVersion: 2.2.0 -metadata: - name: empty - namespace: svor-che -components: - - name: universal-developer-image - container: - image: quay.io/devfile/universal-developer-image:ubi8-latest -commands: - - id: command-id - exec: - label: "2. Configure Che to use the Custom Devfile Registry" - # invalid devfile: no componnet - # component: builder - # invalid devfile: no commandLine - # commandLine: ls diff --git a/tools/devworkspace-generator/tests/_data/devfile/invalid-devfile.yaml b/tools/devworkspace-generator/tests/_data/devfile/invalid-devfile.yaml deleted file mode 100644 index bb1a241f6..000000000 --- a/tools/devworkspace-generator/tests/_data/devfile/invalid-devfile.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.2.0 -metadata: - name: empty - namespace: svor-che -components: - - name: universal-developer-image - # make invalid devfile - # container: - # image: quay.io/devfile/universal-developer-image:ubi8-latest diff --git a/tools/devworkspace-generator/tests/bitbucket-server/bitbucket-server-resolver.spec.ts b/tools/devworkspace-generator/tests/bitbucket-server/bitbucket-server-resolver.spec.ts deleted file mode 100644 index d0df517e4..000000000 --- a/tools/devworkspace-generator/tests/bitbucket-server/bitbucket-server-resolver.spec.ts +++ /dev/null @@ -1,139 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container } from 'inversify'; -import { BitbucketServerResolver } from '../../src/bitbucket-server/bitbucket-server-resolver'; - -describe('Test Bitbucket resolver', () => { - let container: Container; - - let bitbucketResolver: BitbucketServerResolver; - - const BITBUCKET_SERVER_URL = 'https://custom-bitbucket.com/'; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(BitbucketServerResolver).toSelf().inSingletonScope(); - bitbucketResolver = container.get(BitbucketServerResolver); - }); - - test('test get Url', async () => { - const userUrl = BITBUCKET_SERVER_URL + 'users/user/repos/repo'; - const projectUrl = BITBUCKET_SERVER_URL + 'projects/project/repos/repo'; - const array = [ - [BITBUCKET_SERVER_URL + 'scm/~user/repo.git', userUrl], - [BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse', userUrl], - [BITBUCKET_SERVER_URL + 'scm/project/repo.git', projectUrl], - [BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse', projectUrl], - [ - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch', - ], - [ - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=refs%2Fheads%2Fbranch', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch', - ], - [ - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse?at=branch', - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse?at=branch', - ], - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a[0]).getUrl()).toBe(a[1])); - }); - - test('test get clone Url', async () => { - const userUrl = BITBUCKET_SERVER_URL + 'scm/~user/repo.git'; - const projectUrl = BITBUCKET_SERVER_URL + 'scm/project/repo.git'; - const array = [ - [BITBUCKET_SERVER_URL + 'scm/~user/repo.git', userUrl], - [BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse', userUrl], - [BITBUCKET_SERVER_URL + 'scm/project/repo.git', projectUrl], - [BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse', projectUrl], - [BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch', userUrl], - [BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=refs%2Fheads%2Fbranch', userUrl], - [BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse?at=branch', projectUrl], - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a[0]).getCloneUrl()).toBe(a[1])); - }); - - test('test get content', async () => { - const userUrl = BITBUCKET_SERVER_URL + 'users/user/repos/repo/raw/README.md'; - const projectUrl = BITBUCKET_SERVER_URL + 'projects/project/repos/repo/raw/README.md'; - const array = [ - [BITBUCKET_SERVER_URL + 'scm/~user/repo.git', userUrl], - [BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse', userUrl], - [BITBUCKET_SERVER_URL + 'scm/project/repo.git', projectUrl], - [BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse', projectUrl], - [ - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/raw/README.md?/at=branch', - ], - [ - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=refs%2Fheads%2Fbranch', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/raw/README.md?/at=branch', - ], - [ - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse?at=branch', - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/raw/README.md?/at=branch', - ], - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a[0]).getContentUrl('README.md')).toBe(a[1])); - }); - - test('test get branch', async () => { - expect( - bitbucketResolver.resolve(BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch').getBranchName() - ).toBe('branch'); - expect( - bitbucketResolver - .resolve(BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=refs%2Fheads%2Fbranch') - .getBranchName() - ).toBe('branch'); - expect( - bitbucketResolver.resolve(BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse?at=branch').getBranchName() - ).toBe('branch'); - }); - - test('test get repository', async () => { - const array = [ - BITBUCKET_SERVER_URL + 'scm/~user/repo.git', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse', - BITBUCKET_SERVER_URL + 'scm/project/repo.git', - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=refs%2Fheads%2Fbranch', - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse?at=branch', - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a).getRepoName()).toBe('repo')); - }); - - test('validate URL', async () => { - const array = [ - BITBUCKET_SERVER_URL + 'scm/~user/repo.git', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse', - BITBUCKET_SERVER_URL + 'scm/project/repo.git', - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse', - BITBUCKET_SERVER_URL + 'users/user/repos/repo/browse?at=branch', - BITBUCKET_SERVER_URL + 'projects/project/repos/repo/browse?at=branch', - ]; - array.forEach(a => expect(bitbucketResolver.isValid(a)).toBeTruthy()); - expect(bitbucketResolver.isValid('https://github.com/user/repo')).toBeFalsy(); - }); - - test('error', async () => { - expect(() => { - bitbucketResolver.resolve('http://unknown/che'); - }).toThrow('Invalid bitbucket-server URL:'); - }); -}); diff --git a/tools/devworkspace-generator/tests/bitbucket/bitbucket-resolver.spec.ts b/tools/devworkspace-generator/tests/bitbucket/bitbucket-resolver.spec.ts deleted file mode 100644 index f1ebe2d95..000000000 --- a/tools/devworkspace-generator/tests/bitbucket/bitbucket-resolver.spec.ts +++ /dev/null @@ -1,101 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container } from 'inversify'; -import { BitbucketResolver } from '../../src/bitbucket/bitbucket-resolver'; - -describe('Test Bitbucket resolver', () => { - let container: Container; - - let bitbucketResolver: BitbucketResolver; - - const BITBUCKET_URL = 'https://bitbucket.org/workspace/repo'; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(BitbucketResolver).toSelf().inSingletonScope(); - bitbucketResolver = container.get(BitbucketResolver); - }); - - test('test get Url', async () => { - const array = [ - ['https://user@bitbucket.org/workspace/repo.git', 'https://bitbucket.org/workspace/repo/src/HEAD'], - [BITBUCKET_URL, 'https://bitbucket.org/workspace/repo/src/HEAD'], - [BITBUCKET_URL + '/', 'https://bitbucket.org/workspace/repo/src/HEAD'], - [BITBUCKET_URL + '/src/branch', 'https://bitbucket.org/workspace/repo/src/branch'], - [BITBUCKET_URL + '/src/branch/', 'https://bitbucket.org/workspace/repo/src/branch'], - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a[0]).getUrl()).toBe(a[1])); - }); - - test('test get clone Url', async () => { - const url = 'https://bitbucket.org/workspace/repo.git'; - const array = [ - ['https://user@bitbucket.org/workspace/repo.git', url], - [BITBUCKET_URL, url], - [BITBUCKET_URL + '/', url], - [BITBUCKET_URL + '/src/branch', url], - [BITBUCKET_URL + '/src/branch/', url], - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a[0]).getCloneUrl()).toBe(a[1])); - }); - - test('test get content Url', async () => { - const url = 'https://bitbucket.org/workspace/repo/raw/HEAD/Readme.md'; - const array = [ - ['https://user@bitbucket.org/workspace/repo.git', url], - [BITBUCKET_URL, url], - [BITBUCKET_URL + '/', url], - [BITBUCKET_URL + '/src/branch', 'https://bitbucket.org/workspace/repo/raw/branch/Readme.md'], - [BITBUCKET_URL + '/src/branch/', 'https://bitbucket.org/workspace/repo/raw/branch/Readme.md'], - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a[0]).getContentUrl('Readme.md')).toBe(a[1])); - }); - - test('test get branch', async () => { - expect(bitbucketResolver.resolve('https://bitbucket.org/workspace/repo/src/branch').getBranchName()).toBe('branch'); - expect(bitbucketResolver.resolve('https://bitbucket.org/workspace/repo/src/branch/').getBranchName()).toBe( - 'branch' - ); - }); - - test('test get repository', async () => { - const array = [ - 'https://user@bitbucket.org/workspace/repo.git', - BITBUCKET_URL, - BITBUCKET_URL + '/', - BITBUCKET_URL + '/src/branch', - BITBUCKET_URL + '/src/branch/', - ]; - array.forEach(a => expect(bitbucketResolver.resolve(a).getRepoName()).toBe('repo')); - }); - - test('validate URL', async () => { - const array = [ - 'https://user@bitbucket.org/workspace/repo.git', - BITBUCKET_URL, - BITBUCKET_URL + '/', - BITBUCKET_URL + '/src/branch', - BITBUCKET_URL + '/src/branch/', - ]; - array.forEach(a => expect(bitbucketResolver.isValid(a)).toBeTruthy()); - expect(bitbucketResolver.isValid('https://github.com/user/repo')).toBeFalsy(); - }); - - test('error', async () => { - expect(() => { - bitbucketResolver.resolve('http://unknown/che'); - }).toThrow('Invalid bitbucket URL:'); - }); -}); diff --git a/tools/devworkspace-generator/tests/devfile-schema/devfile-schema-validator.spec.ts b/tools/devworkspace-generator/tests/devfile-schema/devfile-schema-validator.spec.ts deleted file mode 100644 index 165be2d8b..000000000 --- a/tools/devworkspace-generator/tests/devfile-schema/devfile-schema-validator.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container } from 'inversify'; -import { DevfileSchemaValidator } from '../../src/devfile-schema/devfile-schema-validator'; -import * as path from 'path'; -import * as fs from 'fs-extra'; -import * as jsYaml from 'js-yaml'; - -describe('DevfileValidator', () => { - let container: Container; - let validator: DevfileSchemaValidator; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(DevfileSchemaValidator).toSelf().inSingletonScope(); - validator = container.get(DevfileSchemaValidator); - }); - - test.each([ - ['2.0.0', 'empty-devfile.yaml'], - ['2.1.0', 'empty-devfile.yaml'], - ['2.2.0', 'empty-devfile.yaml'], - ['2.2.1', 'empty-devfile.yaml'], - ['2.2.2', 'empty-devfile.yaml'], - ['2.3.0', 'empty-devfile.yaml'], - ])('Valid empty devfile for schema %s', async (schemaVersion, fileName) => { - const devfilePath = path.resolve(__dirname, '..', '_data', 'devfile', schemaVersion, fileName); - const devfileYamlContent = await fs.readFile(devfilePath, 'utf-8'); - const devfile = jsYaml.load(devfileYamlContent); - - const result = validator.validateDevfile(devfile, schemaVersion); - expect(result.valid).toBe(true); - }); - - test.each([ - ['2.0.0', 'ansible-devfile.yaml'], - ['2.1.0', 'ansible-devfile.yaml'], - ['2.2.0', 'ansible-devfile.yaml'], - ])('Valid ansible devfile for schema %s', async (schemaVersion, fileName) => { - const devfilePath = path.resolve(__dirname, '..', '_data', 'devfile', schemaVersion, fileName); - const devfileYamlContent = await fs.readFile(devfilePath, 'utf-8'); - const devfile = jsYaml.load(devfileYamlContent); - - const result = validator.validateDevfile(devfile, schemaVersion); - expect(result.valid).toBe(true); - }); - - test.each([ - ['2.0.0', 'quarkus-api-devfile.yaml'], - ['2.1.0', 'quarkus-api-devfile.yaml'], - ['2.2.0', 'quarkus-api-devfile.yaml'], - ['2.2.1', 'quarkus-api-devfile.yaml'], - ['2.2.2', 'quarkus-api-devfile.yaml'], - ['2.3.0', 'quarkus-api-devfile.yaml'], - ])('Valid quarkus api devfile for schema %s', async (schemaVersion, fileName) => { - const devfilePath = path.resolve(__dirname, '..', '_data', 'devfile', schemaVersion, fileName); - const devfileYamlContent = await fs.readFile(devfilePath, 'utf-8'); - const devfile = jsYaml.load(devfileYamlContent); - - const result = validator.validateDevfile(devfile, schemaVersion); - expect(result.valid).toBe(true); - }); - - test('Invalid devfile without component type', async () => { - const invalidDevfileYamlPath = path.resolve(__dirname, '..', '_data', 'devfile', 'invalid-devfile.yaml'); - const invalidDevfileYamlContent = await fs.readFile(invalidDevfileYamlPath, 'utf-8'); - const invalidDevfile = jsYaml.load(invalidDevfileYamlContent); - - const schema = '2.2.0'; - - const result = validator.validateDevfile(invalidDevfile, schema); - expect(result.valid).toBe(false); - - expect(result.toString()).toContain('0: instance.components[0] requires property "container"'); - expect(result.toString()).toContain('1: instance.components[0] requires property "kubernetes"'); - expect(result.toString()).toContain('2: instance.components[0] requires property "openshift"'); - expect(result.toString()).toContain('3: instance.components[0] requires property "volume"'); - expect(result.toString()).toContain('4: instance.components[0] requires property "image"'); - expect(result.toString()).toContain( - '5: instance.components[0] is not exactly one from [subschema 0],[subschema 1],[subschema 2],[subschema 3],[subschema 4]' - ); - }); - - test('Invalid command in devfile', async () => { - const invalidDevfileYamlPath = path.resolve(__dirname, '..', '_data', 'devfile', 'invalid-devfile-2.yaml'); - const invalidDevfileYamlContent = await fs.readFile(invalidDevfileYamlPath, 'utf-8'); - const invalidDevfile = jsYaml.load(invalidDevfileYamlContent); - - const schema = '2.2.0'; - - const result = validator.validateDevfile(invalidDevfile, schema); - expect(result.valid).toBe(false); - - expect(result.toString()).toContain('0: instance.commands[0].exec requires property "commandLine"'); - expect(result.toString()).toContain('1: instance.commands[0].exec requires property "component"'); - }); - - it('should throw an error if the devfile version is not supported', () => { - const devfile = { - apiVersion: '3.0.0', - metadata: { - name: 'test-devfile', - }, - components: [], - }; - const version = '3.0.0'; - - expect(() => validator.validateDevfile(devfile, version)).toThrowError( - `Dev Workspace generator tool doesn't support devfile version: ${version}` - ); - }); -}); diff --git a/tools/devworkspace-generator/tests/devfile/dev-container-component-finder.spec.ts b/tools/devworkspace-generator/tests/devfile/dev-container-component-finder.spec.ts deleted file mode 100644 index 106a555ea..000000000 --- a/tools/devworkspace-generator/tests/devfile/dev-container-component-finder.spec.ts +++ /dev/null @@ -1,234 +0,0 @@ -/********************************************************************** - * Copyright (c) 2021 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container } from 'inversify'; -import { DevContainerComponentFinder } from '../../src/devfile/dev-container-component-finder'; -import { DevfileContext } from '../../src/api/devfile-context'; -import { DevContainerComponentInserter } from '../../src/devfile/dev-container-component-inserter'; - -describe('Test DevContainerComponentFinder', () => { - let container: Container; - - let devContainerComponentFinder: DevContainerComponentFinder; - - let originalConsoleWarn = console.warn; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(DevContainerComponentFinder).toSelf().inSingletonScope(); - container.bind(DevContainerComponentInserter).toSelf().inSingletonScope(); - devContainerComponentFinder = container.get(DevContainerComponentFinder); - container.get(DevContainerComponentInserter); - console.warn = jest.fn(); - }); - - afterEach(() => { - console.warn = originalConsoleWarn; - }); - - test('basics', async () => { - const devfileContext = { - devWorkspace: { - spec: { - template: { - components: [ - { name: 'foo' }, - { - name: 'che-code', - }, - { - name: 'my-container', - container: { - image: 'user-image:123', - }, - }, - ], - }, - }, - }, - } as DevfileContext; - const devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find(devfileContext); - expect(devWorkspaceSpecTemplateComponents?.name).toBe('my-container'); - }); - - test('only one container without mountSources:false', async () => { - const devfileContext = { - devWorkspace: { - spec: { - template: { - components: [ - { - name: 'container-with-mount-sources-false', - container: { - mountSources: false, - image: 'user-image:123', - }, - }, - { - name: 'my-container', - container: { - image: 'user-image:123', - }, - }, - ], - }, - }, - }, - } as DevfileContext; - const devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find(devfileContext); - expect(devWorkspaceSpecTemplateComponents.name).toBe('my-container'); - }); - - test('missing dev container without devfile.parent', async () => { - const devfileContext = { - devfile: {}, - devWorkspace: { - spec: { - template: { - components: [ - { name: 'foo' }, - { - name: 'che-code', - }, - ], - }, - }, - }, - } as DevfileContext; - const devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find(devfileContext); - // default dev component is added - expect(devfileContext.devWorkspace.spec?.template?.components?.length).toBe(2); - expect(devWorkspaceSpecTemplateComponents?.name).toBe(undefined); - }); - - test('dev container should be injected with custom image', async () => { - const devfileContext = { - devfile: {}, - devWorkspace: { - spec: { - template: { - components: [ - { name: 'foo' }, - { - name: 'che-code', - }, - ], - }, - }, - }, - } as DevfileContext; - const devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find( - devfileContext, - 'true', - 'my-image' - ); - // default dev component is added with custom image - expect(devfileContext.devWorkspace.spec?.template?.components?.length).toBe(3); - expect(devWorkspaceSpecTemplateComponents?.name).toBe('dev'); - expect(devWorkspaceSpecTemplateComponents?.container?.image).toBe('my-image'); - }); - - test('dev container should be injected with a default image', async () => { - const devfileContext = { - devfile: {}, - devWorkspace: { - spec: { - template: { - components: [ - { name: 'foo' }, - { - name: 'che-code', - }, - ], - }, - }, - }, - } as DevfileContext; - const devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find(devfileContext, 'true'); - // default dev component is added with a default image - const defaultImage = 'quay.io/devfile/universal-developer-image:ubi8-latest'; - expect(devfileContext.devWorkspace.spec?.template?.components?.length).toBe(3); - expect(devWorkspaceSpecTemplateComponents?.name).toBe('dev'); - expect(devWorkspaceSpecTemplateComponents?.container?.image).toBe(defaultImage); - }); - - test('missing dev container with devfile.parent', async () => { - const devfileContext = { - devfile: { - parent: { - id: 'java-maven', - registryUrl: 'https://registry.stage.devfile.io/', - version: '1.2.0', - }, - }, - devWorkspace: { - spec: { - template: { - components: [ - { name: 'foo' }, - { - name: 'che-code', - }, - ], - }, - }, - }, - } as DevfileContext; - const devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find(devfileContext); - expect(devWorkspaceSpecTemplateComponents).toBeUndefined(); - }); - - test('missing dev container (no components)', async () => { - const devfileContext = { - devfile: {}, - devWorkspace: {}, - } as DevfileContext; - let devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find(devfileContext); - expect(devWorkspaceSpecTemplateComponents?.name).toBe(undefined); - }); - - test('take first one when many dev container', async () => { - const devfileContext = { - devWorkspace: { - spec: { - template: { - components: [ - { name: 'foo' }, - { - name: 'che-code', - }, - { - name: 'my-container-1', - container: { - image: 'user-image:123', - }, - }, - { - name: 'my-container-2', - container: { - image: 'user-image:123', - }, - }, - ], - }, - }, - }, - } as DevfileContext; - const devWorkspaceSpecTemplateComponents = await devContainerComponentFinder.find(devfileContext); - expect(devWorkspaceSpecTemplateComponents?.name).toBe('my-container-1'); - expect(console.warn).toBeCalledWith( - 'More than one dev container component has been potentially found, taking the first one of my-container-1,my-container-2' - ); - }); -}); diff --git a/tools/devworkspace-generator/tests/devfile/dev-container-component-inserter.spec.ts b/tools/devworkspace-generator/tests/devfile/dev-container-component-inserter.spec.ts deleted file mode 100644 index 3c1b33f54..000000000 --- a/tools/devworkspace-generator/tests/devfile/dev-container-component-inserter.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container } from 'inversify'; -import { DevContainerComponentInserter } from '../../src/devfile/dev-container-component-inserter'; -import { DevfileContext } from '../../src/api/devfile-context'; - -describe('Test DevContainerComponentInserter', () => { - let container: Container; - - let devContainerComponentInserter: DevContainerComponentInserter; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(DevContainerComponentInserter).toSelf().inSingletonScope(); - devContainerComponentInserter = container.get(DevContainerComponentInserter); - }); - - test('insert default component', async () => { - const devfileContext = { - devWorkspace: {}, - } as DevfileContext; - - const defaultImage = 'quay.io/devfile/universal-developer-image:ubi8-latest'; - - await devContainerComponentInserter.insert(devfileContext); - const devContainer = devfileContext.devWorkspace.spec?.template?.components?.[0]; - - expect(devfileContext.devWorkspace.spec?.template?.components?.length).toBe(1); - expect(devContainer?.name).toBe('dev'); - expect(devContainer?.container?.image).toBe(defaultImage); - }); - - test('insert dev component with custom image', async () => { - const devfileContext = { - devWorkspace: {}, - } as DevfileContext; - - await devContainerComponentInserter.insert(devfileContext, 'my-image'); - const devContainer = devfileContext.devWorkspace.spec?.template?.components?.[0]; - - expect(devfileContext.devWorkspace.spec?.template?.components?.length).toBe(1); - expect(devContainer?.name).toBe('dev'); - expect(devContainer?.container?.image).toBe('my-image'); - }); -}); diff --git a/tools/devworkspace-generator/tests/entrypoint.spec.ts b/tools/devworkspace-generator/tests/entrypoint.spec.ts deleted file mode 100644 index e4cab41a6..000000000 --- a/tools/devworkspace-generator/tests/entrypoint.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -import 'reflect-metadata'; - -/* eslint-disable @typescript-eslint/no-explicit-any */ -const startMethodMock = jest.fn(); - -jest.mock('../src/main', () => ({ - Main: function () { - return { start: startMethodMock }; - }, -})); - -describe('Test Entrypoint', () => { - const originalProcessExitCode = process.exitCode; - const originalConsoleError = console.error; - const mockedConsoleError = jest.fn(); - - beforeEach(() => { - jest.resetAllMocks(); - jest.clearAllMocks(); - jest.resetModules(); - console.error = mockedConsoleError; - }); - afterEach(() => { - console.error = originalConsoleError; - process.exitCode = originalProcessExitCode; - }); - - test('entrypoint', async () => { - startMethodMock.mockResolvedValue(true); - await require('../src/entrypoint'); - expect(startMethodMock).toBeCalled(); - expect(process.exitCode).toBeUndefined(); - }); - - test('entrypoint fail to start', async () => { - const spyExit = jest.spyOn(process, 'exit'); - const value: never = {} as never; - spyExit.mockReturnValue(value); - await require('../src/entrypoint'); - startMethodMock.mockResolvedValue(false); - expect(spyExit).toBeCalled(); - expect(startMethodMock).toBeCalled(); - }); -}); diff --git a/tools/devworkspace-generator/tests/fetch/url-fetcher.spec.ts b/tools/devworkspace-generator/tests/fetch/url-fetcher.spec.ts deleted file mode 100644 index 6bf1106f4..000000000 --- a/tools/devworkspace-generator/tests/fetch/url-fetcher.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container } from 'inversify'; -import { UrlFetcher } from '../../src/fetch/url-fetcher'; - -class Custom404Error extends Error { - public response = { - status: 404, - }; -} - -class Custom500Error extends Error { - public response = { - status: 500, - }; -} - -describe('Test UrlFetcher', () => { - let container: Container; - - const axiosGetMock = jest.fn(); - const axiosMock = { - get: axiosGetMock, - } as any; - - let urlFetcher: UrlFetcher; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(UrlFetcher).toSelf().inSingletonScope(); - container.bind(Symbol.for('AxiosInstance')).toConstantValue(axiosMock); - urlFetcher = container.get(UrlFetcher); - }); - - test('basic fetchTextOptionalContent', async () => { - const content = 'abcd'; - axiosGetMock.mockResolvedValue({ data: content }); - const value = await urlFetcher.fetchTextOptionalContent('http://fake-entry'); - expect(axiosGetMock).toBeCalledWith('http://fake-entry', { responseType: 'text' }); - expect(value).toBe(content); - }); - - test('basic 404 error empty fetchTextOptionalContent', async () => { - axiosGetMock.mockImplementation(() => Promise.reject(new Custom404Error())); - const value = await urlFetcher.fetchTextOptionalContent('http://fake-entry'); - expect(axiosGetMock).toBeCalledWith('http://fake-entry', { responseType: 'text' }); - expect(value).toBeUndefined(); - }); - - test('basic 500 error empty fetchTextOptionalContent', async () => { - axiosGetMock.mockImplementation(() => Promise.reject(new Custom500Error())); - await expect(urlFetcher.fetchTextOptionalContent('http://fake-entry')).rejects.toThrow(); - expect(axiosGetMock).toBeCalledWith('http://fake-entry', { responseType: 'text' }); - }); - - test('basic fetchText', async () => { - const content = 'abcd'; - axiosGetMock.mockResolvedValue({ data: content }); - const value = await urlFetcher.fetchText('http://fake-entry'); - expect(axiosGetMock).toBeCalledWith('http://fake-entry', { responseType: 'text' }); - expect(value).toBe(content); - }); -}); diff --git a/tools/devworkspace-generator/tests/generate.spec.ts b/tools/devworkspace-generator/tests/generate.spec.ts deleted file mode 100644 index 89c08aa83..000000000 --- a/tools/devworkspace-generator/tests/generate.spec.ts +++ /dev/null @@ -1,522 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; -import fs from 'fs-extra'; -import * as jsYaml from 'js-yaml'; -import { Container } from 'inversify'; -import { Generate } from '../src/generate'; -import { DevContainerComponentFinder } from '../src/devfile/dev-container-component-finder'; -import { DevContainerComponentInserter } from '../src/devfile/dev-container-component-inserter'; - -describe('Test Generate', () => { - let container: Container; - let generate: Generate; - let devContainerFinder: DevContainerComponentFinder; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(Generate).toSelf().inSingletonScope(); - container.bind(DevContainerComponentFinder).toSelf().inSingletonScope(); - container.bind(DevContainerComponentInserter).toSelf().inSingletonScope(); - generate = container.get(Generate); - devContainerFinder = container.get(DevContainerComponentFinder); - }); - - describe('Devfile references a parent', () => { - test('basics', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - name: my-dummy-project -parent: - id: udi - registryUrl: https://dummy-registry.io/ - version: 1.2.0 -`; - const editorContent = ` -schemaVersion: 2.2.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent); - // expect not to write the file - expect(fsWriteFileSpy).not.toBeCalled(); - expect(JSON.stringify(context.devfile)).toEqual( - '{"schemaVersion":"2.2.0","metadata":{"name":"my-dummy-project"},"parent":{"id":"udi","registryUrl":"https://dummy-registry.io/","version":"1.2.0"}}' - ); - const expectedDevWorkspace = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspace', - metadata: { - name: 'my-dummy-project', - annotations: { - 'che.eclipse.org/devfile': jsYaml.dump(jsYaml.load(devfileContent)), - }, - }, - spec: { - started: true, - routingClass: 'che', - template: { - parent: { - id: 'udi', - registryUrl: 'https://dummy-registry.io/', - version: '1.2.0', - }, - }, - contributions: [{ name: 'editor', kubernetes: { name: 'che-code-my-dummy-project' } }], - }, - }; - expect(context.devWorkspace).toStrictEqual(expectedDevWorkspace); - const expectedDevWorkspaceTemplates = [ - { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspaceTemplate', - metadata: { name: 'che-code-my-dummy-project' }, - spec: {}, - }, - ]; - expect(context.devWorkspaceTemplates).toStrictEqual(expectedDevWorkspaceTemplates); - expect(context.suffix).toEqual('my-dummy-project'); - }); - }); - - describe('Devfile contains starterProjects', () => { - test('basics', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - name: starter-project -starterProjects: - - name: go-starter - description: A Go project - git: - checkoutFrom: - revision: main - remotes: - origin: https://github.com/devfile-samples/devfile-stack-go.git - - name: vertx-http-example - git: - remotes: - origin: https://github.com -`; - const editorContent = ` -schemaVersion: 2.2.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent); - // expect not to write the file - expect(fsWriteFileSpy).not.toBeCalled(); - const expectedDevWorkspace = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspace', - metadata: { - name: 'starter-project', - annotations: { - 'che.eclipse.org/devfile': jsYaml.dump(jsYaml.load(devfileContent)), - }, - }, - spec: { - started: true, - routingClass: 'che', - template: { - attributes: { - 'controller.devfile.io/use-starter-project': 'go-starter', - }, - starterProjects: [ - { - name: 'go-starter', - description: 'A Go project', - git: { - checkoutFrom: { - revision: 'main', - }, - remotes: { - origin: 'https://github.com/devfile-samples/devfile-stack-go.git', - }, - }, - }, - { - name: 'vertx-http-example', - git: { - remotes: { - origin: 'https://github.com', - }, - }, - }, - ], - }, - contributions: [{ name: 'editor', kubernetes: { name: 'che-code-starter-project' } }], - }, - }; - expect(context.devWorkspace).toStrictEqual(expectedDevWorkspace); - }); - }); - - describe('Without writing an output file', () => { - test('basics', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - name: my-dummy-project -components: - - name: dev-container - mountSources: true - container: - image: quay.io/foo/bar -`; - const editorContent = ` -schemaVersion: 2.2.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent); - // expect not to write the file - expect(fsWriteFileSpy).not.toBeCalled(); - expect(JSON.stringify(context.devfile)).toEqual( - '{"schemaVersion":"2.2.0","metadata":{"name":"my-dummy-project"},"components":[{"name":"dev-container","mountSources":true,"container":{"image":"quay.io/foo/bar"}}]}' - ); - const expectedDevWorkspace = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspace', - metadata: { - name: 'my-dummy-project', - annotations: { - 'che.eclipse.org/devfile': jsYaml.dump(jsYaml.load(devfileContent)), - }, - }, - spec: { - started: true, - routingClass: 'che', - template: { - components: [ - { - name: 'dev-container', - mountSources: true, - container: { - image: 'quay.io/foo/bar', - }, - }, - ], - }, - contributions: [{ name: 'editor', kubernetes: { name: 'che-code-my-dummy-project' } }], - }, - }; - expect(context.devWorkspace).toStrictEqual(expectedDevWorkspace); - const expectedDevWorkspaceTemplates = [ - { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspaceTemplate', - metadata: { name: 'che-code-my-dummy-project' }, - spec: {}, - }, - ]; - expect(context.devWorkspaceTemplates).toStrictEqual(expectedDevWorkspaceTemplates); - expect(context.suffix).toEqual('my-dummy-project'); - }); - }); - - describe('With generateName in metadata', () => { - test('basics', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - generateName: custom-project -components: - - name: dev-container - mountSources: true - container: - image: quay.io/foo/bar -`; - const editorContent = ` -schemaVersion: 2.2.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent); - // expect not to write the file - expect(fsWriteFileSpy).not.toBeCalled(); - expect(JSON.stringify(context.devfile)).toEqual( - '{"schemaVersion":"2.2.0","metadata":{"generateName":"custom-project"},"components":[{"name":"dev-container","mountSources":true,"container":{"image":"quay.io/foo/bar"}}]}' - ); - const expectedDevWorkspace = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspace', - metadata: { - generateName: 'custom-project', - annotations: { - 'che.eclipse.org/devfile': jsYaml.dump(jsYaml.load(devfileContent)), - }, - }, - spec: { - started: true, - routingClass: 'che', - template: { - components: [ - { - name: 'dev-container', - mountSources: true, - container: { - image: 'quay.io/foo/bar', - }, - }, - ], - }, - contributions: [{ name: 'editor', kubernetes: { name: 'che-code-' } }], - }, - }; - expect(context.devWorkspace).toStrictEqual(expectedDevWorkspace); - const expectedDevWorkspaceTemplates = [ - { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspaceTemplate', - metadata: { name: 'che-code-' }, - spec: {}, - }, - ]; - expect(context.devWorkspaceTemplates).toStrictEqual(expectedDevWorkspaceTemplates); - expect(context.suffix).toEqual(''); - }); - }); - - describe('With writing an output file', () => { - test('basics', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - name: my-dummy-project -components: - - name: dev-container - mountSources: true - container: - image: quay.io/foo/bar -`; - const fakeoutputDir = '/fake-output'; - const editorContent = ` -schemaVersion: 2.2.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent, fakeoutputDir); - // expect to write the file - expect(fsWriteFileSpy).toBeCalled(); - expect(JSON.stringify(context.devfile)).toEqual( - '{"schemaVersion":"2.2.0","metadata":{"name":"my-dummy-project"},"components":[{"name":"dev-container","mountSources":true,"container":{"image":"quay.io/foo/bar"}}]}' - ); - const expectedDevWorkspace = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspace', - metadata: { - name: 'my-dummy-project', - annotations: { - 'che.eclipse.org/devfile': jsYaml.dump(jsYaml.load(devfileContent)), - }, - }, - spec: { - started: true, - routingClass: 'che', - template: { - components: [ - { - name: 'dev-container', - mountSources: true, - container: { - image: 'quay.io/foo/bar', - }, - }, - ], - }, - contributions: [{ name: 'editor', kubernetes: { name: 'che-code-my-dummy-project' } }], - }, - }; - expect(context.devWorkspace).toStrictEqual(expectedDevWorkspace); - const expectedDevWorkspaceTemplates = [ - { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspaceTemplate', - metadata: { name: 'che-code-my-dummy-project' }, - spec: {}, - }, - ]; - expect(context.devWorkspaceTemplates).toStrictEqual(expectedDevWorkspaceTemplates); - expect(context.suffix).toEqual('my-dummy-project'); - }); - - test('add attribute', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - name: my-dummy-project -components: - - name: dev-container - attributes: - old: attribute - mountSources: true - container: - image: quay.io/foo/bar -`; - const fakeoutputDir = '/fake-output'; - const editorContent = ` -schemaVersion: 2.2.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent, fakeoutputDir, 'false'); - // expect to write the file - expect(fsWriteFileSpy).toBeCalled(); - expect(JSON.stringify(context.devfile)).toEqual( - '{"schemaVersion":"2.2.0","metadata":{"name":"my-dummy-project"},"components":[{"name":"dev-container","attributes":{"old":"attribute"},"mountSources":true,"container":{"image":"quay.io/foo/bar"}}]}' - ); - const expectedDevWorkspace = { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspace', - metadata: { - name: 'my-dummy-project', - annotations: { - 'che.eclipse.org/devfile': jsYaml.dump(jsYaml.load(devfileContent)), - }, - }, - spec: { - started: true, - routingClass: 'che', - template: { - components: [ - { - name: 'dev-container', - attributes: { - old: 'attribute', - }, - mountSources: true, - container: { - image: 'quay.io/foo/bar', - }, - }, - ], - }, - contributions: [{ name: 'editor', kubernetes: { name: 'che-code-my-dummy-project' } }], - }, - }; - expect(context.devWorkspace).toStrictEqual(expectedDevWorkspace); - const expectedDevWorkspaceTemplates = [ - { - apiVersion: 'workspace.devfile.io/v1alpha2', - kind: 'DevWorkspaceTemplate', - metadata: { name: 'che-code-my-dummy-project' }, - spec: {}, - }, - ]; - expect(context.devWorkspaceTemplates).toStrictEqual(expectedDevWorkspaceTemplates); - expect(context.suffix).toEqual('my-dummy-project'); - }); - - test('basics no name', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - foo: bar -components: - - name: dev-container - mountSources: true - container: - image: quay.io/foo/bar -`; - const fakeoutputDir = '/fake-output'; - const editorContent = ` -schemaVersion: 2.1.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent, fakeoutputDir, 'false'); - // expect to write the file - expect(fsWriteFileSpy).toBeCalled(); - expect(context.suffix).toEqual(''); - }); - }); - - test('default component should be added with a default image', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - foo: bar -`; - const fakeoutputDir = '/fake-output'; - const editorContent = ` -schemaVersion: 2.1.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let context = await generate.generate(devfileContent, editorContent, fakeoutputDir, 'true'); - - expect(context.devWorkspace.spec?.template?.components?.length).toBe(1); - expect(context.devWorkspace.spec?.template?.components?.[0].name).toBe('dev'); - expect(context.devWorkspace.spec?.template?.components?.[0].container?.image).toBe( - 'quay.io/devfile/universal-developer-image:ubi8-latest' - ); - }); - - test('default component should be added with a specific image', async () => { - const devfileContent = ` -schemaVersion: 2.2.0 -metadata: - foo: bar -`; - const fakeoutputDir = '/fake-output'; - const editorContent = ` -schemaVersion: 2.1.0 -metadata: - name: che-code -`; - - const fsWriteFileSpy = jest.spyOn(fs, 'writeFile'); - fsWriteFileSpy.mockReturnValue({}); - - let image = 'quay.io/my-image:latest'; - let context = await generate.generate(devfileContent, editorContent, fakeoutputDir, 'true', image); - - expect(context.devWorkspace.spec?.template?.components?.length).toBe(1); - expect(context.devWorkspace.spec?.template?.components?.[0].name).toBe('dev'); - expect(context.devWorkspace.spec?.template?.components?.[0].container?.image).toBe(image); - }); -}); diff --git a/tools/devworkspace-generator/tests/github/github-resolver.spec.ts b/tools/devworkspace-generator/tests/github/github-resolver.spec.ts deleted file mode 100644 index 6427d7dde..000000000 --- a/tools/devworkspace-generator/tests/github/github-resolver.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container } from 'inversify'; -import { GithubResolver } from '../../src/github/github-resolver'; - -describe('Test PluginRegistryResolver', () => { - let container: Container; - - let githubResolver: GithubResolver; - - const GITHUB_URL = 'https://github.com/eclipse/che'; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(GithubResolver).toSelf().inSingletonScope(); - githubResolver = container.get(GithubResolver); - }); - - test('test get Url', async () => { - const url = 'https://github.com/eclipse/che/tree/HEAD/'; - const array = [ - [GITHUB_URL, url], - [GITHUB_URL + '/', url], - [GITHUB_URL + '.git', url], - [GITHUB_URL + '/tree/7.30.x', 'https://github.com/eclipse/che/tree/7.30.x/'], - ]; - array.forEach(a => expect(githubResolver.resolve(a[0]).getUrl()).toBe(a[1])); - }); - - test('test get clone Url', async () => { - const url = 'https://github.com/eclipse/che.git'; - const array = [ - [GITHUB_URL, url], - [GITHUB_URL + '/', url], - [GITHUB_URL + '.git', url], - [GITHUB_URL + '/tree/7.30.x', url], - ]; - array.forEach(a => expect(githubResolver.resolve(a[0]).getCloneUrl()).toBe(a[1])); - }); - - test('test get content Url', async () => { - const url = 'https://raw.githubusercontent.com/eclipse/che/HEAD/README.md'; - const array = [ - [GITHUB_URL, url], - [GITHUB_URL + '/', url], - [GITHUB_URL + '.git', url], - [GITHUB_URL + '/tree/7.30.x', 'https://raw.githubusercontent.com/eclipse/che/7.30.x/README.md'], - ['https://github.mycompany.net/user/repo', 'https://raw.github.mycompany.net/user/repo/HEAD/README.md'], - ]; - array.forEach(a => expect(githubResolver.resolve(a[0]).getContentUrl('README.md')).toBe(a[1])); - }); - - test('test get branch', async () => { - expect(githubResolver.resolve(GITHUB_URL + '/tree/7.30.x').getBranchName()).toBe('7.30.x'); - expect(githubResolver.resolve(GITHUB_URL + '/tree/7.30.x/').getBranchName()).toBe('7.30.x'); - }); - - test('test get repository', async () => { - const array = [ - GITHUB_URL, - GITHUB_URL + '/', - GITHUB_URL + '.git', - GITHUB_URL + '/tree/7.30.x', - 'https://github.mycompany.net/user/che', - ]; - array.forEach(a => expect(githubResolver.resolve(a).getRepoName()).toBe('che')); - }); - - test('validate URL', async () => { - const array = [ - GITHUB_URL, - GITHUB_URL + '/', - GITHUB_URL + '.git', - GITHUB_URL + '/tree/7.30.x', - 'https://github.mycompany.net/user/che', - ]; - array.forEach(a => expect(githubResolver.isValid(a)).toBeTruthy()); - expect(githubResolver.isValid('http://unknown/che')).toBeFalsy(); - }); - - test('error', async () => { - expect(() => { - githubResolver.resolve('http://unknown/che'); - }).toThrow('Invalid github URL:'); - }); -}); diff --git a/tools/devworkspace-generator/tests/inversify/inversify-binding.spec.ts b/tools/devworkspace-generator/tests/inversify/inversify-binding.spec.ts deleted file mode 100644 index a543f1e9e..000000000 --- a/tools/devworkspace-generator/tests/inversify/inversify-binding.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ - -import 'reflect-metadata'; - -import fs from 'fs-extra'; -import * as axios from 'axios'; -import { InversifyBinding, InversifyBindingOptions } from '../../src/inversify/inversify-binding'; - -import { Container } from 'inversify'; -import { Generate } from '../../src/generate'; -import { UrlFetcher } from '../../src/fetch/url-fetcher'; -import { PluginRegistryResolver } from '../../src/plugin-registry/plugin-registry-resolver'; -import { DevContainerComponentFinder } from '../../src/devfile/dev-container-component-finder'; -import { TYPES } from '../../src/types'; -import { DevfileSchemaValidator } from '../../src/devfile-schema/devfile-schema-validator'; - -describe('Test InversifyBinding', () => { - const mockedArgv: string[] = ['dummy', 'dummy']; - const originalProcessArgv = process.argv; - - beforeEach(() => { - mockedArgv.length = 2; - process.argv = mockedArgv; - const fsMkdirsSpy = jest.spyOn(fs, 'mkdirs'); - fsMkdirsSpy.mockReturnValue({}); - }); - afterEach(() => (process.argv = originalProcessArgv)); - - test('default', async () => { - const inversifyBinding = new InversifyBinding(); - - const axiosInstance = axios.default; - const options: InversifyBindingOptions = { - pluginRegistryUrl: 'http://fake-registry', - axiosInstance, - }; - - const container: Container = await inversifyBinding.initBindings(options); - container.bind(Generate).toSelf().inSingletonScope(); - - expect(inversifyBinding).toBeDefined(); - - // check devfile module - expect(container.get(DevContainerComponentFinder)).toBeDefined(); - - // check fetch module - expect(container.get(UrlFetcher)).toBeDefined(); - - // check resolve module - expect(container.getAll(TYPES.Resolver).length).toBe(3); - - // check plugin-registry module - expect(container.get(PluginRegistryResolver)).toBeDefined(); - - // check devfile-schema module - expect(container.get(DevfileSchemaValidator)).toBeDefined(); - - // check main module - expect(container.get(Generate)).toBeDefined(); - }); -}); diff --git a/tools/devworkspace-generator/tests/main.spec.ts b/tools/devworkspace-generator/tests/main.spec.ts deleted file mode 100644 index d124dc9e0..000000000 --- a/tools/devworkspace-generator/tests/main.spec.ts +++ /dev/null @@ -1,787 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { InversifyBinding } from '../src/inversify/inversify-binding'; -import { Main } from '../src/main'; -import fs from 'fs-extra'; -import * as jsYaml from 'js-yaml'; -import * as axios from 'axios'; - -describe('Test Main with stubs', () => { - const FAKE_DEVFILE_PATH = '/my-fake-devfile-path'; - const FAKE_DEVFILE_URL = 'http://fake-devfile-url'; - const FAKE_EDITOR_PATH = '/my-fake-editor-path'; - const FAKE_OUTPUT_FILE = '/fake-output'; - const FAKE_PLUGIN_REGISTRY_URL = 'http://fake-plugin-registry-url'; - const FAKE_EDITOR_ENTRY = 'fake/editor'; - - const originalConsoleError = console.error; - const mockedConsoleError = jest.fn(); - - const originalConsoleLog = console.log; - const mockedConsoleLog = jest.fn(); - - const generateMethod = jest.fn(); - const originalArgs = process.argv; - const selfMock = { - inSingletonScope: jest.fn(), - }; - const toSelfMethod = jest.fn(); - const bindMock = { - toSelf: toSelfMethod, - }; - const generateMock = { - generate: generateMethod as any, - }; - - const containerBindMethod = jest.fn(); - const containerGetMethod = jest.fn(); - const container = { - bind: containerBindMethod, - get: containerGetMethod, - } as any; - let spyInitBindings; - - function initArgs( - devfilePath: string | undefined, - devfileUrl: string | undefined, - editorPath: string | undefined, - editorEntry: string | undefined, - outputFile: string | undefined, - pluginRegistryUrl: string | undefined, - injectDefaultComponent: string | undefined, - defaultComponentImage: string | undefined - ) { - // empty args - process.argv = ['', '']; - if (devfilePath) { - process.argv.push(`--devfile-path:${devfilePath}`); - } - if (devfileUrl) { - process.argv.push(`--devfile-url:${devfileUrl}`); - } - if (editorEntry) { - process.argv.push(`--editor-entry:${editorEntry}`); - } - if (editorPath) { - process.argv.push(`--editor-path:${editorPath}`); - } - if (outputFile) { - process.argv.push(`--output-file:${outputFile}`); - } - if (pluginRegistryUrl) { - process.argv.push(`--plugin-registry-url:${pluginRegistryUrl}`); - } - if (defaultComponentImage) { - process.argv.push(`--defaultComponentImage:${defaultComponentImage}`); - } - if (injectDefaultComponent) { - process.argv.push(`--injectDefaultComponent:${injectDefaultComponent}`); - } - } - - beforeEach(() => { - console.error = mockedConsoleError; - console.log = mockedConsoleLog; - }); - - afterEach(() => { - console.error = originalConsoleError; - console.log = originalConsoleLog; - }); - - describe('start', () => { - beforeEach(() => { - initArgs( - FAKE_DEVFILE_PATH, - undefined, - FAKE_EDITOR_PATH, - undefined, - FAKE_OUTPUT_FILE, - FAKE_PLUGIN_REGISTRY_URL, - undefined, - undefined - ); - jest.spyOn(fs, 'readFile').mockResolvedValue(''); - - spyInitBindings = jest.spyOn(InversifyBinding.prototype, 'initBindings'); - spyInitBindings.mockImplementation(() => Promise.resolve(container)); - toSelfMethod.mockReturnValue(selfMock), containerBindMethod.mockReturnValue(bindMock); - containerGetMethod.mockReturnValueOnce(generateMock); - }); - - afterEach(() => { - process.argv = originalArgs; - jest.restoreAllMocks(); - jest.resetAllMocks(); - }); - - test('empty devfile', async () => { - const main = new Main(); - - containerGetMethod.mockReset(); - - const validateDevfileMethod = jest.fn(); - const devfileSchemaValidatorMock = { - validateDevfile: validateDevfileMethod as any, - }; - validateDevfileMethod.mockReturnValueOnce(null); - containerGetMethod.mockReturnValueOnce(devfileSchemaValidatorMock); - containerGetMethod.mockReturnValueOnce(generateMock); - - const returnCode = await main.start(); - - expect(returnCode).toBeFalsy(); - expect(generateMethod).toBeCalledTimes(0); - expect(mockedConsoleError).toBeCalledTimes(2); - }); - - test('success with custom devfile Url', async () => { - const main = new Main(); - initArgs( - undefined, - FAKE_DEVFILE_URL, - undefined, - FAKE_EDITOR_ENTRY, - FAKE_OUTPUT_FILE, - FAKE_PLUGIN_REGISTRY_URL, - 'true', - 'my-image' - ); - process.argv.push('--project.foo=bar'); - containerGetMethod.mockReset(); - const githubResolverResolveMethod = jest.fn(); - const githubResolverMock = { - resolve: githubResolverResolveMethod as any, - }; - - const getContentUrlMethod = jest.fn(); - const getCloneUrlMethod = jest.fn(); - const getBranchNameMethod = jest.fn(); - const getRepoNameMethod = jest.fn(); - - const githubUrlMock = { - getContentUrl: githubResolverResolveMethod as any, - getCloneUrl: getCloneUrlMethod as any, - getBranchName: getBranchNameMethod as any, - getRepoName: getRepoNameMethod as any, - }; - getContentUrlMethod.mockReturnValue('http://foo.bar'); - getCloneUrlMethod.mockReturnValue('http://foo.bar'); - getBranchNameMethod.mockReturnValue('my-branch'); - getRepoNameMethod.mockReturnValue('my-repo'); - githubResolverResolveMethod.mockReturnValue(githubUrlMock); - containerGetMethod.mockReturnValueOnce(githubResolverMock); - - const urlFetcherFetchTextMethod = jest.fn(); - const urlFetcherMock = { - fetchText: urlFetcherFetchTextMethod as any, - }; - urlFetcherFetchTextMethod.mockReturnValueOnce('schemaVersion: 2.1.0'); - containerGetMethod.mockReturnValueOnce(urlFetcherMock); - - const validateDevfileMethod = jest.fn(); - const devfileSchemaValidatorMock = { - validateDevfile: validateDevfileMethod as any, - }; - validateDevfileMethod.mockReturnValueOnce({ valid: true }); - containerGetMethod.mockReturnValueOnce(devfileSchemaValidatorMock); - - const loadDevfilePluginMethod = jest.fn(); - const pluginRegistryResolverMock = { - loadDevfilePlugin: loadDevfilePluginMethod as any, - }; - loadDevfilePluginMethod.mockReturnValue(''); - containerGetMethod.mockReturnValueOnce(pluginRegistryResolverMock); - - // last one is generate mock - containerGetMethod.mockReturnValueOnce(generateMock); - const returnCode = await main.start(); - expect(mockedConsoleError).toBeCalledTimes(0); - expect(loadDevfilePluginMethod).toBeCalled(); - expect(urlFetcherFetchTextMethod).toBeCalled(); - - expect(returnCode).toBeTruthy(); - - const result = { - schemaVersion: '2.1.0', - projects: [ - { - name: 'my-repo', - git: { - remotes: { - origin: 'http://foo.bar', - }, - checkoutFrom: { - revision: 'my-branch', - }, - }, - }, - ], - }; - expect(generateMethod).toBeCalledWith(jsYaml.dump(result), "''\n", FAKE_OUTPUT_FILE, 'true', 'my-image'); - }); - - test('editorEntry with default plugin registry URL', async () => { - const main = new Main(); - initArgs( - FAKE_DEVFILE_PATH, - undefined, - undefined, - FAKE_EDITOR_ENTRY, - FAKE_OUTPUT_FILE, - undefined, - 'false', - undefined - ); - await main.start(); - expect(mockedConsoleLog).toBeCalled(); - expect(mockedConsoleLog.mock.calls[0][0].toString()).toContain('No plug-in registry url. Setting to'); - - // check plugin url is provided to initBindings - expect(spyInitBindings.mock.calls[0][0].pluginRegistryUrl).toBe( - 'https://eclipse-che.github.io/che-plugin-registry/main/v3' - ); - }); - - test('missing devfile', async () => { - const main = new Main(); - initArgs( - undefined, - undefined, - FAKE_EDITOR_PATH, - undefined, - FAKE_OUTPUT_FILE, - FAKE_PLUGIN_REGISTRY_URL, - 'false', - undefined - ); - const returnCode = await main.start(); - expect(mockedConsoleError).toBeCalled(); - expect(mockedConsoleError.mock.calls[1][1].toString()).toContain('missing --devfile-path:'); - expect(returnCode).toBeFalsy(); - expect(generateMethod).toBeCalledTimes(0); - }); - - test('missing editor', async () => { - const main = new Main(); - initArgs( - FAKE_DEVFILE_PATH, - undefined, - undefined, - undefined, - FAKE_OUTPUT_FILE, - FAKE_PLUGIN_REGISTRY_URL, - 'false', - undefined - ); - - const returnCode = await main.start(); - expect(mockedConsoleError).toBeCalled(); - expect(mockedConsoleError.mock.calls[1][1].toString()).toContain('missing --editor-path:'); - expect(returnCode).toBeFalsy(); - expect(generateMethod).toBeCalledTimes(0); - }); - - test('missing outputfile', async () => { - const main = new Main(); - initArgs( - FAKE_DEVFILE_PATH, - undefined, - FAKE_EDITOR_PATH, - undefined, - undefined, - FAKE_PLUGIN_REGISTRY_URL, - 'false', - undefined - ); - const returnCode = await main.start(); - expect(mockedConsoleError).toBeCalled(); - expect(mockedConsoleError.mock.calls[1][1].toString()).toContain('missing --output-file: parameter'); - expect(returnCode).toBeFalsy(); - expect(generateMethod).toBeCalledTimes(0); - }); - - test('error', async () => { - jest.spyOn(InversifyBinding.prototype, 'initBindings').mockImplementation(() => { - throw new Error('Dummy error'); - }); - const main = new Main(); - const returnCode = await main.start(); - expect(mockedConsoleError).toBeCalled(); - expect(returnCode).toBeFalsy(); - expect(generateMethod).toBeCalledTimes(0); - }); - }); - - describe('generateDevfileContext', () => { - beforeEach(() => { - spyInitBindings = jest.spyOn(InversifyBinding.prototype, 'initBindings'); - spyInitBindings.mockImplementation(() => Promise.resolve(container)); - toSelfMethod.mockReturnValue(selfMock), containerBindMethod.mockReturnValue(bindMock); - }); - - afterEach(() => { - process.argv = originalArgs; - jest.restoreAllMocks(); - jest.resetAllMocks(); - }); - - test('missing editor', async () => { - const main = new Main(); - let message: string | undefined; - try { - await main.generateDevfileContext( - { - devfilePath: FAKE_DEVFILE_PATH, - projects: [], - }, - axios.default - ); - throw new Error('Dummy error'); - } catch (e) { - message = e.message; - } - expect(message).toEqual('missing editorPath or editorEntry or editorContent'); - }); - - test('missing devfile', async () => { - const main = new Main(); - let message: string | undefined; - try { - await main.generateDevfileContext( - { - editorEntry: FAKE_EDITOR_ENTRY, - projects: [], - }, - axios.default - ); - throw new Error('Dummy error'); - } catch (e) { - message = e.message; - } - expect(message).toEqual('missing devfilePath or devfileUrl or devfileContent'); - }); - - test('success with custom default image', async () => { - const main = new Main(); - containerGetMethod.mockReset(); - - const validateDevfileMethod = jest.fn(); - const devfileSchemaValidatorMock = { - validateDevfile: validateDevfileMethod as any, - }; - validateDevfileMethod.mockReturnValueOnce({ valid: true }); - containerGetMethod.mockReturnValueOnce(devfileSchemaValidatorMock); - - const loadDevfilePluginMethod = jest.fn(); - const pluginRegistryResolverMock = { - loadDevfilePlugin: loadDevfilePluginMethod as any, - }; - loadDevfilePluginMethod.mockReturnValue(''); - containerGetMethod.mockReturnValueOnce(pluginRegistryResolverMock); - - // last one is generate mock - containerGetMethod.mockReturnValueOnce(generateMock); - - const devfileContent = jsYaml.dump({ - schemaVersion: '2.1.0', - projects: [ - { - name: 'my-repo', - git: { - remotes: { - origin: 'http://foo.bar', - }, - checkoutFrom: { - revision: 'my-branch', - }, - }, - }, - ], - }); - - await main.generateDevfileContext( - { - devfileContent, - outputFile: FAKE_OUTPUT_FILE, - pluginRegistryUrl: FAKE_PLUGIN_REGISTRY_URL, - editorEntry: FAKE_EDITOR_ENTRY, - projects: [], - injectDefaultComponent: 'true', - defaultComponentImage: 'quay.io/custom-image:next', - }, - axios.default - ); - - expect(validateDevfileMethod).toBeCalled(); - expect(mockedConsoleError).toBeCalledTimes(0); - expect(loadDevfilePluginMethod).toBeCalled(); - expect(generateMethod).toBeCalledWith( - devfileContent, - "''\n", - FAKE_OUTPUT_FILE, - 'true', - 'quay.io/custom-image:next' - ); - }); - - test('success with custom devfile content', async () => { - const main = new Main(); - containerGetMethod.mockReset(); - const validateDevfileMethod = jest.fn(); - const devfileSchemaValidatorMock = { - validateDevfile: validateDevfileMethod as any, - }; - validateDevfileMethod.mockReturnValueOnce({ valid: true }); - containerGetMethod.mockReturnValueOnce(devfileSchemaValidatorMock); - - const loadDevfilePluginMethod = jest.fn(); - const pluginRegistryResolverMock = { - loadDevfilePlugin: loadDevfilePluginMethod as any, - }; - loadDevfilePluginMethod.mockReturnValue(''); - containerGetMethod.mockReturnValueOnce(pluginRegistryResolverMock); - - // last one is generate mock - containerGetMethod.mockReturnValueOnce(generateMock); - - const devfileContent = jsYaml.dump({ - schemaVersion: '2.1.0', - projects: [ - { - name: 'my-repo', - git: { - remotes: { - origin: 'http://foo.bar', - }, - checkoutFrom: { - revision: 'my-branch', - }, - }, - }, - ], - }); - - await main.generateDevfileContext( - { - devfileContent, - outputFile: FAKE_OUTPUT_FILE, - pluginRegistryUrl: FAKE_PLUGIN_REGISTRY_URL, - editorEntry: FAKE_EDITOR_ENTRY, - projects: [], - }, - axios.default - ); - - expect(mockedConsoleError).toBeCalledTimes(0); - expect(loadDevfilePluginMethod).toBeCalled(); - expect(validateDevfileMethod).toBeCalled(); - expect(generateMethod).toBeCalledWith(devfileContent, "''\n", FAKE_OUTPUT_FILE, undefined, undefined); - }); - - test('devfile without schemaVersion', async () => { - const main = new Main(); - containerGetMethod.mockReset(); - - // devfile without schemaVersion - const devfileContent = jsYaml.dump({ - metadata: { - name: 'my-repo', - }, - }); - - await expect( - main.generateDevfileContext( - { - devfileContent, - outputFile: FAKE_OUTPUT_FILE, - pluginRegistryUrl: FAKE_PLUGIN_REGISTRY_URL, - editorEntry: FAKE_EDITOR_ENTRY, - projects: [], - }, - axios.default - ) - ).rejects.toThrow('Devfile is not valid, schemaVersion is required'); - }); - - test('success with custom editor content', async () => { - const main = new Main(); - containerGetMethod.mockReset(); - const validateDevfileMethod = jest.fn(); - const devfileSchemaValidatorMock = { - validateDevfile: validateDevfileMethod as any, - }; - validateDevfileMethod.mockReturnValueOnce({ valid: true }); - containerGetMethod.mockReturnValueOnce(devfileSchemaValidatorMock); - - // last one is generate mock - containerGetMethod.mockReturnValueOnce(generateMock); - - const devfileContent = jsYaml.dump({ - schemaVersion: '2.1.0', - projects: [ - { - name: 'my-repo', - git: { - remotes: { - origin: 'http://foo.bar', - }, - checkoutFrom: { - revision: 'my-branch', - }, - }, - }, - ], - }); - - const editorContent = jsYaml.dump({ - schemaVersion: '2.1.0', - metadata: { - name: 'che-incubator/che-pycharm/latest', - }, - components: { - name: 'che-pycharm-runtime-description', - image: 'quay.io/devfile/universal-developer-image:ubi8', - }, - }); - - await main.generateDevfileContext( - { - devfileContent, - outputFile: FAKE_OUTPUT_FILE, - editorContent, - projects: [], - }, - axios.default - ); - - expect(mockedConsoleError).toBeCalledTimes(0); - expect(validateDevfileMethod).toBeCalled(); - expect(generateMethod).toBeCalledWith( - devfileContent, - jsYaml.dump({ - schemaVersion: '2.1.0', - metadata: { - name: 'che-incubator/che-pycharm/latest', - }, - components: { - name: 'che-pycharm-runtime-description', - image: 'quay.io/devfile/universal-developer-image:ubi8', - }, - }), - FAKE_OUTPUT_FILE, - undefined, - undefined - ); - }); - - test('success with editor path', async () => { - const main = new Main(); - containerGetMethod.mockReset(); - const validateDevfileMethod = jest.fn(); - const devfileSchemaValidatorMock = { - validateDevfile: validateDevfileMethod as any, - }; - validateDevfileMethod.mockReturnValueOnce({ valid: true }); - containerGetMethod.mockReturnValueOnce(devfileSchemaValidatorMock); - - // last one is generate mock - containerGetMethod.mockReturnValueOnce(generateMock); - - const devfileContent = jsYaml.dump({ - schemaVersion: '2.1.0', - }); - const editorContent = 'editor content'; - - jest.spyOn(fs, 'readFile').mockResolvedValue(editorContent); - await main.generateDevfileContext( - { - devfileContent, - outputFile: FAKE_OUTPUT_FILE, - editorPath: FAKE_EDITOR_PATH, - projects: [], - }, - axios.default - ); - - expect(mockedConsoleError).toBeCalledTimes(0); - expect(validateDevfileMethod).toBeCalled(); - expect(generateMethod).toBeCalledWith(devfileContent, editorContent, FAKE_OUTPUT_FILE, undefined, undefined); - }); - - test('failed with not valid devfile', async () => { - const main = new Main(); - containerGetMethod.mockReset(); - - const validationResult = { - toString: () => 'Dummy error', - }; - - const validateDevfileMethod = jest.fn(); - const devfileSchemaValidatorMock = { - validateDevfile: validateDevfileMethod as any, - }; - validateDevfileMethod.mockReturnValueOnce(validationResult); - containerGetMethod.mockReturnValueOnce(devfileSchemaValidatorMock); - - // last one is generate mock - containerGetMethod.mockReturnValueOnce(generateMock); - - const devfileContent = jsYaml.dump({ - schemaVersion: '2.1.0', - }); - const editorContent = 'editor content'; - - jest.spyOn(fs, 'readFile').mockResolvedValue(editorContent); - await expect( - main.generateDevfileContext( - { - devfileContent, - outputFile: FAKE_OUTPUT_FILE, - editorPath: FAKE_EDITOR_PATH, - projects: [], - }, - axios.default - ) - ).rejects.toThrow('Devfile schema validation failed. Error: Dummy error'); - - expect(validateDevfileMethod).toBeCalled(); - }); - }); - - describe('replaceIfExistingProjects', () => { - test('empty', async () => { - const devfileContent = ''; - const projects = []; - const main = new Main(); - const result = main.replaceIfExistingProjects(devfileContent, projects); - expect(result).toBe(''); - }); - - test('empty with user projects', async () => { - const devfileContent = ''; - const projects = [ - { - name: 'my-other-repo', - location: 'http://my-location', - }, - ]; - const main = new Main(); - const result = main.replaceIfExistingProjects(devfileContent, projects); - expect(result).toBe(''); - }); - - test('existing projects not matching', async () => { - const initialProjects = [ - { - name: 'my-repo', - git: { - remotes: { - origin: 'http://my.origin', - }, - checkoutFrom: { - revision: 'my-branch', - }, - }, - }, - ]; - - const devfileContent = jsYaml.dump({ - projects: initialProjects, - }); - const projects = [ - { - name: 'my-other-repo', - location: 'http://my-location', - }, - ]; - const main = new Main(); - const result = main.replaceIfExistingProjects(devfileContent, projects); - const devfileResult = jsYaml.load(result); - expect(devfileResult.projects).toStrictEqual(initialProjects); - }); - - test('existing projects matching zip', async () => { - const initialProjects = [ - { - name: 'my-repo', - git: { - remotes: { - origin: 'http://my.origin', - }, - checkoutFrom: { - revision: 'my-branch', - }, - }, - }, - ]; - - const devfileContent = jsYaml.dump({ - projects: initialProjects, - }); - const projects = [ - { - name: 'my-repo', - location: 'http://my-location.zip', - }, - ]; - const main = new Main(); - const result = main.replaceIfExistingProjects(devfileContent, projects); - const devfileResult = jsYaml.load(result); - - const expectedProjects = [ - { - name: 'my-repo', - zip: { - location: 'http://my-location.zip', - }, - }, - ]; - expect(devfileResult.projects).toStrictEqual(expectedProjects); - }); - - test('existing projects matching git', async () => { - const initialProjects = [ - { - name: 'my-repo', - git: { - remotes: { - origin: 'http://my.origin', - }, - checkoutFrom: { - revision: 'my-branch', - }, - }, - }, - ]; - - const devfileContent = jsYaml.dump({ - projects: initialProjects, - }); - const projects = [ - { - name: 'my-repo', - location: 'http://my-another-location', - }, - ]; - const main = new Main(); - const result = main.replaceIfExistingProjects(devfileContent, projects); - const devfileResult = jsYaml.load(result); - - const expectedProjects = []; - Object.assign(expectedProjects, initialProjects); - expectedProjects[0].git.remotes.origin = 'http://my-another-location'; - expect(devfileResult.projects).toStrictEqual(expectedProjects); - }); - }); -}); diff --git a/tools/devworkspace-generator/tests/plugin-registry/plugin-registry-resolver.spec.ts b/tools/devworkspace-generator/tests/plugin-registry/plugin-registry-resolver.spec.ts deleted file mode 100644 index f2b25faf5..000000000 --- a/tools/devworkspace-generator/tests/plugin-registry/plugin-registry-resolver.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -/********************************************************************** - * Copyright (c) 2022 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import * as jsYaml from 'js-yaml'; - -import { Container } from 'inversify'; -import { PluginRegistryResolver } from '../../src/plugin-registry/plugin-registry-resolver'; -import { UrlFetcher } from '../../src/fetch/url-fetcher'; - -describe('Test PluginRegistryResolver', () => { - let container: Container; - - const originalConsoleError = console.error; - const mockedConsoleError = jest.fn(); - - const urlFetcherFetchTextMock = jest.fn(); - const urlFetcherFetchTextOptionalMock = jest.fn(); - const urlFetcher = { - fetchText: urlFetcherFetchTextMock, - fetchTextOptionalContent: urlFetcherFetchTextOptionalMock, - } as any; - - let pluginRegistryResolver: PluginRegistryResolver; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(PluginRegistryResolver).toSelf().inSingletonScope(); - container.bind(UrlFetcher).toConstantValue(urlFetcher); - container.bind('string').toConstantValue('http://fake-plugin-registry').whenTargetNamed('PLUGIN_REGISTRY_URL'); - pluginRegistryResolver = container.get(PluginRegistryResolver); - console.error = mockedConsoleError; - }); - - afterEach(() => { - console.error = originalConsoleError; - }); - - test('basic loadDevfilePlugin', async () => { - const myId = 'foo'; - const dummy = { dummyContent: 'dummy' }; - urlFetcherFetchTextMock.mockResolvedValue(jsYaml.dump(dummy)); - const content = await pluginRegistryResolver.loadDevfilePlugin(myId); - expect(urlFetcherFetchTextMock).toBeCalledWith('http://fake-plugin-registry/plugins/foo/devfile.yaml'); - expect(content).toStrictEqual(dummy); - }); -}); diff --git a/tools/devworkspace-generator/tests/resolve/git-url-resolver.spec.ts b/tools/devworkspace-generator/tests/resolve/git-url-resolver.spec.ts deleted file mode 100644 index bfd8dd0b1..000000000 --- a/tools/devworkspace-generator/tests/resolve/git-url-resolver.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -/********************************************************************** - * Copyright (c) 2023 Red Hat, Inc. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - ***********************************************************************/ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata'; - -import { Container, injectable } from 'inversify'; -import { GitUrlResolver } from '../../src/resolve/git-url-resolver'; -import { TYPES } from '../../src/types'; - -describe('Test git Url resolver', () => { - let container: Container; - - let urlResolver: GitUrlResolver; - - const resolveMock = jest.fn(); - const isValidMock = jest.fn(); - const resolver = { - resolve: resolveMock, - isValid: isValidMock, - } as any; - - beforeEach(() => { - jest.restoreAllMocks(); - jest.resetAllMocks(); - container = new Container(); - container.bind(GitUrlResolver).toSelf().inSingletonScope(); - container.bind(TYPES.Resolver).toConstantValue(resolver); - urlResolver = container.get(GitUrlResolver); - }); - - test('test url resolver', async () => { - isValidMock.mockReturnValue(true); - - urlResolver.resolve('test'); - - expect(resolveMock).toBeCalledWith('test'); - }); - - test('test resolver failure', async () => { - isValidMock.mockReturnValue(false); - - expect(() => urlResolver.resolve('test')).toThrow('Can not resolver the URL'); - }); -}); diff --git a/tools/devworkspace-generator/tsconfig.json b/tools/devworkspace-generator/tsconfig.json deleted file mode 100644 index 7bca566af..000000000 --- a/tools/devworkspace-generator/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "esModuleInterop": true, - "experimentalDecorators": true, - "lib": [ - "ES2017", - ], - "sourceMap": true, - "rootDir": "src", - "outDir": "lib", - "types": [ - "node", "jest" - ], - "resolveJsonModule": true, - }, - "include": [ - "src" - ] -} diff --git a/tools/devworkspace-generator/yarn.lock b/tools/devworkspace-generator/yarn.lock deleted file mode 100644 index efb32072f..000000000 --- a/tools/devworkspace-generator/yarn.lock +++ /dev/null @@ -1,3266 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" - integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" - integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== - dependencies: - "@babel/code-frame" "^7.15.8" - "@babel/generator" "^7.15.8" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.8" - "@babel/helpers" "^7.15.4" - "@babel/parser" "^7.15.8" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.15.8", "@babel/generator@^7.7.2": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" - integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== - dependencies: - "@babel/types" "^7.15.6" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-transforms@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" - integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== - dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== - dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8", "@babel/parser@^7.7.2": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" - integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/template@^7.15.4", "@babel/template@^7.3.3": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@devfile/api@2.2.2-1715367693": - version "2.2.2-1715367693" - resolved "https://registry.yarnpkg.com/@devfile/api/-/api-2.2.2-1715367693.tgz#0e0bbd8a54b5d4f05c2aa9b6cc725a2404629a5c" - integrity sha512-dWGyC7I6cV3L+K2TMOY/hUzmMqp+X1wMp3M3OusoXZrKWExvQVcZZwVd9BB6vPot+0THEHK56U8qYTEy/Ojy0w== - dependencies: - "@types/node" "*" - "@types/node-fetch" "^2.5.7" - es6-promise "^4.2.4" - form-data "^2.5.0" - node-fetch "^2.6.0" - url-parse "^1.4.3" - -"@eslint/eslintrc@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.3.tgz#41f08c597025605f672251dcc4e8be66b5ed7366" - integrity sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.0.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@humanwhocodes/config-array@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.6.0.tgz#b5621fdb3b32309d2d16575456cbc277fa8f021a" - integrity sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.3.1.tgz#e8ea3a475d3f8162f23d69efbfaa9cbe486bee93" - integrity sha512-RkFNWmv0iui+qsOr/29q9dyfKTTT5DCuP31kUwg7rmOKPT/ozLeGLKJKVIiOfbiKyleUZKIrHwhmiZWVe8IMdw== - dependencies: - "@jest/types" "^27.2.5" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.3.1" - jest-util "^27.3.1" - slash "^3.0.0" - -"@jest/core@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.3.1.tgz#04992ef1b58b17c459afb87ab56d81e63d386925" - integrity sha512-DMNE90RR5QKx0EA+wqe3/TNEwiRpOkhshKNxtLxd4rt3IZpCt+RSL+FoJsGeblRZmqdK4upHA/mKKGPPRAifhg== - dependencies: - "@jest/console" "^27.3.1" - "@jest/reporters" "^27.3.1" - "@jest/test-result" "^27.3.1" - "@jest/transform" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^27.3.0" - jest-config "^27.3.1" - jest-haste-map "^27.3.1" - jest-message-util "^27.3.1" - jest-regex-util "^27.0.6" - jest-resolve "^27.3.1" - jest-resolve-dependencies "^27.3.1" - jest-runner "^27.3.1" - jest-runtime "^27.3.1" - jest-snapshot "^27.3.1" - jest-util "^27.3.1" - jest-validate "^27.3.1" - jest-watcher "^27.3.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.3.1.tgz#2182defbce8d385fd51c5e7c7050f510bd4c86b1" - integrity sha512-BCKCj4mOVLme6Tanoyc9k0ultp3pnmuyHw73UHRPeeZxirsU/7E3HC4le/VDb/SMzE1JcPnto+XBKFOcoiJzVw== - dependencies: - "@jest/fake-timers" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - jest-mock "^27.3.0" - -"@jest/fake-timers@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.3.1.tgz#1fad860ee9b13034762cdb94266e95609dfce641" - integrity sha512-M3ZFgwwlqJtWZ+QkBG5NmC23A9w+A6ZxNsO5nJxJsKYt4yguBd3i8TpjQz5NfCX91nEve1KqD9RA2Q+Q1uWqoA== - dependencies: - "@jest/types" "^27.2.5" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.3.1" - jest-mock "^27.3.0" - jest-util "^27.3.1" - -"@jest/globals@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.3.1.tgz#ce1dfb03d379237a9da6c1b99ecfaca1922a5f9e" - integrity sha512-Q651FWiWQAIFiN+zS51xqhdZ8g9b88nGCobC87argAxA7nMfNQq0Q0i9zTfQYgLa6qFXk2cGANEqfK051CZ8Pg== - dependencies: - "@jest/environment" "^27.3.1" - "@jest/types" "^27.2.5" - expect "^27.3.1" - -"@jest/reporters@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.3.1.tgz#28b5c1f5789481e23788048fa822ed15486430b9" - integrity sha512-m2YxPmL9Qn1emFVgZGEiMwDntDxRRQ2D58tiDQlwYTg5GvbFOKseYCcHtn0WsI8CG4vzPglo3nqbOiT8ySBT/w== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.3.1" - "@jest/test-result" "^27.3.1" - "@jest/transform" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^27.3.1" - jest-resolve "^27.3.1" - jest-util "^27.3.1" - jest-worker "^27.3.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/source-map@^27.0.6": - version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" - integrity sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.3.1.tgz#89adee8b771877c69b3b8d59f52f29dccc300194" - integrity sha512-mLn6Thm+w2yl0opM8J/QnPTqrfS4FoXsXF2WIWJb2O/GBSyResL71BRuMYbYRsGt7ELwS5JGcEcGb52BNrumgg== - dependencies: - "@jest/console" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.3.1.tgz#4b3bde2dbb05ee74afdae608cf0768e3354683b1" - integrity sha512-siySLo07IMEdSjA4fqEnxfIX8lB/lWYsBPwNFtkOvsFQvmBrL3yj3k3uFNZv/JDyApTakRpxbKLJ3CT8UGVCrA== - dependencies: - "@jest/test-result" "^27.3.1" - graceful-fs "^4.2.4" - jest-haste-map "^27.3.1" - jest-runtime "^27.3.1" - -"@jest/transform@^27.3.1": - version "27.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.3.1.tgz#ff80eafbeabe811e9025e4b6f452126718455220" - integrity sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.2.5" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^27.3.1" - jest-regex-util "^27.0.6" - jest-util "^27.3.1" - micromatch "^4.0.4" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^27.2.5": - version "27.2.5" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132" - integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz#1c1c9a91419f804e59ae8df316a07dd1c3a76b94" - integrity sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" - integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^27.0.2": - version "27.0.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.2.tgz#ac383c4d4aaddd29bbf2b916d8d105c304a5fcd7" - integrity sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA== - dependencies: - jest-diff "^27.0.0" - pretty-format "^27.0.0" - -"@types/node-fetch@^2.5.7": - version "2.6.9" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.9.tgz#15f529d247f1ede1824f7e7acdaa192d5f28071e" - integrity sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - -"@types/node@*": - version "16.11.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.1.tgz#2e50a649a50fc403433a14f829eface1a3443e97" - integrity sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA== - -"@types/prettier@^2.1.5": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" - integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== - -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -axios@^1.7.0: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-jest@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.3.1.tgz#0636a3404c68e07001e434ac4956d82da8a80022" - integrity sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ== - dependencies: - "@jest/transform" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^27.2.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-plugin-istanbul@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.2.0: - version "27.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz#79f37d43f7e5c4fdc4b2ca3e10cc6cf545626277" - integrity sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-polyfill@^6.2.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^27.2.0: - version "27.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz#556bbbf340608fed5670ab0ea0c8ef2449fba885" - integrity sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg== - dependencies: - babel-plugin-jest-hoist "^27.2.0" - babel-preset-current-node-syntax "^1.0.0" - -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.16.6: - version "4.17.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" - integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== - dependencies: - caniuse-lite "^1.0.30001265" - electron-to-chromium "^1.3.867" - escalade "^3.1.1" - node-releases "^2.0.0" - picocolors "^1.0.0" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-lite@^1.0.30001265: - version "1.0.30001270" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001270.tgz#cc9c37a4ec5c1a8d616fc7bace902bb053b0cdea" - integrity sha512-TcIC7AyNWXhcOmv2KftOl1ShFAaHQYcB/EPL/hEyMrcS7ZX0/DvV1aoy6BzV0+16wTpoAyTMGDNAJfSqS/rz7A== - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.6, combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" - integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -duplexer@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -electron-to-chromium@^1.3.867: - version "1.3.873" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.873.tgz#c238c9199e4951952fe815a65c1beab5db4826b8" - integrity sha512-TiHlCgl2uP26Z0c67u442c0a2MZCWZNCRnPTQDPhVJ4h9G6z2zU0lApD9H0K9R5yFL5SfdaiVsVD2izOY24xBQ== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -es6-promise@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-6.0.0.tgz#9cf45b13c5ac8f3d4c50f46a5121f61b3e318978" - integrity sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186" - integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q== - -eslint@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.1.0.tgz#00f1f7dbf4134f26588e6c9f2efe970760f64664" - integrity sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw== - dependencies: - "@eslint/eslintrc" "^1.0.3" - "@humanwhocodes/config-array" "^0.6.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^6.0.0" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.0.0" - espree "^9.0.0" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.2.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.0.0.tgz#e90a2965698228502e771c7a58489b1a9d107090" - integrity sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ== - dependencies: - acorn "^8.5.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^3.0.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-stream@=3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE= - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expect@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.3.1.tgz#d0f170b1f5c8a2009bab0beffd4bb94f043e38e7" - integrity sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg== - dependencies: - "@jest/types" "^27.2.5" - ansi-styles "^5.0.0" - jest-get-type "^27.3.1" - jest-matcher-utils "^27.3.1" - jest-message-util "^27.3.1" - jest-regex-util "^27.0.6" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== - -follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= - -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.6.0, globals@^13.9.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" - integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== - dependencies: - type-fest "^0.20.2" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -if-env@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/if-env/-/if-env-1.0.4.tgz#8b2b6bd308af86a3a19bb273426761085104878b" - integrity sha1-iytr0wivhqOhm7JzQmdhCFEEh4s= - dependencies: - npm-run-all "1.4.0" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" - integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inversify@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730" - integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ== - -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -istanbul-lib-coverage@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.0.4.tgz#e976f2aa66ebc6737f236d3ab05b76e36f885c80" - integrity sha512-W6jJF9rLGEISGoCyXRqa/JCGQGmmxPO10TMu7izaUTynxvBvTjqzAIIGCK9USBmIbQAaSWD6XJPrM9Pv5INknw== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.5.tgz#a2580107e71279ea6d661ddede929ffc6d693384" - integrity sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^27.3.0: - version "27.3.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.3.0.tgz#22a02cc2b34583fc66e443171dc271c0529d263c" - integrity sha512-9DJs9garMHv4RhylUMZgbdCJ3+jHSkpL9aaVKp13xtXAD80qLTLrqcDZL1PHA9dYA0bCI86Nv2BhkLpLhrBcPg== - dependencies: - "@jest/types" "^27.2.5" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.3.1.tgz#1679e74387cbbf0c6a8b42de963250a6469e0797" - integrity sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw== - dependencies: - "@jest/environment" "^27.3.1" - "@jest/test-result" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.3.1" - is-generator-fn "^2.0.0" - jest-each "^27.3.1" - jest-matcher-utils "^27.3.1" - jest-message-util "^27.3.1" - jest-runtime "^27.3.1" - jest-snapshot "^27.3.1" - jest-util "^27.3.1" - pretty-format "^27.3.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.3.1.tgz#b576f9d146ba6643ce0a162d782b40152b6b1d16" - integrity sha512-WHnCqpfK+6EvT62me6WVs8NhtbjAS4/6vZJnk7/2+oOr50cwAzG4Wxt6RXX0hu6m1169ZGMlhYYUNeKBXCph/Q== - dependencies: - "@jest/core" "^27.3.1" - "@jest/test-result" "^27.3.1" - "@jest/types" "^27.2.5" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - jest-config "^27.3.1" - jest-util "^27.3.1" - jest-validate "^27.3.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.3.1.tgz#cb3b7f6aaa8c0a7daad4f2b9573899ca7e09bbad" - integrity sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^27.3.1" - "@jest/types" "^27.2.5" - babel-jest "^27.3.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-circus "^27.3.1" - jest-environment-jsdom "^27.3.1" - jest-environment-node "^27.3.1" - jest-get-type "^27.3.1" - jest-jasmine2 "^27.3.1" - jest-regex-util "^27.0.6" - jest-resolve "^27.3.1" - jest-runner "^27.3.1" - jest-util "^27.3.1" - jest-validate "^27.3.1" - micromatch "^4.0.4" - pretty-format "^27.3.1" - -jest-diff@^27.0.0, jest-diff@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.3.1.tgz#d2775fea15411f5f5aeda2a5e02c2f36440f6d55" - integrity sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.0.6" - jest-get-type "^27.3.1" - pretty-format "^27.3.1" - -jest-docblock@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" - integrity sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.3.1.tgz#14c56bb4f18dd18dc6bdd853919b5f16a17761ff" - integrity sha512-E4SwfzKJWYcvOYCjOxhZcxwL+AY0uFMvdCOwvzgutJiaiodFjkxQQDxHm8FQBeTqDnSmKsQWn7ldMRzTn2zJaQ== - dependencies: - "@jest/types" "^27.2.5" - chalk "^4.0.0" - jest-get-type "^27.3.1" - jest-util "^27.3.1" - pretty-format "^27.3.1" - -jest-environment-jsdom@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.3.1.tgz#63ac36d68f7a9303494df783494856222b57f73e" - integrity sha512-3MOy8qMzIkQlfb3W1TfrD7uZHj+xx8Olix5vMENkj5djPmRqndMaXtpnaZkxmxM+Qc3lo+yVzJjzuXbCcZjAlg== - dependencies: - "@jest/environment" "^27.3.1" - "@jest/fake-timers" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - jest-mock "^27.3.0" - jest-util "^27.3.1" - jsdom "^16.6.0" - -jest-environment-node@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.3.1.tgz#af7d0eed04edafb740311b303f3fe7c8c27014bb" - integrity sha512-T89F/FgkE8waqrTSA7/ydMkcc52uYPgZZ6q8OaZgyiZkJb5QNNCF6oPZjH9IfPFfcc9uBWh1574N0kY0pSvTXw== - dependencies: - "@jest/environment" "^27.3.1" - "@jest/fake-timers" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - jest-mock "^27.3.0" - jest-util "^27.3.1" - -jest-get-type@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.3.1.tgz#a8a2b0a12b50169773099eee60a0e6dd11423eff" - integrity sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg== - -jest-haste-map@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.3.1.tgz#7656fbd64bf48bda904e759fc9d93e2c807353ee" - integrity sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg== - dependencies: - "@jest/types" "^27.2.5" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^27.0.6" - jest-serializer "^27.0.6" - jest-util "^27.3.1" - jest-worker "^27.3.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.3.1.tgz#df6d3d07c7dafc344feb43a0072a6f09458d32b0" - integrity sha512-WK11ZUetDQaC09w4/j7o4FZDUIp+4iYWH/Lik34Pv7ukL+DuXFGdnmmi7dT58J2ZYKFB5r13GyE0z3NPeyJmsg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^27.3.1" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.3.1" - is-generator-fn "^2.0.0" - jest-each "^27.3.1" - jest-matcher-utils "^27.3.1" - jest-message-util "^27.3.1" - jest-runtime "^27.3.1" - jest-snapshot "^27.3.1" - jest-util "^27.3.1" - pretty-format "^27.3.1" - throat "^6.0.1" - -jest-leak-detector@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.3.1.tgz#7fb632c2992ef707a1e73286e1e704f9cc1772b2" - integrity sha512-78QstU9tXbaHzwlRlKmTpjP9k4Pvre5l0r8Spo4SbFFVy/4Abg9I6ZjHwjg2QyKEAMg020XcjP+UgLZIY50yEg== - dependencies: - jest-get-type "^27.3.1" - pretty-format "^27.3.1" - -jest-matcher-utils@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz#257ad61e54a6d4044e080d85dbdc4a08811e9c1c" - integrity sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w== - dependencies: - chalk "^4.0.0" - jest-diff "^27.3.1" - jest-get-type "^27.3.1" - pretty-format "^27.3.1" - -jest-message-util@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.3.1.tgz#f7c25688ad3410ab10bcb862bcfe3152345c6436" - integrity sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.2.5" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.4" - pretty-format "^27.3.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.3.0: - version "27.3.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.3.0.tgz#ddf0ec3cc3e68c8ccd489bef4d1f525571a1b867" - integrity sha512-ziZiLk0elZOQjD08bLkegBzv5hCABu/c8Ytx45nJKkysQwGaonvmTxwjLqEA4qGdasq9o2I8/HtdGMNnVsMTGw== - dependencies: - "@jest/types" "^27.2.5" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" - integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== - -jest-resolve-dependencies@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.3.1.tgz#85b99bdbdfa46e2c81c6228fc4c91076f624f6e2" - integrity sha512-X7iLzY8pCiYOnvYo2YrK3P9oSE8/3N2f4pUZMJ8IUcZnT81vlSonya1KTO9ZfKGuC+svE6FHK/XOb8SsoRUV1A== - dependencies: - "@jest/types" "^27.2.5" - jest-regex-util "^27.0.6" - jest-snapshot "^27.3.1" - -jest-resolve@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.3.1.tgz#0e5542172a1aa0270be6f66a65888647bdd74a3e" - integrity sha512-Dfzt25CFSPo3Y3GCbxynRBZzxq9AdyNN+x/v2IqYx6KVT5Z6me2Z/PsSGFSv3cOSUZqJ9pHxilao/I/m9FouLw== - dependencies: - "@jest/types" "^27.2.5" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^27.3.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.3.1" - jest-validate "^27.3.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.3.1.tgz#1d594dcbf3bd8600a7e839e790384559eaf96e3e" - integrity sha512-r4W6kBn6sPr3TBwQNmqE94mPlYVn7fLBseeJfo4E2uCTmAyDFm2O5DYAQAFP7Q3YfiA/bMwg8TVsciP7k0xOww== - dependencies: - "@jest/console" "^27.3.1" - "@jest/environment" "^27.3.1" - "@jest/test-result" "^27.3.1" - "@jest/transform" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-docblock "^27.0.6" - jest-environment-jsdom "^27.3.1" - jest-environment-node "^27.3.1" - jest-haste-map "^27.3.1" - jest-leak-detector "^27.3.1" - jest-message-util "^27.3.1" - jest-resolve "^27.3.1" - jest-runtime "^27.3.1" - jest-util "^27.3.1" - jest-worker "^27.3.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.3.1.tgz#80fa32eb85fe5af575865ddf379874777ee993d7" - integrity sha512-qtO6VxPbS8umqhEDpjA4pqTkKQ1Hy4ZSi9mDVeE9Za7LKBo2LdW2jmT+Iod3XFaJqINikZQsn2wEi0j9wPRbLg== - dependencies: - "@jest/console" "^27.3.1" - "@jest/environment" "^27.3.1" - "@jest/globals" "^27.3.1" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.3.1" - "@jest/transform" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-haste-map "^27.3.1" - jest-message-util "^27.3.1" - jest-mock "^27.3.0" - jest-regex-util "^27.0.6" - jest-resolve "^27.3.1" - jest-snapshot "^27.3.1" - jest-util "^27.3.1" - jest-validate "^27.3.1" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^16.2.0" - -jest-serializer@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" - integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.3.1.tgz#1da5c0712a252d70917d46c037054f5918c49ee4" - integrity sha512-APZyBvSgQgOT0XumwfFu7X3G5elj6TGhCBLbBdn3R1IzYustPGPE38F51dBWMQ8hRXa9je0vAdeVDtqHLvB6lg== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/parser" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.3.1" - graceful-fs "^4.2.4" - jest-diff "^27.3.1" - jest-get-type "^27.3.1" - jest-haste-map "^27.3.1" - jest-matcher-utils "^27.3.1" - jest-message-util "^27.3.1" - jest-resolve "^27.3.1" - jest-util "^27.3.1" - natural-compare "^1.4.0" - pretty-format "^27.3.1" - semver "^7.3.2" - -jest-util@^27.0.0, jest-util@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.3.1.tgz#a58cdc7b6c8a560caac9ed6bdfc4e4ff23f80429" - integrity sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw== - dependencies: - "@jest/types" "^27.2.5" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.4" - picomatch "^2.2.3" - -jest-validate@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.3.1.tgz#3a395d61a19cd13ae9054af8cdaf299116ef8a24" - integrity sha512-3H0XCHDFLA9uDII67Bwi1Vy7AqwA5HqEEjyy934lgVhtJ3eisw6ShOF1MDmRPspyikef5MyExvIm0/TuLzZ86Q== - dependencies: - "@jest/types" "^27.2.5" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.3.1" - leven "^3.1.0" - pretty-format "^27.3.1" - -jest-watcher@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.3.1.tgz#ba5e0bc6aa843612b54ddb7f009d1cbff7e05f3e" - integrity sha512-9/xbV6chABsGHWh9yPaAGYVVKurWoP3ZMCv6h+O1v9/+pkOroigs6WzZ0e9gLP/njokUwM7yQhr01LKJVMkaZA== - dependencies: - "@jest/test-result" "^27.3.1" - "@jest/types" "^27.2.5" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.3.1" - string-length "^4.0.1" - -jest-worker@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2" - integrity sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.3.1.tgz#b5bab64e8f56b6f7e275ba1836898b0d9f1e5c8a" - integrity sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng== - dependencies: - "@jest/core" "^27.3.1" - import-local "^3.0.2" - jest-cli "^27.3.1" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.0.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@2.x, json5@^2.1.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonc-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonschema@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.50.0: - version "1.50.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" - integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== - -mime-types@^2.1.12: - version "2.1.33" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" - integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== - dependencies: - mime-db "1.50.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.0, minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -node-fetch@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-releases@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.0.tgz#67dc74903100a7deb044037b8a2e5f453bb05400" - integrity sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-all@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-1.4.0.tgz#a469bb9feabe5bf3aa9916833baf6776582e8948" - integrity sha1-pGm7n+q+W/OqmRaDO69ndlguiUg= - dependencies: - babel-polyfill "^6.2.0" - minimatch "^3.0.0" - ps-tree "^1.0.1" - shell-quote "^1.4.3" - which "^1.2.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= - dependencies: - through "~2.3" - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== - -pretty-format@^27.0.0, pretty-format@^27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5" - integrity sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA== - dependencies: - "@jest/types" "^27.2.5" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -ps-tree@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" - integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== - dependencies: - event-stream "=3.3.4" - -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -reflect-metadata@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@^2.44.0: - version "2.58.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.58.0.tgz#a643983365e7bf7f5b7c62a8331b983b7c4c67fb" - integrity sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw== - optionalDependencies: - fsevents "~2.3.2" - -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -semver@7.x, semver@^7.2.1, semver@^7.3.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.4.3: - version "1.7.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" - integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-support@^0.5.6: - version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= - dependencies: - duplexer "~0.1.1" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -through@2, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmpl@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-jest@^27.0.7: - version "27.0.7" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.7.tgz#fb7c8c8cb5526ab371bc1b23d06e745652cca2d0" - integrity sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "20.x" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.4.3, url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -v8-to-istanbul@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" - integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.4.6: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@20.x, yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2"