From a9864b6502a7012a596b5dc262911e0ed982dfc4 Mon Sep 17 00:00:00 2001 From: Pierre DE SOYRES Date: Mon, 6 Nov 2023 20:31:54 +0100 Subject: [PATCH] ci: implement CI with GitHub actions * build workflow * preview workflow * release with release-please Fixes #625, #627, #637 --- .commitlintrc | 3 + .githooks/commit-msg | 3 + .github/workflows/build.yml | 46 + .github/workflows/preview.yml | 110 + .github/workflows/publish.yml | 59 + .github/workflows/release-please.yml | 17 + .gitignore | 2 +- .npmrc | 1 - CONTRIBUTING.md | 40 + Jenkinsfile | 109 - README.md | 2 +- RELEASE.md | 262 +- docker-runner/Dockerfile | 15 - docs/nexus-config.md | 5 +- docs/setup-systems.md | 23 +- package-lock.json | 2861 ++++++++++++++--- package.json | 6 +- scripts/archive.js | 61 + scripts/build.js | 29 + scripts/bundle.js | 139 + scripts/cellar-client.js | 91 + scripts/config.js | 92 +- scripts/job-build.js | 72 +- scripts/job-package.js | 166 - scripts/job-preview.js | 301 ++ scripts/job-publish-bintray.js | 82 - scripts/job-publish-cellar.js | 86 - scripts/job-publish.js | 87 + scripts/paths.js | 75 + .../{job-publish-arch.js => publish-arch.js} | 18 +- .../{job-publish-brew.js => publish-brew.js} | 16 +- scripts/publish-cellar.js | 85 + ...lish-dockerhub.js => publish-dockerhub.js} | 8 +- ...-publish-exherbo.js => publish-exherbo.js} | 24 +- ...{job-publish-nexus.js => publish-nexus.js} | 62 +- .../{job-publish-npm.js => publish-npm.js} | 12 +- scripts/utils.js | 65 +- templates/arch/.SRCINFO | 2 +- templates/arch/PKGBUILD | 2 +- templates/choco/clever-tools.nuspec | 2 +- .../a1e3117ee6ea4987863ac586a4e311cf.psmdcp | 2 +- templates/exherbo/clever-tools-bin.exheres-0 | 2 +- templates/rpm/cc-nexus-rpm.repo | 7 - 43 files changed, 4006 insertions(+), 1146 deletions(-) create mode 100644 .commitlintrc create mode 100755 .githooks/commit-msg create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/preview.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/release-please.yml create mode 100644 CONTRIBUTING.md delete mode 100644 Jenkinsfile delete mode 100644 docker-runner/Dockerfile create mode 100644 scripts/archive.js create mode 100644 scripts/build.js create mode 100644 scripts/bundle.js create mode 100644 scripts/cellar-client.js mode change 100644 => 100755 scripts/job-build.js delete mode 100644 scripts/job-package.js create mode 100755 scripts/job-preview.js delete mode 100644 scripts/job-publish-bintray.js delete mode 100644 scripts/job-publish-cellar.js create mode 100755 scripts/job-publish.js create mode 100644 scripts/paths.js rename scripts/{job-publish-arch.js => publish-arch.js} (53%) rename scripts/{job-publish-brew.js => publish-brew.js} (58%) create mode 100644 scripts/publish-cellar.js rename scripts/{job-publish-dockerhub.js => publish-dockerhub.js} (82%) rename scripts/{job-publish-exherbo.js => publish-exherbo.js} (58%) rename scripts/{job-publish-nexus.js => publish-nexus.js} (59%) rename scripts/{job-publish-npm.js => publish-npm.js} (54%) diff --git a/.commitlintrc b/.commitlintrc new file mode 100644 index 00000000..c30e5a97 --- /dev/null +++ b/.commitlintrc @@ -0,0 +1,3 @@ +{ + "extends": ["@commitlint/config-conventional"] +} diff --git a/.githooks/commit-msg b/.githooks/commit-msg new file mode 100755 index 00000000..4042ebf0 --- /dev/null +++ b/.githooks/commit-msg @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +npx --no -- commitlint --edit diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..803d6a62 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,46 @@ +name: 'Build' +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + build: + name: 'Build' + runs-on: ubuntu-latest + + steps: + - name: '[Prepare] Checkout' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: '[Prepare] Setup Node.js' + uses: actions/setup-node@v3 + with: + node-version-file: 'package.json' + cache: 'npm' + - name: '[Prepare] Install dependencies' + run: npm ci + + - name: '[Code quality] Check commit message' + if: github.event_name == 'pull_request' + run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose + +# - name: '[Code quality] Check ESLint' +# run: npm run lint + + - name: '[Build] [Prepare] Setup ruby' + uses: ruby/setup-ruby@v1 + with: + ruby-version: '2.7' + bundler-cache: true + - name: '[Build] [Prepare] Install fpm' + run: gem install fpm + - name: '[Build] [Run] Build' + run: node scripts/job-build.js 0.0.0 --latest --bundle + env: + RPM_GPG_PRIVATE_KEY: ${{ secrets.RPM_GPG_PRIVATE_KEY }} + RPM_GPG_NAME: 'Clever Cloud Nexus (rpm)' + RPM_GPG_PASS: ${{ secrets.RPM_GPG_PASSPHRASE }} diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml new file mode 100644 index 00000000..eed2e73c --- /dev/null +++ b/.github/workflows/preview.yml @@ -0,0 +1,110 @@ +name: 'Preview' +on: + pull_request: + types: + - synchronize + - opened + - closed + +env: + BRANCH: ${{ github.event.pull_request.head.ref }} + CC_CLEVER_TOOLS_PREVIEWS_CELLAR_KEY_ID: ${{ secrets.CC_CLEVER_TOOLS_PREVIEWS_CELLAR_KEY_ID }} + CC_CLEVER_TOOLS_PREVIEWS_CELLAR_SECRET_KEY: ${{ secrets.CC_CLEVER_TOOLS_PREVIEWS_CELLAR_SECRET_KEY }} + +jobs: + wait_for_build: + name: 'Wait for build to succeed' + if: | + (github.event.action == 'synchronize' || github.event.action == 'opened') + && github.event.repository.fork == false + && !startsWith(github.event.pull_request.head.ref, 'release-please--') + runs-on: ubuntu-latest + steps: + - name: 'Wait for build to succeed' + uses: lewagon/wait-on-check-action@v1.3.1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + check-name: Build + ref: ${{ github.event.pull_request.head.sha }} + allowed-conclusions: success + publish: + name: 'Publish Preview' + needs: wait_for_build + runs-on: ubuntu-latest + steps: + - name: '[Prepare] Checkout' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: '[Prepare] Setup Node.js' + uses: actions/setup-node@v3 + with: + node-version-file: 'package.json' + cache: 'npm' + - name: '[Prepare] Install dependencies' + run: npm ci + - name: '[Prepare] Check if a preview already exists' + id: check_preview + run: | + if node scripts/job-preview.js get ${BRANCH} > /dev/null 2>&1; then + echo "exists=yes" >> $GITHUB_OUTPUT + else + echo "exists=no" >> $GITHUB_OUTPUT + fi + + - name: '[Run] Build preview' + run: node scripts/job-preview.js build ${BRANCH} + - name: '[Run] Publish preview' + run: node scripts/job-preview.js publish ${BRANCH} + + - name: '[Finalize] Get preview links' + if: steps.check_preview.outputs.exists == 'no' + id: get_preview_links + run: | + PREVIEW_LINKS=$(node scripts/job-preview.js links $BRANCH | sed -z 's/\n/\\n/g'; echo) + echo "PREVIEW_LINKS=${PREVIEW_LINKS::-2}" >> $GITHUB_ENV + - name: '[Finalize] Add comment' + if: steps.check_preview.outputs.exists == 'no' + uses: actions/github-script@v6 + with: + script: | + const links = "${{ env.PREVIEW_LINKS }}"; + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: `๐Ÿ”Ž A preview has been automatically published:\n\n${links}\n\n\n_This preview will be deleted once this PR is closed._` + }); + delete: + if: | + github.event.action == 'closed' + && github.event.repository.fork == false + && !startsWith(github.event.pull_request.head.ref, 'release-please--') + name: 'Delete Preview' + runs-on: ubuntu-latest + steps: + - name: '[Prepare] Checkout' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: '[Prepare] Setup Node.js' + uses: actions/setup-node@v3 + with: + node-version-file: 'package.json' + cache: 'npm' + - name: '[Prepare] Install dependencies' + run: npm ci + + - name: '[Run] Delete preview' + run: node scripts/job-preview.js delete ${BRANCH} + + - name: '[Finalize] Add comment' + uses: actions/github-script@v6 + with: + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: `๐Ÿ”Ž The preview has been automatically deleted.` + }); diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..6254a9a8 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,59 @@ +name: 'Publish' +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + +env: + VERSION: ${{ github.ref_name }} + CC_CLEVER_TOOLS_RELEASES_CELLAR_KEY_ID: ${{ secrets.CC_CLEVER_TOOLS_RELEASES_CELLAR_KEY_ID }} + CC_CLEVER_TOOLS_RELEASES_CELLAR_SECRET_KEY: ${{ secrets.CC_CLEVER_TOOLS_RELEASES_CELLAR_SECRET_KEY }} + RPM_GPG_PRIVATE_KEY: ${{ secrets.RPM_GPG_PRIVATE_KEY }} + RPM_GPG_NAME: 'Clever Cloud Nexus (rpm)' + RPM_GPG_PASS: ${{ secrets.RPM_GPG_PASSPHRASE }} + NEXUS_USER: ${{ secrets.NEXUS_USER }} + NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + +jobs: + publish_cellar: + name: 'Publish' + runs-on: ubuntu-latest + steps: + - name: '[Prepare] Checkout' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: '[Prepare] Setup Node.js' + uses: actions/setup-node@v3 + with: + node-version-file: 'package.json' + cache: 'npm' + - name: '[Prepare] Install dependencies' + run: npm ci + - name: '[Prepare] Setup ruby' + uses: ruby/setup-ruby@v1 + with: + ruby-version: '2.7' + bundler-cache: true + - name: '[Prepare] Install fpm' + run: gem install fpm + - name: '[Prepare] Setup ssh-agent' + uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + + - name: '[Build] version ${{ env.VERSION }}' + run: node scripts/job-build.js "${VERSION}" --latest --bundle + + - name: '[Publish] version ${{ env.VERSION }}' + run: node scripts/job-publish.js "${VERSION}" + + - name: '[Publish] Upload artifacts to GitHub Release' + shell: bash + run: | + gh release upload "${VERSION}" $(find build/${{ github.ref_name }}/archive -maxdepth 1 -type f -name "*$VERSION*" -print) + gh release upload "${VERSION}" $(find build/${{ github.ref_name }}/bundle -maxdepth 1 -type f -print) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..83da5d9d --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,17 @@ +name: 'release-please' +on: + push: + branches: + - master + - 'hotfix/**' +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: google-github-actions/release-please-action@v3 + with: + token: ${{ secrets.CI_TOKEN }} + release-type: node + include-v-in-tag: false + default-branch: ${{ github.ref_name }} + changelog-types: '[{"type": "feat", "section": "๐Ÿš€ Features"}, {"type": "fix", "section": "๐Ÿ› Bug Fixes"}, {"type": "perf", "section": "๐Ÿ’ช Performance Improvements"}, {"type": "deps", "section": "๐Ÿ—ƒ๏ธ Dependencies", "hidden": true}, {"type": "revert", "section": "โ†ฉ Reverts"}, {"type": "docs", "section": "๐Ÿ“– Documentation", "hidden": true}, {"type": "style", "section": "๐ŸŽจ Styles", "hidden": true}, {"type": "chore", "section": "๐Ÿงน Miscellaneous Chores", "hidden": true}, {"type": "refactor", "section": "๐Ÿ›  Code Refactoring", "hidden": true}, {"type": "test", "section": "๐Ÿ”ฌ Tests", "hidden": true}, {"type": "build", "section": "๐Ÿ—๏ธ Build System", "hidden": true}, {"type": "ci", "section": "๐Ÿค– Continuous Integration", "hidden": true}]' diff --git a/.gitignore b/.gitignore index a97d1948..8a607e56 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ node_modules/ spec/empty-repo spec/application.instance-types.js .clever.json -releases/ +build/ .idea/ .s3cfg* *.gpg.key diff --git a/.npmrc b/.npmrc index ca325f30..0efa01e3 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,2 @@ tag-version-prefix = "" message = "Upgrade to %s" -preid = "beta" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0a7f39e3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,40 @@ +# How to contribute? + +## We use ESLint + +We use [ESLint](https://eslint.org/) to enforce JS coding style and spot linting errors ASAP. +Our configuration is based on [standardJS](https://standardjs.com/) + some small tweaks (see `.eslintrc.js`). + +You can run the lint check with: + +```shell +npm run lint +``` + +You can run the lint check (with autofix) with: + +```shell +npm run lint:fix +``` + +## We have precise rules for commit message format + +Commit messages must respect [conventional commit](https://www.conventionalcommits.org). + +Possible types are `fix:`, `feat:`, `build:`, `chore:`, `ci:`, `docs:`, `style:`, `refactor:`, `perf:`, `test:`. + +The scope should be the name of the command affected. +If many commands are affected, consider the following options: +* split into multiple commits +* avoid specifying any scope and add some details instead. However, you must understand that details won't be dumped into the CHANGELOG. + +If none of these options suits your need, you can follow [this how-to](https://github.com/googleapis/release-please#what-if-my-pr-contains-multiple-fixes-or-features) that will let you generate multiple CHANGELOG entries with one single commit. + +To help you respect the rules, you should install a commit linter with the following command: + +```shell +cd ${PATH_TO_THE_REPOSITORY_ROOT} +git config core.hooksPath '.githooks' +``` + +You must understand that nothing will be dumped into the CHANGELOG if you don't respect these rules. diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 88cb0118..00000000 --- a/Jenkinsfile +++ /dev/null @@ -1,109 +0,0 @@ -pipeline { - agent { label 'cc-ci-agent' } - triggers { - githubPush() - } - environment { - GIT_TAG_NAME = gitTagName() - S3_KEY_ID = credentials('CELLAR_CC_TOOLS_ACCESS_KEY_ID') - S3_SECRET_KEY = credentials('CELLAR_CC_TOOLS_SECRET_ACCESS_KEY') - BINTRAY_API_KEY = credentials('BINTRAY_CC_TOOLS_API_KEY') - NUGET_API_KEY = credentials('NUGET_API_KEY') - NEXUS_PASSWORD = credentials('NEXUS_PASSWORD') - NEXUS_USER = credentials('NEXUS_USER') - NPM_TOKEN = credentials('NPM_TOKEN') - RPM_GPG_PRIVATE_KEY = credentials('RPM_GPG_PRIVATE_KEY') - RPM_GPG_PUBLIC_KEY = credentials('RPM_GPG_PUBLIC_KEY') - RPM_GPG_NAME = 'Clever Cloud Nexus (rpm)' - RPM_GPG_PASS = credentials('RPM_GPG_PASSPHRASE') - FORCE_COLOR=3 - } - options { - ansiColor('xterm') - buildDiscarder(logRotator(daysToKeepStr: '5', numToKeepStr: '10', artifactDaysToKeepStr: '5', artifactNumToKeepStr: '10')) - } - stages { - stage('build') { - steps { - sh 'npm ci' - sh 'node scripts/job-build.js' - } - } - stage('package') { - steps { - sh 'node scripts/job-package.js' - } - } - stage('publish') { - when { - not { - environment name: 'GIT_TAG_NAME', value: '' - } - beforeAgent true - } - parallel { - stage('cellar') { - steps { - sh 'node scripts/job-publish-cellar.js' - } - } - stage('nexus') { - steps { - sh 'node ./scripts/job-publish-nexus.js' - } - } - stage('arch') { - steps { - script { - sshagent (credentials: ['CI_CLEVER_CLOUD_SSH_KEY']) { - sh 'node ./scripts/job-publish-arch.js' - } - } - } - } - stage('brew') { - steps { - script { - sshagent (credentials: ['CI_CLEVER_CLOUD_SSH_KEY']) { - sh 'node ./scripts/job-publish-brew.js' - } - } - } - } - stage('exherbo') { - steps { - script { - sshagent (credentials: ['CI_CLEVER_CLOUD_SSH_KEY']) { - sh 'node ./scripts/job-publish-exherbo.js' - } - } - } - } - stage('npm') { - steps { - sh 'node ./scripts/job-publish-npm.js' - } - } - stage('dockerhub') { - steps { - script { - sshagent (credentials: ['CI_CLEVER_CLOUD_SSH_KEY']) { - sh 'node ./scripts/job-publish-dockerhub.js' - } - } - } - } - } - } - } - post { - always { - archiveArtifacts artifacts: 'releases/**/*', fingerprint: true, onlyIfSuccessful: true - } - } -} - -@NonCPS -String gitTagName() { - return sh(script: 'git describe --tags --exact-match $(git rev-parse HEAD) || true', returnStdout: true)?.trim() -} diff --git a/README.md b/README.md index 775ca5f6..ce46c2e7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ If you want to install our latest beta release, you can run: ```sh npm install -g clever-tools@beta ``` -We also distribute binaries and packages for multiple systems and tools: +We also distribute binaries and packages for multiple systems and tools: * [GNU/Linux](docs/setup-systems.md#gnulinux) * [Arch Linux (AUR)](docs/setup-systems.md#arch-linux-aur) diff --git a/RELEASE.md b/RELEASE.md index 9416e0ee..b3b85760 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -2,9 +2,13 @@ ## How is this project built, packaged and published on various repositories? -* Everything is managed by a [multi-branch pipeline job in our Jenkins](https://ki2zrw1f1h-jenkins.services.clever-cloud.com/blue/organizations/jenkins/clever-tools/activity). -* The job consists of 3 steps which are configured in the `Jenkinsfile`: **build**, **package** and **publish**. -* We kept the `Jenkinsfile` to a minimum and put most of the build logic in several JavaScript files executed with node.js and prefixed with `job-`. +* Everything is managed by some GitHub action workflows +* There are 4 workflows + * Build: test and build + * Publish: publish packages to various targets. + * Release: use `release-please` to maintain a release PR + * Preview: handles previews when some event occurs on PR +* We kept the workflows to a minimum and put most of the build logic in several JavaScript files executed with node.js and prefixed with `job-`. * The `job-*.js` scripts use some external binaries when it was easier (or when there was no strong JS based solution): * `tar` * `zip` @@ -12,135 +16,245 @@ * `npm` * `ssh-keyscan` * `fpm` (which is a ruby gem) -* We run this Jenkins job on an agent using this Docker image: [clever-tools-builder](https://hub.docker.com/r/clevercloud/clever-tools-builder/). -* The `Dockerfile` to build this image is here: [docker-runner/Dockerfile](./docker-runner/Dockerfile) -* The job is triggered on each new commit and each new tag via a classic Jenkins git hook setup in the GitHub project. - * If it's a commit in a branch, we only run the **build** and **package** steps, and we archive artefacts afterwards. - * If it's a commit in a tag, we run the **build**, **package** AND **publish** steps. - * The version in the **publish** step uses the git tag. ### Build -The first step of the job builds binaries for GNU/Linux, macOS and Windows using [pkg](https://github.com/zeit/pkg). -This allows us to release a self-contained binary without having to worry about the inner node.js dependencies etc... and other implementation details of the project. +The Build workflow is triggered on every commit on a branch associated with a PR. It is also run on any commit on the `master` branch. -### Package +It does the following: -The second step of the job packages various types of archives and bundles for different needs and computes SHA 256 sums: +#### Check commit messages + +We use [CommitLint](https://github.com/conventional-changelog/commitlint) to enforce the commit messages format. +All commit messages must follow the [conventional commit](https://www.conventionalcommits.org) rules. +They will be used to generate the CHANGELOG. + +#### Ensure code quality + +We use [ESLint](https://eslint.org/) to enforce JS coding style and spot linting errors ASAP. + +Run this locally step with: +```shell +npm run lint +``` + +Or with auto fix: +```shell +npm run lint:fix +``` + +#### Build binaries + +This step does three things: + +* Builds binaries for GNU/Linux, macOS and Windows using [pkg](https://github.com/vercel/pkg). + This allows us to release a self-contained binary without having to worry about the inner node.js dependencies etc... and other implementation details of the project. +* Packages various types of archives + * `.tar.gz` archive for GNU/Linux + * `.tar.gz` archive for macOS + * `.zip` archive for Windows +* Bundles for different needs: + * `.deb` bundle for Debian/Ubuntu... + * `.rpm` bundle for CentOS/Fedora... + +Run this step locally with: +```shell +node scripts/job-build.js +``` + +> [!IMPORTANT] +> Required environment variables: `RPM_GPG_NAME`, `RPM_GPG_PRIVATE_KEY`, `RPM_GPG_PASS` + +### Preview + +This workflow handles preview creation and deletion. + +* The creation is triggered when a PR is created or synchronized (a new commit occurs on the branch). +* The deletion is triggered when a PR is closed. + +Previews are publish on [Cellar](https://www.clever-cloud.com/product/cellar-object-storage/). +When a preview is published for the first time, a comment with the right links is added to the PR. +When a preview is deleted, a comment is also added to the PR. + +> [!NOTE] +> The Cellar instance ID is: `addon_d98a2f57-62cc-4b57-a71a-d8c1e8bc47ff`. + +#### Preview management CLI + +A CLI is here to help managing previews. + +All commands have 2 arguments: +* First argument is the action: `get`, `list`, `build`, `publish`, `delete` +* Second argument is the branch: It can be omitted and will be the current branch by default. + +> [!IMPORTANT] +> Required environment variables: `CC_CLEVER_TOOLS_PREVIEWS_CELLAR_KEY_ID`, `CC_CLEVER_TOOLS_PREVIEWS_CELLAR_SECRET_KEY`. + +##### Examples: + +Building a preview for the current branch: +```shell +./scripts/job-preview.js build +``` + +Publishing a preview for the current branch: +```shell +./scripts/job-preview.js publish +``` + +If a preview with the same name already exists, it will be overridden. + +Getting the preview for the current branch: +```shell +./scripts/job-preview.js get +``` + +Listing all previews: +```shell +./scripts/job-preview.js list +``` + +Deleting a preview for the current branch: +```shell +./scripts/job-preview.js delete +``` + +### Release + +The release workflow is triggered when a commit is pushed on the `master` branch or on `hotfix/*` branches. + +This workflow uses [release-please](https://github.com/googleapis/release-please) GitHub action. + +Basically, a GitHub Pull Request is maintained by this GitHub action. +This Pull Request contains the modification for the next release. +Merging the [release-please](https://github.com/googleapis/release-please) pull request will perform the release: + +* Generation of the CHANGELOG.md +* Bump of the version number in the package.json +* Commit and add git tag + +#### Hotfix + +Standard releases are done on the `master` branch. +If you need a Hot fix release, you must do the modification on a branch using `hotfix/` prefix. +For instance, a branch named `hotfix/x.y.z` will have a dedicated release PR maintained by `release-please`. -* `.tar.gz` archive for GNU/Linux -* `.tar.gz` archive for macOS -* `.zip` archive for Windows -* `.deb` bundle for Debian/Ubuntu... -* `.rpm` bundle for CentOS/Fedora... ### Publish -The third step of the job will publish the new version via different method depending on the target. +This workflow publishes the new version via different method depending on the target. +It is triggered when a new git tag is added. #### Cellar `.tar.gz`, `.zip`, `.deb` and `.rpm` (and corresponding `.sha256` files) are published on Clever Cloud's Cellar. -That's why we need `S3_KEY_ID` and `S3_SECRET_KEY` from the credentials. -* If it's a stable version we publish the files under `X.Y.Z` but also under `latest`. -* If it's a beta version we only publish the files under `X.Y.Z-beta.W`. +* We publish the files under `X.Y.Z` but also under `latest`. + +> [!NOTE] +> The Cellar instance ID is: `addon_fc310359-fc4f-4e30-b37c-b34127c4bb75`. + +> [!IMPORTANT] +> Required environment variables: `CC_CLEVER_TOOLS_RELEASES_CELLAR_KEY_ID`, `CC_CLEVER_TOOLS_RELEASES_CELLAR_SECRET_KEY`. -NOTE: The Cellar instance ID is: `addon_fc310359-fc4f-4e30-b37c-b34127c4bb75`. #### Nexus `.deb`, `.nupkg` and `.rpm` are published on Clever Cloud's public Nexus instance. -That's why we need the `NEXUS_PASSWORD` and `NUGET_API_KEY` environment variables. * `.deb` are published on Nexus repo: [deb](https://nexus.clever-cloud.com/#browse/browse:deb). - * beta versions are published on a separate Nexus repo: [deb-beta](https://nexus.clever-cloud.com/#browse/browse:deb-beta). * `.nupkg` are published on Nexus repo: [nupkg](https://nexus.clever-cloud.com/#browse/browse:nupkg). - * beta versions are published on a separate Nexus repo: [nupkg-beta](https://nexus.clever-cloud.com/#browse/browse:nupkg-beta). * `.rpm` are published on Nexus repo: [rpm](https://nexus.clever-cloud.com/#browse/browse:rpm). - * beta versions are published on a separate Nexus repo: [rpm-beta](https://nexus.clever-cloud.com/#browse/browse:rpm-beta). + +> [!IMPORTANT] +> Required environment variables: `NEXUS_PASSWORD`, `NEXUS_USER`, `NUGET_API_KEY`. #### Archlinux For Archlinux, a new commit is created and pushed to AUR. -That's why we need the `CI_CLEVER_CLOUD_SSH_KEY` SSH key from the credentials. * The new commit updates all files of the given repo using the templates in `templates/arch`. * We use [clever-tools-bin](https://aur.archlinux.org/packages/clever-tools-bin/) for stable versions. -* We use [clever-tools-bin-beta](https://aur.archlinux.org/packages/clever-tools-bin-beta/) for beta versions. + +> [!IMPORTANT] +> Required environment variables: `CI_CLEVER_CLOUD_SSH_KEY`. #### Homebrew For homebrew, a new commit is created and pushed to a homebrew tap on GitHub. -That's why we need the `CI_CLEVER_CLOUD_SSH_KEY` SSH key from the credentials. * The new commit updates all files of the given repo using the templates in `templates/brew`. * We use [homebrew-tap](https://github.com/CleverCloud/homebrew-tap) for stable versions. -* We use [homebrew-tap-beta](https://github.com/CleverCloud/homebrew-tap-beta) for beta versions. + +> [!IMPORTANT] +> Required environment variables: `CI_CLEVER_CLOUD_SSH_KEY`. #### npm We publish new versions on [npmjs.org](https://www.npmjs.com/package/clever-tools) via `npm publish`. -That's why we need `NPM_TOKEN` from the credentials. -* This `NPM_TOKEN` is generated from the `clevercloud-ci` account. -* If it's a beta version, we use the npm `beta` tag so users don't get a beta without explicitly asking for one. +> [!IMPORTANT] +> Required environment variables: `NPM_TOKEN`. + +> [!NOTE] +> This `NPM_TOKEN` is generated from the `clevercloud-ci` account. #### Docker Hub We publish new versions on [Docker Hub](https://hub.docker.com/r/clevercloud/clever-tools/) using automated builds. They are triggered for new commits created and pushed to a [GitHub repo](https://github.com/CleverCloud/clever-tools-dockerhub). -That's why we need the `CI_CLEVER_CLOUD_SSH_KEY` SSH key from the credentials. * The new commit updates all files of the given repo using the templates in `templates/dockerhub`. -## How do I release a new version? +> [!IMPORTANT] +> Required environment variables: `CI_CLEVER_CLOUD_SSH_KEY`. -Here's the guide to create a new release: +#### Publish locally -1. Make sure you updated the `CHANGELOG.md` with all the new features and bugfixes. -2. Decide if you're doing a **major**, **minor** or **patch** version or event a **prerelease** according to the [semver spec](https://semver.org/spec/v2.0.0.html). -3. Make sure the commit you want to version is on master. -4. run the `npm version` command with the right parameters (see details below). - * This will update `package.json` and `package-lock.json` in a new commit. - * This will create a git tag. -5. Push the updated master branch with the new tag on GitHub (see details below). -6. Follow the build on Jenkins and everything should be OK! +All publication is done automatically with a GitHub action. +However, you may need to publish things manually. +The `scripts/job-publish.sh` comes to the rescue: -`npm version` for a stable version: +Usage: `scripts/job-publish.sh {VERSION} {[...TARGETS]?}` -```sh -# For a major version, ex: 1.2.3 => 2.0.0 -npm version major -# For a minor version, ex: 1.2.3 => 1.3.0 -npm version minor -# For a patch version, ex: 1.2.3 => 1.2.4 -npm version patch -``` +* `VERSION` must be a valid semver version +* `VERSION` must be the same as the version specified in the package.json. (Make sur you run `npm version` before.) +* `TARGETS` is optional: if omitted the script will publish on every target. +* `TARGETS` is one of: `cellar, arch, brew, dockerhub, exherbo, nexus, npm` -`npm version` for a beta version: - -```sh -# For a premajor version, ex: 1.2.3 => 2.0.0-beta.1 -npm version premajor -# For a preminor version, ex: 1.2.3 => 1.3.0-beta.1 -npm version preminor -# For a prepatch version, ex: 1.2.3 => 1.2.4-beta.1 -npm version prepatch -# For a pre release, ex: 1.2.3-beta.1 => 1.2.3-beta.2 -npm version prerelease -``` +> [!NOTE] +> You'll need to set up the env vars required by the targets you specified in the command (see above). +> Env var containing the Cellar credentials will still be required (even if the `cellar` target is not requested). +> This is because the script ensures that all the files are present on Cellar before doing any publication on other targets. -Pushing new master and new tag: +##### Examples: -```sh -git push origin master --tags +Full release process: + +```shell +VERSION="X.Y.Z" + +# create new version +npm version $VERSION + +# git commit and tag +git add --all +git commit -m "Release $VERSION" +git tag $VERSION +git push --tags + +# build +node scripts/job-build.js $VERSION --latest --bundle + +# publish +node scripts/job-publish.js $VERSION ``` -## How do I update the docker image? +Publish only some targets: -```sh -docker build -t clevercloud/clever-tools-builder docker-runner -docker login -docker push clevercloud/clever-tools-builder +```shell +node scripts/job-publish.js $VERSION arch brew ``` + +> [!NOTE] +> As the `cellar` target is not required here, the script will verify that all the files are present in cellar before publishing `arch` and `brew` targets. diff --git a/docker-runner/Dockerfile b/docker-runner/Dockerfile deleted file mode 100644 index 3b697d0f..00000000 --- a/docker-runner/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -# Published to https://hub.docker.com/r/clevercloud/clever-tools-builder - -FROM jenkins/inbound-agent - -USER root - -RUN curl -sL https://deb.nodesource.com/setup_18.x | bash - -RUN apt-get install -y nodejs - -RUN apt-get install -y rpm - -RUN apt-get install -y ruby ruby-dev rubygems build-essential -RUN gem install fpm - -USER jenkins diff --git a/docs/nexus-config.md b/docs/nexus-config.md index 0c94d1f8..7ceffa4c 100644 --- a/docs/nexus-config.md +++ b/docs/nexus-config.md @@ -10,7 +10,6 @@ It's available at [https://nexus.clever-cloud.com/](https://nexus.clever-cloud.c We have two repositories for `.deb` packages: * stable: [deb](https://nexus.clever-cloud.com/#browse/browse:deb) -* beta: [deb-beta](https://nexus.clever-cloud.com/#browse/browse:deb-beta) Link to Nexus [apt-repositories docs](https://help.sonatype.com/repomanager3/formats/apt-repositories). @@ -24,7 +23,6 @@ The repository is signed with the PGP key `Clever Cloud Nexus (deb)`. We have two repositories for `.nupkg` packages: * stable: [nupkg](https://nexus.clever-cloud.com/#browse/browse:nupkg) -* beta: [nupkg-beta](https://nexus.clever-cloud.com/#browse/browse:nupkg-beta) Link to Nexus [nuget-repositories docs](https://help.sonatype.com/repomanager3/formats/nuget-repositories). @@ -35,7 +33,6 @@ WIP We have two repositories for `.rpm` packages: * stable: [rpm](https://nexus.clever-cloud.com/#browse/browse:rpm) -* beta: [rpm-beta](https://nexus.clever-cloud.com/#browse/browse:rpm-beta) Link to Nexus [yum-repositories docs](https://help.sonatype.com/repomanager3/formats/yum-repositories). @@ -58,7 +55,7 @@ Steps to follow to generate a new pair of PGP keys: * Export the public key in a file * `gpg --armor --output cc-nexus-deb.public.gpg.key --export ` * Publish the public key on the Cellar - * `s3cmd -c .s3cfg put --acl-public cc-nexus-deb.public.gpg.key s3://clever-tools.clever-cloud.com/gpg/` + * `s3cmd -c .s3cfg put --acl-public cc-nexus-deb.public.gpg.key s3://clever-tools.clever-cloud.com/gpg/` * Export the private key in a file * `gpg --armor --output cc-nexus-deb.private.gpg.key --export-secret-key ` * Update the private key where it's needed diff --git a/docs/setup-systems.md b/docs/setup-systems.md index a3f690c9..7593577f 100644 --- a/docs/setup-systems.md +++ b/docs/setup-systems.md @@ -12,10 +12,6 @@ cd clever-tools makepkg -si ``` -NOTES: - -* If you want access to the beta channel, you can use this repo [clever-tools-bin-beta](https://aur.archlinux.org/packages/clever-tools-bin-beta/). - ### CentOS/Fedora (.rpm) --- @@ -38,7 +34,6 @@ yum install clever-tools NOTES: * The `.rpm` packages are hosted on Clever Cloud's public Nexus instance available at [https://nexus.clever-cloud.com](https://nexus.clever-cloud.com). -* If you want access to the beta channel, you will need to edit `/etc/yum.repos.d/cc-nexus-rpm.repo` and set `enabled=1` for the `[clever-tools-beta]`. ### Debian/Ubuntu (.deb) @@ -64,11 +59,6 @@ NOTES: * The `.deb` packages are hosted on Clever Cloud's public Nexus instance available at [https://nexus.clever-cloud.com](https://nexus.clever-cloud.com). * Our PGP key is required to trust the repository. -* If you want access to the beta channel, you can use this in your `sources.list`: - -```sh -echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/cc-nexus-deb.gpg] https://nexus.clever-cloud.com/repository/deb-beta beta main" | tee -a /etc/apt/sources.list -``` ### Exherbo @@ -92,7 +82,6 @@ cp clever-tools-latest_linux/clever ~/.local/bin/ NOTES: * The packages are available on Clever Cloud's Cellar bucket: [clever-tools-latest_linux.tar.gz](https://clever-tools.clever-cloud.com/releases/latest/clever-tools-latest_linux.tar.gz). -* You can also retrieve any release (including beta) on this Cellar bucket by replacing `latest` (path and filename) with the version number you need. ## macOS @@ -104,10 +93,6 @@ If you are using macOS and you have [homebrew](https://brew.sh) installed, you c brew install CleverCloud/homebrew-tap/clever-tools ``` -NOTES: - -* If you want access to the beta channel, you can use `CleverCloud/homebrew-tap-beta/clever-tools` instead. - ### Binary (.tar.gz) If you are using macOS, but you don't have [Homebrew](https://brew.sh) installed, you can download a `.tar.gz` archive and extract the binary in your `PATH`: @@ -121,7 +106,6 @@ cp clever-tools-latest_macos/clever ~/.local/bin/ NOTES: * The packages are available on Clever Cloud's Cellar bucket: [clever-tools-latest_macos.tar.gz](https://clever-tools.clever-cloud.com/releases/latest/clever-tools-latest_macos.tar.gz). -* You can also retrieve any release (including beta) on this Cellar bucket by replacing `latest` (path and filename) with the version number you need. ## Windows @@ -143,10 +127,6 @@ choco sources add -n=clevercloud -s='https://nexus.clever-cloud.com/repository/n choco install clever-tools ``` -NOTES: - -* If you want access to the beta channel, you can use `choco sources add -n=clevercloud -s='https://nexus.clever-cloud.com/repository/nupkg-beta/'` instead. - ### Binary (.zip) If you are using Windows, but you don't have [chocolatey](https://chocolatey.org) installed, you can download a `.zip` archive and extract the binary in your `PATH`. @@ -154,7 +134,6 @@ If you are using Windows, but you don't have [chocolatey](https://chocolatey.org NOTES: * The packages are available on Clever Cloud's Cellar bucket: [clever-tools-latest_win.zip](https://clever-tools.clever-cloud.com/releases/latest/clever-tools-latest_win.zip). -* You can also retrieve any release (including beta) on this Cellar bucket by replacing `latest` (path and filename) with the version number you need. ## Docker @@ -177,4 +156,4 @@ COPY --from=clevercloud/clever-tools /bin/clever /usr/local/bin/clever If you are using Nix, you will find a Nix derivation on Fretlink's GitHub repository: -* https://github.com/fretlink/clever-tools-nix \ No newline at end of file +* https://github.com/fretlink/clever-tools-nix diff --git a/package-lock.json b/package-lock.json index 7ee1f63a..2b0f3a0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,8 @@ "uninstall-clever-completion": "scripts/uninstall-autocomplete.sh" }, "devDependencies": { + "@commitlint/cli": "^18.4.3", + "@commitlint/config-conventional": "^18.4.3", "aws-sdk": "^2.919.0", "chai": "^4.3.4", "del": "^6.0.0", @@ -52,9 +54,11 @@ "grunt-cli": "^1.4.3", "grunt-http": "^2.3.3", "grunt-mocha-test": "^0.13.3", + "mime-types": "^2.1.35", "mocha": "^8.4.0", "pkg": "^5.8.1", - "semver": "^7.3.5" + "semver": "^7.3.5", + "text-table": "^0.2.0" }, "engines": { "node": ">=18" @@ -188,6 +192,424 @@ "ws": "^7.4.3" } }, + "node_modules/@commitlint/cli": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.4.3.tgz", + "integrity": "sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==", + "dev": true, + "dependencies": { + "@commitlint/format": "^18.4.3", + "@commitlint/lint": "^18.4.3", + "@commitlint/load": "^18.4.3", + "@commitlint/read": "^18.4.3", + "@commitlint/types": "^18.4.3", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.4.3.tgz", + "integrity": "sha512-729eRRaNta7JZF07qf6SAGSghoDEp9mH7yHU0m7ff0q89W97wDrWCyZ3yoV3mcQJwbhlmVmZPTkPcm7qiAu8WA==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.4.3.tgz", + "integrity": "sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.4.3", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@commitlint/ensure": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-18.4.3.tgz", + "integrity": "sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.4.3", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-18.4.3.tgz", + "integrity": "sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-18.4.3.tgz", + "integrity": "sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.4.3", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-18.4.3.tgz", + "integrity": "sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.4.3", + "semver": "7.5.4" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/lint": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.4.3.tgz", + "integrity": "sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^18.4.3", + "@commitlint/parse": "^18.4.3", + "@commitlint/rules": "^18.4.3", + "@commitlint/types": "^18.4.3" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.4.3.tgz", + "integrity": "sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^18.4.3", + "@commitlint/execute-rule": "^18.4.3", + "@commitlint/resolve-extends": "^18.4.3", + "@commitlint/types": "^18.4.3", + "@types/node": "^18.11.9", + "chalk": "^4.1.0", + "cosmiconfig": "^8.3.6", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/message": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-18.4.3.tgz", + "integrity": "sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-18.4.3.tgz", + "integrity": "sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.4.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-18.4.3.tgz", + "integrity": "sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^18.4.3", + "@commitlint/types": "^18.4.3", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.4.3.tgz", + "integrity": "sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^18.4.3", + "@commitlint/types": "^18.4.3", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/rules": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-18.4.3.tgz", + "integrity": "sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^18.4.3", + "@commitlint/message": "^18.4.3", + "@commitlint/to-lines": "^18.4.3", + "@commitlint/types": "^18.4.3", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-18.4.3.tgz", + "integrity": "sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-18.4.3.tgz", + "integrity": "sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/types": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-18.4.3.tgz", + "integrity": "sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v18" + } + }, "node_modules/@curlconverter/yargs": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@curlconverter/yargs/-/yargs-0.0.2.tgz", @@ -393,6 +815,27 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.12.tgz", + "integrity": "sha512-G7slVfkwOm7g8VqcEF1/5SXiMjP3Tbt+pXDU3r/qhlM2KkGm786DUD4xyMA2QzEElFrv/KZV9gjygv4LnkpbMQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -518,9 +961,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -567,6 +1010,12 @@ "node": ">=0.10.0" } }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "node_modules/array-includes": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", @@ -621,6 +1070,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -1002,6 +1460,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1191,43 +1675,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -1289,6 +1736,16 @@ "node": ">=6" } }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1315,6 +1772,48 @@ "node": ">=8" } }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -1334,6 +1833,85 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/crc-32": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", @@ -1399,6 +1977,15 @@ "curlconverter": "bin/cli.js" } }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1446,6 +2033,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -2069,18 +2690,6 @@ "node": ">= 4" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2206,6 +2815,41 @@ "node": ">=0.12.0" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -2605,49 +3249,79 @@ "assert-plus": "^1.0.0" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "node_modules/git-raw-commits/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "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" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=10" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, + "node_modules/git-raw-commits/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "node_modules/git-raw-commits/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, "dependencies": { - "ini": "2.0.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { "node": ">=10" @@ -2656,24 +3330,256 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "node_modules/git-raw-commits/node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/git-raw-commits/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/git-raw-commits/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/git-raw-commits/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } @@ -2996,6 +3902,15 @@ "node": ">=6" } }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3135,6 +4050,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3539,6 +4463,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", @@ -3575,6 +4511,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3678,6 +4626,15 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", @@ -3734,6 +4691,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3782,6 +4745,31 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -3872,6 +4860,12 @@ "node": ">= 8" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/linux-release-info": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/linux-release-info/-/linux-release-info-3.0.0.tgz", @@ -3913,26 +4907,80 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true }, - "node_modules/log-symbols": { - "version": "4.0.0", + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, @@ -4005,6 +5053,36 @@ "node": ">=0.10.0" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4059,24 +5137,33 @@ } }, "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "~1.33.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -4085,6 +5172,15 @@ "node": ">=4" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4104,6 +5200,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minimisted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", @@ -4504,6 +5623,18 @@ "node": ">=8" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nunjucks": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", @@ -4640,6 +5771,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/open": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", @@ -5226,6 +6372,15 @@ } ] }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5362,6 +6517,19 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -5457,27 +6625,6 @@ "npm": ">=1.3.7" } }, - "node_modules/request/node_modules/mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/request/node_modules/mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "dependencies": { - "mime-db": "1.43.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/request/node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5577,6 +6724,30 @@ "node": ">=4" } }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global/node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/resolve/node_modules/is-core-module": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", @@ -5663,9 +6834,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5970,6 +7141,15 @@ "node": ">=6" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6057,13 +7237,13 @@ } }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -6116,11 +7296,11 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -6135,6 +7315,27 @@ "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -6262,53 +7463,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -6359,10 +7519,52 @@ "dev": true, "optional": true }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/to-fast-properties": { "version": "2.0.0", @@ -6424,6 +7626,15 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/tsconfig-paths": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", @@ -6492,6 +7703,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -6539,6 +7764,12 @@ "node": "*" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -6850,43 +8081,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7135,43 +8329,367 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@clevercloud/client": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@clevercloud/client/-/client-8.0.2.tgz", + "integrity": "sha512-smSsmX2GAYed96k8n+qVRxEtc8hvfuvwPW0c5sW/R9x9Z8OsorS+Xpe2OFc0ADsEbJhGqbEHr84TKuIuSUu7dw==", + "requires": { + "component-emitter": "^1.3.0", + "oauth-1.0a": "^2.2.6" + } + }, + "@commitlint/cli": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.4.3.tgz", + "integrity": "sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==", + "dev": true, + "requires": { + "@commitlint/format": "^18.4.3", + "@commitlint/lint": "^18.4.3", + "@commitlint/load": "^18.4.3", + "@commitlint/read": "^18.4.3", + "@commitlint/types": "^18.4.3", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "@commitlint/config-conventional": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.4.3.tgz", + "integrity": "sha512-729eRRaNta7JZF07qf6SAGSghoDEp9mH7yHU0m7ff0q89W97wDrWCyZ3yoV3mcQJwbhlmVmZPTkPcm7qiAu8WA==", + "dev": true, + "requires": { + "conventional-changelog-conventionalcommits": "^7.0.2" + } + }, + "@commitlint/config-validator": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.4.3.tgz", + "integrity": "sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==", + "dev": true, + "requires": { + "@commitlint/types": "^18.4.3", + "ajv": "^8.11.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "@commitlint/ensure": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-18.4.3.tgz", + "integrity": "sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg==", + "dev": true, + "requires": { + "@commitlint/types": "^18.4.3", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + } + }, + "@commitlint/execute-rule": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-18.4.3.tgz", + "integrity": "sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==", + "dev": true + }, + "@commitlint/format": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-18.4.3.tgz", + "integrity": "sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ==", + "dev": true, + "requires": { + "@commitlint/types": "^18.4.3", + "chalk": "^4.1.0" + } + }, + "@commitlint/is-ignored": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-18.4.3.tgz", + "integrity": "sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg==", + "dev": true, + "requires": { + "@commitlint/types": "^18.4.3", + "semver": "7.5.4" + } + }, + "@commitlint/lint": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.4.3.tgz", + "integrity": "sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^18.4.3", + "@commitlint/parse": "^18.4.3", + "@commitlint/rules": "^18.4.3", + "@commitlint/types": "^18.4.3" + } + }, + "@commitlint/load": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.4.3.tgz", + "integrity": "sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^18.4.3", + "@commitlint/execute-rule": "^18.4.3", + "@commitlint/resolve-extends": "^18.4.3", + "@commitlint/types": "^18.4.3", + "@types/node": "^18.11.9", + "chalk": "^4.1.0", + "cosmiconfig": "^8.3.6", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@commitlint/message": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-18.4.3.tgz", + "integrity": "sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how==", + "dev": true + }, + "@commitlint/parse": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-18.4.3.tgz", + "integrity": "sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA==", + "dev": true, + "requires": { + "@commitlint/types": "^18.4.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + } + }, + "@commitlint/read": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-18.4.3.tgz", + "integrity": "sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ==", + "dev": true, + "requires": { + "@commitlint/top-level": "^18.4.3", + "@commitlint/types": "^18.4.3", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "dependencies": { + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "@commitlint/resolve-extends": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.4.3.tgz", + "integrity": "sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^18.4.3", + "@commitlint/types": "^18.4.3", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@commitlint/rules": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-18.4.3.tgz", + "integrity": "sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA==", + "dev": true, + "requires": { + "@commitlint/ensure": "^18.4.3", + "@commitlint/message": "^18.4.3", + "@commitlint/to-lines": "^18.4.3", + "@commitlint/types": "^18.4.3", + "execa": "^5.0.0" + } + }, + "@commitlint/to-lines": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-18.4.3.tgz", + "integrity": "sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ==", + "dev": true + }, + "@commitlint/top-level": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-18.4.3.tgz", + "integrity": "sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true } } }, - "@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", - "dev": true - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "@commitlint/types": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-18.4.3.tgz", + "integrity": "sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@clevercloud/client": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@clevercloud/client/-/client-8.0.2.tgz", - "integrity": "sha512-smSsmX2GAYed96k8n+qVRxEtc8hvfuvwPW0c5sW/R9x9Z8OsorS+Xpe2OFc0ADsEbJhGqbEHr84TKuIuSUu7dw==", - "requires": { - "component-emitter": "^1.3.0", - "oauth-1.0a": "^2.2.6" + "chalk": "^4.1.0" } }, "@curlconverter/yargs": { @@ -7329,6 +8847,27 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "@types/node": { + "version": "18.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.12.tgz", + "integrity": "sha512-G7slVfkwOm7g8VqcEF1/5SXiMjP3Tbt+pXDU3r/qhlM2KkGm786DUD4xyMA2QzEElFrv/KZV9gjygv4LnkpbMQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -7430,9 +8969,9 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -7467,6 +9006,12 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "array-includes": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", @@ -7503,6 +9048,12 @@ "es-abstract": "^1.18.0-next.1" } }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -7796,6 +9347,25 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -7938,36 +9508,6 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "clone-response": { @@ -8019,6 +9559,16 @@ "lodash": "^4.17.11" } }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -8042,6 +9592,36 @@ "xdg-basedir": "^4.0.0" } }, + "conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "requires": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + } + }, "cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -8058,6 +9638,56 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "requires": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "requires": { + "jiti": "^1.19.1" + } + }, "crc-32": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", @@ -8107,6 +9737,12 @@ "yamljs": "^0.3.0" } }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -8143,6 +9779,30 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -8431,15 +10091,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -8700,6 +10351,31 @@ "original": "^1.0.0" } }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -9012,6 +10688,205 @@ "assert-plus": "^1.0.0" } }, + "git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + } + } + }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -9311,6 +11186,12 @@ "har-schema": "^2.0.0" } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -9415,6 +11296,12 @@ "debug": "4" } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9679,6 +11566,12 @@ "is-unc-path": "^1.0.0" } }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, "is-string": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", @@ -9699,6 +11592,15 @@ } } }, + "is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "requires": { + "text-extensions": "^2.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -9783,6 +11685,12 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true + }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", @@ -9827,6 +11735,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -9870,6 +11784,22 @@ "universalify": "^2.0.0" } }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -9944,6 +11874,12 @@ } } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "linux-release-info": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/linux-release-info/-/linux-release-info-3.0.0.tgz", @@ -9976,24 +11912,78 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -10046,6 +12036,24 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -10081,23 +12089,35 @@ "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.52.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -10111,6 +12131,25 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + } + } + }, "minimisted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", @@ -10391,6 +12430,15 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, "nunjucks": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", @@ -10483,6 +12531,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "open": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", @@ -10913,6 +12970,12 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11023,6 +13086,16 @@ "resolve": "^1.9.0" } }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -11095,21 +13168,6 @@ "sshpk": "^1.7.0" } }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -11194,6 +13252,26 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "requires": { + "global-dirs": "^0.1.1" + }, + "dependencies": { + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + } + } + }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -11244,9 +13322,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -11461,6 +13539,12 @@ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -11522,13 +13606,13 @@ } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "dependencies": { "emoji-regex": { @@ -11571,11 +13655,11 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -11584,6 +13668,21 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -11678,43 +13777,11 @@ "uri-js": "^4.2.2" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, @@ -11763,10 +13830,45 @@ "dev": true, "optional": true }, + "text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } }, "to-fast-properties": { "version": "2.0.0", @@ -11815,6 +13917,12 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, "tsconfig-paths": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", @@ -11871,6 +13979,13 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "peer": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -11905,6 +14020,12 @@ "util-deprecate": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -12153,34 +14274,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } } } }, diff --git a/package.json b/package.json index 53113a6e..97f5fe7c 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,8 @@ "xdg": "^0.1.1" }, "devDependencies": { + "@commitlint/cli": "^18.4.3", + "@commitlint/config-conventional": "^18.4.3", "aws-sdk": "^2.919.0", "chai": "^4.3.4", "del": "^6.0.0", @@ -63,9 +65,11 @@ "grunt-cli": "^1.4.3", "grunt-http": "^2.3.3", "grunt-mocha-test": "^0.13.3", + "mime-types": "^2.1.35", "mocha": "^8.4.0", "pkg": "^5.8.1", - "semver": "^7.3.5" + "semver": "^7.3.5", + "text-table": "^0.2.0" }, "overrides": { "pkg-fetch": "3.5.2" diff --git a/scripts/archive.js b/scripts/archive.js new file mode 100644 index 00000000..c141eb93 --- /dev/null +++ b/scripts/archive.js @@ -0,0 +1,61 @@ +const fs = require('fs-extra'); +const path = require('path'); +const cfg = require('./config.js'); +const { + getArchiveFilepath, + getArchiveDirectory, + getBinaryFilepath, getArchiveLatestFilepath, getBinaryLatestFilepath, +} = require('./paths.js'); +const { + generateChecksumFile, + startTask, + endTask, + exec, + cleanupDirectory, + assertFileExists, +} = require('./utils.js'); + +module.exports = async function build (version, latest) { + await cleanupDirectory(getArchiveDirectory(version)); + + for (const arch of cfg.archList) { + const binaryFilepath = getBinaryFilepath(arch, version); + + await assertFileExists(binaryFilepath); + + const archiveFilepath = getArchiveFilepath(arch, version); + await packageArchive(binaryFilepath, archiveFilepath); + await generateChecksumFile(archiveFilepath); + + if (latest) { + const binaryLatestFilepath = getBinaryLatestFilepath(arch, version); + await fs.copy(binaryFilepath, binaryLatestFilepath); + const archiveLatestFilepath = getArchiveLatestFilepath(arch, version); + await packageArchive(binaryLatestFilepath, archiveLatestFilepath); + await generateChecksumFile(archiveLatestFilepath); + } + } +} + +//--- private + +async function packageArchive (binaryFilepath, archiveFilepath) { + startTask(`Packaging ${archiveFilepath}`); + + const { ext: archiveExt } = path.parse(archiveFilepath); + const { dir: dirToBinary } = path.parse(binaryFilepath); + const { dir: dirToArchive } = path.parse(archiveFilepath); + const { dir: workDir } = path.parse(dirToBinary); + const relativeDirToBinary = path.relative(workDir, dirToBinary); + const relativeDirArchiveFilepath = path.relative(workDir, archiveFilepath); + + fs.mkdirs(dirToArchive); + + if (archiveExt === '.zip') { + await exec(`zip -r ${relativeDirArchiveFilepath} ${relativeDirToBinary}`, workDir); + } + else { + await exec(`tar czf ${relativeDirArchiveFilepath} ${relativeDirToBinary}`, workDir); + } + endTask(`Packaging ${archiveFilepath}`); +} diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 00000000..cde77476 --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,29 @@ +const { exec: pkg } = require('pkg'); +const cfg = require('./config.js'); +const { + getBinaryFilepath, + getBinaryDirectory, +} = require('./paths.js'); +const { + startTask, + endTask, + cleanupDirectory, +} = require('./utils.js'); + +module.exports = async function build (version) { + await cleanupDirectory(getBinaryDirectory(version)); + + for (const arch of cfg.archList) { + const binaryFilepath = getBinaryFilepath(arch, version); + await buildBinary(arch, binaryFilepath); + } +}; + +//--- private + +async function buildBinary (arch, binaryFilepath) { + const { nodeVersion } = cfg; + startTask(`Building binary for ${arch}`); + await pkg(['.', '-t', `node${nodeVersion}-${arch}`, '-o', binaryFilepath]); + endTask(`Building binary for ${arch} to ${binaryFilepath}`); +} diff --git a/scripts/bundle.js b/scripts/bundle.js new file mode 100644 index 00000000..dd1d9592 --- /dev/null +++ b/scripts/bundle.js @@ -0,0 +1,139 @@ +const path = require('path'); +const fs = require('fs-extra'); +const { readFile } = require('fs/promises'); +const del = require('del'); +const cfg = require('./config.js'); +const { + startTask, + writeStringToFile, + applyTemplates, + exec, + endTask, + generateChecksumFile, + assertFileExists, + cleanupDirectory, +} = require('./utils.js'); +const { + getBinaryFilepath, + getArchiveFilepath, + getShaFilepath, + getBundleDirectory, + getBundleFilepath, +} = require('./paths.js'); + +module.exports = async function bundle (version) { + await cleanupDirectory(getBundleDirectory(version)); + + for (const arch of cfg.archList) { + if (arch === 'linux') { + await bundleRpm(version); + await bundleDeb(version); + } + if (arch === 'win') { + await bundleNupkg(version); + } + } +}; + +//--- private + +async function bundleRpm (version) { + const bundleType = 'rpm'; + const { appInfos } = cfg; + const binaryFilepath = getBinaryFilepath('linux', version); + + // verify files to bundle are ready + await assertFileExists(binaryFilepath); + + // bundle package + const bundlePath = getBundleFilepath(bundleType, version); + await packageLinuxBundle({ bundleType, bundlePath, version, binaryFilepath, appInfos }); + + // sign package if a private key is found + const { gpgPrivateKey, gpgPath, gpgName, gpgPass } = cfg.getGpgConf(); + if (gpgPrivateKey != null) { + await prepareGpg({ gpgPrivateKey, gpgPath, gpgName, gpgPass }); + await exec(`rpm --addsign ${bundlePath}`); + } + + // generate checksum + await generateChecksumFile(bundlePath); +} + +async function bundleDeb (version) { + const bundleType = 'deb'; + const { appInfos } = cfg; + const binaryFilepath = getBinaryFilepath('linux', version); + + // verify files to bundle are ready + await assertFileExists(binaryFilepath); + + // bundle package + const bundlePath = getBundleFilepath(bundleType, version); + await packageLinuxBundle({ bundleType, bundlePath, version, binaryFilepath, appInfos }); + + // generate checksum + await generateChecksumFile(bundlePath); +} + +async function bundleNupkg (version) { + const { appInfos } = cfg; + const shaFilepath = getShaFilepath(getArchiveFilepath('win', version)); + + startTask('Packaging Nupkg (chocolatey)'); + const sha256 = await readFile(shaFilepath); + const nupkgPath = getBundleFilepath('nupkg', version); + const templatesPath = './templates/choco'; + const destPath = `${getBundleDirectory(version)}/chocolatey`; + const relativeNupkgPath = path.relative(destPath, nupkgPath); + await applyTemplates(destPath, templatesPath, { + version, + sha256, + ...appInfos, + }); + await exec(`zip -r ${relativeNupkgPath} .`, destPath); + endTask('Packaging Nupkg (chocolatey)'); + + // generate checksum + await generateChecksumFile(nupkgPath); +} + +async function prepareGpg ({ gpgPrivateKey, gpgPath, gpgName, gpgPass }) { + startTask('Preparing GPG'); + const templatesPath = './templates/gpg'; + const destPath = `${gpgPath}`; + await writeStringToFile(gpgPrivateKey, '/tmp/GPG-PRIVATE-KEY-Clever-Cloud'); + await applyTemplates(destPath, templatesPath, { + gpgPath, + gpgName, + gpgPass, + }); + // import private/public key in GPG + await exec('gpg --batch --import /tmp/GPG-PRIVATE-KEY-Clever-Cloud'); + // export key in file + await exec(`gpg --export -a "${gpgName}" > /tmp/RPM-GPG-KEY-Clever-Cloud`); + // import key in rpm + await exec('rpm --import /tmp/RPM-GPG-KEY-Clever-Cloud'); + // cleanup temporary files + await exec('rm -f /tmp/RPM-GPG-PRIVATE-KEY-Clever-Cloud'); + await exec('rm -f /tmp/RPM-GPG-KEY-Clever-Cloud'); + console.log(`GPG configuration ready in ${gpgPath}`); + endTask('Preparing GPG'); +} + +async function packageLinuxBundle ({ bundleType, bundlePath, version, binaryFilepath, appInfos }) { + startTask(`Packaging Linux ${bundleType}`); + const { base: binaryFilename } = path.parse(binaryFilepath); + await exec(`fpm \ + -s dir \ + -t ${bundleType} \ + -p "${bundlePath}" \ + -n "${appInfos.name}" \ + --vendor "${appInfos.vendor}" \ + --description "${appInfos.description}" \ + --url "${appInfos.url}" \ + --license "${appInfos.license}" \ + -v ${version} \ + ${binaryFilepath}=/usr/bin/${binaryFilename}`); + endTask(`Packaging Linux ${bundleType}`); +} diff --git a/scripts/cellar-client.js b/scripts/cellar-client.js new file mode 100644 index 00000000..458057c0 --- /dev/null +++ b/scripts/cellar-client.js @@ -0,0 +1,91 @@ +const AWS = require('aws-sdk'); +const fs = require('fs-extra'); +const mime = require('mime-types'); +const { getCellarConf } = require('./config.js'); + +// Forces the *.sha256 files to be uploaded with a text/plain mime type. +mime.types['sha256'] = 'text/plain'; + +const CELLAR_CLIENTS = {}; + +function getCellarClient(scope) { + if (CELLAR_CLIENTS[scope] == null) { + const conf = getCellarConf(scope) + if (!conf.accessKeyId || !conf.secretAccessKey) { + throw new Error('Could not read Cellar access/secret keys!'); + } + + CELLAR_CLIENTS[scope] = cellar(conf); + } + + return CELLAR_CLIENTS[scope]; +} + +function cellar ({ accessKeyId, secretAccessKey, host, bucket }) { + + const s3 = new AWS.S3({ + credentials: { accessKeyId, secretAccessKey }, + endpoint: new AWS.Endpoint(host), + signatureVersion: 'v4', + }); + + const client = { + url(remoteFilepath) { + return `https://${bucket}/${remoteFilepath}`; + }, + async exists(remoteFilepath) { + return new Promise((resolve, reject) => { + const params = { Bucket: bucket, Key: remoteFilepath }; + return s3.headObject(params, (err, data) => err ? reject(err) : resolve()); + }).then(() => { + return true; + }).catch((e) => { + if (e.statusCode === 404) { + return false; + } + throw e; + }); + }, + async upload(filepath, remoteFilepath = filepath) { + return client.putObject(fs.createReadStream(filepath), remoteFilepath); + }, + async putObject(body, remoteFilepath) { + return new Promise((resolve, reject) => { + const params = { ACL: 'public-read', Body: body, Bucket: bucket, Key: remoteFilepath, ContentType: mime.lookup(remoteFilepath) || null, }; + return s3.putObject(params, (err) => err ? reject(err) : resolve()); + }); + }, + async delete(remoteFilepath) { + const objects = await client.listObjects(remoteFilepath); + + return Promise.all( + objects + .map((object) => new Promise((resolve, reject) => { + return s3.deleteObject({ Bucket: bucket, Key: object.Key }, (err) => err ? reject(err) : resolve()) + })) + ); + }, + async listObjects(path) { + return new Promise((resolve, reject) => { + return s3.listObjects( + { Bucket: bucket, Prefix: path}, + (err, data) => err ? reject(err) : resolve(data.Contents)) + }); + }, + async getObject(path) { + return new Promise((resolve, reject) => { + return s3.getObject( + { Bucket: bucket, Key: path}, + (err, data) => err ? reject(err) : resolve(data.Body)) + }).then((body) => { + return JSON.parse(body.toString()) + }); + } + } + + return client; +} + +module.exports = { + getCellarClient, +}; diff --git a/scripts/config.js b/scripts/config.js index 2c7952ce..af7a2c7f 100644 --- a/scripts/config.js +++ b/scripts/config.js @@ -2,15 +2,14 @@ const os = require('os'); const pkgJson = require('../package.json'); -const semver = require('semver'); const archList = ['linux', 'macos', 'win']; +const archEmoji = { + 'linux': '๐Ÿง', + 'macos': '๐Ÿ', + 'win': '๐ŸชŸ', +} const nodeVersion = pkgJson['pkg-node-version']; -const releasesDir = 'releases'; -const cellar = { - host: 'cellar-c2.services.clever-cloud.com', - bucket: 'clever-tools.clever-cloud.com', -}; const git = { email: 'ci@clever-cloud.com', name: 'Clever Cloud CI', @@ -25,57 +24,6 @@ const appInfos = { keywords: pkgJson.keywords.join(' '), }; -function getVersion (striclyFromTag = false) { - const gitTag = process.env.GIT_TAG_NAME; - if (!gitTag) { - if (striclyFromTag) { - throw new Error('Could not read version from git tag!'); - } - return process.env.GIT_BRANCH.replace(/\//g, '-'); - } - const gitTagVersion = gitTag.trim(); - if (gitTagVersion !== pkgJson.version) { - throw new Error(`Mismatch between git tag ${gitTagVersion} and package.json version ${pkgJson.version}`); - } - return gitTagVersion; -} - -function getNupkgVersion (version) { - return version.replace('beta.', 'beta'); -} - -function isStableVersion () { - try { - const version = getVersion(true); - return semver.prerelease(version) == null; - } - catch (e) { - return false; - } -} - -function getBinaryFilename (arch) { - return (arch === 'win') ? 'clever.exe' : 'clever'; -} - -function getBinaryFilepath (arch, version) { - const filename = getBinaryFilename(arch); - return `${releasesDir}/${version}/${appInfos.name}-${version}_${arch}/${filename}`; -} - -function getArchiveFilepath (arch, version) { - const archiveExt = (arch === 'win') ? '.zip' : '.tar.gz'; - return `${releasesDir}/${version}/${appInfos.name}-${version}_${arch}${archiveExt}`; -} - -function getBundleFilepath (type, version) { - if (type === 'nupkg') { - const nupkgVersion = getNupkgVersion(version); - return `${releasesDir}/${version}/${appInfos.name}.${nupkgVersion}.${type}`; - } - return `${releasesDir}/${version}/${appInfos.name}-${version}.${type}`; -} - function getNexusAuth () { const user = process.env.NEXUS_USER || 'ci'; const password = process.env.NEXUS_PASSWORD; @@ -105,20 +53,34 @@ function getGpgConf () { return { gpgPrivateKey, gpgPath, gpgName, gpgPass }; } +function getCellarConf(scope) { + if (scope === 'previews') { + return { + host: 'cellar-c2.services.clever-cloud.com', + bucket: 'clever-tools-preview.clever-cloud.com', + accessKeyId: process.env.CC_CLEVER_TOOLS_PREVIEWS_CELLAR_KEY_ID, + secretAccessKey: process.env.CC_CLEVER_TOOLS_PREVIEWS_CELLAR_SECRET_KEY, + } + } + if (scope === 'releases') { + return { + host: 'cellar-c2.services.clever-cloud.com', + bucket: 'clever-tools.clever-cloud.com', + accessKeyId: process.env.CC_CLEVER_TOOLS_RELEASES_CELLAR_KEY_ID, + secretAccessKey: process.env.CC_CLEVER_TOOLS_RELEASES_CELLAR_SECRET_KEY, + } + } + throw new Error(`Unsupported cellar scope "${scope}". Supported scopes: "previews", "releases".`) +} + module.exports = { archList, + archEmoji, nodeVersion, - releasesDir, - cellar, git, appInfos, - getVersion, - getNupkgVersion, - isStableVersion, - getBinaryFilepath, - getArchiveFilepath, - getBundleFilepath, getNexusAuth, getNpmToken, getGpgConf, + getCellarConf, }; diff --git a/scripts/job-build.js b/scripts/job-build.js old mode 100644 new mode 100755 index 42363583..d0ca9c97 --- a/scripts/job-build.js +++ b/scripts/job-build.js @@ -1,28 +1,30 @@ -'use strict'; +#!/usr/bin/env node -const cfg = require('./config'); -const del = require('del'); -const fs = require('fs-extra'); -const pkg = require('pkg').exec; -const { startTask, endTask } = require('./utils'); +const build = require('./build.js'); +const archive = require('./archive.js'); +const bundle = require('./bundle.js'); +const { cleanupDirectory } = require('./utils.js'); +const { getWorkingDirectory } = require('./paths.js'); async function run () { + const [versionArg, ...optionsArgs] = process.argv.slice(2); - const { archList, nodeVersion, releasesDir } = cfg; - const version = cfg.getVersion(); - const isStableVersion = cfg.isStableVersion(); - - del.sync(releasesDir); - - for (const arch of archList) { - startTask(`Building pkg for ${arch}`); - const filepath = cfg.getBinaryFilepath(arch, version); - await pkg(['.', '-t', `node${nodeVersion}-${arch}`, '-o', filepath]); - if (isStableVersion) { - const latestFilepath = cfg.getBinaryFilepath(arch, 'latest'); - await fs.copy(filepath, latestFilepath); - } - endTask(`Building pkg for ${arch}`); + if (versionArg == null || versionArg.length === 0) { + throw new Error(`Missing argument 'version'`); + } + + const version = getVersion(versionArg); + const options = resolveOptions(optionsArgs); + + await cleanupDirectory(getWorkingDirectory(version)); + + await build(version); + + if (options.archive) { + await archive(version, options.latest); + } + if (options.bundle) { + await bundle(version); } } @@ -30,3 +32,31 @@ run().catch((e) => { console.error(e); process.exit(1); }); + +function getVersion(version) { + return version.replace(/\//g, '-'); +} + +function resolveOptions(args) { + const options = { + archive: false, + latest: false, + bundle: false, + }; + + if (args.includes('--archive') || args.includes('-a')) { + options.archive = true; + } + + if (args.includes('--latest') || args.includes('-l')) { + options.archive = true; + options.latest = true; + } + + if (args.includes('--bundle') || args.includes('-b')) { + options.archive = true; + options.bundle = true; + } + + return options; +} diff --git a/scripts/job-package.js b/scripts/job-package.js deleted file mode 100644 index 6fbee0b3..00000000 --- a/scripts/job-package.js +++ /dev/null @@ -1,166 +0,0 @@ -'use strict'; - -const cfg = require('./config'); -const crypto = require('crypto'); -const del = require('del'); -const fs = require('fs-extra'); -const path = require('path'); -const { startTask, endTask, exec, applyTemplates, writeStringToFile } = require('./utils'); - -async function run () { - - const { archList, releasesDir, appInfos } = cfg; - const version = cfg.getVersion(); - const isStableVersion = cfg.isStableVersion(); - const { gpgPrivateKey, gpgPath, gpgName, gpgPass } = cfg.getGpgConf(); - // if no private key is found, do not try to sign package. - const signPackage = (gpgPrivateKey != null); - - del.sync([ - `${releasesDir}/${version}/*.deb`, - `${releasesDir}/${version}/*.nupkg`, - `${releasesDir}/${version}/*.rpm`, - `${releasesDir}/${version}/*.sha256`, - `${releasesDir}/${version}/*.tar.gz`, - `${releasesDir}/${version}/*.zip`, - `${releasesDir}/${version}/chocolatey`, - ]); - - if (isStableVersion) { - del.sync([ - `${releasesDir}/latest/*.sha256`, - `${releasesDir}/latest/*.tar.gz`, - `${releasesDir}/latest/*.zip`, - ]); - } - if (signPackage) { - await prepareGpg({ gpgPrivateKey, gpgPath, gpgName, gpgPass }); - } - - for (const arch of archList) { - // tar.gz and .zip - const binaryFilepath = cfg.getBinaryFilepath(arch, version); - const archiveFilepath = cfg.getArchiveFilepath(arch, version); - await packageArchiveForArch({ binaryFilepath, archiveFilepath }); - const sha256 = await generateChecksumFile(archiveFilepath); - if (isStableVersion) { - const binaryFilepath = cfg.getBinaryFilepath(arch, 'latest'); - const archiveFilepath = cfg.getArchiveFilepath(arch, 'latest'); - await packageArchiveForArch({ binaryFilepath, archiveFilepath }); - await generateChecksumFile(archiveFilepath); - } - if (arch === 'linux') { - // .rpm - const rpmPath = cfg.getBundleFilepath('rpm', version); - await packageLinuxBundle({ bundlePath: rpmPath, version, binaryFilepath, appInfos, signPackage }); - await generateChecksumFile(rpmPath); - // .deb - const debPath = cfg.getBundleFilepath('deb', version); - await packageLinuxBundle({ bundlePath: debPath, version, binaryFilepath, appInfos }); - await generateChecksumFile(debPath); - } - if (arch === 'win') { - // nupkg - const nupkgPath = cfg.getBundleFilepath('nupkg', version); - await packageNupkg({ version, appInfos, sha256, releasesDir, archiveFilepath, nupkgPath }); - await generateChecksumFile(nupkgPath); - } - } -} - -async function packageArchiveForArch ({ binaryFilepath, archiveFilepath }) { - startTask(`Packaging ${archiveFilepath}`); - const { dir: dirToArchive } = path.parse(binaryFilepath); - const { dir: parentDir } = path.parse(dirToArchive); - const { ext: archiveExt } = path.parse(archiveFilepath); - const relativeDirToArchive = path.relative(parentDir, dirToArchive); - const relativeDirArchiveFilepath = path.relative(parentDir, archiveFilepath); - if (archiveExt === '.zip') { - await exec(`zip -r ${relativeDirArchiveFilepath} ${relativeDirToArchive}`, parentDir); - } - else { - await exec(`tar czf ${relativeDirArchiveFilepath} ${relativeDirToArchive}`, parentDir); - } - endTask(`Packaging ${archiveFilepath}`); -} - -async function prepareGpg ({ gpgPrivateKey, gpgPath, gpgName, gpgPass }) { - startTask('Preparing GPG'); - const templatesPath = './templates/gpg'; - const destPath = `${gpgPath}`; - await writeStringToFile(gpgPrivateKey, '/tmp/GPG-PRIVATE-KEY-Clever-Cloud'); - await applyTemplates(destPath, templatesPath, { - gpgPath, - gpgName, - gpgPass, - }); - // import private/public key in GPG - await exec('gpg --batch --import /tmp/GPG-PRIVATE-KEY-Clever-Cloud'); - // export key in file - await exec(`gpg --export -a "${gpgName}" > /tmp/RPM-GPG-KEY-Clever-Cloud`); - // import key in rpm - await exec('rpm --import /tmp/RPM-GPG-KEY-Clever-Cloud'); - // cleanup temporary files - await exec('rm -f /tmp/RPM-GPG-PRIVATE-KEY-Clever-Cloud'); - await exec('rm -f /tmp/RPM-GPG-KEY-Clever-Cloud'); - console.log(`GPG configuration ready in ${gpgPath}`); - endTask('Preparing GPG'); -} - -async function packageLinuxBundle ({ bundlePath, version, binaryFilepath, appInfos, signPackage }) { - const { ext } = path.parse(bundlePath); - const type = ext.slice(1); - startTask(`Packaging Linux ${type}`); - const { base: binaryFilename } = path.parse(binaryFilepath); - await exec(`fpm \ - -s dir \ - -t ${type} \ - -p "${bundlePath}" \ - -n "${appInfos.name}" \ - --vendor "${appInfos.vendor}" \ - --description "${appInfos.description}" \ - --url "${appInfos.url}" \ - --license "${appInfos.license}" \ - -v ${version} \ - ${binaryFilepath}=/usr/bin/${binaryFilename}`); - if (type === 'rpm' && signPackage === true) { - await exec(`rpm --addsign ${bundlePath}`); - } - endTask(`Packaging Linux ${type}`); - return bundlePath; -} - -async function packageNupkg ({ version, appInfos, sha256, releasesDir, archiveFilepath, nupkgPath }) { - startTask('Packaging Nupkg (chocolatey)'); - const templatesPath = './templates/choco'; - const destPath = `./${releasesDir}/${version}/chocolatey`; - const relativeNupkgPath = path.relative(destPath, nupkgPath); - const pkgVersion = version.replace('beta.', 'beta'); - await applyTemplates(destPath, templatesPath, { - version, - pkgVersion, - sha256, - ...appInfos, - }); - await exec(`zip -r ${relativeNupkgPath} .`, destPath); - endTask('Packaging Nupkg (chocolatey)'); -} - -async function generateChecksumFile (filepath) { - startTask(`Generating checksum file for ${filepath}`, ''); - const sum = await new Promise((resolve, reject) => { - const shasum = crypto.createHash('sha256'); - const stream = fs.ReadStream(filepath); - stream.on('data', (d) => shasum.update(d)); - stream.on('end', () => resolve(shasum.digest('hex'))); - stream.on('error', reject); - }); - await fs.outputFile(`${filepath}.sha256`, sum); - endTask('', '\n\n'); - return sum; -} - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/job-preview.js b/scripts/job-preview.js new file mode 100755 index 00000000..fd872448 --- /dev/null +++ b/scripts/job-preview.js @@ -0,0 +1,301 @@ +#!/usr/bin/env node + +const fs = require('fs-extra'); +const colors = require('colors/safe'); +const textTable = require('text-table'); +const cfg = require('./config.js'); +const { archList} = cfg; +const build = require('./build.js'); +const archive = require('./archive.js'); +const { getArchiveFilename, getWorkingDirectory, getArchiveFilepath, getShaFilepath } = require('./paths.js'); +const { getCurrentBranch, cleanupDirectory, getCurrentAuthor, getCurrentCommit } = require('./utils.js'); +const { getCellarClient } = require('./cellar-client.js'); +const { archEmoji } = require('./config.js'); + +const REMOTE_PREVIEW_DIR = 'previews'; + +async function run () { + const [command, branch] = process.argv.slice(2); + + if (command == null || command.length === 0) { + throw new Error(`Missing argument 'command'`); + } + + const previewName = () => (branch ?? getCurrentBranch()).replace(/\//g, '-'); + + switch (command) { + case 'get': + return getPreview(previewName()); + case 'links': + return getPreviewLinks(previewName()); + case 'list': + return listPreviews(); + case 'build': + return buildPreview(previewName()); + case 'publish': + return publishPreview(previewName()); + case 'delete': + return deletePreview(previewName()); + } + + throw new Error('Unknown command!'); +} + +async function buildPreview(previewName) { + await cleanupDirectory(getWorkingDirectory(previewName)); + + await build(previewName); + await archive(previewName, false); +} + +async function publishPreview(previewName) { + const cellarClient = cellar(); + + for (const arch of archList) { + const archiveFilepath = getArchiveFilepath(arch, previewName); + const remoteFilepath = getArchiveRemoteFilepath(arch, previewName); + await cellarClient.upload(archiveFilepath, remoteFilepath); + await cellarClient.upload(getShaFilepath(archiveFilepath), getShaFilepath(remoteFilepath)); + } + + const checksums = {}; + for (const arch of archList) { + const archiveFilepath = getArchiveFilepath(arch, previewName); + checksums[arch] = await fs.readFile(getShaFilepath(archiveFilepath), 'utf-8'); + } + + const manifest = await getManifest(); + const newPreview = { + name: previewName, + urls: archList.map((arch) => { + const archiveRemoteFilepath = getArchiveRemoteFilepath(arch, previewName); + const shaRemoteFilepath = getShaFilepath(archiveRemoteFilepath); + return ({ + arch, + url: cellarClient.url(archiveRemoteFilepath), + checksum: { + type: 'sha256', + url: cellarClient.url(shaRemoteFilepath), + value: checksums[arch], + }, + }); + }), + updatedAt: new Date().toISOString(), + commitId: getCurrentCommit(), + author: getCurrentAuthor(), + }; + const previewIndex = manifest.previews.findIndex((p) => p.name === previewName); + if (previewIndex !== -1) { + manifest.previews[previewIndex] = newPreview; + } + else { + manifest.previews.push(newPreview); + } + + await updateManifest(manifest); + await updateListIndex(manifest); +} + +async function deletePreview(previewName) { + const manifest = await getManifest(); + const previewIndex = manifest.previews.findIndex((p) => p.name === previewName); + if (previewIndex === -1) { + console.log(`No preview "${previewName}" found.`); + return; + } + + await cellar().delete(getArchiveRemoteDirectory(previewName)); + + manifest.previews = manifest.previews.filter((p) => p.name !== previewName); + + await updateManifest(manifest); + await updateListIndex(manifest); +} + +async function getPreview(previewName) { + const manifest = await getManifest(); + + const preview = manifest.previews.find((p) => p.name === previewName); + + if (preview == null) { + console.log(`No preview for "${previewName}" could be found.`); + process.exit(1); + } + else { + console.log(textTable([previewToPrintableDetails(preview)])); + } +} + +async function getPreviewLinks(previewName) { + const manifest = await getManifest(); + + const preview = manifest.previews.find((p) => p.name === previewName); + + if (preview == null) { + console.log(`No preview for "${previewName}" could be found.`); + process.exit(1); + } + else { + const markdown = preview.urls.map((u) => { + const name = `${archEmoji[u.arch]}`; + const link = `[${u.arch}](${u.url})`; + const checksum = `\`${u.checksum.value}\``; + return `* ${name} ${link} ${checksum}`; + }).join('\n'); + console.log(markdown); + } +} + +async function listPreviews () { + const manifest = await getManifest(); + if (manifest.previews.length === 0) { + console.log('No previews right now.'); + } + else { + const table = manifest.previews.map((p) => previewToPrintableDetails(p)); + console.log(textTable(table)); + } +} + +run().catch((e) => { + console.error(e); + console.log('Available commands are: get [branch?], list, links [branch?], build [branch?], publish [branch?], delete [branch?]'); + process.exit(1); +}); + + +// ---------- + +function cellar() { + return getCellarClient('previews'); +} + +function getArchiveRemoteFilepath(arch, name) { + return `${getArchiveRemoteDirectory(name)}/${getArchiveFilename(arch, name)}`; +} + +function getArchiveRemoteDirectory(name) { + return `${REMOTE_PREVIEW_DIR}/${name}`; +} + +async function getManifest() { + const cellarClient = cellar(); + + try { + return await cellarClient.getObject(`${REMOTE_PREVIEW_DIR}/manifest.json`); + } + catch (e) { + if (e.code === 'NoSuchKey') { + return { + version: '1', + previews: [], + } + } + throw e; + } +} + +async function updateManifest (manifest) { + const cellarClient = cellar(); + + const manifestJson = JSON.stringify(manifest, null, ' '); + return cellarClient.putObject(manifestJson, `${REMOTE_PREVIEW_DIR}/manifest.json`); +} + +async function updateListIndex (manifest) { + const cellarClient = cellar(); + + const indexHtml = ` + + + + + + Clever tools - Previews + + + + +

Clever tools - Previews

+ ${manifest.previews.length === 0 ? ` +

No previews right now

+ ` : ` + + + + + + + + + ${manifest.previews.map((p) => ` + + + + + + + + `).join('\n')} +
BranchBinariesUpdatedCommit IDAuthor
${p.name} +
+ ${p.urls.map((u) => { + const url = `${archEmoji[u.arch]} ${u.arch}` + const checksum = `${u.checksum.value}` + return `${url}${checksum}`; + }).join('')} +
+
${p.updatedAt}${p.commitId.substring(0, 8)}${p.author}
+ `} + + + `; + return cellarClient.putObject(indexHtml, `${REMOTE_PREVIEW_DIR}/index.html`); +} + +function previewToPrintableDetails (p) { + return [ + ...p.updatedAt.substring(0, 19).split('T'), + colors.red(p.commitId.substring(0, 8)), + colors.yellow(p.name), + colors.green(p.author), + p.urls.map((u) => { + const name = `${archEmoji[u.arch]} ${colors.bold(u.arch.padEnd(5, ' '))}`; + const link = `${u.url}`; + const checksum = colors.gray(`${u.checksum.type}: ${u.checksum.value}`); + + return colors.blue(`\n ${name}: ${link}\n ${checksum}`); + }).join(''), + ]; +} diff --git a/scripts/job-publish-bintray.js b/scripts/job-publish-bintray.js deleted file mode 100644 index c05ff20f..00000000 --- a/scripts/job-publish-bintray.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -const cfg = require('./config'); -const fs = require('fs-extra'); -const https = require('https'); -const path = require('path'); - -async function run () { - - const version = cfg.getVersion(true); - const nupkgVersion = cfg.getNupkgVersion(version); - const uploadToBintray = bintray({ - ...cfg.bintray, - apiKey: cfg.getBintrayApiKey(), - packageName: cfg.appInfos.name, - }); - - await uploadToBintray({ filepath: cfg.getBundleFilepath('rpm', version), version }); - await uploadToBintray({ filepath: cfg.getBundleFilepath('deb', version), version }); - await uploadToBintray({ filepath: cfg.getBundleFilepath('nupkg', version), version: nupkgVersion }); -} - -function bintray ({ user, apiKey, subject, packageName }) { - - const basicAuth = Buffer.from(`${user}:${apiKey}`).toString('base64'); - - return function ({ filepath, version }) { - const { ext, name: filename } = path.parse(filepath); - const repo = ext.slice(1); - const host = 'api.bintray.com'; - const requestPath = `/content/${subject}/${repo}/${packageName}/${version}/${filename}.${repo}?publish=1&override=1`; - const isStableVersion = cfg.isStableVersion(); - const debianDistribution = isStableVersion ? 'stable' : 'unstable'; - const debianComponent = isStableVersion ? 'main' : 'beta'; - console.log(`Uploading ${repo} on Bintray...`); - console.log(`\tfile ${filepath}`); - console.log(`\tto ${host} ${requestPath}`); - return httpPut({ - host, - requestPath, - body: fs.createReadStream(filepath), - headers: { - 'Content-Type': 'application/zip', - Authorization: `Basic ${basicAuth}`, - // Mandatory specifications for debian - 'X-Bintray-Debian-Distribution': debianDistribution, - 'X-Bintray-Debian-Component': debianComponent, - 'X-Bintray-Debian-Architecture': 'amd64', - }, - }); - }; -} - -// We use https module directly because we had pb with streams and superagent -function httpPut ({ host, requestPath, body, headers }) { - return new Promise((resolve, reject) => { - - const opts = { - host, - path: requestPath, - method: 'put', - headers, - }; - - function onResp (resp) { - resp.on('data', () => { - }); - resp.on('end', () => resolve()); - } - - const req = https - .request(opts, onResp) - .on('error', reject); - - body.pipe(req); - }); -} - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/job-publish-cellar.js b/scripts/job-publish-cellar.js deleted file mode 100644 index 42473852..00000000 --- a/scripts/job-publish-cellar.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict'; - -const AWS = require('aws-sdk'); -const cfg = require('./config'); -const fs = require('fs-extra'); - -async function run () { - - const { archList } = cfg; - const version = cfg.getVersion(true); - const isStableVersion = cfg.isStableVersion(); - - const accessKeyId = process.env.S3_KEY_ID; - const secretAccessKey = process.env.S3_SECRET_KEY; - if (!accessKeyId || !secretAccessKey) { - throw new Error('Could not read S3 access/secret keys!'); - } - const uploadToCellar = cellar({ accessKeyId, secretAccessKey, ...cfg.cellar }); - - // tar.gz and .zip - for (const arch of archList) { - const archivePath = cfg.getArchiveFilepath(arch, version); - await uploadToCellar(`${archivePath}`); - await uploadToCellar(`${archivePath}.sha256`); - if (isStableVersion) { - const latestArchivePath = cfg.getArchiveFilepath(arch, 'latest'); - await uploadToCellar(`${latestArchivePath}`); - await uploadToCellar(`${latestArchivePath}.sha256`); - } - } - - // .rpm - const rpmPath = cfg.getBundleFilepath('rpm', version); - await uploadToCellar(`${rpmPath}`); - await uploadToCellar(`${rpmPath}.sha256`); - if (isStableVersion) { - const latestRpmPath = cfg.getBundleFilepath('rpm', 'latest'); - await uploadToCellar(`${rpmPath}`, `${latestRpmPath}`); - await uploadToCellar(`${rpmPath}.sha256`, `${latestRpmPath}.sha256`); - } - - // .deb - const debPath = cfg.getBundleFilepath('deb', version); - await uploadToCellar(`${debPath}`); - await uploadToCellar(`${debPath}.sha256`); - if (isStableVersion) { - const latestDebPath = cfg.getBundleFilepath('deb', 'latest'); - await uploadToCellar(`${debPath}`, `${latestDebPath}`); - await uploadToCellar(`${debPath}.sha256`, `${latestDebPath}.sha256`); - } - - // .nupkg - const nupkgPath = cfg.getBundleFilepath('nupkg', version); - await uploadToCellar(`${nupkgPath}`); - await uploadToCellar(`${nupkgPath}.sha256`); - if (isStableVersion) { - const latestNupkgPath = cfg.getBundleFilepath('nupkg', 'latest'); - await uploadToCellar(`${nupkgPath}`, `${latestNupkgPath}`); - await uploadToCellar(`${nupkgPath}.sha256`, `${latestNupkgPath}.sha256`); - } -} - -function cellar ({ accessKeyId, secretAccessKey, host, bucket }) { - - AWS.config.update({ accessKeyId, secretAccessKey }); - const s3 = new AWS.S3({ - endpoint: new AWS.Endpoint(host), - signatureVersion: 'v4', - }); - - return async function (filepath, remoteFilepath = filepath) { - const Body = await fs.readFile(filepath); - console.log('Uploading file on Cellar ...'); - console.log(`\tfile ${filepath}`); - console.log(`\tto ${remoteFilepath}`); - return new Promise((resolve, reject) => { - const params = { ACL: 'public-read', Body, Bucket: bucket, Key: remoteFilepath }; - return s3.putObject(params, (err) => err ? reject(err) : resolve()); - }).then(() => console.log('\tDONE!')); - }; -} - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/job-publish.js b/scripts/job-publish.js new file mode 100755 index 00000000..07c1cbcf --- /dev/null +++ b/scripts/job-publish.js @@ -0,0 +1,87 @@ +#!/usr/bin/env node + +const pkgJson = require('../package.json'); +const publishArch = require('./publish-arch.js'); +const publishBrew = require('./publish-brew.js'); +const { publishCellar, assertRemoteFilesAreOnCellar } = require('./publish-cellar.js'); +const publishDockerhub = require('./publish-dockerhub.js'); +const publishExherbo = require('./publish-exherbo.js'); +const publishNexus = require('./publish-nexus.js'); +const publishNpm = require('./publish-npm.js'); + +const PUBLISHERS = { + arch: publishArch, + brew: publishBrew, + dockerhub: publishDockerhub, + exherbo: publishExherbo, + nexus: publishNexus, + npm: publishNpm, +} +const TARGETS = Object.keys(PUBLISHERS); + +async function run () { + const [version, ...requestedTargets] = process.argv.slice(2); + + if (version == null || version.length === 0) { + throw new Error(`Missing argument 'version'`); + } + + assertVersionCoherence(version); + const job = resolveTargets(requestedTargets); + + if (!job.cellar) { + await assertPackagesAreOnCellar(version); + } + else { + await publishCellar(version); + } + + for (const target of job.targets) { + await PUBLISHERS[target](version); + } +} + +run().catch((e) => { + console.error(e); + process.exit(1); +}); + +//-- + +function assertVersionCoherence(version) { + if (version !== pkgJson.version) { + throw new Error(`Mismatch between version ${version} and package.json version ${pkgJson.version}`); + } +} + +function resolveTargets(requestedTargets) { + if (requestedTargets == null || requestedTargets.length === 0) { + return { + cellar: true, + targets: TARGETS, + }; + } + + const cellar = requestedTargets.includes('cellar'); + + const targets = cellar ? requestedTargets.filter((t) => t !== 'cellar') : requestedTargets; + + const unknownTargets = targets.filter((target) => !TARGETS.includes(target)); + if (unknownTargets.length > 0) { + throw new Error(`Unknown targets: ${unknownTargets}. Possible targets are ${TARGETS}.`); + } + + return { + cellar, + targets, + }; +} + +async function assertPackagesAreOnCellar(version) { + try { + await assertRemoteFilesAreOnCellar(version); + } + catch (e) { + throw new Error(`Cannot publish because some files are missing on Cellar: ${e.message}`); + } +} diff --git a/scripts/paths.js b/scripts/paths.js new file mode 100644 index 00000000..60b6c141 --- /dev/null +++ b/scripts/paths.js @@ -0,0 +1,75 @@ +const cfg = require('./config.js'); + +const BUILD_DIR = 'build'; + +function getWorkingDirectory(version) { + return `${BUILD_DIR}/${version}` +} + +function getBinaryDirectory(version) { + return `${getWorkingDirectory(version)}/bin` +} + +function getBinaryFilepath(arch, version) { + return `${getBinaryDirectory(version)}/${getId(arch, version)}/${getBinaryFilename(arch)}`; +} + +function getBinaryLatestFilepath(arch, version) { + return `${getBinaryDirectory(version)}/${getId(arch, 'latest')}/${getBinaryFilename(arch)}`; +} + +function getBinaryFilename (arch) { + return (arch === 'win') ? 'clever.exe' : 'clever'; +} + +function getArchiveDirectory(version) { + return `${getWorkingDirectory(version)}/archive` +} + +function getArchiveFilepath(arch, version) { + return `${getArchiveDirectory(version)}/${getArchiveFilename(arch, version)}`; +} + +function getArchiveLatestFilepath(arch, version) { + return `${getArchiveDirectory(version)}/${getArchiveFilename(arch, 'latest')}`; +} + +function getArchiveFilename(arch, version) { + const archiveExt = (arch === 'win') ? '.zip' : '.tar.gz'; + return `${getId(arch, version)}${archiveExt}`; +} + +function getBundleDirectory(version) { + return `${getWorkingDirectory(version)}/bundle` +} + +function getBundleFilepath(type, version) { + return `${getBundleDirectory(version)}/${getBundleFilename(type, version)}` +} + +function getBundleFilename(type, version) { + return `${cfg.appInfos.name}-${version}.${type}` +} + +function getId(arch, version) { + return `${cfg.appInfos.name}-${version}_${arch}`; +} + +function getShaFilepath(filepath) { + return `${filepath}.sha256`; +} + +module.exports = { + getWorkingDirectory, + getBinaryDirectory, + getBinaryFilepath, + getBinaryLatestFilepath, + getArchiveDirectory, + getArchiveFilepath, + getArchiveLatestFilepath, + getArchiveFilename, + getBundleDirectory, + getBundleFilepath, + getBundleFilename, + getShaFilepath, +} diff --git a/scripts/job-publish-arch.js b/scripts/publish-arch.js similarity index 53% rename from scripts/job-publish-arch.js rename to scripts/publish-arch.js index 91d5c3ed..b1797881 100644 --- a/scripts/job-publish-arch.js +++ b/scripts/publish-arch.js @@ -3,32 +3,24 @@ const cfg = require('./config'); const fs = require('fs-extra'); const { cloneGitProject, applyTemplates, commitAndPush } = require('./utils'); +const { getArchiveFilepath, getShaFilepath } = require('./paths.js'); -async function run () { +module.exports = async function publishArch (version) { const templatesPath = './templates/arch'; const gitPath = './git-arch'; const { git, appInfos } = cfg; - const isStableVersion = cfg.isStableVersion(); - const pkgbase = isStableVersion ? 'clever-tools-bin' : 'clever-tools-bin-beta'; + const pkgbase = 'clever-tools-bin'; const gitUrl = `ssh://aur@aur.archlinux.org/${pkgbase}.git`; - const version = cfg.getVersion(); - const underscoreVersion = version.replace(/-/g, '_'); - const archivePath = cfg.getArchiveFilepath('linux', version); - const sha256 = await fs.readFile(`${archivePath}.sha256`, 'utf-8'); + const shaFilepath = getShaFilepath(getArchiveFilepath('linux', version)); + const sha256 = await fs.readFile(shaFilepath, 'utf-8'); await cloneGitProject({ gitUrl, gitPath, git }); await applyTemplates(gitPath, templatesPath, { pkgbase, - pkgver: underscoreVersion, version, sha256, ...appInfos, }); await commitAndPush({ gitPath, version }); } - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/job-publish-brew.js b/scripts/publish-brew.js similarity index 58% rename from scripts/job-publish-brew.js rename to scripts/publish-brew.js index 2d590505..75fd9424 100644 --- a/scripts/job-publish-brew.js +++ b/scripts/publish-brew.js @@ -3,18 +3,17 @@ const cfg = require('./config'); const fs = require('fs-extra'); const { cloneGitProject, applyTemplates, commitAndPush } = require('./utils'); +const { getShaFilepath, getArchiveFilepath } = require('./paths.js'); -async function run () { +module.exports = async function publishBrew (version) { const templatesPath = './templates/brew'; const gitPath = './git-brew'; const { git, appInfos } = cfg; - const isStableVersion = cfg.isStableVersion(); - const gitProject = isStableVersion ? 'homebrew-tap' : 'homebrew-tap-beta'; + const gitProject = 'homebrew-tap'; const gitUrl = `ssh://git@github.com/CleverCloud/${gitProject}.git`; - const version = cfg.getVersion(); - const archivePath = cfg.getArchiveFilepath('macos', version); - const sha256 = await fs.readFile(`${archivePath}.sha256`, 'utf-8'); + const shaFilepath = getShaFilepath(getArchiveFilepath('macos', version)); + const sha256 = await fs.readFile(shaFilepath, 'utf-8'); await cloneGitProject({ gitUrl, gitPath, git }); await applyTemplates(gitPath, templatesPath, { @@ -25,8 +24,3 @@ async function run () { }); await commitAndPush({ gitPath, version }); } - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/publish-cellar.js b/scripts/publish-cellar.js new file mode 100644 index 00000000..00a8bc9a --- /dev/null +++ b/scripts/publish-cellar.js @@ -0,0 +1,85 @@ +'use strict'; + +const path = require('path'); +const cfg = require('./config'); +const { getCellarClient } = require('./cellar-client.js'); +const { + getArchiveFilepath, + getShaFilepath, + getArchiveLatestFilepath, + getBundleFilepath, + getBundleFilename +} = require('./paths.js'); + +const { archList } = cfg; +const bundlesList = ['rpm', 'deb', 'nupkg']; + +async function publishCellar (version) { + const cellarClient = getCellarClient("releases"); + + for (const file of getFilesToCopy(version)) { + await cellarClient.upload(file.src, file.dest); + } +} + +function getFilesToCopy(version) { + + const withSha = (o) => [o, {src: getShaFilepath(o.src), dest: getShaFilepath(o.dest)}]; + + const archives = archList.flatMap((arch) => { + const archiveFilepath = getArchiveFilepath(arch, version); + const archiveLatestFilepath = getArchiveLatestFilepath(arch, version); + + return [ + ...withSha({ + src: archiveFilepath, + dest: getRemoteFilepath(archiveFilepath, version), + }), + ...withSha({ + src: archiveLatestFilepath, + dest: getRemoteFilepath(archiveLatestFilepath, 'latest'), + }), + ] + }); + + const bundles = bundlesList.flatMap((type) => { + const bundleFilepath = getBundleFilepath(type, version); + + return [ + ...withSha({ + src: bundleFilepath, + dest: getRemoteFilepath(bundleFilepath, version), + }), + ...withSha({ + src: bundleFilepath, + dest: getRemote(getBundleFilename(type, 'latest'), 'latest'), + }) + ] + }); + + return [...archives, ... bundles]; +} + +function getRemoteFilepath(filepath, version) { + const { base: filename } = path.parse(filepath); + return getRemote(filename, version); +} + +function getRemote(filename, version) { + return `releases/${version}/${filename}`; +} + +async function assertRemoteFilesAreOnCellar(version) { + const cellarClient = getCellarClient("releases"); + + for (const file of getFilesToCopy(version)) { + if (!await cellarClient.exists(file.dest)) { + throw new Error(`${file.dest} is not present on Cellar`); + } + } +} + +module.exports = { + publishCellar, + assertRemoteFilesAreOnCellar, +} diff --git a/scripts/job-publish-dockerhub.js b/scripts/publish-dockerhub.js similarity index 82% rename from scripts/job-publish-dockerhub.js rename to scripts/publish-dockerhub.js index 95e0bb59..e146e3c1 100644 --- a/scripts/job-publish-dockerhub.js +++ b/scripts/publish-dockerhub.js @@ -3,13 +3,12 @@ const cfg = require('./config'); const { cloneGitProject, applyTemplates, tagAndPush, commitAndPush } = require('./utils'); -async function run () { +module.exports = async function publishDockerhub (version) { const templateFilepath = './templates/dockerhub'; const gitPath = './git-dockerhub'; const { git, appInfos } = cfg; const gitUrl = 'ssh://git@github.com/CleverCloud/clever-tools-dockerhub.git'; - const version = cfg.getVersion(); await cloneGitProject({ gitUrl, gitPath, git }); await applyTemplates(gitPath, templateFilepath, { @@ -19,8 +18,3 @@ async function run () { await commitAndPush({ gitPath, version }); await tagAndPush({ gitPath, tagName: version }); } - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/job-publish-exherbo.js b/scripts/publish-exherbo.js similarity index 58% rename from scripts/job-publish-exherbo.js rename to scripts/publish-exherbo.js index ae2fac29..7239c1d2 100644 --- a/scripts/job-publish-exherbo.js +++ b/scripts/publish-exherbo.js @@ -4,28 +4,19 @@ const cfg = require('./config'); const del = require('del'); const { cloneGitProject, applyOneTemplate, commitAndPush } = require('./utils'); -async function run () { +module.exports = async function publishExherbo (version) { const templateFilepath = 'templates/exherbo/clever-tools-bin.exheres-0'; const gitPath = './git-exherbo'; const gitCleverToolsDir = `${gitPath}/packages/dev-util/clever-tools-bin`; const { git, appInfos } = cfg; - const isStableVersion = cfg.isStableVersion(); const gitUrl = 'ssh://git@github.com/CleverCloud/CleverCloud-exheres.git'; - const version = cfg.getVersion(); - const underscoreVersion = version - .replace(/-/g, '_') - .replace('beta.', 'beta'); await cloneGitProject({ gitUrl, gitPath, git, cleanRepo: false }); - if (isStableVersion) { - del.sync(`${gitCleverToolsDir}/*`); - } - else { - del.sync(`${gitCleverToolsDir}/*beta*`); - } - await applyOneTemplate(`${gitCleverToolsDir}/clever-tools-bin-${underscoreVersion}.exheres-0`, templateFilepath, { + del.sync(`${gitCleverToolsDir}/*`); + + await applyOneTemplate(`${gitCleverToolsDir}/clever-tools-bin-${version}.exheres-0`, templateFilepath, { copyrightYear: new Date().getFullYear(), maintainerEmail: git.email, ...appInfos, @@ -34,11 +25,6 @@ async function run () { await commitAndPush({ gitPath, version, - commitMessage: `dev-util/clever-tools-bin: bump to ${underscoreVersion}`, + commitMessage: `dev-util/clever-tools-bin: bump to ${version}`, }); } - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/job-publish-nexus.js b/scripts/publish-nexus.js similarity index 59% rename from scripts/job-publish-nexus.js rename to scripts/publish-nexus.js index f3e94e65..46befeb0 100644 --- a/scripts/job-publish-nexus.js +++ b/scripts/publish-nexus.js @@ -4,61 +4,48 @@ const cfg = require('./config'); const { promises: fs } = require('fs'); const path = require('path'); const superagent = require('superagent'); +const { getBundleFilepath } = require('./paths.js'); + +const NEXUS_DEB = 'https://nexus.clever-cloud.com/repository/deb/'; +const NEXUS_NUPKG = 'https://nexus.clever-cloud.com/repository/nupkg/'; +const NEXUS_RPM = 'https://nexus.clever-cloud.com/repository/rpm/'; + +module.exports = async function publishNexus (version) { -const NEXUS_DEB = { - stable: 'https://nexus.clever-cloud.com/repository/deb/', - beta: 'https://nexus.clever-cloud.com/repository/deb-beta/', -}; -const NEXUS_NUPKG = { - stable: 'https://nexus.clever-cloud.com/repository/nupkg/', - beta: 'https://nexus.clever-cloud.com/repository/nupkg-beta/', -}; -const NEXUS_RPM = { - stable: 'https://nexus.clever-cloud.com/repository/rpm/', - beta: 'https://nexus.clever-cloud.com/repository/rpm-beta/', -}; - -async function run () { - - const version = cfg.getVersion(true); - const isStableVersion = cfg.isStableVersion(); - const releaseType = isStableVersion ? 'stable' : 'beta'; const nexusAuth = cfg.getNexusAuth(); let errorCount = 0; - await publishDebToNexus({ releaseType, nexusAuth, filepath: cfg.getBundleFilepath('deb', version) }) + await publishDebToNexus({ nexusAuth, filepath: getBundleFilepath('deb', version) }) .catch(() => { errorCount += 1; }); - await publishNupkgToNexus({ releaseType, nexusAuth, filepath: cfg.getBundleFilepath('nupkg', version) }) + await publishNupkgToNexus({ nexusAuth, filepath: getBundleFilepath('nupkg', version) }) .catch(() => { errorCount += 1; }); - await publishRpmToNexus({ releaseType, nexusAuth, filepath: cfg.getBundleFilepath('rpm', version) }) + await publishRpmToNexus({ nexusAuth, filepath: getBundleFilepath('rpm', version) }) .catch(() => { errorCount += 1; }); if (errorCount > 0) { - throw new Error('Some error occured while publishing assets to Nexus.'); + throw new Error('Some error occurred while publishing assets to Nexus.'); } } -async function publishDebToNexus ({ releaseType, nexusAuth, filepath }) { - - const nexusRepo = NEXUS_DEB[releaseType]; +async function publishDebToNexus ({ nexusAuth, filepath }) { const filebuffer = await fs.readFile(filepath); console.log('Uploading deb on Nexus...'); console.log(` file ${filepath}`); - console.log(` to ${nexusRepo}`); + console.log(` to ${NEXUS_DEB}`); return superagent - .post(nexusRepo) + .post(NEXUS_DEB) .auth(nexusAuth.user, nexusAuth.password) .set('accept', 'application/json') .type('multipart/form-data') @@ -72,17 +59,15 @@ async function publishDebToNexus ({ releaseType, nexusAuth, filepath }) { }); } -async function publishNupkgToNexus ({ releaseType, nexusAuth, filepath }) { - - const nexusRepo = NEXUS_NUPKG[releaseType]; +async function publishNupkgToNexus ({ nexusAuth, filepath }) { const { base: filename } = path.parse(filepath); - const targetUrl = new URL(filename, nexusRepo).toString(); + const targetUrl = new URL(filename, NEXUS_NUPKG).toString(); const filebuffer = await fs.readFile(filepath); console.log('Uploading nupkg on Nexus...'); console.log(` file ${filepath}`); - console.log(` to ${nexusRepo}`); + console.log(` to ${NEXUS_NUPKG}`); return superagent .put(targetUrl) @@ -97,17 +82,15 @@ async function publishNupkgToNexus ({ releaseType, nexusAuth, filepath }) { }); } -async function publishRpmToNexus ({ releaseType, nexusAuth, filepath }) { - - const nexusRepo = NEXUS_RPM[releaseType]; +async function publishRpmToNexus ({ nexusAuth, filepath }) { const { base: filename } = path.parse(filepath); - const targetUrl = new URL(filename, nexusRepo).toString(); + const targetUrl = new URL(filename, NEXUS_RPM).toString(); const filebuffer = await fs.readFile(filepath); console.log('Uploading rpm on Nexus...'); console.log(` file ${filepath}`); - console.log(` to ${nexusRepo}`); + console.log(` to ${NEXUS_RPM}`); return superagent .put(targetUrl) @@ -140,8 +123,3 @@ function getNexusErrorFromHtml (html) { .replace(/<\/.*$/s, '') .trim(); } - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/job-publish-npm.js b/scripts/publish-npm.js similarity index 54% rename from scripts/job-publish-npm.js rename to scripts/publish-npm.js index 7a5d2d33..e22ecefe 100644 --- a/scripts/job-publish-npm.js +++ b/scripts/publish-npm.js @@ -3,17 +3,11 @@ const cfg = require('./config'); const { exec } = require('./utils'); -async function run () { - const isStableVersion = cfg.isStableVersion(); +module.exports = async function publishNpm () { + const npmToken = cfg.getNpmToken(); - const npmTag = isStableVersion ? 'latest' : 'beta'; await exec('npm config set registry \'https://registry.npmjs.com/\''); await exec(`npm config set '//registry.npmjs.com/:_authToken' '${npmToken}'`); - await exec(`npm publish --tag ${npmTag}`); + await exec(`npm publish --tag latest`); } - -run().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/utils.js b/scripts/utils.js index 78c86a7d..dea6be87 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -6,6 +6,9 @@ const childProcess = require('child_process'); const fs = require('fs-extra'); const glob = require('glob'); const { URL } = require('url'); +const crypto = require('crypto'); +const { getShaFilepath } = require('./paths.js'); +const del = require('del'); // This disables ES6+ template delimiters _.templateSettings.interpolate = /<%=([\s\S]+?)%>/g; @@ -35,6 +38,23 @@ function exec (command, cwd) { }); } +function execSync(command, cwd) { + const stdout = childProcess.execSync(command, {cwd}); + return stdout.toString().trim(); +} + +function getCurrentBranch () { + return execSync('git branch --show-current'); +} + +function getCurrentCommit () { + return execSync('git rev-parse HEAD'); +} + +function getCurrentAuthor () { + return execSync(`git log -1 --pretty=format:'%an'`); +} + async function cloneGitProject ({ gitUrl, gitPath, git, cleanRepo = true }) { const { protocol, hostname } = new URL(gitUrl); if (protocol === 'ssh:') { @@ -82,4 +102,47 @@ async function tagAndPush ({ gitPath, tagName }) { await exec(`git push origin refs/tags/${tagName}`, gitPath); } -module.exports = { startTask, endTask, exec, cloneGitProject, writeStringToFile, applyTemplates, applyOneTemplate, tagAndPush, commitAndPush }; +async function generateChecksumFile (filepath) { + startTask(`Generating checksum file for ${filepath}`, ''); + const sum = await new Promise((resolve, reject) => { + const shasum = crypto.createHash('sha256'); + const stream = fs.ReadStream(filepath); + stream.on('data', (d) => shasum.update(d)); + stream.on('end', () => resolve(shasum.digest('hex'))); + stream.on('error', reject); + }); + await fs.outputFile(getShaFilepath(filepath), sum); + endTask('', '\n\n'); + return sum; +} + +async function cleanupDirectory(path) { + del.sync(path); + await fs.mkdirs(path); +} + +async function assertFileExists(filepath) { + try { + await fs.exists(filepath) + } catch (e) { + throw new Error(`${filepath} is missing.`); + } +} + +module.exports = { + startTask, + endTask, + exec, + cloneGitProject, + writeStringToFile, + applyTemplates, + applyOneTemplate, + tagAndPush, + commitAndPush, + getCurrentBranch, + getCurrentCommit, + getCurrentAuthor, + generateChecksumFile, + cleanupDirectory, + assertFileExists, +}; diff --git a/templates/arch/.SRCINFO b/templates/arch/.SRCINFO index 95f41616..8f1a9b21 100644 --- a/templates/arch/.SRCINFO +++ b/templates/arch/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = <%= pkgbase %> pkgdesc = <%= description %> - pkgver = <%= pkgver %> + pkgver = <%= version %> pkgrel = 1 url = <%= url %> arch = x86_64 diff --git a/templates/arch/PKGBUILD b/templates/arch/PKGBUILD index 37d6a572..bf2c9d73 100644 --- a/templates/arch/PKGBUILD +++ b/templates/arch/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: <%= maintainer %> pkgname=<%= pkgbase %> -pkgver=<%= pkgver %> +pkgver=<%= version %> pkgrel=1 pkgdesc="<%= description %>" arch=('x86_64') diff --git a/templates/choco/clever-tools.nuspec b/templates/choco/clever-tools.nuspec index 98205851..c760dd59 100644 --- a/templates/choco/clever-tools.nuspec +++ b/templates/choco/clever-tools.nuspec @@ -3,7 +3,7 @@ <%= name %> <%= name %> - <%= pkgVersion %> + <%= version %> <%= vendor %> <%= vendor %> false diff --git a/templates/choco/package/services/metadata/core-properties/a1e3117ee6ea4987863ac586a4e311cf.psmdcp b/templates/choco/package/services/metadata/core-properties/a1e3117ee6ea4987863ac586a4e311cf.psmdcp index 5611709f..e56a73f4 100644 --- a/templates/choco/package/services/metadata/core-properties/a1e3117ee6ea4987863ac586a4e311cf.psmdcp +++ b/templates/choco/package/services/metadata/core-properties/a1e3117ee6ea4987863ac586a4e311cf.psmdcp @@ -1 +1 @@ -๏ปฟ<%= vendor %><%= description %><%= name %><%= pkgVersion %><%= keywords %><%= name %>choco, Version=0.10.11.0, Culture=neutral, PublicKeyToken=79d02ea9cad655eb;Microsoft Windows NT 10.0.17134.0;.NET Framework 4 +๏ปฟ<%= vendor %><%= description %><%= name %><%= version %><%= keywords %><%= name %>choco, Version=0.10.11.0, Culture=neutral, PublicKeyToken=79d02ea9cad655eb;Microsoft Windows NT 10.0.17134.0;.NET Framework 4 diff --git a/templates/exherbo/clever-tools-bin.exheres-0 b/templates/exherbo/clever-tools-bin.exheres-0 index aea9fddd..044a4bcf 100644 --- a/templates/exherbo/clever-tools-bin.exheres-0 +++ b/templates/exherbo/clever-tools-bin.exheres-0 @@ -6,7 +6,7 @@ require bash-completion zsh-completion SUMMARY="<%= description %>" MY_PN="clever-tools" -MY_PV="${PV/_beta/-beta.}" +MY_PV="${PV}" MY_PNV="${MY_PN}-${MY_PV}" HOMEPAGE="https://github.com/CleverCloud/${MY_PN}" DOWNLOADS="https://${MY_PN}.clever-cloud.com/releases/${MY_PV}/${MY_PNV}_linux.tar.gz" diff --git a/templates/rpm/cc-nexus-rpm.repo b/templates/rpm/cc-nexus-rpm.repo index c0d16c5b..126f6093 100644 --- a/templates/rpm/cc-nexus-rpm.repo +++ b/templates/rpm/cc-nexus-rpm.repo @@ -4,10 +4,3 @@ baseurl=https://nexus.clever-cloud.com/repository/rpm/ enabled=1 gpgcheck=1 gpgkey=https://clever-tools.clever-cloud.com/gpg/cc-nexus-rpm.public.gpg.key - -[clever-tools-beta] -name=clever-tools beta -baseurl=https://nexus.clever-cloud.com/repository/rpm-beta/ -enabled=0 -gpgcheck=1 -gpgkey=https://clever-tools.clever-cloud.com/gpg/cc-nexus-rpm.public.gpg.key