diff --git a/.github/workflows/build-tests-mac.yml b/.github/workflows/build-tests-mac.yml new file mode 100644 index 00000000..0068bea2 --- /dev/null +++ b/.github/workflows/build-tests-mac.yml @@ -0,0 +1,84 @@ +name: Builds - MacOS + +on: + workflow_dispatch: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + buildForAllPlatformsWindows: + name: ${{ matrix.targetPlatform }} on ${{ matrix.unityVersion }} + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + projectPath: + - test-project + unityVersion: + - 2019.4.40f1 # Minimum version for IL2CPP + - 2020.1.17f1 + - 2020.2.7f1 + - 2020.3.44f1 + - 2021.1.28f1 + - 2021.2.19f1 + - 2021.3.18f1 + - 2022.1.24f1 + - 2022.2.6f1 + targetPlatform: + - StandaloneOSX # Build a MacOS executable + + steps: + ########################### + # Checkout # + ########################### + - uses: actions/checkout@v3 + with: + lfs: true + + ########################### + # Cache # + ########################### + - uses: actions/cache@v3 + with: + path: ${{ matrix.projectPath }}/Library + key: Library-${{ matrix.projectPath }}-macos-${{ matrix.targetPlatform }} + restore-keys: | + Library-${{ matrix.projectPath }}-macos- + Library- + + ########################### + # Set Scripting Backend # + ########################### + - name: Set Scripting Backend To il2cpp + run: | + mv -f "./test-project/ProjectSettings/ProjectSettingsIl2cpp.asset" "./test-project/ProjectSettings/ProjectSettings.asset" + + ########################### + # Build # + ########################### + - uses: ./ + env: + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} + with: + projectPath: ${{ matrix.projectPath }} + unityVersion: ${{ matrix.unityVersion }} + targetPlatform: ${{ matrix.targetPlatform }} + customParameters: -profile SomeProfile -someBoolean -someValue exampleValue + # We use dirty build because we are replacing the default project settings file above + allowDirtyBuild: true + + ########################### + # Upload # + ########################### + - uses: actions/upload-artifact@v3 + with: + name: Build MacOS (${{ matrix.unityVersion }}) + path: build + retention-days: 14 diff --git a/.github/workflows/build-tests.yml b/.github/workflows/build-tests-ubuntu.yml similarity index 92% rename from .github/workflows/build-tests.yml rename to .github/workflows/build-tests-ubuntu.yml index 52b894d7..af59a755 100644 --- a/.github/workflows/build-tests.yml +++ b/.github/workflows/build-tests-ubuntu.yml @@ -1,12 +1,18 @@ -name: Builds +name: Builds - Ubuntu on: workflow_dispatch: - push: { branches: [main] } + push: + branches: + - main pull_request: paths-ignore: - '.github/**' +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + env: UNITY_LICENSE: "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \nm0Db8UK+ktnOLJBtHybkfetpcKo=o/pUbSQAukz7+ZYAWhnA0AJbIlyyCPL7bKVEM2lVqbrXt7cyey+umkCXamuOgsWPVUKBMkXtMH8L\n5etLmD0getWIhTGhzOnDCk+gtIPfL4jMo9tkEuOCROQAXCci23VFscKcrkB+3X6h4wEOtA2APhOY\nB+wvC794o8/82ffjP79aVAi57rp3Wmzx+9pe9yMwoJuljAy2sc2tIMgdQGWVmOGBpQm3JqsidyzI\nJWG2kjnc7pDXK9pwYzXoKiqUqqrut90d+kQqRyv7MSZXR50HFqD/LI69h68b7P8Bjo3bPXOhNXGR\n9YCoemH6EkfCJxp2gIjzjWW+l2Hj2EsFQi8YXw==" +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true jobs: buildForAllPlatformsWindows: - name: Build for ${{ matrix.targetPlatform }} on version ${{ matrix.unityVersion }} + name: ${{ matrix.targetPlatform }} on ${{ matrix.unityVersion }} runs-on: windows-2019 strategy: fail-fast: false @@ -89,7 +67,7 @@ jobs: uses: ./ id: build-1 continue-on-error: true - timeout-minutes: 60 + timeout-minutes: 30 env: UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} @@ -111,7 +89,7 @@ jobs: uses: ./ id: build-2 continue-on-error: true - timeout-minutes: 60 + timeout-minutes: 30 if: steps.build-1.outcome == 'failure' env: UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} @@ -133,7 +111,7 @@ jobs: - name: Build Retry 2 uses: ./ id: build-3 - timeout-minutes: 60 + timeout-minutes: 30 if: ${{ steps.build-1.outcome == 'failure' && steps.build-2.outcome == 'failure' }} env: UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} diff --git a/.github/workflows/integrity-check.yml b/.github/workflows/integrity-check.yml index 8b9dd0e1..4d64fb87 100644 --- a/.github/workflows/integrity-check.yml +++ b/.github/workflows/integrity-check.yml @@ -7,6 +7,10 @@ on: env: CODECOV_TOKEN: '2f2eb890-30e2-4724-83eb-7633832cf0de' +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: tests: name: Tests diff --git a/.github/workflows/mac-build-tests.yml b/.github/workflows/mac-build-tests.yml deleted file mode 100644 index 05d5c43c..00000000 --- a/.github/workflows/mac-build-tests.yml +++ /dev/null @@ -1,106 +0,0 @@ -name: Mac Builds - -on: - workflow_dispatch: - push: - branches: - - main - -env: - UNITY_LICENSE: - "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \nm0Db8UK+ktnOLJBtHybkfetpcKo=o/pUbSQAukz7+ZYAWhnA0AJbIlyyCPL7bKVEM2lVqbrXt7cyey+umkCXamuOgsWPVUKBMkXtMH8L\n5etLmD0getWIhTGhzOnDCk+gtIPfL4jMo9tkEuOCROQAXCci23VFscKcrkB+3X6h4wEOtA2APhOY\nB+wvC794o8/82ffjP79aVAi57rp3Wmzx+9pe9yMwoJuljAy2sc2tIMgdQGWVmOGBpQm3JqsidyzI\nJWG2kjnc7pDXK9pwYzXoKiqUqqrut90d+kQqRyv7MSZXR50HFqD/LI69h68b7P8Bjo3bPXOhNXGR\n9YCoemH6EkfCJxp2gIjzjWW+l2Hj2EsFQi8YXw==" - -jobs: - buildForAllPlatformsWindows: - name: Build for ${{ matrix.targetPlatform }} on version ${{ matrix.unityVersion }} - runs-on: macos-latest - strategy: - fail-fast: false - matrix: - projectPath: - - test-project - unityVersion: - - 2019.4.40f1 # Minimum version for IL2CPP - - 2020.1.17f1 - - 2020.2.7f1 - - 2020.3.44f1 - - 2021.1.28f1 - - 2021.2.19f1 - - 2021.3.18f1 - - 2022.1.24f1 - - 2022.2.6f1 - targetPlatform: - - StandaloneOSX # Build a MacOS executable - - steps: - ########################### - # Checkout # - ########################### - - uses: actions/checkout@v3 - with: - lfs: true - - ########################### - # Cache # - ########################### - - uses: actions/cache@v3 - with: - path: ${{ matrix.projectPath }}/Library - key: Library-${{ matrix.projectPath }}-macos-${{ matrix.targetPlatform }} - restore-keys: | - Library-${{ matrix.projectPath }}-macos- - Library- - - ########################### - # Set Scripting Backend # - ########################### - - name: Set Scripting Backend To il2cpp - run: | - mv -f "./test-project/ProjectSettings/ProjectSettingsIl2cpp.asset" "./test-project/ProjectSettings/ProjectSettings.asset" - - ########################### - # Build # - ########################### - - uses: ./ - env: - UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} - UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} - UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} - with: - projectPath: ${{ matrix.projectPath }} - unityVersion: ${{ matrix.unityVersion }} - targetPlatform: ${{ matrix.targetPlatform }} - customParameters: -profile SomeProfile -someBoolean -someValue exampleValue - # We use dirty build because we are replacing the default project settings file above - allowDirtyBuild: true - - ########################### - # Upload # - ########################### - - uses: actions/upload-artifact@v3 - with: - name: Build MacOS (${{ matrix.unityVersion }}) - path: build - retention-days: 14 diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..9c7be0a5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug Jest Test", + "program": "${workspaceRoot}/node_modules/jest/bin/jest.js", + "args": [ + "--collectCoverage=false", + "--colors", + "--config", + "${workspaceRoot}/jest.config.js", + "--runInBand", + "--runTestsByPath", + "${relativeFile}", + "--testPathPattern=${fileDirname}", + "--testTimeout=10000000" + ], + "outputCapture": "std", + "internalConsoleOptions": "openOnSessionStart", + "envFile": "${workspaceRoot}/.env", + "skipFiles": ["${workspaceRoot}/../../node_modules/**/*", "/**/*"] + } + ] +} diff --git a/dist/index.js b/dist/index.js index 09bcfe59..24a3505f 100644 Binary files a/dist/index.js and b/dist/index.js differ diff --git a/dist/index.js.map b/dist/index.js.map index 2f2afeff..25907a9c 100644 Binary files a/dist/index.js.map and b/dist/index.js.map differ diff --git a/dist/licenses.txt b/dist/licenses.txt index b7820d06..0324788a 100644 Binary files a/dist/licenses.txt and b/dist/licenses.txt differ diff --git a/dist/sourcemap-register.js b/dist/sourcemap-register.js index b9d830e9..466141d4 100644 Binary files a/dist/sourcemap-register.js and b/dist/sourcemap-register.js differ diff --git a/dist/xhr-sync-worker.js b/dist/xhr-sync-worker.js deleted file mode 100644 index f6389cfd..00000000 --- a/dist/xhr-sync-worker.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; -/* eslint-disable no-process-exit */ -const util = require("util"); -const { JSDOM } = require("../../../.."); -const { READY_STATES } = require("./xhr-utils"); -const idlUtils = require("../generated/utils"); -const tough = require("tough-cookie"); - -const dom = new JSDOM(); -const xhr = new dom.window.XMLHttpRequest(); -const xhrImpl = idlUtils.implForWrapper(xhr); - -const chunks = []; - -process.stdin.on("data", chunk => { - chunks.push(chunk); -}); - -process.stdin.on("end", () => { - const buffer = Buffer.concat(chunks); - - const flag = JSON.parse(buffer.toString()); - if (flag.body && flag.body.type === "Buffer" && flag.body.data) { - flag.body = Buffer.from(flag.body.data); - } - if (flag.cookieJar) { - flag.cookieJar = tough.CookieJar.fromJSON(flag.cookieJar); - } - - flag.synchronous = false; - Object.assign(xhrImpl.flag, flag); - const { properties } = xhrImpl; - xhrImpl.readyState = READY_STATES.OPENED; - try { - xhr.addEventListener("loadend", () => { - if (properties.error) { - properties.error = properties.error.stack || util.inspect(properties.error); - } - process.stdout.write(JSON.stringify({ - responseURL: xhrImpl.responseURL, - status: xhrImpl.status, - statusText: xhrImpl.statusText, - properties - }), () => { - process.exit(0); - }); - }, false); - xhr.send(flag.body); - } catch (error) { - properties.error += error.stack || util.inspect(error); - process.stdout.write(JSON.stringify({ - responseURL: xhrImpl.responseURL, - status: xhrImpl.status, - statusText: xhrImpl.statusText, - properties - }), () => { - process.exit(0); - }); - } -}); diff --git a/jest.config.js b/jest.config.js index d8024f48..be54f49e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -18,7 +18,6 @@ module.exports = { transform: { '^.+\\.ts$': 'ts-jest', }, - autoRun: false, // Indicates whether each individual test should be reported during the run verbose: true, diff --git a/package.json b/package.json index 98d43e3f..b8e5619d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "test-i-k8s": "cross-env cloudRunnerTests=true cloudRunnerCluster=k8s yarn test -i -t \"cloud runner\"" }, "engines": { - "node": ">=16.0.0" + "node": ">=16.x" }, "dependencies": { "@actions/cache": "^3.1.3", @@ -43,19 +43,21 @@ "nanoid": "^3.3.1", "reflect-metadata": "^0.1.13", "semver": "^7.3.5", - "unity-changeset": "^1.6.0", + "unity-changeset": "^2.0.0", "uuid": "^8.3.2", "yaml": "^1.10.2" }, "devDependencies": { - "@arkweid/lefthook": "^0.7.7", + "@evilmartians/lefthook": "^1.2.9", + "@types/base-64": "^1.0.0", "@types/jest": "^27.4.1", "@types/node": "^17.0.23", "@types/semver": "^7.3.9", + "@types/uuid": "^9.0.0", "@typescript-eslint/parser": "4.8.1", - "@vercel/ncc": "^0.33.3", + "@vercel/ncc": "^0.36.1", "cross-env": "^7.0.3", - "eslint": "7.17.0", + "eslint": "^7.23.0", "eslint-config-prettier": "8.1.0", "eslint-plugin-github": "^4.1.1", "eslint-plugin-jest": "24.1.3", @@ -63,7 +65,7 @@ "eslint-plugin-unicorn": "28.0.2", "jest": "^27.5.1", "jest-circus": "^27.5.1", - "jest-fail-on-console": "^2.3.0", + "jest-fail-on-console": "^3.0.2", "js-yaml": "^4.1.0", "prettier": "^2.5.1", "ts-jest": "^27.1.3", diff --git a/src/index.ts b/src/index.ts index 3478af03..12f10e1b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import { Action, BuildParameters, Cache, CloudRunner, Docker, ImageTag, Output } import { Cli } from './model/cli/cli'; import MacBuilder from './model/mac-builder'; import PlatformSetup from './model/platform-setup'; + async function runMain() { try { if (Cli.InitCliMode()) { @@ -18,16 +19,16 @@ async function runMain() { const buildParameters = await BuildParameters.create(); const baseImage = new ImageTag(buildParameters); - if (buildParameters.cloudRunnerCluster !== 'local') { - await CloudRunner.run(buildParameters, baseImage.toString()); - } else { + if (buildParameters.cloudRunnerCluster === 'local') { core.info('Building locally'); await PlatformSetup.setup(buildParameters, actionFolder); if (process.platform === 'darwin') { MacBuilder.run(actionFolder); } else { - await Docker.run(baseImage, { workspace, actionFolder, ...buildParameters }); + await Docker.run(baseImage.toString(), { workspace, actionFolder, ...buildParameters }); } + } else { + await CloudRunner.run(buildParameters, baseImage.toString()); } // Set output diff --git a/src/integrity.test.ts b/src/integrity.test.ts index 7763709c..c2f76806 100644 --- a/src/integrity.test.ts +++ b/src/integrity.test.ts @@ -1,4 +1,4 @@ -import { stat } from 'fs/promises'; +import { stat } from 'node:fs/promises'; describe('Integrity tests', () => { describe('package-lock.json', () => { diff --git a/src/model/action.test.ts b/src/model/action.test.ts index 76fef312..830c2517 100644 --- a/src/model/action.test.ts +++ b/src/model/action.test.ts @@ -1,5 +1,5 @@ -import path from 'path'; -import fs from 'fs'; +import path from 'node:path'; +import fs from 'node:fs'; import Action from './action'; describe('Action', () => { diff --git a/src/model/action.ts b/src/model/action.ts index 28d07963..4b7d759c 100644 --- a/src/model/action.ts +++ b/src/model/action.ts @@ -1,23 +1,27 @@ -import path from 'path'; +import path from 'node:path'; class Action { - static get supportedPlatforms() { + static get supportedPlatforms(): string[] { return ['linux', 'win32', 'darwin']; } - static get isRunningLocally() { + static get isRunningLocally(): boolean { return process.env.RUNNER_WORKSPACE === undefined; } - static get isRunningFromSource() { + static get isRunningFromSource(): boolean { return path.basename(__dirname) === 'model'; } - static get canonicalName() { + static get canonicalName(): string { + if (Action.isRunningFromSource) { + return path.basename(path.dirname(path.join(path.dirname(__filename), '/..'))); + } + return 'unity-builder'; } - static get rootFolder() { + static get rootFolder(): string { if (Action.isRunningFromSource) { return path.dirname(path.dirname(path.dirname(__filename))); } @@ -25,12 +29,12 @@ class Action { return path.dirname(path.dirname(__filename)); } - static get actionFolder() { + static get actionFolder(): string { return `${Action.rootFolder}/dist`; } - static get workspace() { - return process.env.GITHUB_WORKSPACE; + static get workspace(): string { + return process.env.GITHUB_WORKSPACE!; } static checkCompatibility() { diff --git a/src/model/android-versioning.test.ts b/src/model/android-versioning.test.ts index 59d3b64a..d63fb3ff 100644 --- a/src/model/android-versioning.test.ts +++ b/src/model/android-versioning.test.ts @@ -3,15 +3,15 @@ import AndroidVersioning from './android-versioning'; describe('Android Versioning', () => { describe('versionToVersionCode', () => { it('defaults to 0 when versioning strategy is none', () => { - expect(AndroidVersioning.versionToVersionCode('none')).toBe(0); + expect(AndroidVersioning.versionToVersionCode('none')).toBe('0'); }); it('defaults to 1 when version is not a valid semver', () => { - expect(AndroidVersioning.versionToVersionCode('abcd')).toBe(1); + expect(AndroidVersioning.versionToVersionCode('abcd')).toBe('1'); }); it('returns a number', () => { - expect(AndroidVersioning.versionToVersionCode('123.456.789')).toBe(123456789); + expect(AndroidVersioning.versionToVersionCode('123.456.789')).toBe('123456789'); }); it('throw when generated version code is too large', () => { @@ -21,11 +21,11 @@ describe('Android Versioning', () => { describe('determineVersionCode', () => { it('defaults to parsed version', () => { - expect(AndroidVersioning.determineVersionCode('1.2.3', '')).toBe(1002003); + expect(AndroidVersioning.determineVersionCode('1.2.3', '')).toBe('1002003'); }); it('use specified code', () => { - expect(AndroidVersioning.determineVersionCode('1.2.3', 2)).toBe(2); + expect(AndroidVersioning.determineVersionCode('1.2.3', '2')).toBe('2'); }); }); diff --git a/src/model/android-versioning.ts b/src/model/android-versioning.ts index 3fb5a5a3..b51aa20c 100644 --- a/src/model/android-versioning.ts +++ b/src/model/android-versioning.ts @@ -2,19 +2,19 @@ import * as core from '@actions/core'; import * as semver from 'semver'; export default class AndroidVersioning { - static determineVersionCode(version, inputVersionCode) { - if (!inputVersionCode) { + static determineVersionCode(version: string, inputVersionCode: string): string { + if (inputVersionCode === '') { return AndroidVersioning.versionToVersionCode(version); } return inputVersionCode; } - static versionToVersionCode(version) { + static versionToVersionCode(version: string): string { if (version === 'none') { core.info(`Versioning strategy is set to ${version}, so android version code should not be applied.`); - return 0; + return '0'; } const parsedVersion = semver.parse(version); @@ -22,7 +22,7 @@ export default class AndroidVersioning { if (!parsedVersion) { core.warning(`Could not parse "${version}" to semver, defaulting android version code to 1`); - return 1; + return '1'; } // The greatest value Google Plays allows is 2100000000. @@ -36,10 +36,10 @@ export default class AndroidVersioning { } core.info(`Using android versionCode ${versionCode}`); - return versionCode; + return versionCode.toString(); } - static determineSdkManagerParameters(targetSdkVersion) { + static determineSdkManagerParameters(targetSdkVersion: string) { const parsedVersion = Number.parseInt(targetSdkVersion.slice(-2), 10); return Number.isNaN(parsedVersion) ? '' : `platforms;android-${parsedVersion}`; diff --git a/src/model/build-parameters.test.ts b/src/model/build-parameters.test.ts index 2d44194b..595379d7 100644 --- a/src/model/build-parameters.test.ts +++ b/src/model/build-parameters.test.ts @@ -33,7 +33,7 @@ describe('BuildParameters', () => { it('determines the unity version only once', async () => { jest.spyOn(UnityVersioning, 'determineUnityVersion').mockImplementation(() => '2019.2.11f1'); await BuildParameters.create(); - await expect(UnityVersioning.determineUnityVersion).toHaveBeenCalledTimes(1); + expect(UnityVersioning.determineUnityVersion).toHaveBeenCalledTimes(1); }); it('returns the android version code with provided input', async () => { @@ -47,13 +47,15 @@ describe('BuildParameters', () => { it('returns the android version code from version by default', async () => { const mockValue = ''; jest.spyOn(Input, 'androidVersionCode', 'get').mockReturnValue(mockValue); - await expect(BuildParameters.create()).resolves.toEqual(expect.objectContaining({ androidVersionCode: 1003037 })); + await expect(BuildParameters.create()).resolves.toEqual( + expect.objectContaining({ androidVersionCode: '1003037' }), + ); }); it('determines the android sdk manager parameters only once', async () => { jest.spyOn(AndroidVersioning, 'determineSdkManagerParameters').mockImplementation(() => 'platforms;android-30'); await BuildParameters.create(); - await expect(AndroidVersioning.determineSdkManagerParameters).toHaveBeenCalledTimes(1); + expect(AndroidVersioning.determineSdkManagerParameters).toHaveBeenCalledTimes(1); }); it('returns the targetPlatform', async () => { diff --git a/src/model/build-parameters.ts b/src/model/build-parameters.ts index 867b00c9..b6fb7256 100644 --- a/src/model/build-parameters.ts +++ b/src/model/build-parameters.ts @@ -13,11 +13,14 @@ import GitHub from './github'; import CloudRunnerOptions from './cloud-runner/cloud-runner-options'; class BuildParameters { + // eslint-disable-next-line no-undef + [key: string]: any; + public editorVersion!: string; public customImage!: string; public unitySerial!: string; public unityLicensingServer!: string; - public runnerTempPath: string | undefined; + public runnerTempPath!: string; public targetPlatform!: string; public projectPath!: string; public buildName!: string; @@ -43,8 +46,8 @@ class BuildParameters { public gitPrivateToken!: string; public awsStackName!: string; public kubeConfig!: string; - public cloudRunnerMemory!: string; - public cloudRunnerCpu!: string; + public cloudRunnerMemory!: string | undefined; + public cloudRunnerCpu!: string | undefined; public kubeVolumeSize!: string; public kubeVolume!: string; public kubeStorageClass!: string; @@ -64,7 +67,7 @@ class BuildParameters { public logId!: string; public buildGuid!: string; public cloudRunnerBranch!: string; - public cloudRunnerDebug!: boolean; + public cloudRunnerDebug!: boolean | undefined; public cloudRunnerBuilderPlatform!: string | undefined; public isCliMode!: boolean; public retainWorkspace!: boolean; @@ -98,21 +101,19 @@ class BuildParameters { } } - // Todo - Don't use process.env directly, that's what the input model class is for. - // --- let unitySerial = ''; if (Input.unityLicensingServer === '') { - if (!process.env.UNITY_SERIAL && GitHub.githubInputEnabled) { + if (!Input.unitySerial && GitHub.githubInputEnabled) { // No serial was present, so it is a personal license that we need to convert - if (!process.env.UNITY_LICENSE) { + if (!Input.unityLicense) { throw new Error(`Missing Unity License File and no Serial was found. If this is a personal license, make sure to follow the activation steps and set the UNITY_LICENSE GitHub secret or enter a Unity serial number inside the UNITY_SERIAL GitHub secret.`); } - unitySerial = this.getSerialFromLicenseFile(process.env.UNITY_LICENSE); + unitySerial = this.getSerialFromLicenseFile(Input.unityLicense); } else { - unitySerial = process.env.UNITY_SERIAL!; + unitySerial = Input.unitySerial!; } } @@ -121,7 +122,7 @@ class BuildParameters { customImage: Input.customImage, unitySerial, unityLicensingServer: Input.unityLicensingServer, - runnerTempPath: process.env.RUNNER_TEMP, + runnerTempPath: Input.runnerTempPath, targetPlatform: Input.targetPlatform, projectPath: Input.projectPath, buildName: Input.buildName, diff --git a/src/model/cache.ts b/src/model/cache.ts index de963bc8..a5b618e4 100644 --- a/src/model/cache.ts +++ b/src/model/cache.ts @@ -1,5 +1,5 @@ import * as core from '@actions/core'; -import fs from 'fs'; +import fs from 'node:fs'; import Action from './action'; import Project from './project'; diff --git a/src/model/cli/cli-functions-repository.ts b/src/model/cli/cli-functions-repository.ts index 6cc66f30..62d119cf 100644 --- a/src/model/cli/cli-functions-repository.ts +++ b/src/model/cli/cli-functions-repository.ts @@ -16,7 +16,7 @@ export class CliFunctionsRepository { }); } - public static GetCliFunctions(key) { + public static GetCliFunctions(key: any) { const results = CliFunctionsRepository.targets.find((x) => x.key === key); if (results === undefined || results.length === 0) { throw new Error(`no CLI mode found for ${key}`); diff --git a/src/model/cli/cli.ts b/src/model/cli/cli.ts index 687c5451..7473b908 100644 --- a/src/model/cli/cli.ts +++ b/src/model/cli/cli.ts @@ -13,13 +13,15 @@ import GitHub from '../github'; import { TaskParameterSerializer } from '../cloud-runner/services/task-parameter-serializer'; import { CloudRunnerFolders } from '../cloud-runner/services/cloud-runner-folders'; import { CloudRunnerSystem } from '../cloud-runner/services/cloud-runner-system'; +import { OptionValues } from 'commander'; +import { InputKey } from '../input'; export class Cli { - public static options; + public static options: OptionValues | undefined; static get isCliMode() { return Cli.options !== undefined && Cli.options.mode !== undefined && Cli.options.mode !== ''; } - public static query(key, alternativeKey) { + public static query(key: string, alternativeKey: string) { if (Cli.options && Cli.options[key] !== undefined) { return Cli.options[key]; } @@ -61,15 +63,15 @@ export class Cli { static async RunCli(): Promise { GitHub.githubInputEnabled = false; - if (Cli.options['populateOverride'] === `true`) { + if (Cli.options!['populateOverride'] === `true`) { await CloudRunnerQueryOverride.PopulateQueryOverrideInput(); } - if (Cli.options['logInput']) { + if (Cli.options!['logInput']) { Cli.logInput(); } - const results = CliFunctionsRepository.GetCliFunctions(Cli.options.mode); + const results = CliFunctionsRepository.GetCliFunctions(Cli.options?.mode); CloudRunnerLogger.log(`Entrypoint: ${results.key}`); - Cli.options.versioning = 'None'; + Cli.options!.versioning = 'None'; const buildParameter = TaskParameterSerializer.readBuildParameterFromEnvironment(); CloudRunnerLogger.log(`Build Params: @@ -88,14 +90,15 @@ export class Cli { const properties = CloudRunnerOptionsReader.GetProperties(); for (const element of properties) { if ( - Input[element] !== undefined && - Input[element] !== '' && - typeof Input[element] !== `function` && + element in Input && + Input[element as InputKey] !== undefined && + Input[element as InputKey] !== '' && + typeof Input[element as InputKey] !== `function` && element !== 'length' && element !== 'cliOptions' && element !== 'prototype' ) { - core.info(`${element} ${Input[element]}`); + core.info(`${element} ${Input[element as InputKey]}`); } } core.info(`\n`); diff --git a/src/model/cloud-runner/cloud-runner-options.ts b/src/model/cloud-runner/cloud-runner-options.ts index 023e4648..c3f39801 100644 --- a/src/model/cloud-runner/cloud-runner-options.ts +++ b/src/model/cloud-runner/cloud-runner-options.ts @@ -1,13 +1,13 @@ import { Cli } from '../cli/cli'; import CloudRunnerQueryOverride from './services/cloud-runner-query-override'; import GitHub from '../github'; -const core = require('@actions/core'); +import * as core from '@actions/core'; class CloudRunnerOptions { // ### ### ### // Input Handling // ### ### ### - public static getInput(query) { + public static getInput(query: string): string | undefined { if (GitHub.githubInputEnabled) { const coreInput = core.getInput(query); if (coreInput && coreInput !== '') { @@ -32,11 +32,9 @@ class CloudRunnerOptions { if (alternativeQuery !== query && process.env[alternativeQuery] !== undefined) { return process.env[alternativeQuery]; } - - return; } - public static ToEnvVarFormat(input: string) { + public static ToEnvVarFormat(input: string): string { if (input.toUpperCase() === input) { return input; } @@ -60,39 +58,40 @@ class CloudRunnerOptions { // GitHub parameters // ### ### ### static get githubChecks(): boolean { - return CloudRunnerOptions.getInput('githubChecks') || false; + return CloudRunnerOptions.getInput('githubChecks') === 'true' || false; } - static get githubOwner() { - return CloudRunnerOptions.getInput('githubOwner') || CloudRunnerOptions.githubRepo.split(`/`)[0] || false; + static get githubOwner(): string { + return CloudRunnerOptions.getInput('githubOwner') || CloudRunnerOptions.githubRepo?.split(`/`)[0] || ''; } - static get githubRepoName() { - return CloudRunnerOptions.getInput('githubRepoName') || CloudRunnerOptions.githubRepo.split(`/`)[1] || false; + static get githubRepoName(): string { + return CloudRunnerOptions.getInput('githubRepoName') || CloudRunnerOptions.githubRepo?.split(`/`)[1] || ''; } // ### ### ### // Git syncronization parameters // ### ### ### - static get githubRepo() { + static get githubRepo(): string | undefined { return CloudRunnerOptions.getInput('GITHUB_REPOSITORY') || CloudRunnerOptions.getInput('GITHUB_REPO') || undefined; } - static get branch() { + + static get branch(): string { if (CloudRunnerOptions.getInput(`GITHUB_REF`)) { - return CloudRunnerOptions.getInput(`GITHUB_REF`).replace('refs/', '').replace(`head/`, '').replace(`heads/`, ''); + return CloudRunnerOptions.getInput(`GITHUB_REF`)!.replace('refs/', '').replace(`head/`, '').replace(`heads/`, ''); } else if (CloudRunnerOptions.getInput('branch')) { - return CloudRunnerOptions.getInput('branch'); + return CloudRunnerOptions.getInput('branch')!; } else { return ''; } } - static get gitSha() { + static get gitSha(): string | undefined { if (CloudRunnerOptions.getInput(`GITHUB_SHA`)) { - return CloudRunnerOptions.getInput(`GITHUB_SHA`); + return CloudRunnerOptions.getInput(`GITHUB_SHA`)!; } else if (CloudRunnerOptions.getInput(`GitSHA`)) { - return CloudRunnerOptions.getInput(`GitSHA`); + return CloudRunnerOptions.getInput(`GitSHA`)!; } } @@ -100,7 +99,7 @@ class CloudRunnerOptions { // Cloud Runner parameters // ### ### ### - static get cloudRunnerBuilderPlatform() { + static get cloudRunnerBuilderPlatform(): string | undefined { const input = CloudRunnerOptions.getInput('cloudRunnerBuilderPlatform'); if (input) { return input; @@ -112,11 +111,11 @@ class CloudRunnerOptions { return; } - static get cloudRunnerBranch() { + static get cloudRunnerBranch(): string { return CloudRunnerOptions.getInput('cloudRunnerBranch') || 'main'; } - static get cloudRunnerCluster() { + static get cloudRunnerCluster(): string { if (Cli.isCliMode) { return CloudRunnerOptions.getInput('cloudRunnerCluster') || 'aws'; } @@ -124,15 +123,15 @@ class CloudRunnerOptions { return CloudRunnerOptions.getInput('cloudRunnerCluster') || 'local'; } - static get cloudRunnerCpu() { + static get cloudRunnerCpu(): string | undefined { return CloudRunnerOptions.getInput('cloudRunnerCpu'); } - static get cloudRunnerMemory() { + static get cloudRunnerMemory(): string | undefined { return CloudRunnerOptions.getInput('cloudRunnerMemory'); } - static get customJob() { + static get customJob(): string { return CloudRunnerOptions.getInput('customJob') || ''; } @@ -140,11 +139,11 @@ class CloudRunnerOptions { // Custom commands from files parameters // ### ### ### - static get customStepFiles() { + static get customStepFiles(): string[] { return CloudRunnerOptions.getInput('customStepFiles')?.split(`,`) || []; } - static get customHookFiles() { + static get customHookFiles(): string[] { return CloudRunnerOptions.getInput('customHookFiles')?.split(`,`) || []; } @@ -152,15 +151,15 @@ class CloudRunnerOptions { // Custom commands from yaml parameters // ### ### ### - static customJobHooks() { + static customJobHooks(): string { return CloudRunnerOptions.getInput('customJobHooks') || ''; } - static get postBuildSteps() { + static get postBuildSteps(): string { return CloudRunnerOptions.getInput('postBuildSteps') || ''; } - static get preBuildSteps() { + static get preBuildSteps(): string { return CloudRunnerOptions.getInput('preBuildSteps') || ''; } @@ -168,11 +167,11 @@ class CloudRunnerOptions { // Input override handling // ### ### ### - static readInputFromOverrideList() { + static readInputFromOverrideList(): string { return CloudRunnerOptions.getInput('readInputFromOverrideList') || ''; } - static readInputOverrideCommand() { + static readInputOverrideCommand(): string { const value = CloudRunnerOptions.getInput('readInputOverrideCommand'); if (value === 'gcp-secret-manager') { @@ -188,7 +187,7 @@ class CloudRunnerOptions { // Aws // ### ### ### - static get awsBaseStackName() { + static get awsBaseStackName(): string { return CloudRunnerOptions.getInput('awsBaseStackName') || 'game-ci'; } @@ -196,15 +195,15 @@ class CloudRunnerOptions { // K8s // ### ### ### - static get kubeConfig() { + static get kubeConfig(): string { return CloudRunnerOptions.getInput('kubeConfig') || ''; } - static get kubeVolume() { + static get kubeVolume(): string { return CloudRunnerOptions.getInput('kubeVolume') || ''; } - static get kubeVolumeSize() { + static get kubeVolumeSize(): string { return CloudRunnerOptions.getInput('kubeVolumeSize') || '5Gi'; } @@ -225,12 +224,16 @@ class CloudRunnerOptions { // ### ### ### static get cloudRunnerDebug(): boolean { - return CloudRunnerOptions.getInput(`cloudRunnerTests`) || CloudRunnerOptions.getInput(`cloudRunnerDebug`) || false; + return ( + CloudRunnerOptions.getInput(`cloudRunnerTests`) === 'true' || + CloudRunnerOptions.getInput(`cloudRunnerDebug`) === 'true' || + false + ); } - static get cloudRunnerDebugTree(): boolean { + static get cloudRunnerDebugTree(): string | boolean { return CloudRunnerOptions.getInput(`cloudRunnerDebugTree`) || false; } - static get cloudRunnerDebugEnv(): boolean { + static get cloudRunnerDebugEnv(): string | boolean { return CloudRunnerOptions.getInput(`cloudRunnerDebugEnv`) || false; } @@ -239,7 +242,7 @@ class CloudRunnerOptions { return false; } - return CloudRunnerOptions.getInput(`watchToEnd`) || true; + return CloudRunnerOptions.getInput(`watchToEnd`) === 'true' || true; } static get asyncCloudRunner(): boolean { @@ -267,7 +270,7 @@ class CloudRunnerOptions { // ### ### ### public static get retainWorkspaces(): boolean { - return CloudRunnerOptions.getInput(`retainWorkspaces`) || false; + return CloudRunnerOptions.getInput(`retainWorkspaces`) === 'true' || false; } static get maxRetainedWorkspaces(): number { @@ -279,7 +282,7 @@ class CloudRunnerOptions { // ### ### ### static get constantGarbageCollection(): boolean { - return CloudRunnerOptions.getInput(`constantGarbageCollection`) || true; + return CloudRunnerOptions.getInput(`constantGarbageCollection`) === 'true' || true; } static get garbageCollectionMaxAge(): number { diff --git a/src/model/cloud-runner/cloud-runner.ts b/src/model/cloud-runner/cloud-runner.ts index d1f716a3..bfa2272b 100644 --- a/src/model/cloud-runner/cloud-runner.ts +++ b/src/model/cloud-runner/cloud-runner.ts @@ -23,7 +23,8 @@ class CloudRunner { private static cloudRunnerEnvironmentVariables: CloudRunnerEnvironmentVariable[]; static lockedWorkspace: string | undefined; public static readonly retainedWorkspacePrefix: string = `retained-workspace`; - public static githubCheckId; + public static githubCheckId: number | string; + public static setup(buildParameters: BuildParameters) { CloudRunnerLogger.setup(); CloudRunnerLogger.log(`Setting up cloud runner`); diff --git a/src/model/cloud-runner/providers/aws/aws-base-stack.ts b/src/model/cloud-runner/providers/aws/aws-base-stack.ts index a60cc43a..11147ab9 100644 --- a/src/model/cloud-runner/providers/aws/aws-base-stack.ts +++ b/src/model/cloud-runner/providers/aws/aws-base-stack.ts @@ -2,7 +2,7 @@ import CloudRunnerLogger from '../../services/cloud-runner-logger'; import * as core from '@actions/core'; import * as SDK from 'aws-sdk'; import { BaseStackFormation } from './cloud-formations/base-stack-formation'; -const crypto = require('crypto'); +import crypto from 'node:crypto'; export class AWSBaseStack { constructor(baseStackName: string) { diff --git a/src/model/cloud-runner/providers/aws/aws-cloud-formation-templates.ts b/src/model/cloud-runner/providers/aws/aws-cloud-formation-templates.ts index 0d0f83a4..79334d30 100644 --- a/src/model/cloud-runner/providers/aws/aws-cloud-formation-templates.ts +++ b/src/model/cloud-runner/providers/aws/aws-cloud-formation-templates.ts @@ -1,7 +1,7 @@ import { TaskDefinitionFormation } from './cloud-formations/task-definition-formation'; export class AWSCloudFormationTemplates { - public static getParameterTemplate(p1) { + public static getParameterTemplate(p1: string) { return ` ${p1}: Type: String @@ -9,7 +9,7 @@ export class AWSCloudFormationTemplates { `; } - public static getSecretTemplate(p1) { + public static getSecretTemplate(p1: string) { return ` ${p1}Secret: Type: AWS::SecretsManager::Secret @@ -19,14 +19,14 @@ export class AWSCloudFormationTemplates { `; } - public static getSecretDefinitionTemplate(p1, p2) { + public static getSecretDefinitionTemplate(p1: string, p2: string) { return ` - Name: '${p1}' ValueFrom: !Ref ${p2}Secret `; } - public static insertAtTemplate(template, insertionKey, insertion) { + public static insertAtTemplate(template: string, insertionKey: string, insertion: string) { const index = template.search(insertionKey) + insertionKey.length + '\n'.length; template = [template.slice(0, index), insertion, template.slice(index)].join(''); diff --git a/src/model/cloud-runner/providers/aws/aws-task-runner.ts b/src/model/cloud-runner/providers/aws/aws-task-runner.ts index 6d5bd8e3..8fb5cde0 100644 --- a/src/model/cloud-runner/providers/aws/aws-task-runner.ts +++ b/src/model/cloud-runner/providers/aws/aws-task-runner.ts @@ -2,7 +2,7 @@ import * as AWS from 'aws-sdk'; import CloudRunnerEnvironmentVariable from '../../services/cloud-runner-environment-variable'; import * as core from '@actions/core'; import CloudRunnerAWSTaskDef from './cloud-runner-aws-task-def'; -import * as zlib from 'zlib'; +import * as zlib from 'node:zlib'; import CloudRunnerLogger from '../../services/cloud-runner-logger'; import { Input } from '../../..'; import CloudRunner from '../../cloud-runner'; @@ -192,22 +192,19 @@ class AWSTaskRunner { } private static logRecords( - records, + records: AWS.Kinesis.GetRecordsOutput, iterator: string, shouldReadLogs: boolean, output: string, shouldCleanup: boolean, ) { if (records.Records.length > 0 && iterator) { - for (let index = 0; index < records.Records.length; index++) { - const json = JSON.parse( - zlib.gunzipSync(Buffer.from(records.Records[index].Data as string, 'base64')).toString('utf8'), - ); + for (const record of records.Records) { + const json = JSON.parse(zlib.gunzipSync(Buffer.from(record.Data as string, 'base64')).toString('utf8')); if (json.messageType === 'DATA_MESSAGE') { - for (let logEventsIndex = 0; logEventsIndex < json.logEvents.length; logEventsIndex++) { - const message = json.logEvents[logEventsIndex].message; + for (const logEvent of json.logEvents) { ({ shouldReadLogs, shouldCleanup, output } = FollowLogStreamService.handleIteration( - message, + logEvent.message, shouldReadLogs, shouldCleanup, output, @@ -226,7 +223,7 @@ class AWSTaskRunner { }).promise(); } - private static async getLogIterator(stream) { + private static async getLogIterator(stream: AWS.Kinesis.DescribeStreamOutput) { return ( ( await AWSTaskRunner.Kinesis.getShardIterator({ diff --git a/src/model/cloud-runner/providers/aws/services/garbage-collection-service.ts b/src/model/cloud-runner/providers/aws/services/garbage-collection-service.ts index b46e660b..087e97e5 100644 --- a/src/model/cloud-runner/providers/aws/services/garbage-collection-service.ts +++ b/src/model/cloud-runner/providers/aws/services/garbage-collection-service.ts @@ -4,7 +4,7 @@ import CloudRunnerLogger from '../../../services/cloud-runner-logger'; import { TaskService } from './task-service'; export class GarbageCollectionService { - static isOlderThan1day(date: any) { + static isOlderThan1day(date: Date) { const ageDate = new Date(date.getTime() - Date.now()); return ageDate.getDay() > 0; @@ -17,14 +17,16 @@ export class GarbageCollectionService { const cwl = new AWS.CloudWatchLogs(); const taskDefinitionsInUse = new Array(); const tasks = await TaskService.getTasks(); + for (const task of tasks) { const { taskElement, element } = task; taskDefinitionsInUse.push(taskElement.taskDefinitionArn); - if (deleteResources && (!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(taskElement.CreatedAt))) { + if (deleteResources && (!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(taskElement.createdAt!))) { CloudRunnerLogger.log(`Stopping task ${taskElement.containers?.[0].name}`); await ecs.stopTask({ task: taskElement.taskArn || '', cluster: element }).promise(); } } + const jobStacks = await TaskService.getCloudFormationJobStacks(); for (const element of jobStacks) { if ( @@ -36,13 +38,15 @@ export class GarbageCollectionService { return; } + if (deleteResources && (!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(element.CreationTime))) { if (element.StackName === 'game-ci' || element.TemplateDescription === 'Game-CI base stack') { CloudRunnerLogger.log(`Skipping ${element.StackName} ignore list`); return; } - CloudRunnerLogger.log(`Deleting ${element.logGroupName}`); + + CloudRunnerLogger.log(`Deleting ${element.StackName}`); const deleteStackInput: AWS.CloudFormation.DeleteStackInput = { StackName: element.StackName }; await CF.deleteStack(deleteStackInput).promise(); } @@ -51,7 +55,7 @@ export class GarbageCollectionService { for (const element of logGroups) { if ( deleteResources && - (!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(new Date(element.createdAt))) + (!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(new Date(element.creationTime!))) ) { CloudRunnerLogger.log(`Deleting ${element.logGroupName}`); await cwl.deleteLogGroup({ logGroupName: element.logGroupName || '' }).promise(); diff --git a/src/model/cloud-runner/providers/aws/services/task-service.ts b/src/model/cloud-runner/providers/aws/services/task-service.ts index 4e9ed6a2..87c570c7 100644 --- a/src/model/cloud-runner/providers/aws/services/task-service.ts +++ b/src/model/cloud-runner/providers/aws/services/task-service.ts @@ -5,6 +5,8 @@ import { BaseStackFormation } from '../cloud-formations/base-stack-formation'; import AwsTaskRunner from '../aws-task-runner'; import { ListObjectsRequest } from 'aws-sdk/clients/s3'; import CloudRunner from '../../../cloud-runner'; +import { StackSummaries } from 'aws-sdk/clients/cloudformation'; +import { LogGroups } from 'aws-sdk/clients/cloudwatchlogs'; export class TaskService { static async watch() { @@ -18,7 +20,7 @@ export class TaskService { return output; } public static async getCloudFormationJobStacks() { - const result: any[] = []; + const result: StackSummaries = []; CloudRunnerLogger.log(``); CloudRunnerLogger.log(`List Cloud Formation Stacks`); process.env.AWS_REGION = Input.region; @@ -62,7 +64,7 @@ export class TaskService { return result; } public static async getTasks() { - const result: any[] = []; + const result: { taskElement: AWS.ECS.Task; element: string }[] = []; CloudRunnerLogger.log(``); CloudRunnerLogger.log(`List Tasks`); process.env.AWS_REGION = Input.region; @@ -123,7 +125,7 @@ export class TaskService { return message; } public static async getLogGroups() { - const result: any[] = []; + const result: LogGroups = []; process.env.AWS_REGION = Input.region; const ecs = new AWS.CloudWatchLogs(); let logStreamInput: AWS.CloudWatchLogs.DescribeLogGroupsRequest = { diff --git a/src/model/cloud-runner/providers/docker/index.ts b/src/model/cloud-runner/providers/docker/index.ts index 88f0fe16..5fe1eeec 100644 --- a/src/model/cloud-runner/providers/docker/index.ts +++ b/src/model/cloud-runner/providers/docker/index.ts @@ -10,7 +10,8 @@ import CloudRunner from '../../cloud-runner'; import { ProviderResource } from '../provider-resource'; import { ProviderWorkflow } from '../provider-workflow'; import { CloudRunnerSystem } from '../../services/cloud-runner-system'; -import * as fs from 'fs'; +import fs from 'node:fs'; +import { StringKeyValuePair } from '../../../shared-types'; class LocalDockerCloudRunner implements ProviderInterface { public buildParameters: BuildParameters | undefined; @@ -86,7 +87,7 @@ class LocalDockerCloudRunner implements ProviderInterface { CloudRunnerLogger.log(commands); const { workspace, actionFolder } = Action; - const content: any[] = []; + const content: StringKeyValuePair[] = []; for (const x of secrets) { content.push({ name: x.EnvironmentVariable, value: x.ParameterValue }); } diff --git a/src/model/cloud-runner/providers/k8s/kubernetes-job-spec-factory.ts b/src/model/cloud-runner/providers/k8s/kubernetes-job-spec-factory.ts index d3e69618..0f62f17a 100644 --- a/src/model/cloud-runner/providers/k8s/kubernetes-job-spec-factory.ts +++ b/src/model/cloud-runner/providers/k8s/kubernetes-job-spec-factory.ts @@ -15,10 +15,10 @@ class KubernetesJobSpecFactory { secrets: CloudRunnerSecret[], buildGuid: string, buildParameters: BuildParameters, - secretName, - pvcName, - jobName, - k8s, + secretName: string, + pvcName: string, + jobName: string, + k8s: any, ) { environment.push( ...[ diff --git a/src/model/cloud-runner/providers/k8s/kubernetes-secret.ts b/src/model/cloud-runner/providers/k8s/kubernetes-secret.ts index d17301d6..a8dd9f46 100644 --- a/src/model/cloud-runner/providers/k8s/kubernetes-secret.ts +++ b/src/model/cloud-runner/providers/k8s/kubernetes-secret.ts @@ -2,7 +2,7 @@ import { CoreV1Api } from '@kubernetes/client-node'; import CloudRunnerSecret from '../../services/cloud-runner-secret'; import * as k8s from '@kubernetes/client-node'; import CloudRunnerLogger from '../../services/cloud-runner-logger'; -const base64 = require('base-64'); +import * as base64 from 'base-64'; class KubernetesSecret { static async createSecret( diff --git a/src/model/cloud-runner/providers/k8s/kubernetes-storage.ts b/src/model/cloud-runner/providers/k8s/kubernetes-storage.ts index 41533e84..2c3e04f0 100644 --- a/src/model/cloud-runner/providers/k8s/kubernetes-storage.ts +++ b/src/model/cloud-runner/providers/k8s/kubernetes-storage.ts @@ -3,7 +3,7 @@ import * as core from '@actions/core'; import * as k8s from '@kubernetes/client-node'; import BuildParameters from '../../../build-parameters'; import CloudRunnerLogger from '../../services/cloud-runner-logger'; -import { IncomingMessage } from 'http'; +import { IncomingMessage } from 'node:http'; import GitHub from '../../../github'; class KubernetesStorage { diff --git a/src/model/cloud-runner/providers/provider-interface.ts b/src/model/cloud-runner/providers/provider-interface.ts index 057b8d21..359d4c7f 100644 --- a/src/model/cloud-runner/providers/provider-interface.ts +++ b/src/model/cloud-runner/providers/provider-interface.ts @@ -14,7 +14,7 @@ export interface ProviderInterface { branchName: string, // eslint-disable-next-line no-unused-vars defaultSecretsArray: { ParameterKey: string; EnvironmentVariable: string; ParameterValue: string }[], - ); + ): any; setupWorkflow( // eslint-disable-next-line no-unused-vars buildGuid: string, @@ -24,7 +24,7 @@ export interface ProviderInterface { branchName: string, // eslint-disable-next-line no-unused-vars defaultSecretsArray: { ParameterKey: string; EnvironmentVariable: string; ParameterValue: string }[], - ); + ): any; runTaskInWorkflow( // eslint-disable-next-line no-unused-vars buildGuid: string, diff --git a/src/model/cloud-runner/remote-client/caching.ts b/src/model/cloud-runner/remote-client/caching.ts index 0c266855..73be5186 100644 --- a/src/model/cloud-runner/remote-client/caching.ts +++ b/src/model/cloud-runner/remote-client/caching.ts @@ -1,6 +1,6 @@ -import { assert } from 'console'; -import fs from 'fs'; -import path from 'path'; +import { assert } from 'node:console'; +import fs from 'node:fs'; +import path from 'node:path'; import CloudRunner from '../cloud-runner'; import CloudRunnerLogger from '../services/cloud-runner-logger'; import { CloudRunnerFolders } from '../services/cloud-runner-folders'; @@ -10,7 +10,7 @@ import { RemoteClientLogger } from './remote-client-logger'; import { Cli } from '../../cli/cli'; import { CliFunction } from '../../cli/cli-functions-repository'; // eslint-disable-next-line github/no-then -const fileExists = async (fpath) => !!(await fs.promises.stat(fpath).catch(() => false)); +const fileExists = async (fpath: fs.PathLike) => !!(await fs.promises.stat(fpath).catch(() => false)); export class Caching { @CliFunction(`cache-push`, `push to cache`) @@ -19,9 +19,9 @@ export class Caching { const buildParameter = JSON.parse(process.env.BUILD_PARAMETERS || '{}'); CloudRunner.buildParameters = buildParameter; await Caching.PushToCache( - Cli.options['cachePushTo'], - Cli.options['cachePushFrom'], - Cli.options['artifactName'] || '', + Cli.options!['cachePushTo'], + Cli.options!['cachePushFrom'], + Cli.options!['artifactName'] || '', ); } catch (error: any) { CloudRunnerLogger.log(`${error}`); @@ -34,9 +34,9 @@ export class Caching { const buildParameter = JSON.parse(process.env.BUILD_PARAMETERS || '{}'); CloudRunner.buildParameters = buildParameter; await Caching.PullFromCache( - Cli.options['cachePushFrom'], - Cli.options['cachePushTo'], - Cli.options['artifactName'] || '', + Cli.options!['cachePushFrom'], + Cli.options!['cachePushTo'], + Cli.options!['artifactName'] || '', ); } catch (error: any) { CloudRunnerLogger.log(`${error}`); diff --git a/src/model/cloud-runner/remote-client/index.ts b/src/model/cloud-runner/remote-client/index.ts index 9bd3533c..e62d45c1 100644 --- a/src/model/cloud-runner/remote-client/index.ts +++ b/src/model/cloud-runner/remote-client/index.ts @@ -1,11 +1,11 @@ -import fs from 'fs'; +import fs from 'node:fs'; import CloudRunner from '../cloud-runner'; import { CloudRunnerFolders } from '../services/cloud-runner-folders'; import { Caching } from './caching'; import { LfsHashing } from '../services/lfs-hashing'; import { RemoteClientLogger } from './remote-client-logger'; -import path from 'path'; -import { assert } from 'console'; +import path from 'node:path'; +import { assert } from 'node:console'; import CloudRunnerLogger from '../services/cloud-runner-logger'; import { CliFunction } from '../../cli/cli-functions-repository'; import { CloudRunnerSystem } from '../services/cloud-runner-system'; diff --git a/src/model/cloud-runner/remote-client/remote-client-logger.ts b/src/model/cloud-runner/remote-client/remote-client-logger.ts index 5581b8bc..122969d0 100644 --- a/src/model/cloud-runner/remote-client/remote-client-logger.ts +++ b/src/model/cloud-runner/remote-client/remote-client-logger.ts @@ -13,7 +13,7 @@ export class RemoteClientLogger { CloudRunnerLogger.log(`[Client][Diagnostic] ${message}`); } - public static logWarning(message) { + public static logWarning(message: string) { CloudRunnerLogger.logWarning(message); } } diff --git a/src/model/cloud-runner/services/cloud-runner-custom-hooks.ts b/src/model/cloud-runner/services/cloud-runner-custom-hooks.ts index 94e265ef..bdc291cb 100644 --- a/src/model/cloud-runner/services/cloud-runner-custom-hooks.ts +++ b/src/model/cloud-runner/services/cloud-runner-custom-hooks.ts @@ -2,9 +2,9 @@ import { BuildParameters, Input } from '../..'; import YAML from 'yaml'; import CloudRunnerSecret from './cloud-runner-secret'; import { RemoteClientLogger } from '../remote-client/remote-client-logger'; -import path from 'path'; +import path from 'node:path'; import CloudRunnerOptions from '../cloud-runner-options'; -import * as fs from 'fs'; +import fs from 'node:fs'; // import CloudRunnerLogger from './cloud-runner-logger'; @@ -24,15 +24,11 @@ export class CloudRunnerCustomHooks { echo "---${buildParameters.logId}"`; } - public static getHooks(customJobHooks): Hook[] { + public static getHooks(customJobHooks: string): Hook[] { const experimentHooks = customJobHooks; let output = new Array(); if (experimentHooks && experimentHooks !== '') { - try { - output = YAML.parse(experimentHooks); - } catch (error) { - throw error; - } + output = YAML.parse(experimentHooks); } return output.filter((x) => x.step !== undefined && x.hook !== undefined && x.hook.length > 0); @@ -62,7 +58,7 @@ export class CloudRunnerCustomHooks { return results; } - private static ConvertYamlSecrets(object) { + private static ConvertYamlSecrets(object: Hook) { if (object.secrets === undefined) { object.secrets = []; @@ -70,9 +66,9 @@ export class CloudRunnerCustomHooks { } object.secrets = object.secrets.map((x) => { return { - ParameterKey: x.name, - EnvironmentVariable: Input.ToEnvVarFormat(x.name), - ParameterValue: x.value, + ParameterKey: x.ParameterKey, + EnvironmentVariable: Input.ToEnvVarFormat(x.ParameterKey), + ParameterValue: x.ParameterValue, }; }); } @@ -102,7 +98,7 @@ export class CloudRunnerCustomHooks { return object; } - public static getSecrets(hooks) { + public static getSecrets(hooks: Hook[]) { const secrets = hooks.map((x) => x.secrets).filter((x) => x !== undefined && x.length > 0); // eslint-disable-next-line unicorn/no-array-reduce @@ -110,9 +106,9 @@ export class CloudRunnerCustomHooks { } } export class Hook { - public commands; + public commands!: string[]; public secrets: CloudRunnerSecret[] = new Array(); - public name; + public name!: string; public hook!: string[]; public step!: string[]; } diff --git a/src/model/cloud-runner/services/cloud-runner-custom-steps.ts b/src/model/cloud-runner/services/cloud-runner-custom-steps.ts index d46335b0..0a05e45d 100644 --- a/src/model/cloud-runner/services/cloud-runner-custom-steps.ts +++ b/src/model/cloud-runner/services/cloud-runner-custom-steps.ts @@ -3,12 +3,13 @@ import CloudRunner from '../cloud-runner'; import * as core from '@actions/core'; import { CustomWorkflow } from '../workflows/custom-workflow'; import { RemoteClientLogger } from '../remote-client/remote-client-logger'; -import path from 'path'; -import * as fs from 'fs'; +import path from 'node:path'; +import fs from 'node:fs'; import Input from '../../input'; import CloudRunnerOptions from '../cloud-runner-options'; import CloudRunnerLogger from './cloud-runner-logger'; import { CustomStep } from './custom-step'; +import { CloudRunnerStepState } from '../cloud-runner-step-state'; export class CloudRunnerCustomSteps { static GetCustomStepsFromFiles(hookLifecycle: string): CustomStep[] { @@ -182,13 +183,13 @@ export class CloudRunnerCustomSteps { return results; } - private static ConvertYamlSecrets(object) { + private static ConvertYamlSecrets(object: CustomStep) { if (object.secrets === undefined) { object.secrets = []; return; } - object.secrets = object.secrets.map((x) => { + object.secrets = object.secrets.map((x: { [key: string]: any }) => { return { ParameterKey: x.name, EnvironmentVariable: Input.ToEnvVarFormat(x.name), @@ -228,7 +229,7 @@ export class CloudRunnerCustomSteps { return object; } - static async RunPostBuildSteps(cloudRunnerStepState) { + static async RunPostBuildSteps(cloudRunnerStepState: CloudRunnerStepState) { let output = ``; const steps: CustomStep[] = [ ...CloudRunnerCustomSteps.ParseSteps(CloudRunner.buildParameters.postBuildSteps), @@ -247,7 +248,7 @@ export class CloudRunnerCustomSteps { return output; } - static async RunPreBuildSteps(cloudRunnerStepState) { + static async RunPreBuildSteps(cloudRunnerStepState: CloudRunnerStepState) { let output = ``; const steps: CustomStep[] = [ ...CloudRunnerCustomSteps.ParseSteps(CloudRunner.buildParameters.preBuildSteps), diff --git a/src/model/cloud-runner/services/cloud-runner-folders.ts b/src/model/cloud-runner/services/cloud-runner-folders.ts index d544de00..fb43651f 100644 --- a/src/model/cloud-runner/services/cloud-runner-folders.ts +++ b/src/model/cloud-runner/services/cloud-runner-folders.ts @@ -1,4 +1,4 @@ -import path from 'path'; +import path from 'node:path'; import CloudRunnerOptions from '../cloud-runner-options'; import CloudRunner from './../cloud-runner'; diff --git a/src/model/cloud-runner/services/cloud-runner-query-override.ts b/src/model/cloud-runner/services/cloud-runner-query-override.ts index 8b364e50..9fddcf2e 100644 --- a/src/model/cloud-runner/services/cloud-runner-query-override.ts +++ b/src/model/cloud-runner/services/cloud-runner-query-override.ts @@ -2,7 +2,7 @@ import Input from '../../input'; import { GenericInputReader } from '../../input-readers/generic-input-reader'; import CloudRunnerOptions from '../cloud-runner-options'; -const formatFunction = (value, arguments_) => { +const formatFunction = (value: string, arguments_: any[]) => { for (const element of arguments_) { value = value.replace(`{${element.key}}`, element.value); } @@ -11,11 +11,11 @@ const formatFunction = (value, arguments_) => { }; class CloudRunnerQueryOverride { - static queryOverrides: any; + static queryOverrides: { [key: string]: string } | undefined; // TODO accept premade secret sources or custom secret source definition yamls - public static query(key, alternativeKey) { + public static query(key: string, alternativeKey: string) { if (CloudRunnerQueryOverride.queryOverrides && CloudRunnerQueryOverride.queryOverrides[key] !== undefined) { return CloudRunnerQueryOverride.queryOverrides[key]; } @@ -30,7 +30,7 @@ class CloudRunnerQueryOverride { return; } - private static shouldUseOverride(query) { + private static shouldUseOverride(query: string) { if (CloudRunnerOptions.readInputOverrideCommand() !== '') { if (CloudRunnerOptions.readInputFromOverrideList() !== '') { const doesInclude = @@ -44,7 +44,7 @@ class CloudRunnerQueryOverride { } } - private static async queryOverride(query) { + private static async queryOverride(query: string) { if (!this.shouldUseOverride(query)) { throw new Error(`Should not be trying to run override query on ${query}`); } @@ -56,7 +56,7 @@ class CloudRunnerQueryOverride { public static async PopulateQueryOverrideInput() { const queries = CloudRunnerOptions.readInputFromOverrideList().split(','); - CloudRunnerQueryOverride.queryOverrides = new Array(); + CloudRunnerQueryOverride.queryOverrides = {}; for (const element of queries) { if (CloudRunnerQueryOverride.shouldUseOverride(element)) { CloudRunnerQueryOverride.queryOverrides[element] = await CloudRunnerQueryOverride.queryOverride(element); diff --git a/src/model/cloud-runner/services/custom-step.ts b/src/model/cloud-runner/services/custom-step.ts index 6f660b25..a5c8f03a 100644 --- a/src/model/cloud-runner/services/custom-step.ts +++ b/src/model/cloud-runner/services/custom-step.ts @@ -1,9 +1,9 @@ import CloudRunnerSecret from './cloud-runner-secret'; export class CustomStep { - public commands; + public commands!: string; public secrets: CloudRunnerSecret[] = new Array(); - public name; + public name!: string; public image: string = `ubuntu`; public hook!: string; } diff --git a/src/model/cloud-runner/services/follow-log-stream-service.ts b/src/model/cloud-runner/services/follow-log-stream-service.ts index 486fb356..e824fd64 100644 --- a/src/model/cloud-runner/services/follow-log-stream-service.ts +++ b/src/model/cloud-runner/services/follow-log-stream-service.ts @@ -5,7 +5,7 @@ import { CloudRunnerStatics } from '../cloud-runner-statics'; import GitHub from '../../github'; export class FollowLogStreamService { - public static handleIteration(message, shouldReadLogs, shouldCleanup, output) { + public static handleIteration(message: string, shouldReadLogs: boolean, shouldCleanup: boolean, output: string) { if (message.includes(`---${CloudRunner.buildParameters.logId}`)) { CloudRunnerLogger.log('End of log transmission received'); shouldReadLogs = false; diff --git a/src/model/cloud-runner/services/lfs-hashing.ts b/src/model/cloud-runner/services/lfs-hashing.ts index 9d43130a..07f9d96d 100644 --- a/src/model/cloud-runner/services/lfs-hashing.ts +++ b/src/model/cloud-runner/services/lfs-hashing.ts @@ -1,8 +1,8 @@ -import path from 'path'; +import path from 'node:path'; import { CloudRunnerFolders } from './cloud-runner-folders'; import { CloudRunnerSystem } from './cloud-runner-system'; -import fs from 'fs'; -import { assert } from 'console'; +import fs from 'node:fs'; +import { assert } from 'node:console'; import { Cli } from '../../cli/cli'; import { CliFunction } from '../../cli/cli-functions-repository'; @@ -41,7 +41,7 @@ export class LfsHashing { @CliFunction(`hash`, `hash all folder contents`) static async hash() { - const folder = Cli.options['cachePushFrom']; + const folder = Cli.options!['cachePushFrom']; LfsHashing.hashAllFiles(folder); } } diff --git a/src/model/cloud-runner/services/shared-workspace-locking.ts b/src/model/cloud-runner/services/shared-workspace-locking.ts index 45c1ae61..0866c2ba 100644 --- a/src/model/cloud-runner/services/shared-workspace-locking.ts +++ b/src/model/cloud-runner/services/shared-workspace-locking.ts @@ -1,5 +1,5 @@ import { CloudRunnerSystem } from './cloud-runner-system'; -import * as fs from 'fs'; +import fs from 'node:fs'; import CloudRunnerLogger from './cloud-runner-logger'; import CloudRunnerOptions from '../cloud-runner-options'; import BuildParameters from '../../build-parameters'; diff --git a/src/model/cloud-runner/services/task-parameter-serializer.ts b/src/model/cloud-runner/services/task-parameter-serializer.ts index 5e330087..d74ae64b 100644 --- a/src/model/cloud-runner/services/task-parameter-serializer.ts +++ b/src/model/cloud-runner/services/task-parameter-serializer.ts @@ -44,20 +44,21 @@ export class TaskParameterSerializer { x.name = TaskParameterSerializer.ToEnvVarFormat(x.name); x.value = `${x.value}`; - if (buildParameters.cloudRunnerDebug && Number(x.name) === Number.NaN) { + if (buildParameters.cloudRunnerDebug && Number.isNaN(Number(x.name))) { core.info(`[ERROR] found a number in task param serializer ${JSON.stringify(x)}`); } return x; }), - (item) => item.name, + (item: CloudRunnerEnvironmentVariable) => item.name, ); return result; } - static uniqBy(a, key) { - const seen = {}; + // eslint-disable-next-line no-unused-vars + static uniqBy(a: CloudRunnerEnvironmentVariable[], key: (parameters: CloudRunnerEnvironmentVariable) => string) { + const seen: { [key: string]: boolean } = {}; return a.filter(function (item) { const k = key(item); @@ -89,23 +90,23 @@ export class TaskParameterSerializer { return TaskParameterSerializer.serializeFromType(Input); } - public static ToEnvVarFormat(input): string { + public static ToEnvVarFormat(input: string): string { return CloudRunnerOptions.ToEnvVarFormat(input); } - public static UndoEnvVarFormat(element): string { + public static UndoEnvVarFormat(element: string): string { return this.camelize(element.replace('GAMECI_', '').toLowerCase().replace(/_+/g, ' ')); } - private static camelize(string) { + private static camelize(string: string) { return string - .replace(/^\w|[A-Z]|\b\w/g, function (word, index) { + .replace(/(^\w)|([A-Z])|(\b\w)/g, function (word: string, index: number) { return index === 0 ? word.toLowerCase() : word.toUpperCase(); }) .replace(/\s+/g, ''); } - private static serializeFromObject(buildParameters) { + private static serializeFromObject(buildParameters: any) { const array: any[] = []; const keys = Object.getOwnPropertyNames(buildParameters).filter((x) => !this.blocked.has(x)); for (const element of keys) { @@ -124,7 +125,7 @@ export class TaskParameterSerializer { return array; } - private static serializeFromType(type) { + private static serializeFromType(type: any) { const array: any[] = []; const input = CloudRunnerOptionsReader.GetProperties(); for (const element of input) { @@ -149,14 +150,15 @@ export class TaskParameterSerializer { return array; } - private static getValue(key) { + + private static getValue(key: string) { return CloudRunnerQueryOverride.queryOverrides !== undefined && CloudRunnerQueryOverride.queryOverrides[key] !== undefined ? CloudRunnerQueryOverride.queryOverrides[key] : process.env[key]; } - s; - private static tryAddInput(array, key): CloudRunnerSecret[] { + + private static tryAddInput(array: CloudRunnerSecret[], key: string): CloudRunnerSecret[] { const value = TaskParameterSerializer.getValue(key); if (value !== undefined && value !== '' && value !== 'null') { array.push({ diff --git a/src/model/cloud-runner/tests/cloud-runner-async-workflow.test.ts b/src/model/cloud-runner/tests/cloud-runner-async-workflow.test.ts index a4cb1552..4070e3bb 100644 --- a/src/model/cloud-runner/tests/cloud-runner-async-workflow.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-async-workflow.test.ts @@ -4,8 +4,9 @@ import UnityVersioning from '../../unity-versioning'; import { Cli } from '../../cli/cli'; import CloudRunnerOptions from '../cloud-runner-options'; import setups from './cloud-runner-suite.test'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) Cli.options = overrides; return BuildParameters.create(); diff --git a/src/model/cloud-runner/tests/cloud-runner-environment-serializer.test.ts b/src/model/cloud-runner/tests/cloud-runner-environment-serializer.test.ts index 667ca439..89510a7b 100644 --- a/src/model/cloud-runner/tests/cloud-runner-environment-serializer.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-environment-serializer.test.ts @@ -4,8 +4,9 @@ import UnityVersioning from '../../unity-versioning'; import { Cli } from '../../cli/cli'; import GitHub from '../../github'; import setups from './cloud-runner-suite.test'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) { Cli.options = overrides; } diff --git a/src/model/cloud-runner/tests/cloud-runner-remote-client-caching.test.ts b/src/model/cloud-runner/tests/cloud-runner-remote-client-caching.test.ts index 906ccb69..bc56e333 100644 --- a/src/model/cloud-runner/tests/cloud-runner-remote-client-caching.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-remote-client-caching.test.ts @@ -1,5 +1,5 @@ -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; import BuildParameters from '../../build-parameters'; import { Cli } from '../../cli/cli'; import UnityVersioning from '../../unity-versioning'; diff --git a/src/model/cloud-runner/tests/cloud-runner-run-once-custom-hooks.test.ts b/src/model/cloud-runner/tests/cloud-runner-run-once-custom-hooks.test.ts index fc0107bd..85fa46bb 100644 --- a/src/model/cloud-runner/tests/cloud-runner-run-once-custom-hooks.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-run-once-custom-hooks.test.ts @@ -7,8 +7,9 @@ import { v4 as uuidv4 } from 'uuid'; import CloudRunnerOptions from '../cloud-runner-options'; import setups from './cloud-runner-suite.test'; import { CloudRunnerCustomSteps } from '../services/cloud-runner-custom-steps'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) { Cli.options = overrides; } diff --git a/src/model/cloud-runner/tests/cloud-runner-run-twice-caching.test.ts b/src/model/cloud-runner/tests/cloud-runner-run-twice-caching.test.ts index d93551b6..381deaf3 100644 --- a/src/model/cloud-runner/tests/cloud-runner-run-twice-caching.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-run-twice-caching.test.ts @@ -6,9 +6,10 @@ import CloudRunnerLogger from '../services/cloud-runner-logger'; import { v4 as uuidv4 } from 'uuid'; import CloudRunnerOptions from '../cloud-runner-options'; import setups from './cloud-runner-suite.test'; -import * as fs from 'fs'; +import fs from 'node:fs'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) { Cli.options = overrides; } diff --git a/src/model/cloud-runner/tests/cloud-runner-run-twice-retaining.test.ts b/src/model/cloud-runner/tests/cloud-runner-run-twice-retaining.test.ts index 30b221c9..c30e6b7d 100644 --- a/src/model/cloud-runner/tests/cloud-runner-run-twice-retaining.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-run-twice-retaining.test.ts @@ -6,12 +6,13 @@ import CloudRunnerLogger from '../services/cloud-runner-logger'; import { v4 as uuidv4 } from 'uuid'; import CloudRunnerOptions from '../cloud-runner-options'; import setups from './cloud-runner-suite.test'; -import * as fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; import { CloudRunnerFolders } from '../services/cloud-runner-folders'; import SharedWorkspaceLocking from '../services/shared-workspace-locking'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) { Cli.options = overrides; } diff --git a/src/model/cloud-runner/tests/cloud-runner-s3-prebuilt-steps.test.ts b/src/model/cloud-runner/tests/cloud-runner-s3-prebuilt-steps.test.ts index 2cf4bf61..f33b679e 100644 --- a/src/model/cloud-runner/tests/cloud-runner-s3-prebuilt-steps.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-s3-prebuilt-steps.test.ts @@ -7,8 +7,9 @@ import { v4 as uuidv4 } from 'uuid'; import CloudRunnerOptions from '../cloud-runner-options'; import setups from './cloud-runner-suite.test'; import { CloudRunnerSystem } from '../services/cloud-runner-system'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) { Cli.options = overrides; } diff --git a/src/model/cloud-runner/tests/cloud-runner-sync-environment.test.ts b/src/model/cloud-runner/tests/cloud-runner-sync-environment.test.ts index 2368d25e..94d9577c 100644 --- a/src/model/cloud-runner/tests/cloud-runner-sync-environment.test.ts +++ b/src/model/cloud-runner/tests/cloud-runner-sync-environment.test.ts @@ -8,8 +8,9 @@ import { Cli } from '../../cli/cli'; import CloudRunnerLogger from '../services/cloud-runner-logger'; import CloudRunnerOptions from '../cloud-runner-options'; import setups from './cloud-runner-suite.test'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) Cli.options = overrides; return BuildParameters.create(); diff --git a/src/model/cloud-runner/tests/shared-workspace-locking.test.ts b/src/model/cloud-runner/tests/shared-workspace-locking.test.ts index 703edf7b..0945e224 100644 --- a/src/model/cloud-runner/tests/shared-workspace-locking.test.ts +++ b/src/model/cloud-runner/tests/shared-workspace-locking.test.ts @@ -7,8 +7,9 @@ import CloudRunnerOptions from '../cloud-runner-options'; import UnityVersioning from '../../unity-versioning'; import BuildParameters from '../../build-parameters'; import CloudRunner from '../cloud-runner'; +import { OptionValues } from 'commander'; -async function CreateParameters(overrides) { +async function CreateParameters(overrides: OptionValues | undefined) { if (overrides) { Cli.options = overrides; } @@ -21,7 +22,7 @@ describe('Cloud Runner Locking', () => { it('Responds', () => {}); if (CloudRunnerOptions.cloudRunnerDebug) { it(`Simple Locking Flow`, async () => { - Cli.options.retainWorkspaces = true; + Cli.options!.retainWorkspaces = true; const overrides: any = { versioning: 'None', projectPath: 'test-project', @@ -53,8 +54,8 @@ describe('Cloud Runner Locking', () => { expect(isExpectedLockedAfterReleasing).toBeTruthy(); }, 150000); it.skip('All Locking Actions', async () => { - Cli.options.retainWorkspaces = true; - const overrides: any = { + Cli.options!.retainWorkspaces = true; + const overrides: OptionValues = { versioning: 'None', projectPath: 'test-project', unityVersion: UnityVersioning.determineUnityVersion('test-project', UnityVersioning.read('test-project')), diff --git a/src/model/cloud-runner/workflows/build-automation-workflow.ts b/src/model/cloud-runner/workflows/build-automation-workflow.ts index b880da84..78cf57bc 100644 --- a/src/model/cloud-runner/workflows/build-automation-workflow.ts +++ b/src/model/cloud-runner/workflows/build-automation-workflow.ts @@ -4,56 +4,48 @@ import { CloudRunnerStepState } from '../cloud-runner-step-state'; import { WorkflowInterface } from './workflow-interface'; import * as core from '@actions/core'; import { CloudRunnerCustomHooks } from '../services/cloud-runner-custom-hooks'; -import path from 'path'; +import path from 'node:path'; import CloudRunner from '../cloud-runner'; import CloudRunnerOptions from '../cloud-runner-options'; import { CloudRunnerCustomSteps } from '../services/cloud-runner-custom-steps'; export class BuildAutomationWorkflow implements WorkflowInterface { async run(cloudRunnerStepState: CloudRunnerStepState) { - try { - return await BuildAutomationWorkflow.standardBuildAutomation(cloudRunnerStepState.image, cloudRunnerStepState); - } catch (error) { - throw error; - } + return await BuildAutomationWorkflow.standardBuildAutomation(cloudRunnerStepState.image, cloudRunnerStepState); } - private static async standardBuildAutomation(baseImage: any, cloudRunnerStepState: CloudRunnerStepState) { + private static async standardBuildAutomation(baseImage: string, cloudRunnerStepState: CloudRunnerStepState) { // TODO accept post and pre build steps as yaml files in the repo - try { - CloudRunnerLogger.log(`Cloud Runner is running standard build automation`); + CloudRunnerLogger.log(`Cloud Runner is running standard build automation`); - let output = ''; + let output = ''; - output += await CloudRunnerCustomSteps.RunPreBuildSteps(cloudRunnerStepState); - CloudRunnerLogger.logWithTime('Configurable pre build step(s) time'); + output += await CloudRunnerCustomSteps.RunPreBuildSteps(cloudRunnerStepState); + CloudRunnerLogger.logWithTime('Configurable pre build step(s) time'); - if (!CloudRunner.buildParameters.isCliMode) core.startGroup('build'); - CloudRunnerLogger.log(baseImage.toString()); - CloudRunnerLogger.logLine(` `); - CloudRunnerLogger.logLine('Starting build automation job'); + if (!CloudRunner.buildParameters.isCliMode) core.startGroup('build'); + CloudRunnerLogger.log(baseImage); + CloudRunnerLogger.logLine(` `); + CloudRunnerLogger.logLine('Starting build automation job'); - output += await CloudRunner.Provider.runTaskInWorkflow( - CloudRunner.buildParameters.buildGuid, - baseImage.toString(), - BuildAutomationWorkflow.BuildWorkflow, - `/${CloudRunnerFolders.buildVolumeFolder}`, - `/${CloudRunnerFolders.buildVolumeFolder}/`, - cloudRunnerStepState.environment, - cloudRunnerStepState.secrets, - ); - if (!CloudRunner.buildParameters.isCliMode) core.endGroup(); - CloudRunnerLogger.logWithTime('Build time'); + output += await CloudRunner.Provider.runTaskInWorkflow( + CloudRunner.buildParameters.buildGuid, + baseImage.toString(), + BuildAutomationWorkflow.BuildWorkflow, + `/${CloudRunnerFolders.buildVolumeFolder}`, + `/${CloudRunnerFolders.buildVolumeFolder}/`, + cloudRunnerStepState.environment, + cloudRunnerStepState.secrets, + ); + if (!CloudRunner.buildParameters.isCliMode) core.endGroup(); + CloudRunnerLogger.logWithTime('Build time'); - output += await CloudRunnerCustomSteps.RunPostBuildSteps(cloudRunnerStepState); - CloudRunnerLogger.logWithTime('Configurable post build step(s) time'); + output += await CloudRunnerCustomSteps.RunPostBuildSteps(cloudRunnerStepState); + CloudRunnerLogger.logWithTime('Configurable post build step(s) time'); - CloudRunnerLogger.log(`Cloud Runner finished running standard build automation`); + CloudRunnerLogger.log(`Cloud Runner finished running standard build automation`); - return output; - } catch (error) { - throw error; - } + return output; } private static get BuildWorkflow() { @@ -85,7 +77,7 @@ export class BuildAutomationWorkflow implements WorkflowInterface { ${BuildAutomationWorkflow.TreeCommand}`; } - private static setupCommands(builderPath) { + private static setupCommands(builderPath: string) { const commands = `mkdir -p ${CloudRunnerFolders.ToLinuxFolder( CloudRunnerFolders.builderPathAbsolute, )} && git clone -q -b ${CloudRunner.buildParameters.cloudRunnerBranch} ${ @@ -112,7 +104,7 @@ export class BuildAutomationWorkflow implements WorkflowInterface { node ${builderPath} -m remote-cli-pre-build`; } - private static BuildCommands(builderPath) { + private static BuildCommands(builderPath: string) { const distFolder = path.join(CloudRunnerFolders.builderPathAbsolute, 'dist'); const ubuntuPlatformsFolder = path.join(CloudRunnerFolders.builderPathAbsolute, 'dist', 'platforms', 'ubuntu'); diff --git a/src/model/cloud-runner/workflows/workflow-interface.ts b/src/model/cloud-runner/workflows/workflow-interface.ts index 3e8763ed..fe60f5eb 100644 --- a/src/model/cloud-runner/workflows/workflow-interface.ts +++ b/src/model/cloud-runner/workflows/workflow-interface.ts @@ -4,5 +4,5 @@ export interface WorkflowInterface { run( // eslint-disable-next-line no-unused-vars cloudRunnerStepState: CloudRunnerStepState, - ); + ): Promise; } diff --git a/src/model/docker.ts b/src/model/docker.ts index b9943400..60d32e5c 100644 --- a/src/model/docker.ts +++ b/src/model/docker.ts @@ -1,16 +1,19 @@ import { execWithErrorCheck } from './exec-with-error-check'; import ImageEnvironmentFactory from './image-environment-factory'; -import { existsSync, mkdirSync } from 'fs'; -import path from 'path'; +import { existsSync, mkdirSync } from 'node:fs'; +import path from 'node:path'; +import { ExecOptions } from '@actions/exec'; +import { DockerParameters, StringKeyValuePair } from './shared-types'; class Docker { static async run( - image, - parameters, - silent = false, - overrideCommands = '', - additionalVariables: any[] = [], - options: any = false, + image: string, + parameters: DockerParameters, + silent: boolean = false, + overrideCommands: string = '', + additionalVariables: StringKeyValuePair[] = [], + // eslint-disable-next-line unicorn/no-useless-undefined + options: ExecOptions | undefined = undefined, entrypointBash: boolean = false, ) { let runCommand = ''; @@ -21,7 +24,7 @@ class Docker { case 'win32': runCommand = this.getWindowsCommand(image, parameters); } - if (options !== false) { + if (options) { options.silent = silent; await execWithErrorCheck(runCommand, undefined, options); } else { @@ -30,10 +33,10 @@ class Docker { } static getLinuxCommand( - image, - parameters, - overrideCommands = '', - additionalVariables: any[] = [], + image: string, + parameters: DockerParameters, + overrideCommands: string = '', + additionalVariables: StringKeyValuePair[] = [], entrypointBash: boolean = false, ): string { const { workspace, actionFolder, runnerTempPath, sshAgent, gitPrivateToken } = parameters; @@ -67,7 +70,7 @@ class Docker { "${overrideCommands !== '' ? overrideCommands : `/entrypoint.sh`}"`; } - static getWindowsCommand(image: any, parameters: any): string { + static getWindowsCommand(image: string, parameters: DockerParameters): string { const { workspace, actionFolder, unitySerial, gitPrivateToken } = parameters; return `docker run \ diff --git a/src/model/github.ts b/src/model/github.ts index 75255f10..4f2166b3 100644 --- a/src/model/github.ts +++ b/src/model/github.ts @@ -3,6 +3,7 @@ import CloudRunner from './cloud-runner/cloud-runner'; import CloudRunnerOptions from './cloud-runner/cloud-runner-options'; import * as core from '@actions/core'; import { Octokit } from '@octokit/core'; + class GitHub { private static readonly asyncChecksApiWorkflowName = `Async Checks API`; public static githubInputEnabled: boolean = true; @@ -43,7 +44,7 @@ class GitHub { return CloudRunnerOptions.githubRepoName; } - public static async createGitHubCheck(summary) { + public static async createGitHubCheck(summary: string) { if (!CloudRunnerOptions.githubChecks) { return ``; } @@ -80,7 +81,12 @@ class GitHub { return result.data.id; } - public static async updateGitHubCheck(longDescription, summary, result = `neutral`, status = `in_progress`) { + public static async updateGitHubCheck( + longDescription: string, + summary: any, + result = `neutral`, + status = `in_progress`, + ) { if (!CloudRunnerOptions.githubChecks) { return; } @@ -122,15 +128,15 @@ class GitHub { await GitHub.updateGitHubCheckRequest(data); } - public static async updateGitHubCheckRequest(data) { + public static async updateGitHubCheckRequest(data: any) { return await GitHub.octokitDefaultToken.request(`PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}`, data); } - public static async createGitHubCheckRequest(data) { + public static async createGitHubCheckRequest(data: any) { return await GitHub.octokitDefaultToken.request(`POST /repos/{owner}/{repo}/check-runs`, data); } - public static async runUpdateAsyncChecksWorkflow(data, mode) { + public static async runUpdateAsyncChecksWorkflow(data: any, mode: string) { if (mode === `create`) { throw new Error(`Not supported: only use update`); } diff --git a/src/model/image-environment-factory.ts b/src/model/image-environment-factory.ts index 8398acde..c5d14a68 100644 --- a/src/model/image-environment-factory.ts +++ b/src/model/image-environment-factory.ts @@ -1,13 +1,8 @@ -import BuildParameters from './build-parameters'; import { ReadLicense } from './input-readers/test-license-reader'; - -class Parameter { - public name; - public value; -} +import { DockerParameters, StringKeyValuePair } from './shared-types'; class ImageEnvironmentFactory { - public static getEnvVarString(parameters: BuildParameters, additionalVariables: any[] = []) { + public static getEnvVarString(parameters: DockerParameters, additionalVariables: StringKeyValuePair[] = []) { const environmentVariables = ImageEnvironmentFactory.getEnvironmentVariables(parameters, additionalVariables); let string = ''; for (const p of environmentVariables) { @@ -25,8 +20,9 @@ class ImageEnvironmentFactory { return string; } - public static getEnvironmentVariables(parameters: BuildParameters, additionalVariables: any[] = []) { - let environmentVariables: Parameter[] = [ + + public static getEnvironmentVariables(parameters: DockerParameters, additionalVariables: StringKeyValuePair[] = []) { + let environmentVariables: StringKeyValuePair[] = [ { name: 'UNITY_LICENSE', value: process.env.UNITY_LICENSE || ReadLicense() }, { name: 'UNITY_LICENSE_FILE', value: process.env.UNITY_LICENSE_FILE }, { name: 'UNITY_EMAIL', value: process.env.UNITY_EMAIL }, diff --git a/src/model/image-tag.test.ts b/src/model/image-tag.test.ts index f7ac2e2b..f567cadd 100644 --- a/src/model/image-tag.test.ts +++ b/src/model/image-tag.test.ts @@ -1,7 +1,7 @@ import ImageTag from './image-tag'; describe('ImageTag', () => { - const some = { + const testImageParameters = { editorVersion: '2099.9.f9f9', targetPlatform: 'Test', builderPlatform: '', @@ -15,38 +15,38 @@ describe('ImageTag', () => { describe('constructor', () => { it('can be called', () => { - const { targetPlatform } = some; - - expect(() => new ImageTag({ targetPlatform })).not.toThrow(); + expect(() => new ImageTag(testImageParameters)).not.toThrow(); }); it('accepts parameters and sets the right properties', () => { - const image = new ImageTag(some); + const image = new ImageTag(testImageParameters); expect(image.repository).toStrictEqual('unityci'); expect(image.name).toStrictEqual('editor'); - expect(image.editorVersion).toStrictEqual(some.editorVersion); - expect(image.targetPlatform).toStrictEqual(some.targetPlatform); - expect(image.builderPlatform).toStrictEqual(some.builderPlatform); + expect(image.editorVersion).toStrictEqual(testImageParameters.editorVersion); + expect(image.targetPlatform).toStrictEqual(testImageParameters.targetPlatform); + expect(image.builderPlatform).toStrictEqual(testImageParameters.builderPlatform); }); test.each(['2000.0.0f0', '2011.1.11f1'])('accepts %p version format', (version) => { - expect(() => new ImageTag({ editorVersion: version, targetPlatform: some.targetPlatform })).not.toThrow(); + expect( + () => new ImageTag({ editorVersion: version, targetPlatform: testImageParameters.targetPlatform }), + ).not.toThrow(); }); test.each(['some version', ''])('throws for incorrect version %p', (editorVersion) => { - const { targetPlatform } = some; + const { targetPlatform } = testImageParameters; expect(() => new ImageTag({ editorVersion, targetPlatform })).toThrow(); }); - test.each([undefined, 'nonExisting'])('throws for unsupported target %p', (targetPlatform) => { + test.each(['nonExisting'])('throws for unsupported target %p', (targetPlatform) => { expect(() => new ImageTag({ targetPlatform })).toThrow(); }); }); describe('toString', () => { it('returns the correct version', () => { - const image = new ImageTag({ editorVersion: '2099.1.1111', targetPlatform: some.targetPlatform }); + const image = new ImageTag({ editorVersion: '2099.1.1111', targetPlatform: testImageParameters.targetPlatform }); switch (process.platform) { case 'win32': expect(image.toString()).toStrictEqual(`${defaults.image}:windows-2099.1.1111-1`); @@ -59,7 +59,7 @@ describe('ImageTag', () => { it('returns customImage if given', () => { const image = new ImageTag({ editorVersion: '2099.1.1111', - targetPlatform: some.targetPlatform, + targetPlatform: testImageParameters.targetPlatform, customImage: `${defaults.image}:2099.1.1111@347598437689743986`, }); @@ -80,7 +80,7 @@ describe('ImageTag', () => { }); it('returns no specific build platform for generic targetPlatforms', () => { - const image = new ImageTag({ targetPlatform: 'NoTarget' }); + const image = new ImageTag({ editorVersion: '2019.2.11f1', targetPlatform: 'NoTarget' }); switch (process.platform) { case 'win32': diff --git a/src/model/image-tag.ts b/src/model/image-tag.ts index e71bdfc0..2d16ee30 100644 --- a/src/model/image-tag.ts +++ b/src/model/image-tag.ts @@ -1,21 +1,18 @@ import Platform from './platform'; -import BuildParameters from './build-parameters'; -import Input from './input'; - class ImageTag { public repository: string; public name: string; - public cloudRunnerBuilderPlatform!: string | undefined; + public cloudRunnerBuilderPlatform!: string; public editorVersion: string; - public targetPlatform: any; + public targetPlatform: string; public builderPlatform: string; - public customImage: any; + public customImage: string; public imageRollingVersion: number; public imagePlatformPrefix: string; - constructor(imageProperties: Partial) { - const { editorVersion = '2019.2.11f1', targetPlatform, customImage, cloudRunnerBuilderPlatform } = imageProperties; + constructor(imageProperties: { [key: string]: string }) { + const { editorVersion, targetPlatform, customImage, cloudRunnerBuilderPlatform } = imageProperties; if (!ImageTag.versionPattern.test(editorVersion)) { throw new Error(`Invalid version "${editorVersion}".`); @@ -39,8 +36,8 @@ class ImageTag { this.imageRollingVersion = 1; // Will automatically roll to the latest non-breaking version. } - static get versionPattern() { - return /^20\d{2}\.\d\.\w{3,4}|3$/; + static get versionPattern(): RegExp { + return /^(20\d{2}\.\d\.\w{3,4}|3)$/; } static get targetPlatformSuffixes() { @@ -60,7 +57,7 @@ class ImageTag { }; } - static getImagePlatformPrefixes(platform) { + static getImagePlatformPrefixes(platform: string): string { switch (platform) { case 'win32': return 'windows'; @@ -71,7 +68,7 @@ class ImageTag { } } - static getTargetPlatformToTargetPlatformSuffixMap(platform, version) { + static getTargetPlatformToTargetPlatformSuffixMap(platform: string, version: string): string { const { generic, webgl, mac, windows, windowsIl2cpp, wsaPlayer, linux, linuxIl2cpp, android, ios, tvos, facebook } = ImageTag.targetPlatformSuffixes; @@ -84,7 +81,7 @@ class ImageTag { case Platform.types.StandaloneWindows: case Platform.types.StandaloneWindows64: // Can only build windows-il2cpp on a windows based system - if (Input.useIL2Cpp && process.platform === 'win32') { + if (process.platform === 'win32') { // Unity versions before 2019.3 do not support il2cpp if (major >= 2020 || (major === 2019 && minor >= 3)) { return windowsIl2cpp; @@ -97,7 +94,7 @@ class ImageTag { return windows; case Platform.types.StandaloneLinux64: { // Unity versions before 2019.3 do not support il2cpp - if ((Input.useIL2Cpp && major >= 2020) || (major === 2019 && minor >= 3)) { + if (major >= 2020 || (major === 2019 && minor >= 3)) { return linuxIl2cpp; } @@ -150,17 +147,17 @@ class ImageTag { } } - get tag() { + get tag(): string { const versionAndPlatform = `${this.editorVersion}-${this.builderPlatform}`.replace(/-+$/, ''); return `${this.imagePlatformPrefix}-${versionAndPlatform}-${this.imageRollingVersion}`; } - get image() { + get image(): string { return `${this.repository}/${this.name}`.replace(/^\/+/, ''); } - toString() { + toString(): string { const { image, tag, customImage } = this; if (customImage) return customImage; diff --git a/src/model/index.test.ts b/src/model/index.test.ts index e172367b..70eed7f2 100644 --- a/src/model/index.test.ts +++ b/src/model/index.test.ts @@ -1,10 +1,22 @@ import * as Index from '.'; +interface ExportedModules { + [key: string]: any; + Action: any; + BuildParameters: any; + Cache: any; + Docker: any; + ImageTag: any; + Input: any; + Platform: any; + Project: any; + Unity: any; +} + +const exportedModules: ExportedModules = Index; + describe('Index', () => { - test.each(['Action', 'BuildParameters', 'Cache', 'Docker', 'ImageTag', 'Input', 'Platform', 'Project', 'Unity'])( - 'exports %s', - (exportedModule) => { - expect(Index[exportedModule]).toBeDefined(); - }, - ); + test.each(Object.keys(exportedModules))('exports %s', (exportedModule) => { + expect(exportedModules[exportedModule]).toBeDefined(); + }); }); diff --git a/src/model/input-readers/action-yaml.ts b/src/model/input-readers/action-yaml.ts index 8c46bb66..12b9c37b 100644 --- a/src/model/input-readers/action-yaml.ts +++ b/src/model/input-readers/action-yaml.ts @@ -1,5 +1,5 @@ -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; import YAML from 'yaml'; export class ActionYamlReader { diff --git a/src/model/input-readers/generic-input-reader.ts b/src/model/input-readers/generic-input-reader.ts index 709a6d11..90a8caad 100644 --- a/src/model/input-readers/generic-input-reader.ts +++ b/src/model/input-readers/generic-input-reader.ts @@ -2,7 +2,7 @@ import { CloudRunnerSystem } from '../cloud-runner/services/cloud-runner-system' import CloudRunnerOptions from '../cloud-runner/cloud-runner-options'; export class GenericInputReader { - public static async Run(command) { + public static async Run(command: string) { if (CloudRunnerOptions.cloudRunnerCluster === 'local') { return ''; } diff --git a/src/model/input-readers/git-repo.ts b/src/model/input-readers/git-repo.ts index ffa8385b..3d8307d7 100644 --- a/src/model/input-readers/git-repo.ts +++ b/src/model/input-readers/git-repo.ts @@ -1,5 +1,5 @@ -import { assert } from 'console'; -import fs from 'fs'; +import { assert } from 'node:console'; +import fs from 'node:fs'; import { CloudRunnerSystem } from '../cloud-runner/services/cloud-runner-system'; import CloudRunnerLogger from '../cloud-runner/services/cloud-runner-logger'; import CloudRunnerOptions from '../cloud-runner/cloud-runner-options'; diff --git a/src/model/input-readers/test-license-reader.ts b/src/model/input-readers/test-license-reader.ts index d97de587..13819495 100644 --- a/src/model/input-readers/test-license-reader.ts +++ b/src/model/input-readers/test-license-reader.ts @@ -1,9 +1,9 @@ -import path from 'path'; -import fs from 'fs'; +import path from 'node:path'; +import fs from 'node:fs'; import YAML from 'yaml'; import CloudRunnerOptions from '../cloud-runner/cloud-runner-options'; -export function ReadLicense() { +export function ReadLicense(): string { if (CloudRunnerOptions.cloudRunnerCluster === 'local') { return ''; } diff --git a/src/model/input.test.ts b/src/model/input.test.ts index 20b3e6de..32275812 100644 --- a/src/model/input.test.ts +++ b/src/model/input.test.ts @@ -191,7 +191,7 @@ describe('Input', () => { }); spy.mockImplementationOnce(() => { - return true; + return 'true'; }); expect(Input.androidExportType).toStrictEqual(expected); expect(spy).toHaveBeenCalledTimes(1); @@ -207,7 +207,7 @@ describe('Input', () => { ({ input, expected }) => { const spy = jest.spyOn(Input, 'getInput'); spy.mockImplementationOnce(() => { - return; + return ''; }); spy.mockImplementationOnce(() => { diff --git a/src/model/input.ts b/src/model/input.ts index 368e91fa..f3169d61 100644 --- a/src/model/input.ts +++ b/src/model/input.ts @@ -1,11 +1,13 @@ -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; import { Cli } from './cli/cli'; import CloudRunnerQueryOverride from './cloud-runner/services/cloud-runner-query-override'; import Platform from './platform'; import GitHub from './github'; -const core = require('@actions/core'); +import * as core from '@actions/core'; + +export type InputKey = keyof typeof Input; /** * Input variables specified in workflows using "with" prop. @@ -15,7 +17,7 @@ const core = require('@actions/core'); * Todo: rename to UserInput and remove anything that is not direct input from the user / ci workflow */ class Input { - public static getInput(query) { + public static getInput(query: string): string | undefined { if (GitHub.githubInputEnabled) { const coreInput = core.getInput(query); if (coreInput && coreInput !== '') { @@ -34,113 +36,120 @@ class Input { } if (process.env[query] !== undefined) { - return process.env[query]; + return process.env[query]!; } if (alternativeQuery !== query && process.env[alternativeQuery] !== undefined) { - return process.env[alternativeQuery]; + return process.env[alternativeQuery]!; } - - return; } static get region(): string { return Input.getInput('region') || 'eu-west-2'; } - static get githubRepo() { + static get githubRepo(): string | undefined { return Input.getInput('GITHUB_REPOSITORY') || Input.getInput('GITHUB_REPO') || undefined; } - static get branch() { + + static get branch(): string { if (Input.getInput(`GITHUB_REF`)) { - return Input.getInput(`GITHUB_REF`).replace('refs/', '').replace(`head/`, '').replace(`heads/`, ''); + return Input.getInput(`GITHUB_REF`)!.replace('refs/', '').replace(`head/`, '').replace(`heads/`, ''); } else if (Input.getInput('branch')) { - return Input.getInput('branch'); + return Input.getInput('branch')!; } else { return ''; } } - static get gitSha() { + static get gitSha(): string { if (Input.getInput(`GITHUB_SHA`)) { - return Input.getInput(`GITHUB_SHA`); + return Input.getInput(`GITHUB_SHA`)!; } else if (Input.getInput(`GitSHA`)) { - return Input.getInput(`GitSHA`); + return Input.getInput(`GitSHA`)!; } + + return ''; } - static get useIL2Cpp() { - return Input.getInput(`useIL2Cpp`) || true; - } - - static get runNumber() { + static get runNumber(): string { return Input.getInput('GITHUB_RUN_NUMBER') || '0'; } - static get targetPlatform() { + static get targetPlatform(): string { return Input.getInput('targetPlatform') || Platform.default; } - static get unityVersion() { + static get unityVersion(): string { return Input.getInput('unityVersion') || 'auto'; } - static get customImage() { + static get customImage(): string { return Input.getInput('customImage') || ''; } - static get projectPath() { + static get projectPath(): string { const input = Input.getInput('projectPath'); - const rawProjectPath = input - ? input - : fs.existsSync(path.join('test-project', 'ProjectSettings', 'ProjectVersion.txt')) && - !fs.existsSync(path.join('ProjectSettings', 'ProjectVersion.txt')) - ? 'test-project' - : '.'; + let rawProjectPath; + + if (input) { + rawProjectPath = input; + } else if ( + fs.existsSync(path.join('test-project', 'ProjectSettings', 'ProjectVersion.txt')) && + !fs.existsSync(path.join('ProjectSettings', 'ProjectVersion.txt')) + ) { + rawProjectPath = 'test-project'; + } else { + rawProjectPath = '.'; + } return rawProjectPath.replace(/\/$/, ''); } - static get buildName() { - return Input.getInput('buildName') || this.targetPlatform; + static get runnerTempPath(): string { + return Input.getInput('RUNNER_TEMP') || ''; } - static get buildsPath() { + static get buildName(): string { + return Input.getInput('buildName') || Input.targetPlatform; + } + + static get buildsPath(): string { return Input.getInput('buildsPath') || 'build'; } - static get unityLicensingServer() { + static get unityLicensingServer(): string { return Input.getInput('unityLicensingServer') || ''; } - static get buildMethod() { + static get buildMethod(): string { return Input.getInput('buildMethod') || ''; // Processed in docker file } - static get customParameters() { + static get customParameters(): string { return Input.getInput('customParameters') || ''; } - static get versioningStrategy() { + static get versioningStrategy(): string { return Input.getInput('versioning') || 'Semantic'; } - static get specifiedVersion() { + static get specifiedVersion(): string { return Input.getInput('version') || ''; } - static get androidVersionCode() { - return Input.getInput('androidVersionCode'); + static get androidVersionCode(): string { + return Input.getInput('androidVersionCode') || ''; } - static get androidAppBundle() { + static get androidAppBundle(): boolean { core.warning('androidAppBundle is deprecated, please use androidExportType instead'); const input = Input.getInput('androidAppBundle') || false; return input === 'true'; } - static get androidExportType() { + static get androidExportType(): string { // TODO: remove this in V3 const exportType = Input.getInput('androidExportType') || ''; @@ -156,64 +165,72 @@ class Input { // return Input.getInput('androidExportType') || 'androidPackage'; } - static get androidKeystoreName() { + static get androidKeystoreName(): string { return Input.getInput('androidKeystoreName') || ''; } - static get androidKeystoreBase64() { + static get androidKeystoreBase64(): string { return Input.getInput('androidKeystoreBase64') || ''; } - static get androidKeystorePass() { + static get androidKeystorePass(): string { return Input.getInput('androidKeystorePass') || ''; } - static get androidKeyaliasName() { + static get androidKeyaliasName(): string { return Input.getInput('androidKeyaliasName') || ''; } - static get androidKeyaliasPass() { + static get androidKeyaliasPass(): string { return Input.getInput('androidKeyaliasPass') || ''; } - static get androidTargetSdkVersion() { + static get androidTargetSdkVersion(): string { return Input.getInput('androidTargetSdkVersion') || ''; } - static get androidSymbolType() { + static get androidSymbolType(): string { return Input.getInput('androidSymbolType') || 'none'; } - static get sshAgent() { + static get sshAgent(): string { return Input.getInput('sshAgent') || ''; } - static get gitPrivateToken() { - return core.getInput('gitPrivateToken') || false; + static get gitPrivateToken(): string | undefined { + return Input.getInput('gitPrivateToken'); } static get chownFilesTo() { return Input.getInput('chownFilesTo') || ''; } - static get allowDirtyBuild() { + static get allowDirtyBuild(): boolean { const input = Input.getInput('allowDirtyBuild') || false; return input === 'true'; } - static get cacheUnityInstallationOnMac() { + static get cacheUnityInstallationOnMac(): boolean { const input = Input.getInput('cacheUnityInstallationOnMac') || false; return input === 'true'; } - static get unityHubVersionOnMac() { + static get unityHubVersionOnMac(): string { const input = Input.getInput('unityHubVersionOnMac') || ''; return input !== '' ? input : ''; } + static get unitySerial(): string | undefined { + return Input.getInput('UNITY_SERIAL'); + } + + static get unityLicense(): string | undefined { + return Input.getInput('UNITY_LICENSE'); + } + public static ToEnvVarFormat(input: string) { if (input.toUpperCase() === input) { return input; diff --git a/src/model/mac-builder.ts b/src/model/mac-builder.ts index d4b9ae45..eb9ec683 100644 --- a/src/model/mac-builder.ts +++ b/src/model/mac-builder.ts @@ -1,7 +1,7 @@ import { execWithErrorCheck } from './exec-with-error-check'; class MacBuilder { - public static async run(actionFolder, silent = false) { + public static async run(actionFolder: string, silent: boolean = false) { await execWithErrorCheck('bash', [`${actionFolder}/platforms/mac/entrypoint.sh`], { silent, }); diff --git a/src/model/output.ts b/src/model/output.ts index 8b6896bc..1d71bf86 100644 --- a/src/model/output.ts +++ b/src/model/output.ts @@ -1,12 +1,12 @@ -const core = require('@actions/core'); +import * as core from '@actions/core'; class Output { - static async setBuildVersion(buildVersion) { - await core.setOutput('buildVersion', buildVersion); + static async setBuildVersion(buildVersion: string) { + core.setOutput('buildVersion', buildVersion); } - static async setAndroidVersionCode(androidVersionCode) { - await core.setOutput('androidVersionCode', androidVersionCode); + static async setAndroidVersionCode(androidVersionCode: string) { + core.setOutput('androidVersionCode', androidVersionCode); } } diff --git a/src/model/platform-setup.ts b/src/model/platform-setup.ts index f60072a3..ad4065c8 100644 --- a/src/model/platform-setup.ts +++ b/src/model/platform-setup.ts @@ -1,4 +1,4 @@ -import fs from 'fs'; +import fs from 'node:fs'; import * as core from '@actions/core'; import { BuildParameters } from '.'; import { SetupMac, SetupWindows, SetupAndroid } from './platform-setup/'; diff --git a/src/model/platform-setup/setup-android.ts b/src/model/platform-setup/setup-android.ts index 4a2d1668..2b0c1172 100644 --- a/src/model/platform-setup/setup-android.ts +++ b/src/model/platform-setup/setup-android.ts @@ -1,5 +1,5 @@ -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; import { BuildParameters } from '..'; class SetupAndroid { diff --git a/src/model/platform-setup/setup-mac.ts b/src/model/platform-setup/setup-mac.ts index bab218dc..993c421b 100644 --- a/src/model/platform-setup/setup-mac.ts +++ b/src/model/platform-setup/setup-mac.ts @@ -3,7 +3,7 @@ import { getUnityChangeset } from 'unity-changeset'; import { exec, getExecOutput } from '@actions/exec'; import { restoreCache, saveCache } from '@actions/cache'; -import fs from 'fs'; +import fs from 'node:fs'; class SetupMac { static unityHubBasePath = `/Applications/"Unity Hub.app"`; @@ -23,7 +23,7 @@ class SetupMac { await SetupMac.setEnvironmentVariables(buildParameters, actionFolder); } - private static async installUnityHub(buildParameters, silent = false) { + private static async installUnityHub(buildParameters: BuildParameters, silent = false) { // Can't use quotes in the cache package so we need a different path const unityHubCachePath = `/Applications/Unity\\ Hub.app`; diff --git a/src/model/platform-setup/setup-windows.ts b/src/model/platform-setup/setup-windows.ts index 2ba7ab36..1a602e6b 100644 --- a/src/model/platform-setup/setup-windows.ts +++ b/src/model/platform-setup/setup-windows.ts @@ -1,5 +1,5 @@ import { exec } from '@actions/exec'; -import fs from 'fs'; +import fs from 'node:fs'; import { BuildParameters } from '..'; class SetupWindows { @@ -9,7 +9,7 @@ class SetupWindows { await SetupWindows.setupWindowsRun(targetPlatform); } - private static async setupWindowsRun(targetPlatform, silent = false) { + private static async setupWindowsRun(targetPlatform: string, silent: boolean = false) { if (!fs.existsSync('c:/regkeys')) { fs.mkdirSync('c:/regkeys'); } @@ -24,7 +24,7 @@ class SetupWindows { } } - private static async generateWinSDKRegKeys(silent = false) { + private static async generateWinSDKRegKeys(silent: boolean = false) { // Export registry keys that point to the Windows 10 SDK const exportWinSDKRegKeysCommand = 'reg export "HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v10.0" c:/regkeys/winsdk.reg /y'; diff --git a/src/model/platform-validation/validate-windows.ts b/src/model/platform-validation/validate-windows.ts index 0a2c56ba..6158c9f8 100644 --- a/src/model/platform-validation/validate-windows.ts +++ b/src/model/platform-validation/validate-windows.ts @@ -1,4 +1,4 @@ -import fs from 'fs'; +import fs from 'node:fs'; import { BuildParameters } from '..'; class ValidateWindows { @@ -11,16 +11,10 @@ class ValidateWindows { } } - private static validateWindowsPlatformRequirements(platform) { + private static validateWindowsPlatformRequirements(platform: string) { switch (platform) { case 'StandaloneWindows': - this.checkForVisualStudio(); - this.checkForWin10SDK(); - break; case 'StandaloneWindows64': - this.checkForVisualStudio(); - this.checkForWin10SDK(); - break; case 'WSAPlayer': this.checkForVisualStudio(); this.checkForWin10SDK(); diff --git a/src/model/platform.ts b/src/model/platform.ts index 2d8fe865..768e51b4 100644 --- a/src/model/platform.ts +++ b/src/model/platform.ts @@ -30,7 +30,7 @@ class Platform { }; } - static isWindows(platform) { + static isWindows(platform: string) { switch (platform) { case Platform.types.StandaloneWindows: case Platform.types.StandaloneWindows64: @@ -40,7 +40,7 @@ class Platform { } } - static isAndroid(platform) { + static isAndroid(platform: string) { switch (platform) { case Platform.types.Android: return true; diff --git a/src/model/shared-types.ts b/src/model/shared-types.ts new file mode 100644 index 00000000..9c7f584f --- /dev/null +++ b/src/model/shared-types.ts @@ -0,0 +1,6 @@ +export class StringKeyValuePair { + public name!: string; + public value!: string; +} + +export type DockerParameters = { [key: string]: any }; diff --git a/src/model/system.ts b/src/model/system.ts index 9f1cb676..02d73f54 100644 --- a/src/model/system.ts +++ b/src/model/system.ts @@ -1,21 +1,21 @@ import * as core from '@actions/core'; -import { exec } from '@actions/exec'; +import { exec, ExecListeners } from '@actions/exec'; class System { - static async run(command, arguments_: any = [], options = {}, shouldLog = true) { + static async run(command: string, arguments_: string[] = [], options = {}, shouldLog = true) { let result = ''; let error = ''; let debug = ''; - const listeners = { - stdout: (dataBuffer) => { + const listeners: ExecListeners = { + stdout: (dataBuffer: Buffer) => { result += dataBuffer.toString(); }, - stderr: (dataBuffer) => { + stderr: (dataBuffer: Buffer) => { error += dataBuffer.toString(); }, - debug: (dataString) => { - debug += dataString.toString(); + debug: (dataString: string) => { + debug += dataString; }, }; @@ -33,7 +33,7 @@ class System { } }; - const throwContextualError = (message) => { + const throwContextualError = (message: string) => { let commandAsString = command; if (Array.isArray(arguments_)) { commandAsString += ` ${arguments_.join(' ')}`; diff --git a/src/model/unity-versioning.ts b/src/model/unity-versioning.ts index a7ef2e26..098aee25 100644 --- a/src/model/unity-versioning.ts +++ b/src/model/unity-versioning.ts @@ -1,12 +1,12 @@ -import * as fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; export default class UnityVersioning { static get versionPattern() { return /20\d{2}\.\d\.\w{3,4}|3/; } - static determineUnityVersion(projectPath, unityVersion) { + static determineUnityVersion(projectPath: string, unityVersion: string) { if (unityVersion === 'auto') { return UnityVersioning.read(projectPath); } @@ -14,7 +14,7 @@ export default class UnityVersioning { return unityVersion; } - static read(projectPath) { + static read(projectPath: string) { const filePath = path.join(projectPath, 'ProjectSettings', 'ProjectVersion.txt'); if (!fs.existsSync(filePath)) { throw new Error(`Project settings file not found at "${filePath}". Have you correctly set the projectPath?`); @@ -23,7 +23,7 @@ export default class UnityVersioning { return UnityVersioning.parse(fs.readFileSync(filePath, 'utf8')); } - static parse(projectVersionTxt) { + static parse(projectVersionTxt: string) { const matches = projectVersionTxt.match(UnityVersioning.versionPattern); if (!matches || matches.length === 0) { throw new Error(`Failed to parse version from "${projectVersionTxt}".`); diff --git a/src/model/versioning.test.ts b/src/model/versioning.test.ts index 0451c74f..aa36a21c 100644 --- a/src/model/versioning.test.ts +++ b/src/model/versioning.test.ts @@ -37,7 +37,7 @@ describe('Versioning', () => { describe('grepCompatibleInputVersionRegex', () => { // eslint-disable-next-line unicorn/consistent-function-scoping - const matchInputUsingGrep = async (input) => { + const matchInputUsingGrep = async (input: string) => { const output = await System.run('sh', undefined, { input: Buffer.from(`echo '${input}' | grep -E '${Versioning.grepCompatibleInputVersionRegex}'`), silent: true, @@ -68,7 +68,7 @@ describe('Versioning', () => { const reference = jest.spyOn(Versioning, 'ref', 'get').mockReturnValue('refs/heads/feature-branch-2'); expect(Versioning.branch).toStrictEqual('feature-branch-2'); - expect(reference).toHaveBeenCalledTimes(2); + expect(reference).toHaveBeenCalledTimes(1); }); it('prefers headRef over ref when set', () => { @@ -103,16 +103,6 @@ describe('Versioning', () => { }); }); - describe('isDirtyAllowed', () => { - it('does not throw', () => { - expect(() => Versioning.isDirtyAllowed).not.toThrow(); - }); - - it('returns false by default', () => { - expect(Versioning.isDirtyAllowed).toStrictEqual(false); - }); - }); - describe('logging git diff', () => { it('calls git diff', async () => { // allowDirtyBuild: true @@ -140,28 +130,28 @@ describe('Versioning', () => { describe('descriptionRegex1', () => { it('is a valid regex', () => { - expect(Versioning.descriptionRegex1).toBeInstanceOf(RegExp); + expect(Versioning.descriptionRegexes[0]).toBeInstanceOf(RegExp); }); test.each(['v1.1-1-g12345678', 'v0.1-2-g12345678', 'v0.0-500-gA9B6C3D0-dirty'])( 'is happy with valid %s', (description) => { - expect(Versioning.descriptionRegex1.test(description)).toBeTruthy(); + expect(Versioning.descriptionRegexes[0].test(description)).toBeTruthy(); }, ); test.each(['1.1-1-g12345678', '0.1-2-g12345678', '0.0-500-gA9B6C3D0-dirty'])( 'accepts valid semantic versions without v-prefix %s', (description) => { - expect(Versioning.descriptionRegex1.test(description)).toBeTruthy(); + expect(Versioning.descriptionRegexes[0].test(description)).toBeTruthy(); }, ); test.each(['v0', 'v0.1', 'v0.1.2', 'v0.1-2', 'v0.1-2-g'])('does not like %s', (description) => { - expect(Versioning.descriptionRegex1.test(description)).toBeFalsy(); + expect(Versioning.descriptionRegexes[0].test(description)).toBeFalsy(); // Also, never expect without the v to work for any of these cases. - expect(Versioning.descriptionRegex1.test(description?.slice(1))).toBeFalsy(); + expect(Versioning.descriptionRegexes[0].test(description?.slice(1))).toBeFalsy(); }); }); diff --git a/src/model/versioning.ts b/src/model/versioning.ts index e39dff42..bf9e6292 100644 --- a/src/model/versioning.ts +++ b/src/model/versioning.ts @@ -5,14 +5,6 @@ import Input from './input'; import System from './system'; export default class Versioning { - static get projectPath() { - return Input.projectPath; - } - - static get isDirtyAllowed() { - return Input.allowDirtyBuild; - } - static get strategies() { return { None: 'None', Semantic: 'Semantic', Tag: 'Tag', Custom: 'Custom' }; } @@ -25,8 +17,7 @@ export default class Versioning { * Get the branch name of the (related) branch */ static get branch() { - // Todo - use optional chaining (https://github.com/zeit/ncc/issues/534) - return this.headRef || (this.ref && this.ref.slice(11)); + return this.headRef || this.ref?.slice(11); } /** @@ -76,43 +67,32 @@ export default class Versioning { /** * Regex to parse version description into separate fields */ - static get descriptionRegex1() { - return /^v?([\d.]+)-(\d+)-g(\w+)-?(\w+)*/g; + static get descriptionRegexes(): RegExp[] { + return [ + /^v?([\d.]+)-(\d+)-g(\w+)-?(\w+)*/g, + /^v?([\d.]+-\w+)-(\d+)-g(\w+)-?(\w+)*/g, + /^v?([\d.]+-\w+\.\d+)-(\d+)-g(\w+)-?(\w+)*/g, + ]; } - static get descriptionRegex2() { - return /^v?([\d.]+-\w+)-(\d+)-g(\w+)-?(\w+)*/g; - } - - static get descriptionRegex3() { - return /^v?([\d.]+-\w+\.\d+)-(\d+)-g(\w+)-?(\w+)*/g; - } - - static async determineBuildVersion(strategy: string, inputVersion: string) { + static async determineBuildVersion(strategy: string, inputVersion: string): Promise { // Validate input if (!Object.hasOwnProperty.call(this.strategies, strategy)) { throw new ValidationError(`Versioning strategy should be one of ${Object.values(this.strategies).join(', ')}.`); } - let version; switch (strategy) { case this.strategies.None: - version = 'none'; - break; + return 'none'; case this.strategies.Custom: - version = inputVersion; - break; + return inputVersion; case this.strategies.Semantic: - version = await this.generateSemanticVersion(); - break; + return await this.generateSemanticVersion(); case this.strategies.Tag: - version = await this.generateTagVersion(); - break; + return await this.generateTagVersion(); default: throw new NotImplementedException(`Strategy ${strategy} is not implemented.`); } - - return version; } /** @@ -132,7 +112,7 @@ export default class Versioning { await this.logDiff(); - if ((await this.isDirty()) && !this.isDirtyAllowed) { + if ((await this.isDirty()) && !Input.allowDirtyBuild) { throw new Error('Branch is dirty. Refusing to base semantic version on uncommitted changes'); } @@ -180,19 +160,9 @@ export default class Versioning { */ static async parseSemanticVersion() { const description = await this.getVersionDescription(); - - try { - const [match, tag, commits, hash] = this.descriptionRegex1.exec(description) as RegExpExecArray; - - return { - match, - tag, - commits, - hash, - }; - } catch { + for (const descriptionRegex of Versioning.descriptionRegexes) { try { - const [match, tag, commits, hash] = this.descriptionRegex2.exec(description) as RegExpExecArray; + const [match, tag, commits, hash] = descriptionRegex.exec(description) as RegExpExecArray; return { match, @@ -201,24 +171,13 @@ export default class Versioning { hash, }; } catch { - try { - const [match, tag, commits, hash] = this.descriptionRegex3.exec(description) as RegExpExecArray; - - return { - match, - tag, - commits, - hash, - }; - } catch { - core.warning( - `Failed to parse git describe output or version can not be determined through: "${description}".`, - ); - - return false; - } + continue; } } + + core.warning(`Failed to parse git describe output or version can not be determined through: "${description}".`); + + return false; } /** @@ -255,7 +214,7 @@ export default class Versioning { * identifies the current commit. */ static async getVersionDescription() { - return this.git(['describe', '--long', '--tags', '--always', this.sha]); + return this.git(['describe', '--long', '--tags', '--always', this.sha!]); } /** @@ -288,7 +247,7 @@ export default class Versioning { static async hasAnyVersionTags() { const numberOfTagsAsString = await System.run('sh', undefined, { input: Buffer.from(`git tag --list --merged HEAD | grep -E '${this.grepCompatibleInputVersionRegex}' | wc -l`), - cwd: this.projectPath, + cwd: Input.projectPath, silent: false, }); @@ -303,7 +262,7 @@ export default class Versioning { * Note: HEAD should not be used, as it may be detached, resulting in an additional count. */ static async getTotalNumberOfCommits() { - const numberOfCommitsAsString = await this.git(['rev-list', '--count', this.sha]); + const numberOfCommitsAsString = await this.git(['rev-list', '--count', this.sha!]); return Number.parseInt(numberOfCommitsAsString, 10); } @@ -311,7 +270,7 @@ export default class Versioning { /** * Run git in the specified project path */ - static async git(arguments_, options = {}) { - return System.run('git', arguments_, { cwd: this.projectPath, ...options }, false); + static async git(arguments_: string[], options = {}) { + return System.run('git', arguments_, { cwd: Input.projectPath, ...options }, false); } } diff --git a/tsconfig.json b/tsconfig.json index e8c9118c..dbf06cb3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,12 @@ { "compilerOptions": { "experimentalDecorators": true, - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "outDir": "./lib" /* Redirect output structure to the directory. */, "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, "strict": true /* Enable all strict type-checking options. */, - "noImplicitAny": false /* Re-enable after fixing compatibility */ /* Raise error on expressions and declarations with an implied 'any' type. */, + "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ }, "exclude": ["node_modules", "dist"] diff --git a/yarn.lock b/yarn.lock index aee0be74..54729da1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,11 +84,6 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" -"@arkweid/lefthook@^0.7.7": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@arkweid/lefthook/-/lefthook-0.7.7.tgz#12951b09b955d8054885ffe929aa07a49f39027c" - integrity sha512-Eq30OXKmjxIAIsTtbX2fcF3SNZIXS8yry1u8yty7PQFYRctx04rVlhOJCEB2UmfTh8T2vrOMC9IHHUvvo5zbaQ== - "@azure/abort-controller@^1.0.0", "@azure/abort-controller@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249" @@ -193,6 +188,13 @@ events "^3.0.0" tslib "^2.2.0" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": version "7.12.13" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz" @@ -466,6 +468,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.18.6": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz" @@ -494,6 +501,15 @@ "@babel/traverse" "^7.17.0" "@babel/types" "^7.17.0" +"@babel/highlight@^7.10.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.12.13": version "7.13.10" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz" @@ -694,22 +710,53 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" -"@eslint/eslintrc@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" - integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== +"@deno/shim-deno-test@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@deno/shim-deno-test/-/shim-deno-test-0.3.3.tgz#2dd014a2649507477f904d0172dd88341354086d" + integrity sha512-Ge0Tnl7zZY0VvEfgsyLhjid8DzI1d0La0dgm+3m0/A8gZXgp5xwlyIyue5e4SCUuVB/3AH/0lun9LcJhhTwmbg== + +"@deno/shim-deno@~0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@deno/shim-deno/-/shim-deno-0.6.0.tgz#ed8486aaa020edd928d8799135317f2bc11910a2" + integrity sha512-f8JD7kwSX1pEMO+bCl/Ooi6ucJ1HHKlAbYw6Na1uFsPeF4iOPaVdc8AcxWO6bSSQ8MBKjELitJ3nG2euBO9kCA== + dependencies: + "@deno/shim-deno-test" "^0.3.2" + which "^2.0.2" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.19" minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@evilmartians/lefthook@^1.2.9": + version "1.2.9" + resolved "https://registry.yarnpkg.com/@evilmartians/lefthook/-/lefthook-1.2.9.tgz#2ca6d3326dbeb25f5e08075f62cb24555e4a77f1" + integrity sha512-Fn5HmnV6WgQUT6tfPUaq+yVUG4LyJU2q4m5D7DmwnXCzFpR3Sp0SOVUtraKKDveZP85D/N2Gdukk3KLLv+jFvg== + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -1208,6 +1255,11 @@ dependencies: "@babel/types" "^7.3.0" +"@types/base-64@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/base-64/-/base-64-1.0.0.tgz#de9c6070ea457fbd65a1b5ebf13976b3ac0bdad0" + integrity sha512-AvCJx/HrfYHmOQRFdVvgKMplXfzTUizmh0tz9GFTpDePWgCY4uoKll84zKlaRoeiYiCr7c9ZnqSTzkl0BUVD6g== + "@types/cacheable-request@^6.0.1": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" @@ -1426,6 +1478,11 @@ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== +"@types/uuid@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.0.tgz#53ef263e5239728b56096b0a869595135b7952d2" + integrity sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q== + "@types/ws@^6.0.1": version "6.0.4" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.4.tgz#7797707c8acce8f76d8c34b370d4645b70421ff1" @@ -1565,10 +1622,10 @@ "@typescript-eslint/types" "4.8.1" eslint-visitor-keys "^2.0.0" -"@vercel/ncc@^0.33.3": - version "0.33.3" - resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.33.3.tgz#aacc6b3ea9f7b175e0c9a18c9b97e4005a2f4fcc" - integrity sha512-JGZ11QV+/ZcfudW2Cz2JVp54/pJNXbsuWRgSh2ZmmZdQBKXqBtIGrwI1Wyx8nlbzAiEFe7FHi4K1zX4//jxTnQ== +"@vercel/ncc@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.36.1.tgz#d4c01fdbbe909d128d1bf11c7f8b5431654c5b95" + integrity sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw== "@yarnpkg/lockfile@^1.1.0": version "1.1.0" @@ -1576,9 +1633,9 @@ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== abort-controller@^3.0.0: version "3.0.0" @@ -1589,7 +1646,7 @@ abort-controller@^3.0.0: acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" @@ -1602,7 +1659,7 @@ acorn-jsx@^5.3.1: acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.1.1: @@ -1615,11 +1672,6 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0: - version "8.1.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz" - integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== - acorn@^8.2.4, acorn@^8.4.1: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" @@ -1761,7 +1813,7 @@ asn1@~0.2.3: assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== astral-regex@^2.0.0: version "2.0.0" @@ -1781,7 +1833,7 @@ async-wait-until@^2.0.12: asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== aws-sdk@^2.1081.0: version "2.1082.0" @@ -1801,12 +1853,12 @@ aws-sdk@^2.1081.0: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== babel-jest@^27.5.1: version "27.5.1" @@ -1913,7 +1965,7 @@ bash-path@^1.0.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" @@ -1939,7 +1991,7 @@ braces@^3.0.1: browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.14.5: @@ -1997,7 +2049,7 @@ byline@^5.0.0: resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= -cac@^6.6.1: +cac@6.7.12: version "6.7.12" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.12.tgz#6fb5ea2ff50bd01490dbda497f4ae75a99415193" integrity sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA== @@ -2074,7 +2126,7 @@ caniuse-lite@^1.0.30001312: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chalk@^2.0.0: version "2.4.2" @@ -2267,7 +2319,7 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== create-require@^1.1.0: version "1.1.1" @@ -2301,17 +2353,17 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: cssom@^0.4.4: version "0.4.4" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" @@ -2319,13 +2371,13 @@ cssstyle@^2.3.0: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-urls@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: abab "^2.0.3" @@ -2347,9 +2399,9 @@ debug@^2.6.9: ms "2.0.0" decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decompress-response@^3.3.0: version "3.3.0" @@ -2370,11 +2422,16 @@ dedent@^0.7.0: resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" @@ -2400,7 +2457,7 @@ define-properties@^1.1.3: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@^2.0.0: version "2.0.0" @@ -2451,7 +2508,7 @@ doctrine@^3.0.0: domexception@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: webidl-conversions "^5.0.0" @@ -2469,7 +2526,7 @@ each-parallel-async@^1.0.0: ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -2566,9 +2623,14 @@ escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" @@ -2720,29 +2782,32 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.17.0: - version "7.17.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" - integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== +eslint@^7.23.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.2" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" - esquery "^1.2.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.0" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -2750,7 +2815,7 @@ eslint@7.17.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -2759,7 +2824,7 @@ eslint@7.17.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -2777,13 +2842,20 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0, esquery@^1.3.1: +esquery@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" +esquery@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.2.tgz#c6d3fee05dd665808e2ad870631f221f5617b1d1" + integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" @@ -2796,14 +2868,19 @@ estraverse@^4.1.1: resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== event-target-shim@^5.0.0: @@ -2881,14 +2958,14 @@ extend@~3.0.2: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -2945,7 +3022,7 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -file-entry-cache@^6.0.0: +file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== @@ -3006,7 +3083,7 @@ flatted@^3.1.0: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^2.5.0: version "2.5.1" @@ -3126,11 +3203,11 @@ get-stream@^6.0.0: getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2: +glob-parent@^5.1.0, glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3154,12 +3231,12 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globby@^11.0.1: version "11.0.3" @@ -3236,7 +3313,7 @@ graceful-fs@^4.2.9: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" @@ -3280,7 +3357,7 @@ hosted-git-info@^2.1.4: html-encoding-sniffer@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: whatwg-encoding "^1.0.5" @@ -3307,7 +3384,7 @@ http-proxy-agent@^4.0.1: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -3336,7 +3413,7 @@ human-signals@^2.1.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -3513,7 +3590,7 @@ is-plain-object@^5.0.0: resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.0, is-potential-custom-element-name@^1.0.1: +is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== @@ -3546,7 +3623,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-windows@^1.0.1: version "1.0.2" @@ -3571,7 +3648,7 @@ isomorphic-ws@^4.0.1: isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0: version "3.0.0" @@ -3755,10 +3832,10 @@ jest-environment-node@^27.5.1: jest-mock "^27.5.1" jest-util "^27.5.1" -jest-fail-on-console@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/jest-fail-on-console/-/jest-fail-on-console-2.3.0.tgz#bf22af0e535512ec7e220223279e3fb7ae621b8b" - integrity sha512-RwTq79+v5OccU59VmhoTvsCyTQ11YeOtLL6xLtkks/H7afLay6gASk6a4qMlyLlpM36t0rPW+DQsJ4ZNcCS2ug== +jest-fail-on-console@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jest-fail-on-console/-/jest-fail-on-console-3.0.2.tgz#4ab3c5f1986702c1dfa099cbf303767818f6d916" + integrity sha512-8vpH03d9n41jKCF/rcQz/nf0ksK2hlnOXTY5VUMqliPHPfT9F7L9CYOyhFNSQ+o6Aszsuja0GAXt1jz6sfDM8w== dependencies: chalk "^4.1.0" @@ -4074,39 +4151,7 @@ js-yaml@^4.1.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^16.4.0: - version "16.5.3" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz" - integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== - dependencies: - abab "^2.0.5" - acorn "^8.1.0" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" - nwsapi "^2.2.0" - parse5 "6.0.1" - request "^2.88.2" - request-promise-native "^1.0.9" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.4" - xml-name-validator "^3.0.0" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsdom@^16.6.0: version "16.7.0" @@ -4189,7 +4234,7 @@ json-stream@^1.0.0: json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@2.x, json5@^2.1.2: version "2.2.3" @@ -4280,8 +4325,8 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4328,27 +4373,22 @@ lodash-es@^4.17.21: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4415,17 +4455,17 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.51.0" + mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" @@ -4506,14 +4546,7 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" -node-fetch@^2.6.1: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@~2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== @@ -4568,9 +4601,9 @@ npm-run-path@^4.0.1: path-key "^3.0.0" nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== oauth-sign@~0.9.0: version "0.9.0" @@ -4661,7 +4694,7 @@ openid-client@^4.1.1: optionator@^0.8.1: version "0.8.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -4787,7 +4820,7 @@ parse-json@^5.0.0, parse-json@^5.2.0: parse5@6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== path-exists@^3.0.0: @@ -4835,7 +4868,7 @@ path-type@^4.0.0: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^1.0.0: version "1.0.0" @@ -4890,8 +4923,8 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^2.0.0: version "2.0.0" @@ -4958,9 +4991,9 @@ pseudomap@^1.0.2: integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: version "3.0.0" @@ -4976,9 +5009,9 @@ punycode@1.3.2: integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== qs@^6.9.0: version "6.11.0" @@ -4997,6 +5030,11 @@ querystring@0.2.0: resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" @@ -5070,22 +5108,6 @@ regexpp@^3.0.0, regexpp@^3.1.0: resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" @@ -5122,6 +5144,11 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + reserved-words@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz" @@ -5243,7 +5270,7 @@ sax@>=0.6.0: saxes@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" @@ -5429,11 +5456,6 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - stream-buffers@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-3.0.2.tgz#5249005a8d5c2d00b3a32e6e0a6ea209dc4f3521" @@ -5456,6 +5478,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" @@ -5479,6 +5510,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" @@ -5549,7 +5587,7 @@ swagger-fluent@^5.0.3: symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== synp@^1.9.10: @@ -5567,20 +5605,16 @@ synp@^1.9.10: semver "^7.3.5" sort-object-keys "^1.1.3" -table@^6.0.4: - version "6.3.1" - resolved "https://registry.npmjs.org/table/-/table-6.3.1.tgz" - integrity sha512-kNpMVSN4fj9KY4G6tNDVIT59uaG8ZELGQ+cmFSqivmWkCXJLd00VfRmtyHa8X7AeM75PQ/6/TtEtWjTDs1jXJw== +table@^6.0.9: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - lodash.clonedeep "^4.5.0" - lodash.flatten "^4.4.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" - string-width "^4.2.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" tar@^6.1.11: version "6.1.11" @@ -5657,14 +5691,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tough-cookie@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" @@ -5675,25 +5701,34 @@ tough-cookie@^3.0.1: punycode "^2.1.1" tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-jest@^27.1.3: version "27.1.3" @@ -5757,7 +5792,7 @@ tsutils@^3.17.1: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" @@ -5769,7 +5804,7 @@ tunnel@0.0.6, tunnel@^0.0.6: tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -5780,8 +5815,8 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -5790,6 +5825,11 @@ type-detect@4.0.8: resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" @@ -5832,24 +5872,24 @@ underscore@^1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.2.tgz#276cea1e8b9722a8dbed0100a407dda572125881" integrity sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g== -unity-changeset@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/unity-changeset/-/unity-changeset-1.6.0.tgz#b2a3cab1350b10669cb53341ce562f3b93f38ddf" - integrity sha512-ke90Zhr2C5q2SPvinDKTr1dwgAPI0R6kxcO7gHPgQXntbx/Ag8hR0xLwd9K6UR2ykGFmDnUVjdbWfYlkhX8tFQ== +unity-changeset@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unity-changeset/-/unity-changeset-2.0.0.tgz#cd529f2120f27a8ed9eb639332c71f39a57eeabf" + integrity sha512-bGcuQIbo5oD17Paey+Y/SM33haJ5Wbp/9+qi8tdXSIWD19mbLfYz1RwpeduDLwEIEFyNlfMq206vGx+lGacZJg== dependencies: - cac "^6.6.1" - jsdom "^16.4.0" - node-fetch "^2.6.1" + "@deno/shim-deno" "~0.6.0" + cac "6.7.12" + node-fetch "~2.6.7" universal-user-agent@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" @@ -5875,6 +5915,14 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + url@0.10.3: version "0.10.3" resolved "https://registry.npmjs.org/url/-/url-0.10.3.tgz" @@ -5923,7 +5971,7 @@ validate-npm-package-license@^3.0.1: verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -5931,14 +5979,14 @@ verror@1.10.0: w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: xml-name-validator "^3.0.0" @@ -5953,45 +6001,45 @@ walker@^1.0.7: webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== whatwg-encoding@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" - tr46 "^2.0.2" + tr46 "^2.1.0" webidl-conversions "^6.1.0" which-boxed-primitive@^1.0.2: @@ -6012,7 +6060,7 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -6055,7 +6103,7 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -ws@^7.2.3, ws@^7.4.4: +ws@^7.2.3: version "7.5.6" resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz" integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== @@ -6067,7 +6115,7 @@ ws@^7.3.1, ws@^7.4.6: xml-name-validator@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xml2js@0.4.19: @@ -6098,7 +6146,7 @@ xmlbuilder@~9.0.1: xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== y18n@^5.0.5: