diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml deleted file mode 100644 index 1dcd089b..00000000 --- a/.github/workflows/release-cli.yml +++ /dev/null @@ -1,170 +0,0 @@ -name: Release CLI - -on: - release: - types: [published] - workflow_dispatch: - inputs: - tag: - description: 'Release tag to build (e.g., v2.0.0). Uses latest release if empty.' - required: false - type: string - publish-npm: - description: 'Publish to npm' - required: false - default: false - type: boolean - -concurrency: - group: ${{ github.workflow }}-${{ github.event.release.tag_name || inputs.tag || github.ref }} - cancel-in-progress: true - -jobs: - build-binaries: - name: Build ${{ matrix.target }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - include: - - target: linux-x64 - os: ubuntu-latest - pkg-target: node20-linux-x64 - binary-name: game-ci-linux-x64 - - target: linux-arm64 - os: ubuntu-latest - pkg-target: node20-linux-arm64 - binary-name: game-ci-linux-arm64 - - target: macos-x64 - os: macos-latest - pkg-target: node20-macos-x64 - binary-name: game-ci-macos-x64 - - target: macos-arm64 - os: macos-latest - pkg-target: node20-macos-arm64 - binary-name: game-ci-macos-arm64 - - target: windows-x64 - os: windows-latest - pkg-target: node20-win-x64 - binary-name: game-ci-windows-x64.exe - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.release.tag_name || inputs.tag || github.ref }} - - - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Build TypeScript - run: yarn build - - - name: Verify CLI before packaging - run: node lib/cli.js version - - - name: Build standalone binary - run: npx pkg lib/cli.js --target ${{ matrix.pkg-target }} --output ${{ matrix.binary-name }} --compress GZip - - - name: Verify standalone binary (non-cross-compiled) - if: | - (matrix.target == 'linux-x64' && runner.os == 'Linux') || - (matrix.target == 'macos-arm64' && runner.os == 'macOS' && runner.arch == 'ARM64') || - (matrix.target == 'macos-x64' && runner.os == 'macOS' && runner.arch == 'X64') || - (matrix.target == 'windows-x64' && runner.os == 'Windows') - run: ./${{ matrix.binary-name }} version - shell: bash - - - uses: actions/upload-artifact@v4 - with: - name: binary-${{ matrix.target }} - path: ${{ matrix.binary-name }} - retention-days: 5 - - create-checksums-and-upload: - name: Checksums and release upload - needs: build-binaries - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/download-artifact@v4 - with: - path: binaries - pattern: binary-* - merge-multiple: true - - - name: List binaries - run: ls -la binaries/ - - - name: Generate SHA256 checksums - run: | - cd binaries - sha256sum game-ci-* > checksums.txt - echo "=== checksums.txt ===" - cat checksums.txt - - - name: Determine release tag - id: tag - run: | - if [ "${{ github.event_name }}" = "release" ]; then - echo "tag=${{ github.event.release.tag_name }}" >> "$GITHUB_OUTPUT" - elif [ -n "${{ inputs.tag }}" ]; then - echo "tag=${{ inputs.tag }}" >> "$GITHUB_OUTPUT" - else - echo "No release tag available. Skipping upload." - echo "tag=" >> "$GITHUB_OUTPUT" - fi - - - name: Upload binaries to release - if: steps.tag.outputs.tag != '' - env: - GH_TOKEN: ${{ github.token }} - run: | - cd binaries - for f in game-ci-* checksums.txt; do - echo "Uploading $f..." - gh release upload "${{ steps.tag.outputs.tag }}" "$f" \ - --repo "${{ github.repository }}" \ - --clobber - done - - publish-npm: - name: Publish to npm - needs: build-binaries - runs-on: ubuntu-latest - if: >- - (github.event_name == 'release') || (github.event_name == 'workflow_dispatch' && inputs.publish-npm) - permissions: - contents: read - id-token: write - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.release.tag_name || inputs.tag || github.ref }} - - - uses: actions/setup-node@v4 - with: - node-version: '20' - registry-url: 'https://registry.npmjs.org' - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Build - run: yarn build - - - name: Run tests - run: yarn test - - - name: Verify CLI - run: | - node lib/cli.js version - node lib/cli.js --help - - - name: Publish to npm - run: npm publish --provenance --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/validate-orchestrator.yml b/.github/workflows/validate-orchestrator.yml index 80e8d24f..88c5bf96 100644 --- a/.github/workflows/validate-orchestrator.yml +++ b/.github/workflows/validate-orchestrator.yml @@ -51,10 +51,10 @@ jobs: - name: Install unity-builder dependencies run: yarn install --frozen-lockfile - - name: Verify unity-builder compiles without orchestrator + - name: Build unity-builder run: | - echo "Verifying unity-builder compiles without @game-ci/orchestrator installed..." - npx tsc --noEmit + echo "Building unity-builder TypeScript..." + npx tsc echo "✓ unity-builder compiles successfully" - name: Run unity-builder tests @@ -62,10 +62,9 @@ jobs: echo "Running unity-builder tests..." npx jest --no-cache --passWithNoTests 2>&1 | tail -10 - - name: Verify plugin loader gracefully handles missing orchestrator + - name: Verify plugin loader returns undefined without orchestrator run: | - echo "Checking that orchestrator-plugin.ts handles missing package..." - # The plugin loader should return undefined when @game-ci/orchestrator is not installed + echo "Checking plugin loader handles missing @game-ci/orchestrator..." node -e " const { loadOrchestrator, loadEnterpriseServices } = require('./lib/model/orchestrator-plugin'); (async () => { @@ -83,7 +82,7 @@ jobs: } console.log('✓ loadEnterpriseServices() returns undefined when package not installed'); })(); - " 2>&1 || echo "::warning::Plugin loader test requires compiled JS (run yarn build first)" + " - name: Verify orchestrator type declarations exist run: | @@ -94,16 +93,46 @@ jobs: exit 1 fi - - name: Run orchestrator standalone tests + - name: Build and install orchestrator standalone working-directory: orchestrator-standalone run: | yarn install --frozen-lockfile + echo "Building orchestrator standalone..." + npx tsc + echo "✓ orchestrator standalone compiles successfully" + echo "Packing orchestrator as tarball..." + npm pack + + - name: Run orchestrator standalone tests + working-directory: orchestrator-standalone + run: | echo "Running orchestrator standalone tests..." npx jest --no-cache 2>&1 | tail -10 - - name: Verify orchestrator standalone compiles - working-directory: orchestrator-standalone + - name: Verify plugin loader returns exports with orchestrator installed run: | - echo "Verifying orchestrator standalone compiles..." - npx tsc --noEmit - echo "✓ orchestrator standalone compiles successfully" + echo "Installing orchestrator into unity-builder workspace..." + npm install ./orchestrator-standalone/game-ci-orchestrator-*.tgz --no-save + echo "Checking plugin loader returns defined exports..." + node -e " + const { loadOrchestrator, loadEnterpriseServices } = require('./lib/model/orchestrator-plugin'); + (async () => { + const orch = await loadOrchestrator(); + if (orch === undefined) { + console.error('ERROR: loadOrchestrator should return defined exports when package is installed'); + process.exit(1); + } + if (typeof orch.run !== 'function') { + console.error('ERROR: loadOrchestrator().run should be a function'); + process.exit(1); + } + console.log('✓ loadOrchestrator() returns defined exports with orchestrator installed'); + + const services = await loadEnterpriseServices(); + if (services === undefined) { + console.error('ERROR: loadEnterpriseServices should return defined exports when package is installed'); + process.exit(1); + } + console.log('✓ loadEnterpriseServices() returns defined exports with orchestrator installed'); + })(); + " diff --git a/package.json b/package.json index 9269c6f1..a0a19cde 100644 --- a/package.json +++ b/package.json @@ -3,24 +3,6 @@ "version": "3.0.0", "description": "Build Unity projects for different platforms.", "main": "dist/index.js", - "bin": { - "game-ci": "./lib/cli.js" - }, - "pkg": { - "scripts": "lib/**/*.js", - "assets": [ - "lib/**/*.json", - "package.json" - ], - "targets": [ - "node20-linux-x64", - "node20-linux-arm64", - "node20-macos-x64", - "node20-macos-arm64", - "node20-win-x64" - ], - "outputPath": "dist-binaries" - }, "repository": "git@github.com:game-ci/unity-builder.git", "author": "Webber ", "license": "MIT", @@ -29,8 +11,6 @@ "build": "yarn && tsc && ncc build lib --source-map --license licenses.txt", "lint": "prettier --check \"src/**/*.{js,ts}\" && eslint src/**/*.ts", "format": "prettier --write \"src/**/*.{js,ts}\"", - "cli": "yarn ts-node src/index.ts -m cli", - "game-ci": "ts-node src/cli.ts", "test": "jest", "test:ci": "jest --config=jest.ci.config.js --runInBand" }, @@ -50,14 +30,12 @@ "semver": "^7.5.2", "ts-md5": "^1.3.1", "unity-changeset": "^3.1.0", - "yaml": "^2.2.2", - "yargs": "^17.7.2" + "yaml": "^2.2.2" }, "devDependencies": { "@types/jest": "^27.4.1", "@types/node": "^17.0.23", "@types/semver": "^7.3.9", - "@types/yargs": "^17.0.35", "@typescript-eslint/parser": "4.8.1", "@vercel/ncc": "^0.36.1", "cross-env": "^7.0.3", @@ -73,7 +51,6 @@ "js-yaml": "^4.1.0", "lefthook": "^1.6.1", "node-fetch": "2", - "pkg": "^5.8.1", "prettier": "^2.5.1", "ts-jest": "^27.1.3", "ts-node": "10.8.1", diff --git a/src/cli.ts b/src/cli.ts deleted file mode 100644 index 2daa9f04..00000000 --- a/src/cli.ts +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env node - -import yargs from 'yargs'; -import { hideBin } from 'yargs/helpers'; -import buildCommand from './cli/commands/build'; -import activateCommand from './cli/commands/activate'; -import orchestrateCommand from './cli/commands/orchestrate'; -import statusCommand from './cli/commands/status'; -import versionCommand from './cli/commands/version'; -import updateCommand from './cli/commands/update'; -import * as core from '@actions/core'; - -const cli = yargs(hideBin(process.argv)) - .scriptName('game-ci') - .usage('$0 [options]') - .command(buildCommand) - .command(activateCommand) - .command(orchestrateCommand) - .command(statusCommand) - .command(versionCommand) - .command(updateCommand) - .demandCommand(1, 'You must specify a command. Run game-ci --help for available commands.') - .strict() - .alias('h', 'help') - .epilogue('For more information, visit https://game.ci') - .wrap(Math.min(120, process.stdout.columns || 80)); - -async function main() { - try { - await cli.parse(); - } catch (error: any) { - if (error.name !== 'YError') { - core.error(`Error: ${error.message}`); - process.exit(1); - } - } -} - -main(); diff --git a/src/cli/__tests__/cli-integration.test.ts b/src/cli/__tests__/cli-integration.test.ts deleted file mode 100644 index b6607176..00000000 --- a/src/cli/__tests__/cli-integration.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { execFile } from 'node:child_process'; -import path from 'node:path'; - -/** - * Integration tests that spawn the CLI as a child process and verify - * exit codes and output. Uses node with --require ts-node/register to - * run the TypeScript entry point directly so no build step is required. - */ - -const CLI_ENTRY = path.resolve(__dirname, '..', '..', 'cli.ts'); - -function runCli(cliArguments: string[]): Promise<{ code: number | null; stdout: string; stderr: string }> { - return new Promise((resolve) => { - execFile( - process.execPath, - ['--require', 'ts-node/register/transpile-only', CLI_ENTRY, ...cliArguments], - { timeout: 30_000, cwd: path.resolve(__dirname, '..', '..', '..') }, - (error, stdout, stderr) => { - resolve({ - code: error ? error.code ?? 1 : 0, - stdout: stdout.toString(), - stderr: stderr.toString(), - }); - }, - ); - }); -} - -// Integration tests spawn child processes which need more time than the default 5s -jest.setTimeout(30_000); - -describe('CLI integration', () => { - it('exits 0 and shows all commands for --help', async () => { - const result = await runCli(['--help']); - - expect(result.code).toStrictEqual(0); - expect(result.stdout).toContain('game-ci'); - expect(result.stdout).toContain('build'); - expect(result.stdout).toContain('activate'); - expect(result.stdout).toContain('orchestrate'); - expect(result.stdout).toContain('status'); - expect(result.stdout).toContain('version'); - expect(result.stdout).toContain('update'); - }); - - it('exits 0 and shows version info for version command', async () => { - const result = await runCli(['version']); - - expect(result.code).toStrictEqual(0); - expect(result.stdout).toContain('unity-builder'); - }); - - it('exits 0 and shows build flags for build --help', async () => { - const result = await runCli(['build', '--help']); - - expect(result.code).toStrictEqual(0); - expect(result.stdout).toContain('--target-platform'); - expect(result.stdout).toContain('--unity-version'); - expect(result.stdout).toContain('--project-path'); - expect(result.stdout).toContain('--build-name'); - expect(result.stdout).toContain('--builds-path'); - expect(result.stdout).toContain('--build-method'); - expect(result.stdout).toContain('--custom-parameters'); - expect(result.stdout).toContain('--provider-strategy'); - }); - - it('exits non-zero for an unknown command', async () => { - const result = await runCli(['nonexistent']); - - expect(result.code).not.toStrictEqual(0); - }); - - it('exits non-zero when no command is provided', async () => { - const result = await runCli([]); - - expect(result.code).not.toStrictEqual(0); - }); - - it('exits 0 for orchestrate --help', async () => { - const result = await runCli(['orchestrate', '--help']); - - expect(result.code).toStrictEqual(0); - expect(result.stdout).toContain('--target-platform'); - expect(result.stdout).toContain('--provider-strategy'); - expect(result.stdout).toContain('cache'); - }); - - it('exits 0 for activate --help', async () => { - const result = await runCli(['activate', '--help']); - - expect(result.code).toStrictEqual(0); - expect(result.stdout).toContain('activate'); - }); - - it('exits 0 for orchestrate cache --help', async () => { - const result = await runCli(['orchestrate', 'cache', '--help']); - - expect(result.code).toStrictEqual(0); - expect(result.stdout).toContain('cache'); - }); - - it('exits 0 for update --help', async () => { - const result = await runCli(['update', '--help']); - - expect(result.code).toStrictEqual(0); - expect(result.stdout).toContain('update'); - expect(result.stdout).toContain('--force'); - expect(result.stdout).toContain('--version'); - }); -}); diff --git a/src/cli/__tests__/commands.test.ts b/src/cli/__tests__/commands.test.ts deleted file mode 100644 index 16909ea2..00000000 --- a/src/cli/__tests__/commands.test.ts +++ /dev/null @@ -1,245 +0,0 @@ -import buildCommand from '../commands/build'; -import activateCommand from '../commands/activate'; -import orchestrateCommand from '../commands/orchestrate'; -import statusCommand from '../commands/status'; -import versionCommand from '../commands/version'; -import updateCommand from '../commands/update'; - -function createFakeYargs(): { yargs: any; options: Record } { - const options: Record = {}; - const yargs: any = { - option: jest.fn(), - positional: jest.fn(), - example: jest.fn(), - env: jest.fn(), - command: jest.fn(), - }; - - yargs.option.mockImplementation((name: string, config: any) => { - options[name] = config; - - return yargs; - }); - yargs.positional.mockImplementation((name: string, config: any) => { - options[name] = config; - - return yargs; - }); - yargs.example.mockReturnValue(yargs); - yargs.env.mockReturnValue(yargs); - yargs.command.mockReturnValue(yargs); - - return { yargs, options }; -} - -describe('CLI commands', () => { - describe('build command', () => { - it('exports the correct command name', () => { - expect(buildCommand.command).toStrictEqual('build'); - }); - - it('has a description', () => { - expect(buildCommand.describe).toBeTruthy(); - }); - - it('has a builder function', () => { - expect(typeof buildCommand.builder).toStrictEqual('function'); - }); - - it('has a handler function', () => { - expect(typeof buildCommand.handler).toStrictEqual('function'); - }); - - it('defines all expected build flags via builder', () => { - const { yargs, options } = createFakeYargs(); - - (buildCommand.builder as Function)(yargs); - - // Core build flags - expect(options['target-platform']).toBeDefined(); - expect(options['target-platform'].demandOption).toStrictEqual(true); - expect(options['unity-version']).toBeDefined(); - expect(options['project-path']).toBeDefined(); - expect(options['build-profile']).toBeDefined(); - expect(options['build-name']).toBeDefined(); - expect(options['builds-path']).toBeDefined(); - expect(options['build-method']).toBeDefined(); - expect(options['custom-parameters']).toBeDefined(); - expect(options['versioning']).toBeDefined(); - expect(options['version']).toBeDefined(); - expect(options['custom-image']).toBeDefined(); - expect(options['manual-exit']).toBeDefined(); - expect(options['enable-gpu']).toBeDefined(); - - // Android flags - expect(options['android-version-code']).toBeDefined(); - expect(options['android-export-type']).toBeDefined(); - expect(options['android-keystore-name']).toBeDefined(); - expect(options['android-keystore-base64']).toBeDefined(); - expect(options['android-keystore-pass']).toBeDefined(); - expect(options['android-keyalias-name']).toBeDefined(); - expect(options['android-keyalias-pass']).toBeDefined(); - expect(options['android-target-sdk-version']).toBeDefined(); - expect(options['android-symbol-type']).toBeDefined(); - - // Docker flags - expect(options['docker-cpu-limit']).toBeDefined(); - expect(options['docker-memory-limit']).toBeDefined(); - expect(options['docker-workspace-path']).toBeDefined(); - expect(options['run-as-host-user']).toBeDefined(); - expect(options['chown-files-to']).toBeDefined(); - - // Provider flags - expect(options['provider-strategy']).toBeDefined(); - expect(options['skip-activation']).toBeDefined(); - expect(options['unity-licensing-server']).toBeDefined(); - }); - - it('sets correct default values', () => { - const { yargs, options } = createFakeYargs(); - - (buildCommand.builder as Function)(yargs); - - expect(options['unity-version'].default).toStrictEqual('auto'); - expect(options['project-path'].default).toStrictEqual('.'); - expect(options['builds-path'].default).toStrictEqual('build'); - expect(options['versioning'].default).toStrictEqual('Semantic'); - expect(options['manual-exit'].default).toStrictEqual(false); - expect(options['enable-gpu'].default).toStrictEqual(false); - expect(options['android-export-type'].default).toStrictEqual('androidPackage'); - expect(options['android-symbol-type'].default).toStrictEqual('none'); - expect(options['provider-strategy'].default).toStrictEqual('local'); - }); - - it('provides camelCase aliases for kebab-case options', () => { - const { yargs, options } = createFakeYargs(); - - (buildCommand.builder as Function)(yargs); - - expect(options['target-platform'].alias).toStrictEqual('targetPlatform'); - expect(options['unity-version'].alias).toStrictEqual('unityVersion'); - expect(options['project-path'].alias).toStrictEqual('projectPath'); - expect(options['build-name'].alias).toStrictEqual('buildName'); - expect(options['builds-path'].alias).toStrictEqual('buildsPath'); - expect(options['build-method'].alias).toStrictEqual('buildMethod'); - }); - }); - - describe('activate command', () => { - it('exports the correct command name', () => { - expect(activateCommand.command).toStrictEqual('activate'); - }); - - it('has a description', () => { - expect(activateCommand.describe).toBeTruthy(); - }); - - it('has a builder function', () => { - expect(typeof activateCommand.builder).toStrictEqual('function'); - }); - - it('has a handler function', () => { - expect(typeof activateCommand.handler).toStrictEqual('function'); - }); - }); - - describe('orchestrate command', () => { - it('exports the correct command name', () => { - expect(orchestrateCommand.command).toStrictEqual('orchestrate'); - }); - - it('has a description', () => { - expect(orchestrateCommand.describe).toBeTruthy(); - }); - - it('has a builder function', () => { - expect(typeof orchestrateCommand.builder).toStrictEqual('function'); - }); - - it('has a handler function', () => { - expect(typeof orchestrateCommand.handler).toStrictEqual('function'); - }); - - it('defines key orchestrator flags', () => { - const { yargs, options } = createFakeYargs(); - - (orchestrateCommand.builder as Function)(yargs); - - expect(options['target-platform']).toBeDefined(); - expect(options['provider-strategy']).toBeDefined(); - expect(options['provider-strategy'].default).toStrictEqual('aws'); - expect(options['aws-stack-name']).toBeDefined(); - expect(options['kube-config']).toBeDefined(); - expect(options['kube-volume']).toBeDefined(); - expect(options['cache-key']).toBeDefined(); - expect(options['watch-to-end']).toBeDefined(); - expect(options['clone-depth']).toBeDefined(); - }); - - it('registers cache as a subcommand', () => { - const { yargs } = createFakeYargs(); - - (orchestrateCommand.builder as Function)(yargs); - - expect(yargs.command).toHaveBeenCalled(); - }); - }); - - describe('status command', () => { - it('exports the correct command name', () => { - expect(statusCommand.command).toStrictEqual('status'); - }); - - it('has a description', () => { - expect(statusCommand.describe).toBeTruthy(); - }); - - it('has a handler function', () => { - expect(typeof statusCommand.handler).toStrictEqual('function'); - }); - }); - - describe('version command', () => { - it('exports the correct command name', () => { - expect(versionCommand.command).toStrictEqual('version'); - }); - - it('has a description', () => { - expect(versionCommand.describe).toBeTruthy(); - }); - - it('has a handler function', () => { - expect(typeof versionCommand.handler).toStrictEqual('function'); - }); - }); - - describe('update command', () => { - it('exports the correct command name', () => { - expect(updateCommand.command).toStrictEqual('update'); - }); - - it('has a description', () => { - expect(updateCommand.describe).toBeTruthy(); - }); - - it('has a builder function', () => { - expect(typeof updateCommand.builder).toStrictEqual('function'); - }); - - it('has a handler function', () => { - expect(typeof updateCommand.handler).toStrictEqual('function'); - }); - - it('defines force and version flags', () => { - const { yargs, options } = createFakeYargs(); - - (updateCommand.builder as Function)(yargs); - - expect(options['force']).toBeDefined(); - expect(options['force'].type).toStrictEqual('boolean'); - expect(options['force'].default).toStrictEqual(false); - expect(options['version']).toBeDefined(); - expect(options['version'].type).toStrictEqual('string'); - }); - }); -}); diff --git a/src/cli/__tests__/input-mapper.test.ts b/src/cli/__tests__/input-mapper.test.ts deleted file mode 100644 index 5f3e7b61..00000000 --- a/src/cli/__tests__/input-mapper.test.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { mapCliArgumentsToInput, CliArguments } from '../input-mapper'; -import { Cli } from '../../model/cli/cli'; -import GitHub from '../../model/github'; - -afterEach(() => { - jest.restoreAllMocks(); - Cli.options = undefined; -}); - -describe('mapCliArgumentsToInput', () => { - describe('basic mapping', () => { - it('populates Cli.options from CLI arguments', () => { - const cliArguments: CliArguments = { - targetPlatform: 'StandaloneLinux64', - unityVersion: '2022.3.56f1', - projectPath: './my-project', - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options).toBeDefined(); - expect(Cli.options!['targetPlatform']).toStrictEqual('StandaloneLinux64'); - expect(Cli.options!['unityVersion']).toStrictEqual('2022.3.56f1'); - expect(Cli.options!['projectPath']).toStrictEqual('./my-project'); - }); - - it('disables GitHub Actions input reading', () => { - const cliArguments: CliArguments = { targetPlatform: 'WebGL' }; - - mapCliArgumentsToInput(cliArguments); - - expect(GitHub.githubInputEnabled).toStrictEqual(false); - }); - - it('sets mode to cli by default when not provided', () => { - const cliArguments: CliArguments = { targetPlatform: 'Android' }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['mode']).toStrictEqual('cli'); - }); - - it('preserves an explicitly provided mode', () => { - const cliArguments: CliArguments = { targetPlatform: 'Android', mode: 'custom-mode' }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['mode']).toStrictEqual('custom-mode'); - }); - }); - - describe('default values', () => { - it('omits undefined values from Cli.options', () => { - const cliArguments: CliArguments = { - targetPlatform: 'StandaloneLinux64', - unityVersion: undefined, - buildName: undefined, - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['targetPlatform']).toStrictEqual('StandaloneLinux64'); - expect(Cli.options!).not.toHaveProperty('unityVersion'); - expect(Cli.options!).not.toHaveProperty('buildName'); - }); - }); - - describe('boolean conversion', () => { - it('converts boolean true to string "true"', () => { - const cliArguments: CliArguments = { manualExit: true }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['manualExit']).toStrictEqual('true'); - }); - - it('converts boolean false to string "false"', () => { - const cliArguments: CliArguments = { enableGpu: false }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['enableGpu']).toStrictEqual('false'); - }); - - it('converts allowDirtyBuild boolean to string', () => { - const cliArguments: CliArguments = { allowDirtyBuild: true }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['allowDirtyBuild']).toStrictEqual('true'); - }); - }); - - describe('yargs internal properties', () => { - it('filters out yargs _ property', () => { - const cliArguments: CliArguments = { - targetPlatform: 'iOS', - _: ['build'] as any, - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!).not.toHaveProperty('_'); - }); - - it('filters out yargs $0 property', () => { - const cliArguments: CliArguments = { - targetPlatform: 'iOS', - $0: 'game-ci' as any, - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!).not.toHaveProperty('$0'); - }); - }); - - describe('flag name conversion', () => { - it('passes camelCase keys through directly', () => { - const cliArguments: CliArguments = { - androidKeystoreName: 'my.keystore', - androidKeystorePass: 'secret', - dockerCpuLimit: '4', - dockerMemoryLimit: '8g', - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['androidKeystoreName']).toStrictEqual('my.keystore'); - expect(Cli.options!['androidKeystorePass']).toStrictEqual('secret'); - expect(Cli.options!['dockerCpuLimit']).toStrictEqual('4'); - expect(Cli.options!['dockerMemoryLimit']).toStrictEqual('8g'); - }); - - it('maps all android-related arguments', () => { - const cliArguments: CliArguments = { - androidVersionCode: '42', - androidExportType: 'androidAppBundle', - androidKeystoreBase64: 'base64data', - androidKeyaliasName: 'myalias', - androidKeyaliasPass: 'aliaspass', - androidTargetSdkVersion: '33', - androidSymbolType: 'public', - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['androidVersionCode']).toStrictEqual('42'); - expect(Cli.options!['androidExportType']).toStrictEqual('androidAppBundle'); - expect(Cli.options!['androidKeystoreBase64']).toStrictEqual('base64data'); - expect(Cli.options!['androidKeyaliasName']).toStrictEqual('myalias'); - expect(Cli.options!['androidKeyaliasPass']).toStrictEqual('aliaspass'); - expect(Cli.options!['androidTargetSdkVersion']).toStrictEqual('33'); - expect(Cli.options!['androidSymbolType']).toStrictEqual('public'); - }); - - it('maps docker and container arguments', () => { - const cliArguments: CliArguments = { - dockerIsolationMode: 'hyperv', - dockerWorkspacePath: '/custom/workspace', - containerRegistryRepository: 'custom/editor', - containerRegistryImageVersion: '5', - runAsHostUser: 'true', - chownFilesTo: 'root:root', - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['dockerIsolationMode']).toStrictEqual('hyperv'); - expect(Cli.options!['dockerWorkspacePath']).toStrictEqual('/custom/workspace'); - expect(Cli.options!['containerRegistryRepository']).toStrictEqual('custom/editor'); - expect(Cli.options!['containerRegistryImageVersion']).toStrictEqual('5'); - expect(Cli.options!['runAsHostUser']).toStrictEqual('true'); - expect(Cli.options!['chownFilesTo']).toStrictEqual('root:root'); - }); - - it('maps orchestrator-related arguments', () => { - const cliArguments: CliArguments = { - providerStrategy: 'k8s', - awsStackName: 'my-stack', - kubeConfig: 'base64config', - kubeVolume: 'my-pvc', - kubeVolumeSize: '10Gi', - kubeStorageClass: 'gp3', - containerCpu: '2048', - containerMemory: '4096', - cacheKey: 'my-cache', - watchToEnd: 'false', - cloneDepth: '100', - }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.options!['providerStrategy']).toStrictEqual('k8s'); - expect(Cli.options!['awsStackName']).toStrictEqual('my-stack'); - expect(Cli.options!['kubeConfig']).toStrictEqual('base64config'); - expect(Cli.options!['kubeVolume']).toStrictEqual('my-pvc'); - expect(Cli.options!['kubeVolumeSize']).toStrictEqual('10Gi'); - expect(Cli.options!['kubeStorageClass']).toStrictEqual('gp3'); - expect(Cli.options!['containerCpu']).toStrictEqual('2048'); - expect(Cli.options!['containerMemory']).toStrictEqual('4096'); - expect(Cli.options!['cacheKey']).toStrictEqual('my-cache'); - expect(Cli.options!['watchToEnd']).toStrictEqual('false'); - expect(Cli.options!['cloneDepth']).toStrictEqual('100'); - }); - }); - - describe('Cli.isCliMode integration', () => { - it('enables CLI mode after mapping', () => { - const cliArguments: CliArguments = { targetPlatform: 'WebGL' }; - - mapCliArgumentsToInput(cliArguments); - - expect(Cli.isCliMode).toStrictEqual(true); - }); - - it('is not in CLI mode before mapping', () => { - expect(Cli.isCliMode).toStrictEqual(false); - }); - }); -}); diff --git a/src/cli/commands/activate.ts b/src/cli/commands/activate.ts deleted file mode 100644 index 910568f8..00000000 --- a/src/cli/commands/activate.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { CommandModule } from 'yargs'; -import * as core from '@actions/core'; -import { mapCliArgumentsToInput, CliArguments } from '../input-mapper'; - -interface ActivateArguments extends CliArguments { - unityVersion?: string; - unitySerial?: string; - unityLicensingServer?: string; -} - -const activateCommand: CommandModule = { - command: 'activate', - describe: 'Verify Unity license configuration', - builder: (yargs) => { - return yargs - .option('unity-version', { - alias: 'unityVersion', - type: 'string', - description: 'Version of Unity to activate', - default: 'auto', - }) - .option('unity-licensing-server', { - alias: 'unityLicensingServer', - type: 'string', - description: 'The Unity licensing server address for floating licenses', - default: '', - }) - .env('UNITY') - .example( - 'UNITY_SERIAL=XXXX-XXXX-XXXX-XXXX game-ci activate', - 'Activate Unity using a serial from environment variable', - ) - .example( - 'game-ci activate --unity-licensing-server http://license-server:8080', - 'Activate Unity using a floating license server', - ) as any; - }, - handler: async (cliArguments) => { - try { - mapCliArgumentsToInput(cliArguments); - - const unitySerial = process.env.UNITY_SERIAL; - const unityLicense = process.env.UNITY_LICENSE; - const licensingServer = cliArguments.unityLicensingServer || process.env.UNITY_LICENSING_SERVER || ''; - - if (licensingServer) { - core.info(`Activating Unity via licensing server: ${licensingServer}`); - core.info('Floating license activation is handled automatically during builds.'); - core.info('No manual activation step is needed when using a licensing server.'); - - return; - } - - if (!unitySerial && !unityLicense) { - throw new Error( - 'No Unity license found.\n\n' + - 'Provide one of the following:\n' + - ' - UNITY_SERIAL environment variable (professional license)\n' + - ' - UNITY_LICENSE environment variable (personal license file content)\n' + - ' - --unity-licensing-server flag (floating license)\n\n' + - 'For more information, visit: https://game.ci/docs/github/activation', - ); - } - - if (unitySerial) { - const maskedSerial = unitySerial.length > 8 ? `${unitySerial.slice(0, 4)}...${unitySerial.slice(-4)}` : '****'; - core.info(`Unity serial detected: ${maskedSerial}`); - core.info('License will be activated automatically when running a build.'); - } else if (unityLicense) { - core.info('Unity license file detected from UNITY_LICENSE environment variable.'); - core.info('License will be activated automatically when running a build.'); - } - - core.info('\nActivation verified. You can now run: game-ci build --target-platform '); - } catch (error: any) { - core.setFailed(`Activation failed: ${error.message}`); - - throw error; - } - }, -}; - -export default activateCommand; diff --git a/src/cli/commands/build.ts b/src/cli/commands/build.ts deleted file mode 100644 index 94667f14..00000000 --- a/src/cli/commands/build.ts +++ /dev/null @@ -1,306 +0,0 @@ -import type { CommandModule } from 'yargs'; -import * as core from '@actions/core'; -import { BuildParameters, ImageTag } from '../../model'; -import { mapCliArgumentsToInput, CliArguments } from '../input-mapper'; -import { loadOrchestrator } from '../../model/orchestrator-plugin'; -import MacBuilder from '../../model/mac-builder'; -import Docker from '../../model/docker'; -import Action from '../../model/action'; -import PlatformSetup from '../../model/platform-setup'; - -interface BuildArguments extends CliArguments { - targetPlatform: string; -} - -const buildCommand: CommandModule = { - command: 'build', - describe: 'Build a Unity project', - builder: (yargs) => { - return yargs - .option('target-platform', { - alias: 'targetPlatform', - type: 'string', - description: 'Platform that the build should target', - demandOption: true, - }) - .option('unity-version', { - alias: 'unityVersion', - type: 'string', - description: 'Version of Unity to use for building the project. Use "auto" to detect.', - default: 'auto', - }) - .option('project-path', { - alias: 'projectPath', - type: 'string', - description: 'Path to the Unity project to be built', - default: '.', - }) - .option('build-profile', { - alias: 'buildProfile', - type: 'string', - description: 'Path to the build profile to activate, relative to the project root', - default: '', - }) - .option('build-name', { - alias: 'buildName', - type: 'string', - description: 'Name of the build (no file extension)', - default: '', - }) - .option('builds-path', { - alias: 'buildsPath', - type: 'string', - description: 'Path where the builds should be stored', - default: 'build', - }) - .option('build-method', { - alias: 'buildMethod', - type: 'string', - description: 'Path to a Namespace.Class.StaticMethod to run to perform the build', - default: '', - }) - .option('custom-parameters', { - alias: 'customParameters', - type: 'string', - description: 'Custom parameters to configure the build', - default: '', - }) - .option('versioning', { - type: 'string', - description: 'The versioning scheme to use when building the project', - default: 'Semantic', - }) - .option('version', { - type: 'string', - description: 'The version, when used with the "Custom" versioning scheme', - default: '', - }) - .option('custom-image', { - alias: 'customImage', - type: 'string', - description: 'Specific docker image that should be used for building the project', - default: '', - }) - .option('manual-exit', { - alias: 'manualExit', - type: 'boolean', - description: 'Suppresses -quit. Exit your build method using EditorApplication.Exit(0) instead.', - default: false, - }) - .option('enable-gpu', { - alias: 'enableGpu', - type: 'boolean', - description: 'Launches unity without specifying -nographics', - default: false, - }) - .option('android-version-code', { - alias: 'androidVersionCode', - type: 'string', - description: 'The android versionCode', - default: '', - }) - .option('android-export-type', { - alias: 'androidExportType', - type: 'string', - description: 'The android export type (androidPackage, androidAppBundle, androidStudioProject)', - default: 'androidPackage', - }) - .option('android-keystore-name', { - alias: 'androidKeystoreName', - type: 'string', - description: 'The android keystoreName', - default: '', - }) - .option('android-keystore-base64', { - alias: 'androidKeystoreBase64', - type: 'string', - description: 'The base64 contents of the android keystore file', - default: '', - }) - .option('android-keystore-pass', { - alias: 'androidKeystorePass', - type: 'string', - description: 'The android keystorePass', - default: '', - }) - .option('android-keyalias-name', { - alias: 'androidKeyaliasName', - type: 'string', - description: 'The android keyaliasName', - default: '', - }) - .option('android-keyalias-pass', { - alias: 'androidKeyaliasPass', - type: 'string', - description: 'The android keyaliasPass', - default: '', - }) - .option('android-target-sdk-version', { - alias: 'androidTargetSdkVersion', - type: 'string', - description: 'The android target API level', - default: '', - }) - .option('android-symbol-type', { - alias: 'androidSymbolType', - type: 'string', - description: 'The android symbol type to export (none, public, debugging)', - default: 'none', - }) - .option('docker-cpu-limit', { - alias: 'dockerCpuLimit', - type: 'string', - description: 'Number of CPU cores to assign the docker container', - default: '', - }) - .option('docker-memory-limit', { - alias: 'dockerMemoryLimit', - type: 'string', - description: 'Amount of memory to assign the docker container (e.g. 512m, 4g)', - default: '', - }) - .option('docker-workspace-path', { - alias: 'dockerWorkspacePath', - type: 'string', - description: 'The path to mount the workspace inside the docker container', - default: '/github/workspace', - }) - .option('run-as-host-user', { - alias: 'runAsHostUser', - type: 'string', - description: 'Whether to run as a user that matches the host system', - default: 'false', - }) - .option('chown-files-to', { - alias: 'chownFilesTo', - type: 'string', - description: 'User and optionally group to give ownership of build artifacts', - default: '', - }) - .option('ssh-agent', { - alias: 'sshAgent', - type: 'string', - description: 'SSH Agent path to forward to the container', - default: '', - }) - .option('git-private-token', { - alias: 'gitPrivateToken', - type: 'string', - description: 'GitHub private token to pull from GitHub', - default: '', - }) - .option('provider-strategy', { - alias: 'providerStrategy', - type: 'string', - description: 'Execution strategy: local, k8s, or aws', - default: 'local', - }) - .option('skip-activation', { - alias: 'skipActivation', - type: 'string', - description: 'Skip the activation/deactivation of Unity', - default: 'false', - }) - .option('unity-licensing-server', { - alias: 'unityLicensingServer', - type: 'string', - description: 'The Unity licensing server address', - default: '', - }) - .option('container-registry-repository', { - alias: 'containerRegistryRepository', - type: 'string', - description: 'Container registry and repository to pull image from. Only applicable if customImage is not set.', - default: 'unityci/editor', - }) - .option('container-registry-image-version', { - alias: 'containerRegistryImageVersion', - type: 'string', - description: 'Container registry image version. Only applicable if customImage is not set.', - default: '3', - }) - .option('docker-isolation-mode', { - alias: 'dockerIsolationMode', - type: 'string', - description: - 'Isolation mode to use for the docker container (process, hyperv, or default). Only applicable on Windows.', - default: 'default', - }) - .option('ssh-public-keys-directory-path', { - alias: 'sshPublicKeysDirectoryPath', - type: 'string', - description: 'Path to a directory containing SSH public keys to forward to the container', - default: '', - }) - .option('cache-unity-installation-on-mac', { - alias: 'cacheUnityInstallationOnMac', - type: 'boolean', - description: 'Whether to cache the Unity hub and editor installation on MacOS', - default: false, - }) - .option('unity-hub-version-on-mac', { - alias: 'unityHubVersionOnMac', - type: 'string', - description: 'The version of Unity Hub to install on MacOS (e.g. 3.4.0). Defaults to latest available on brew.', - default: '', - }) - .example('game-ci build --target-platform StandaloneLinux64', 'Build for Linux using auto-detected Unity version') - .example( - 'game-ci build --target-platform Android --unity-version 2022.3.56f1 --build-method MyBuild.Run', - 'Build for Android with a specific Unity version and build method', - ) as any; - }, - handler: async (cliArguments) => { - try { - mapCliArgumentsToInput(cliArguments); - - const buildParameters = await BuildParameters.create(); - const baseImage = new ImageTag(buildParameters); - - let exitCode = -1; - - if (buildParameters.providerStrategy === 'local') { - core.info(`Building locally for ${buildParameters.targetPlatform}...`); - core.info(`Unity version: ${buildParameters.editorVersion}`); - core.info(`Project path: ${buildParameters.projectPath}`); - - const actionFolder = Action.actionFolder; - await PlatformSetup.setup(buildParameters, actionFolder); - - exitCode = - process.platform === 'darwin' - ? await MacBuilder.run(actionFolder) - : await Docker.run(baseImage.toString(), { - workspace: process.cwd(), - actionFolder, - ...buildParameters, - }); - } else { - core.info(`Building via orchestrator (${buildParameters.providerStrategy})...`); - const orchestrator = await loadOrchestrator(); - if (!orchestrator) { - throw new Error( - 'Orchestrator package not available. Install @game-ci/orchestrator or use --provider-strategy local.', - ); - } - const result = await orchestrator.run(buildParameters, baseImage.toString()); - exitCode = result.exitCode; - } - - // Output results - core.info(`\nBuild completed with exit code: ${exitCode}`); - core.info(`Build version: ${buildParameters.buildVersion}`); - core.info(`Build path: ${buildParameters.buildPath}`); - - if (exitCode !== 0) { - throw new Error(`Build failed with exit code ${exitCode}`); - } - } catch (error: any) { - core.setFailed(`Build failed: ${error.message}`); - - throw error; - } - }, -}; - -export default buildCommand; diff --git a/src/cli/commands/cache.ts b/src/cli/commands/cache.ts deleted file mode 100644 index b70d2383..00000000 --- a/src/cli/commands/cache.ts +++ /dev/null @@ -1,160 +0,0 @@ -import type { CommandModule } from 'yargs'; -import * as core from '@actions/core'; -import fs from 'node:fs'; -import path from 'node:path'; - -const cacheCommand: CommandModule = { - command: 'cache ', - describe: 'Manage build caches', - builder: (yargs) => { - return yargs - .positional('action', { - describe: 'Cache action to perform', - choices: ['list', 'restore', 'clear'] as const, - }) - .option('cache-dir', { - alias: 'cacheDir', - type: 'string', - description: 'Path to the cache directory', - default: '', - }) - .option('project-path', { - alias: 'projectPath', - type: 'string', - description: 'Path to the Unity project', - default: '.', - }) - .example('game-ci orchestrate cache list', 'List all cached workspaces') - .example('game-ci orchestrate cache restore --cache-dir ./my-cache', 'Restore a cached workspace') - .example('game-ci orchestrate cache clear', 'Clear all cached workspaces'); - }, - handler: async (cliArguments) => { - const action = cliArguments.action as string; - const projectPath = (cliArguments.projectPath as string) || '.'; - const cacheDirectory = (cliArguments.cacheDir as string) || path.join(projectPath, 'Library'); - - try { - switch (action) { - case 'list': { - await listCache(cacheDirectory, projectPath); - break; - } - - case 'restore': { - await restoreCache(cacheDirectory); - break; - } - - case 'clear': { - await clearCache(cacheDirectory); - break; - } - - default: { - throw new Error(`Unknown cache action: ${action}. Available actions: list, restore, clear`); - } - } - } catch (error: any) { - core.setFailed(`Cache operation failed: ${error.message}`); - - throw error; - } - }, -}; - -async function listCache(cacheDirectory: string, projectPath: string): Promise { - const libraryPath = path.resolve(projectPath, 'Library'); - - core.info('Cache Status:'); - core.info('============='); - - if (fs.existsSync(libraryPath)) { - const stats = fs.statSync(libraryPath); - const files = fs.readdirSync(libraryPath); - core.info(` Library folder: ${libraryPath}`); - core.info(` Entries: ${files.length}`); - core.info(` Last modified: ${stats.mtime.toISOString()}`); - - // Show size of key subdirectories - const keyDirectories = ['PackageCache', 'ScriptAssemblies', 'ShaderCache', 'Bee']; - for (const directory of keyDirectories) { - const directoryPath = path.join(libraryPath, directory); - if (fs.existsSync(directoryPath)) { - const directoryStats = fs.statSync(directoryPath); - core.info(` ${directory}/: exists (modified ${directoryStats.mtime.toISOString()})`); - } - } - } else { - core.info(` Library folder not found at: ${libraryPath}`); - core.info(' No cache available. First build will be a clean build.'); - } - - // Check for .tar cache files if a custom cache dir is specified - if (cacheDirectory && cacheDirectory !== libraryPath && fs.existsSync(cacheDirectory)) { - core.info(`\nCache directory: ${cacheDirectory}`); - const cacheFiles = fs.readdirSync(cacheDirectory).filter((f) => f.endsWith('.tar') || f.endsWith('.tar.lz4')); - if (cacheFiles.length > 0) { - core.info(` Cache archives found: ${cacheFiles.length}`); - for (const file of cacheFiles) { - const filePath = path.join(cacheDirectory, file); - const fileStats = fs.statSync(filePath); - const sizeMegabytes = (fileStats.size / (1024 * 1024)).toFixed(1); - core.info(` - ${file} (${sizeMegabytes} MB, ${fileStats.mtime.toISOString()})`); - } - } else { - core.info(' No cache archives found.'); - } - } -} - -async function restoreCache(cacheDirectory: string): Promise { - if (!cacheDirectory) { - throw new Error('--cache-dir is required for restore'); - } - - if (!fs.existsSync(cacheDirectory)) { - core.info(`Cache directory does not exist: ${cacheDirectory}`); - core.info('Nothing to restore.'); - - return; - } - - const cacheFiles = fs.readdirSync(cacheDirectory).filter((f) => f.endsWith('.tar') || f.endsWith('.tar.lz4')); - if (cacheFiles.length === 0) { - core.info('No cache archives found to restore.'); - - return; - } - - // Sort by modification time, newest first - const sorted = cacheFiles - .map((f) => ({ name: f, mtime: fs.statSync(path.join(cacheDirectory, f)).mtime })) - .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); - - core.info(`Found ${sorted.length} cache archive(s). Latest: ${sorted[0].name}`); - core.info('Use the orchestrator cache system for full restore functionality:'); - core.info(' game-ci orchestrate --cache-key ...'); -} - -async function clearCache(cacheDirectory: string): Promise { - let cleared = false; - - if (cacheDirectory && fs.existsSync(cacheDirectory)) { - const cacheFiles = fs.readdirSync(cacheDirectory).filter((f) => f.endsWith('.tar') || f.endsWith('.tar.lz4')); - if (cacheFiles.length > 0) { - for (const file of cacheFiles) { - fs.unlinkSync(path.join(cacheDirectory, file)); - core.info(` Removed: ${file}`); - } - cleared = true; - } - } - - if (!cleared) { - core.info('No cache archives found to clear.'); - } else { - core.info('Cache cleared.'); - } -} - -export default cacheCommand; diff --git a/src/cli/commands/orchestrate.ts b/src/cli/commands/orchestrate.ts deleted file mode 100644 index 4a46f2c2..00000000 --- a/src/cli/commands/orchestrate.ts +++ /dev/null @@ -1,230 +0,0 @@ -import type { CommandModule } from 'yargs'; -import * as core from '@actions/core'; -import { BuildParameters, ImageTag } from '../../model'; -import { mapCliArgumentsToInput, CliArguments } from '../input-mapper'; -import { loadOrchestrator } from '../../model/orchestrator-plugin'; -import cacheCommand from './cache'; - -interface OrchestrateArguments extends CliArguments { - targetPlatform: string; - providerStrategy?: string; -} - -const orchestrateCommand: CommandModule = { - command: 'orchestrate', - describe: 'Orchestrator — remote builds, cache management, and provider tools', - builder: (yargs) => { - return yargs - .command(cacheCommand) - .option('target-platform', { - alias: 'targetPlatform', - type: 'string', - description: 'Platform that the build should target', - }) - .option('provider-strategy', { - alias: 'providerStrategy', - type: 'string', - description: 'Orchestrator provider: aws, k8s, local-docker, local-system', - default: 'aws', - }) - .option('unity-version', { - alias: 'unityVersion', - type: 'string', - description: 'Version of Unity to use for building', - default: 'auto', - }) - .option('project-path', { - alias: 'projectPath', - type: 'string', - description: 'Path to the Unity project to be built', - default: '.', - }) - .option('build-name', { - alias: 'buildName', - type: 'string', - description: 'Name of the build', - default: '', - }) - .option('builds-path', { - alias: 'buildsPath', - type: 'string', - description: 'Path where the builds should be stored', - default: 'build', - }) - .option('build-method', { - alias: 'buildMethod', - type: 'string', - description: 'Path to a Namespace.Class.StaticMethod to run to perform the build', - default: '', - }) - .option('custom-parameters', { - alias: 'customParameters', - type: 'string', - description: 'Custom parameters to configure the build', - default: '', - }) - .option('versioning', { - type: 'string', - description: 'The versioning scheme to use', - default: 'None', - }) - .option('aws-stack-name', { - alias: 'awsStackName', - type: 'string', - description: 'The Cloud Formation stack name (AWS provider)', - default: 'game-ci', - }) - .option('kube-config', { - alias: 'kubeConfig', - type: 'string', - description: 'Base64 encoded Kubernetes config (K8s provider)', - default: '', - }) - .option('kube-volume', { - alias: 'kubeVolume', - type: 'string', - description: 'Persistent Volume Claim name for Unity build (K8s provider)', - default: '', - }) - .option('kube-volume-size', { - alias: 'kubeVolumeSize', - type: 'string', - description: 'Disc space for Kubernetes Persistent Volume', - default: '5Gi', - }) - .option('container-cpu', { - alias: 'containerCpu', - type: 'string', - description: 'CPU allocation for remote build container', - default: '1024', - }) - .option('container-memory', { - alias: 'containerMemory', - type: 'string', - description: 'Memory allocation for remote build container', - default: '3072', - }) - .option('cache-key', { - alias: 'cacheKey', - type: 'string', - description: 'Cache key to indicate bucket for cache', - default: '', - }) - .option('git-private-token', { - alias: 'gitPrivateToken', - type: 'string', - description: 'GitHub private token for repository access', - default: '', - }) - .option('allow-dirty-build', { - alias: 'allowDirtyBuild', - type: 'boolean', - description: 'Allow builds from dirty branches', - default: false, - }) - .option('watch-to-end', { - alias: 'watchToEnd', - type: 'string', - description: 'Whether to watch the build to completion', - default: 'true', - }) - .option('clone-depth', { - alias: 'cloneDepth', - type: 'string', - description: 'Git clone depth (0 for full clone)', - default: '50', - }) - .option('skip-activation', { - alias: 'skipActivation', - type: 'string', - description: 'Skip Unity activation/deactivation', - default: 'false', - }) - .option('kube-storage-class', { - alias: 'kubeStorageClass', - type: 'string', - description: 'Kubernetes storage class to use for orchestrator jobs. Leave empty to install rook cluster.', - default: '', - }) - .option('read-input-from-override-list', { - alias: 'readInputFromOverrideList', - type: 'string', - description: 'Comma separated list of input value names to read from the input override command', - default: '', - }) - .option('read-input-override-command', { - alias: 'readInputOverrideCommand', - type: 'string', - description: 'Command to execute to pull input from an external source (e.g. cloud provider secret managers)', - default: '', - }) - .option('post-build-steps', { - alias: 'postBuildSteps', - type: 'string', - description: - 'Post build job in yaml format with the keys image, secrets (name, value object array), command string', - default: '', - }) - .option('pre-build-steps', { - alias: 'preBuildSteps', - type: 'string', - description: - 'Pre build job after repository setup but before the build job (yaml format with keys image, secrets, command)', - default: '', - }) - .option('custom-job', { - alias: 'customJob', - type: 'string', - description: - 'Custom job instead of the standard build automation (yaml format with keys image, secrets, command)', - default: '', - }) - .example( - 'game-ci orchestrate --target-platform StandaloneLinux64 --provider-strategy aws', - 'Build on AWS using the orchestrator', - ) - .example( - 'game-ci orchestrate --target-platform StandaloneLinux64 --provider-strategy k8s --kube-config ', - 'Build on Kubernetes', - ) as any; - }, - handler: async (cliArguments) => { - try { - if (!cliArguments.targetPlatform) { - throw new Error('--target-platform is required for orchestrate builds. Run game-ci orchestrate --help.'); - } - - mapCliArgumentsToInput(cliArguments); - - const orchestrator = await loadOrchestrator(); - if (!orchestrator) { - throw new Error( - 'Orchestrator package not available. Install @game-ci/orchestrator to use orchestrate commands.', - ); - } - - const buildParameters = await BuildParameters.create(); - const baseImage = new ImageTag(buildParameters); - - core.info(`Orchestrating build via ${buildParameters.providerStrategy}...`); - core.info(`Target platform: ${buildParameters.targetPlatform}`); - core.info(`Unity version: ${buildParameters.editorVersion}`); - core.info(`Build GUID: ${buildParameters.buildGuid}`); - - const result = await orchestrator.run(buildParameters, baseImage.toString()); - - core.info(`\nOrchestrated build completed.`); - if (result?.BuildSucceeded) { - core.info(`Build succeeded.`); - } else { - core.warning('Build completed but did not succeed.'); - } - } catch (error: any) { - core.setFailed(`Orchestrated build failed: ${error.message}`); - - throw error; - } - }, -}; - -export default orchestrateCommand; diff --git a/src/cli/commands/status.ts b/src/cli/commands/status.ts deleted file mode 100644 index 881d4789..00000000 --- a/src/cli/commands/status.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { CommandModule } from 'yargs'; -import * as core from '@actions/core'; -import fs from 'node:fs'; -import path from 'node:path'; -import UnityVersioning from '../../model/unity-versioning'; - -const statusCommand: CommandModule = { - command: 'status', - describe: 'Show build status and workspace info', - builder: (yargs) => { - return yargs.option('project-path', { - alias: 'projectPath', - type: 'string', - description: 'Path to the Unity project', - default: '.', - }); - }, - handler: async (cliArguments) => { - const projectPath = (cliArguments.projectPath as string) || '.'; - - core.info('game-ci Workspace Status'); - core.info('========================\n'); - - // Project detection - const projectVersionPath = path.join(projectPath, 'ProjectSettings', 'ProjectVersion.txt'); - const hasProject = fs.existsSync(projectVersionPath); - - core.info(`Project Path: ${path.resolve(projectPath)}`); - core.info(`Unity Project Found: ${hasProject ? 'Yes' : 'No'}`); - - if (hasProject) { - try { - const unityVersion = UnityVersioning.determineUnityVersion(projectPath, 'auto'); - core.info(`Unity Version: ${unityVersion}`); - } catch { - core.info(`Unity Version: Unable to detect`); - } - - // Library folder status - const libraryPath = path.join(projectPath, 'Library'); - if (fs.existsSync(libraryPath)) { - const stats = fs.statSync(libraryPath); - core.info(`Library Cache: Present (modified ${stats.mtime.toISOString()})`); - } else { - core.info(`Library Cache: Not present (clean build required)`); - } - - // Build output detection - const buildsPath = path.join(projectPath, '..', 'build'); - if (fs.existsSync(buildsPath)) { - const builds = fs.readdirSync(buildsPath); - if (builds.length > 0) { - core.info(`\nBuild Outputs (${buildsPath}):`); - for (const build of builds) { - const buildPath = path.join(buildsPath, build); - const buildStats = fs.statSync(buildPath); - core.info(` - ${build} (${buildStats.isDirectory() ? 'dir' : 'file'}, ${buildStats.mtime.toISOString()})`); - } - } - } - } - - // Environment - core.info('\nEnvironment:'); - core.info(` Platform: ${process.platform}`); - core.info(` Node.js: ${process.version}`); - core.info(` UNITY_SERIAL: ${process.env.UNITY_SERIAL ? 'Set' : 'Not set'}`); - core.info(` UNITY_LICENSE: ${process.env.UNITY_LICENSE ? 'Set' : 'Not set'}`); - core.info(` UNITY_EMAIL: ${process.env.UNITY_EMAIL ? 'Set' : 'Not set'}`); - core.info(` UNITY_PASSWORD: ${process.env.UNITY_PASSWORD ? 'Set' : 'Not set'}`); - - // Docker availability - core.info(`\nDocker: Checking...`); - try { - const { execSync } = await import('node:child_process'); - const dockerVersion = execSync('docker --version', { encoding: 'utf8' }).trim(); - core.info(` ${dockerVersion}`); - } catch { - core.info(` Docker not found or not accessible`); - } - }, -}; - -export default statusCommand; diff --git a/src/cli/commands/update.ts b/src/cli/commands/update.ts deleted file mode 100644 index 354d879f..00000000 --- a/src/cli/commands/update.ts +++ /dev/null @@ -1,387 +0,0 @@ -import type { CommandModule } from 'yargs'; -import * as core from '@actions/core'; -import fs from 'node:fs'; -import os from 'node:os'; -import path from 'node:path'; -import https from 'node:https'; -import http from 'node:http'; -import { execFileSync } from 'node:child_process'; - -const REPO = 'game-ci/unity-builder'; - -interface GitHubRelease { - // eslint-disable-next-line camelcase - tag_name: string; - assets: Array<{ - name: string; - // eslint-disable-next-line camelcase - browser_download_url: string; - size: number; - }>; -} - -interface UpdateArguments { - force?: boolean; - version?: string; -} - -/** - * Fetches JSON from a URL via HTTPS, following redirects. - */ -function fetchJson(url: string): Promise { - return new Promise((resolve, reject) => { - const get = (targetUrl: string, redirectCount: number) => { - if (redirectCount > 5) { - reject(new Error('Too many redirects')); - - return; - } - https - .get( - targetUrl, - { - headers: { 'User-Agent': 'game-ci-cli', Accept: 'application/json' }, - }, - (response) => { - if ( - response.statusCode && - response.statusCode >= 300 && - response.statusCode < 400 && - response.headers.location - ) { - get(response.headers.location, redirectCount + 1); - - return; - } - if (response.statusCode !== 200) { - reject(new Error(`HTTP ${response.statusCode} from ${targetUrl}`)); - - return; - } - let data = ''; - response.on('data', (chunk) => (data += chunk)); - response.on('end', () => { - try { - resolve(JSON.parse(data)); - } catch { - reject(new Error('Invalid JSON response')); - } - }); - }, - ) - .on('error', reject); - }; - get(url, 0); - }); -} - -/** - * Downloads a file from a URL, following redirects. Returns the file content as a Buffer. - */ -function downloadFile(url: string): Promise { - return new Promise((resolve, reject) => { - const get = (targetUrl: string, redirectCount: number) => { - if (redirectCount > 10) { - reject(new Error('Too many redirects')); - - return; - } - - const protocol = targetUrl.startsWith('https') ? https : http; - protocol - .get(targetUrl, { headers: { 'User-Agent': 'game-ci-cli' } }, (response) => { - if ( - response.statusCode && - response.statusCode >= 300 && - response.statusCode < 400 && - response.headers.location - ) { - get(response.headers.location, redirectCount + 1); - - return; - } - if (response.statusCode !== 200) { - reject(new Error(`HTTP ${response.statusCode} downloading ${targetUrl}`)); - - return; - } - const chunks: Buffer[] = []; - response.on('data', (chunk: Buffer) => chunks.push(chunk)); - response.on('end', () => resolve(Buffer.concat(chunks))); - }) - .on('error', reject); - }; - get(url, 0); - }); -} - -/** - * Gets the current version from package.json or the compiled binary. - */ -function getCurrentVersion(): string { - // Try reading from package.json at various relative locations - const candidates = [ - path.join(__dirname, '..', '..', '..', 'package.json'), - path.join(__dirname, '..', '..', 'package.json'), - path.join(process.cwd(), 'package.json'), - ]; - - for (const candidate of candidates) { - if (fs.existsSync(candidate)) { - try { - const packageData = JSON.parse(fs.readFileSync(candidate, 'utf8')); - if (packageData.version) { - return packageData.version; - } - } catch { - // Continue to next candidate - } - } - } - - return 'unknown'; -} - -/** - * Determines the correct asset name for the current platform/architecture. - */ -function getAssetName(): string { - const platform = process.platform; - const arch = process.arch; - - let osPart: string; - switch (platform) { - case 'linux': - osPart = 'linux'; - break; - case 'darwin': - osPart = 'macos'; - break; - case 'win32': - osPart = 'windows'; - break; - default: - throw new Error(`Unsupported platform: ${platform}`); - } - - let archPart: string; - switch (arch) { - case 'x64': - archPart = 'x64'; - break; - case 'arm64': - archPart = 'arm64'; - break; - default: - throw new Error(`Unsupported architecture: ${arch}`); - } - - const assetBaseName = `game-ci-${osPart}-${archPart}`; - - return osPart === 'windows' ? `${assetBaseName}.exe` : assetBaseName; -} - -/** - * Determines the path to the currently running executable. - * For standalone binaries (pkg), process.execPath points to the binary itself. - * For Node.js execution, we return undefined since self-update does not apply. - */ -function getExecutablePath(): string | undefined { - // When running as a pkg binary, process.pkg is defined - if ((process as any).pkg) { - return process.execPath; - } - - // When running via Node.js, check if there is a standalone binary in the typical install location - const installDirectory = process.env.GAME_CI_INSTALL || path.join(os.homedir(), '.game-ci', 'bin'); - const binaryName = process.platform === 'win32' ? 'game-ci.exe' : 'game-ci'; - const installedPath = path.join(installDirectory, binaryName); - - if (fs.existsSync(installedPath)) { - return installedPath; - } - - return; -} - -/** - * Strips leading 'v' from a version string and splits into numeric parts. - */ -function parseVersionParts(version: string): number[] { - return version - .replace(/^v/, '') - .split('.') - .map((part) => Number(part)); -} - -/** - * Compares two semver strings. Returns: - * -1 if a < b - * 0 if a == b - * 1 if a > b - */ -function compareSemver(a: string, b: string): number { - const partsA = parseVersionParts(a); - const partsB = parseVersionParts(b); - - for (let index = 0; index < 3; index++) { - const x = partsA[index] || 0; - const y = partsB[index] || 0; - if (x < y) return -1; - if (x > y) return 1; - } - - return 0; -} - -const updateCommand: CommandModule = { - command: 'update', - describe: 'Update game-ci to the latest version', - builder: (yargs) => { - return yargs - .option('force', { - alias: 'f', - type: 'boolean', - description: 'Force update even if already on latest version', - default: false, - }) - .option('version', { - type: 'string', - description: 'Update to a specific version (e.g., v2.0.0)', - default: '', - }) - .example('game-ci update', 'Update to the latest version') - .example('game-ci update --version v2.1.0', 'Update to a specific version') - .example('game-ci update --force', 'Force reinstall of the current version') as any; - }, - handler: async (cliArguments) => { - try { - const currentVersion = getCurrentVersion(); - core.info(`Current version: v${currentVersion}`); - core.info(`Platform: ${process.platform} ${process.arch}`); - core.info(''); - - // Fetch release info - let release: GitHubRelease; - const targetVersion = cliArguments.version as string; - - if (targetVersion) { - const tag = targetVersion.startsWith('v') ? targetVersion : `v${targetVersion}`; - core.info(`Fetching release ${tag}...`); - release = await fetchJson(`https://api.github.com/repos/${REPO}/releases/tags/${tag}`); - } else { - core.info('Checking for updates...'); - release = await fetchJson(`https://api.github.com/repos/${REPO}/releases/latest`); - } - - const latestVersion = release.tag_name; - core.info(`Latest version: ${latestVersion}`); - core.info(''); - - // Compare versions - const comparison = compareSemver(currentVersion, latestVersion); - if (comparison >= 0 && !cliArguments.force) { - core.info('You are already on the latest version. Use --force to reinstall.'); - - return; - } - - if (comparison > 0 && !targetVersion) { - core.info(`Current version (v${currentVersion}) is newer than latest release (${latestVersion}).`); - core.info('Use --force to downgrade, or --version to target a specific release.'); - - return; - } - - // Find the correct asset - const assetName = getAssetName(); - const asset = release.assets.find((a) => a.name === assetName); - - if (!asset) { - const available = release.assets.map((a) => a.name).join(', '); - throw new Error( - `No binary found for ${process.platform}-${process.arch} (looking for ${assetName}).\nAvailable assets: ${available}`, - ); - } - - const sizeMb = (asset.size / (1024 * 1024)).toFixed(1); - core.info(`Downloading ${assetName} (${sizeMb} MB)...`); - - // Download the new binary - const binaryData = await downloadFile(asset.browser_download_url); - - // Determine where to write the updated binary - const executablePath = getExecutablePath(); - - if (!executablePath) { - core.info(''); - core.info('game-ci is running via Node.js (not as a standalone binary).'); - core.info('To update the npm package, run:'); - core.info(' npm install -g unity-builder@latest'); - core.info(''); - core.info('To install the standalone binary instead:'); - core.info(' curl -fsSL https://raw.githubusercontent.com/game-ci/unity-builder/main/install.sh | sh'); - - return; - } - - // Write the new binary. - // On Windows, we cannot overwrite a running executable directly. - // Write to a temporary file, then rename. - const temporaryPath = `${executablePath}.update`; - const backupPath = `${executablePath}.backup`; - - fs.writeFileSync(temporaryPath, binaryData); - - if (process.platform !== 'win32') { - fs.chmodSync(temporaryPath, 0o755); - } - - // Verify the downloaded binary - try { - const output = execFileSync(temporaryPath, ['version'], { encoding: 'utf8', timeout: 10_000 }); - core.info(`Verified new binary: ${output.trim().split('\n')[0]}`); - } catch (verifyError: any) { - fs.unlinkSync(temporaryPath); - throw new Error(`Downloaded binary failed verification: ${verifyError.message}`); - } - - // Replace the current binary - try { - // Backup current - if (fs.existsSync(backupPath)) { - fs.unlinkSync(backupPath); - } - fs.renameSync(executablePath, backupPath); - fs.renameSync(temporaryPath, executablePath); - - // Clean up backup - try { - fs.unlinkSync(backupPath); - } catch { - // On Windows the backup may be locked; that is fine - } - } catch (replaceError: any) { - // Attempt to restore from backup - if (fs.existsSync(backupPath) && !fs.existsSync(executablePath)) { - fs.renameSync(backupPath, executablePath); - } - - // Clean up temporary file - if (fs.existsSync(temporaryPath)) { - fs.unlinkSync(temporaryPath); - } - throw new Error(`Failed to replace binary: ${replaceError.message}`); - } - - core.info(''); - core.info(`Successfully updated game-ci to ${latestVersion}`); - } catch (error: any) { - core.error(`Update failed: ${error.message}`); - - throw error; - } - }, -}; - -export default updateCommand; diff --git a/src/cli/commands/version.ts b/src/cli/commands/version.ts deleted file mode 100644 index febabcf2..00000000 --- a/src/cli/commands/version.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { CommandModule } from 'yargs'; -import * as core from '@actions/core'; -import fs from 'node:fs'; -import path from 'node:path'; - -const versionCommand: CommandModule = { - command: 'version', - describe: 'Show version info', - builder: {}, - handler: async () => { - try { - // Read version from package.json - let packageJsonPath = path.join(__dirname, '..', '..', '..', 'package.json'); - if (!fs.existsSync(packageJsonPath)) { - packageJsonPath = path.join(__dirname, '..', '..', 'package.json'); - } - if (!fs.existsSync(packageJsonPath)) { - packageJsonPath = path.join(process.cwd(), 'package.json'); - } - - if (fs.existsSync(packageJsonPath)) { - const packageData = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); - core.info(`game-ci (unity-builder) v${packageData.version}`); - core.info(`Node.js ${process.version}`); - core.info(`Platform: ${process.platform} ${process.arch}`); - } else { - core.info('game-ci (unity-builder)'); - core.info('Version information unavailable'); - } - } catch (error: any) { - core.info('game-ci (unity-builder)'); - core.error(`Could not read version: ${error.message}`); - } - }, -}; - -export default versionCommand; diff --git a/src/cli/input-mapper.ts b/src/cli/input-mapper.ts deleted file mode 100644 index b6e1386f..00000000 --- a/src/cli/input-mapper.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { Cli } from '../model/cli/cli'; -import GitHub from '../model/github'; - -/** - * Maps CLI arguments (kebab-case flags) to the Input/OrchestratorOptions - * interface used by the action. This bridges the gap between user-friendly - * CLI flags and the camelCase environment/input system unity-builder expects. - * - * The existing Input class already queries Cli.options, environment variables, - * and GitHub Action inputs in priority order. We populate Cli.options so that - * the rest of the codebase works unchanged. - */ -export interface CliArguments { - targetPlatform?: string; - unityVersion?: string; - projectPath?: string; - buildProfile?: string; - buildName?: string; - buildsPath?: string; - buildMethod?: string; - customParameters?: string; - versioning?: string; - version?: string; - customImage?: string; - manualExit?: boolean; - enableGpu?: boolean; - - androidVersionCode?: string; - androidExportType?: string; - androidKeystoreName?: string; - androidKeystoreBase64?: string; - androidKeystorePass?: string; - androidKeyaliasName?: string; - androidKeyaliasPass?: string; - androidTargetSdkVersion?: string; - androidSymbolType?: string; - - dockerCpuLimit?: string; - dockerMemoryLimit?: string; - dockerIsolationMode?: string; - dockerWorkspacePath?: string; - containerRegistryRepository?: string; - containerRegistryImageVersion?: string; - runAsHostUser?: string; - chownFilesTo?: string; - - sshAgent?: string; - sshPublicKeysDirectoryPath?: string; - gitPrivateToken?: string; - - providerStrategy?: string; - awsStackName?: string; - kubeConfig?: string; - kubeVolume?: string; - kubeVolumeSize?: string; - kubeStorageClass?: string; - containerCpu?: string; - containerMemory?: string; - cacheKey?: string; - watchToEnd?: string; - allowDirtyBuild?: boolean; - skipActivation?: string; - cloneDepth?: string; - - readInputFromOverrideList?: string; - readInputOverrideCommand?: string; - postBuildSteps?: string; - preBuildSteps?: string; - customJob?: string; - - unityLicensingServer?: string; - - cacheUnityInstallationOnMac?: boolean; - unityHubVersionOnMac?: string; - - mode?: string; - - [key: string]: unknown; -} - -/** - * Converts kebab-case CLI flags to camelCase keys matching the Input class - * property names, then injects them into Cli.options so the existing - * Input.getInput() / OrchestratorOptions.getInput() chain picks them up. - */ -export function mapCliArgumentsToInput(cliArguments: CliArguments): void { - // Disable GitHub Actions input reading when in CLI mode - GitHub.githubInputEnabled = false; - - // The existing Cli.options mechanism is used by Input.getInput() to query - // CLI-provided values. We set it directly. - const mapped: Record = {}; - - for (const [key, value] of Object.entries(cliArguments)) { - if (value !== undefined && key !== '_' && key !== '$0') { - mapped[key] = typeof value === 'boolean' ? String(value) : value; - } - } - - // Ensure mode is set so Cli.isCliMode returns true - if (!mapped['mode']) { - mapped['mode'] = 'cli'; - } - - Cli.options = mapped; -} diff --git a/yarn.lock b/yarn.lock index b05dc826..4f196b06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -255,15 +255,6 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== - dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" - jsesc "^2.5.1" - "@babel/generator@^7.22.10", "@babel/generator@^7.7.2": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" @@ -357,21 +348,11 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - "@babel/helper-string-parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" @@ -414,11 +395,6 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@7.18.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" - integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== - "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" @@ -561,15 +537,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" - integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.5", "@babel/types@^7.3.3": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" @@ -579,14 +546,6 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@babel/types@^7.18.2": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/types@^7.22.15", "@babel/types@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" @@ -1268,13 +1227,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.35": - version "17.0.35" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" - integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== - dependencies: - "@types/yargs-parser" "*" - "@types/yarnpkg__lockfile@^1.1.6": version "1.1.6" resolved "https://registry.yarnpkg.com/@types/yarnpkg__lockfile/-/yarnpkg__lockfile-1.1.6.tgz#60a35ede6197d8cbedd5bb8393f3921e8d56d44b" @@ -1693,11 +1645,6 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -1781,11 +1728,6 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - bash-glob@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/bash-glob/-/bash-glob-2.0.0.tgz" @@ -1817,15 +1759,6 @@ big-integer@^1.6.44: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - bplist-parser@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" @@ -1882,14 +1815,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bundle-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" @@ -1942,7 +1867,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1965,11 +1890,6 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -2001,15 +1921,6 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2108,11 +2019,6 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - create-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" @@ -2205,23 +2111,11 @@ decimal.js@^10.2.1: resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -2278,11 +2172,6 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-libc@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" - integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -2359,20 +2248,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -end-of-stream@^1.4.1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" - integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== - dependencies: - once "^1.4.0" - enquirer@^2.3.5: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -2852,11 +2727,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - expect@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" @@ -3004,19 +2874,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" @@ -3026,16 +2883,6 @@ fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3051,11 +2898,6 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -3114,11 +2956,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3256,13 +3093,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -3314,11 +3144,6 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -3363,16 +3188,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -3382,14 +3202,6 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -into-stream@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" - integrity sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA== - dependencies: - from2 "^2.3.0" - p-is-promise "^3.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -3429,13 +3241,6 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - is-core-module@^2.12.1, is-core-module@^2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" @@ -3443,13 +3248,6 @@ is-core-module@^2.12.1, is-core-module@^2.13.0: dependencies: has "^1.0.3" -is-core-module@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -3598,11 +3396,6 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -4421,11 +4214,6 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -4433,16 +4221,11 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -4458,24 +4241,11 @@ multimap@^1.1.0: resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== -multistream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" - integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== - dependencies: - once "^1.4.0" - readable-stream "^3.6.0" - nanoid@^3.3.1: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4496,14 +4266,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-abi@^3.3.0: - version "3.87.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.87.0.tgz#423e28fea5c2f195fddd98acded9938c001ae6dd" - integrity sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ== - dependencies: - semver "^7.3.5" - -node-fetch@2, node-fetch@^2.6.6, node-fetch@^2.7.0: +node-fetch@2, node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -4618,7 +4381,7 @@ object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -4661,11 +4424,6 @@ optionator@^0.9.1: prelude-ls "^1.2.1" type-check "^0.4.0" -p-is-promise@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" - integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4798,63 +4556,11 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-fetch@3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.4.2.tgz#6f68ebc54842b73f8c0808959a9df3739dcb28b7" - integrity sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA== - dependencies: - chalk "^4.1.2" - fs-extra "^9.1.0" - https-proxy-agent "^5.0.0" - node-fetch "^2.6.6" - progress "^2.0.3" - semver "^7.3.5" - tar-fs "^2.1.1" - yargs "^16.2.0" - -pkg@^5.8.1: - version "5.8.1" - resolved "https://registry.yarnpkg.com/pkg/-/pkg-5.8.1.tgz#862020f3c0575638ef7d1146f951a54d65ddc984" - integrity sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA== - dependencies: - "@babel/generator" "7.18.2" - "@babel/parser" "7.18.4" - "@babel/types" "7.19.0" - chalk "^4.1.2" - fs-extra "^9.1.0" - globby "^11.1.0" - into-stream "^6.0.0" - is-core-module "2.9.0" - minimist "^1.2.6" - multistream "^4.1.0" - pkg-fetch "3.4.2" - prebuild-install "7.1.1" - resolve "^1.22.0" - stream-meter "^1.0.4" - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -prebuild-install@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4886,17 +4592,12 @@ pretty-format@^27.0.0, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - process@^0.11.10: version "0.11.10" resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@^2.0.0, progress@^2.0.3: +progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -4919,14 +4620,6 @@ psl@^1.1.33: resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" @@ -4942,16 +4635,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" @@ -4976,28 +4659,6 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.0, readable-stream@^2.1.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - reflect-metadata@^0.1.13: version "0.1.14" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" @@ -5078,15 +4739,6 @@ resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.3, resolve@^1.22.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.22.0: - version "1.22.11" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" - integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== - dependencies: - is-core-module "^2.16.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5123,16 +4775,6 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -5221,20 +4863,6 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -5320,13 +4948,6 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -stream-meter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d" - integrity sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ== - dependencies: - readable-stream "^2.1.4" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -5371,20 +4992,6 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -5417,11 +5024,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5500,27 +5102,6 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tar-fs@^2.0.0, tar-fs@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" - integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -5675,13 +5256,6 @@ tsutils@^3.17.1, tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - tunnel@0.0.6, tunnel@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" @@ -5856,11 +5430,6 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" @@ -6088,11 +5657,6 @@ yargs-parser@20.x, yargs-parser@^20.2.2: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - yargs@^16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" @@ -6106,19 +5670,6 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - 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" - yarn-audit-fix@^9.3.8: version "9.3.12" resolved "https://registry.yarnpkg.com/yarn-audit-fix/-/yarn-audit-fix-9.3.12.tgz#cc34e87aa080bace32f2f105be6b581a3cb6eb24"