diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..0693936
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,6 @@
+# Ignore list
+/*
+
+# Do not ignore these folders:
+!__tests__/
+!src/
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..c78ea5a
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,49 @@
+module.exports = {
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:eslint-plugin-jest/recommended',
+ 'eslint-config-prettier'
+ ],
+ parser: '@typescript-eslint/parser',
+ plugins: ['@typescript-eslint', 'eslint-plugin-jest'],
+ rules: {
+ '@typescript-eslint/no-require-imports': 'error',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/ban-ts-comment': [
+ 'error',
+ {
+ 'ts-ignore': 'allow-with-description'
+ }
+ ],
+ 'no-console': 'error',
+ 'yoda': 'error',
+ 'prefer-const': [
+ 'error',
+ {
+ destructuring: 'all'
+ }
+ ],
+ 'no-control-regex': 'off',
+ 'no-constant-condition': ['error', {checkLoops: false}]
+ },
+ overrides: [
+ {
+ files: ['**/*{test,spec}.ts'],
+ rules: {
+ '@typescript-eslint/no-unused-vars': 'off',
+ 'jest/no-standalone-expect': 'off',
+ 'jest/no-conditional-expect': 'off',
+ 'no-console': 'off',
+
+ }
+ }
+ ],
+ env: {
+ node: true,
+ es6: true,
+ 'jest/globals': true
+ }
+};
diff --git a/.gitattributes b/.gitattributes
index f6ac05f..0fe3b2d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
+* text=auto eol=lf
.licenses/** -diff linguist-generated=true
diff --git a/.github/workflows/basic-validation.yml b/.github/workflows/basic-validation.yml
index 5e5029a..a4b1c0f 100644
--- a/.github/workflows/basic-validation.yml
+++ b/.github/workflows/basic-validation.yml
@@ -14,4 +14,4 @@ on:
jobs:
call-basic-validation:
name: Basic validation
- uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main
\ No newline at end of file
+ uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main
diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml
index 1251c11..c952291 100644
--- a/.github/workflows/check-dist.yml
+++ b/.github/workflows/check-dist.yml
@@ -14,4 +14,4 @@ on:
jobs:
call-check-dist:
name: Check dist/
- uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
\ No newline at end of file
+ uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index f1f430a..7a82612 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -2,13 +2,13 @@ name: CodeQL analysis
on:
push:
- branches: [ main ]
+ branches: [main]
pull_request:
- branches: [ main ]
+ branches: [main]
schedule:
- cron: '0 3 * * 0'
jobs:
call-codeQL-analysis:
- name: CodeQL analysis
- uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main
\ No newline at end of file
+ name: CodeQL analysis
+ uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main
diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml
index b6cda4c..1be4173 100644
--- a/.github/workflows/e2e-tests.yml
+++ b/.github/workflows/e2e-tests.yml
@@ -192,83 +192,83 @@ jobs:
run: __tests__/verify-dotnet.ps1 2.2 3.1
test-setup-with-dotnet-quality:
- runs-on: ${{ matrix.operating-system }}
- strategy:
- fail-fast: false
- matrix:
- operating-system: [ubuntu-latest, windows-latest, macOS-latest]
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Clear toolcache
- shell: pwsh
- run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
-
- - name: Setup dotnet 7.0 with preview quality
- uses: ./
- with:
- dotnet-version: "7.0"
- dotnet-quality: "preview"
- - name: Verify preview version
- shell: pwsh
- run: |
- $version = & dotnet --version
- Write-Host "Installed version: $version"
- if (-not ($version.Contains("preview") -or $version.Contains("rc"))) { throw "Unexpected version" }
-
+ runs-on: ${{ matrix.operating-system }}
+ strategy:
+ fail-fast: false
+ matrix:
+ operating-system: [ubuntu-latest, windows-latest, macOS-latest]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: Clear toolcache
+ shell: pwsh
+ run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
+
+ - name: Setup dotnet 7.0 with preview quality
+ uses: ./
+ with:
+ dotnet-version: '7.0'
+ dotnet-quality: 'preview'
+ - name: Verify preview version
+ shell: pwsh
+ run: |
+ $version = & dotnet --version
+ Write-Host "Installed version: $version"
+ if (-not ($version.Contains("preview") -or $version.Contains("rc"))) { throw "Unexpected version" }
+
test-dotnet-version-output-during-single-version-installation:
- runs-on: ${{ matrix.operating-system }}
- strategy:
- fail-fast: false
- matrix:
- operating-system: [ubuntu-latest, windows-latest, macOS-latest]
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Clear toolcache
- shell: pwsh
- run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
-
- - name: Setup dotnet 6.0.401
- uses: ./
- id: step1
- with:
- dotnet-version: "6.0.401"
+ runs-on: ${{ matrix.operating-system }}
+ strategy:
+ fail-fast: false
+ matrix:
+ operating-system: [ubuntu-latest, windows-latest, macOS-latest]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: Clear toolcache
+ shell: pwsh
+ run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
+
+ - name: Setup dotnet 6.0.401
+ uses: ./
+ id: step1
+ with:
+ dotnet-version: '6.0.401'
+
+ - name: Verify value of the dotnet-version output
+ shell: pwsh
+ run: |
+ $version = & dotnet --version
+ Write-Host "Installed version: $version"
+ if (-not ($version -eq '${{steps.step1.outputs.dotnet-version}}')) { throw "Unexpected output value" }
- - name: Verify value of the dotnet-version output
- shell: pwsh
- run: |
- $version = & dotnet --version
- Write-Host "Installed version: $version"
- if (-not ($version -eq '${{steps.step1.outputs.dotnet-version}}')) { throw "Unexpected output value" }
-
test-dotnet-version-output-during-multiple-version-installation:
- runs-on: ${{ matrix.operating-system }}
- strategy:
- fail-fast: false
- matrix:
- operating-system: [ubuntu-latest, windows-latest, macOS-latest]
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Clear toolcache
- shell: pwsh
- run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
-
- - name: Setup dotnet 6.0.401, 5.0.408, 7.0.100-rc.1.22431.12
- uses: ./
- id: step2
- with:
- dotnet-version: |
- 7.0.100-rc.1.22431.12
- 6.0.401
- 5.0.408
+ runs-on: ${{ matrix.operating-system }}
+ strategy:
+ fail-fast: false
+ matrix:
+ operating-system: [ubuntu-latest, windows-latest, macOS-latest]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: Clear toolcache
+ shell: pwsh
+ run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
- - name: Verify value of the dotnet-version output
- shell: pwsh
- run: |
- $version = "7.0.100-rc.1.22431.12"
- if (-not ($version -eq '${{steps.step2.outputs.dotnet-version}}')) { throw "Unexpected output value" }
+ - name: Setup dotnet 6.0.401, 5.0.408, 7.0.100-rc.1.22431.12
+ uses: ./
+ id: step2
+ with:
+ dotnet-version: |
+ 7.0.100-rc.1.22431.12
+ 6.0.401
+ 5.0.408
+
+ - name: Verify value of the dotnet-version output
+ shell: pwsh
+ run: |
+ $version = "7.0.100-rc.1.22431.12"
+ if (-not ($version -eq '${{steps.step2.outputs.dotnet-version}}')) { throw "Unexpected output value" }
test-proxy:
runs-on: ubuntu-latest
@@ -320,4 +320,4 @@ jobs:
env:
NUGET_AUTH_TOKEN: NOTATOKEN
- name: Verify dotnet
- run: __tests__/verify-dotnet.sh 3.1.201
\ No newline at end of file
+ run: __tests__/verify-dotnet.sh 3.1.201
diff --git a/.github/workflows/licensed.yml b/.github/workflows/licensed.yml
index 42084b2..37f1560 100644
--- a/.github/workflows/licensed.yml
+++ b/.github/workflows/licensed.yml
@@ -12,4 +12,4 @@ on:
jobs:
call-licensed:
name: Licensed
- uses: actions/reusable-workflows/.github/workflows/licensed.yml@main
\ No newline at end of file
+ uses: actions/reusable-workflows/.github/workflows/licensed.yml@main
diff --git a/.github/workflows/release-new-action-version.yml b/.github/workflows/release-new-action-version.yml
index bd5b8da..e584e46 100644
--- a/.github/workflows/release-new-action-version.yml
+++ b/.github/workflows/release-new-action-version.yml
@@ -21,9 +21,9 @@ jobs:
name: releaseNewActionVersion
runs-on: ubuntu-latest
steps:
- - name: Update the ${{ env.TAG_NAME }} tag
- id: update-major-tag
- uses: actions/publish-action@v0.2.2
- with:
- source-tag: ${{ env.TAG_NAME }}
- slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
+ - name: Update the ${{ env.TAG_NAME }} tag
+ id: update-major-tag
+ uses: actions/publish-action@v0.2.2
+ with:
+ source-tag: ${{ env.TAG_NAME }}
+ slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
diff --git a/.github/workflows/test-dotnet.yml b/.github/workflows/test-dotnet.yml
index aea26b3..0b37d28 100644
--- a/.github/workflows/test-dotnet.yml
+++ b/.github/workflows/test-dotnet.yml
@@ -34,4 +34,4 @@ jobs:
run: |
$version = & dotnet --version
Write-Host "Installed version: $version"
- if (-not $version.StartsWith("${{ matrix.dotnet-version }}")) { throw "Unexpected version" }
\ No newline at end of file
+ if (-not $version.StartsWith("${{ matrix.dotnet-version }}")) { throw "Unexpected version" }
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 1bda9c1..610a0bf 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -2,3 +2,4 @@
. "$(dirname -- "$0")/_/husky.sh"
npm run format
+npm run lint:fix
diff --git a/.husky/pre-push b/.husky/pre-push
index 1dc0f9b..42e17da 100755
--- a/.husky/pre-push
+++ b/.husky/pre-push
@@ -3,3 +3,4 @@
# Tests are not run at push time since they can take 2-4 minutes to complete
npm run format-check
+npm run lint
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..a3c81cb
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,7 @@
+# Ignore list
+/*
+
+# Do not ignore these folders:
+!__tests__/
+!.github/
+!src/
\ No newline at end of file
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 0000000..d7133c7
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,10 @@
+module.exports = {
+ printWidth: 80,
+ tabWidth: 2,
+ useTabs: false,
+ semi: true,
+ singleQuote: true,
+ trailingComma: 'none',
+ bracketSpacing: false,
+ arrowParens: 'avoid'
+};
diff --git a/.prettierrc.json b/.prettierrc.json
deleted file mode 100644
index ca09262..0000000
--- a/.prettierrc.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "printWidth": 80,
- "tabWidth": 2,
- "useTabs": false,
- "semi": true,
- "singleQuote": true,
- "trailingComma": "none",
- "bracketSpacing": false,
- "arrowParens": "avoid",
- "parser": "typescript",
- "endOfLine": "auto"
- }
\ No newline at end of file
diff --git a/__tests__/authutil.test.ts b/__tests__/authutil.test.ts
index 595682e..d9a0b7a 100644
--- a/__tests__/authutil.test.ts
+++ b/__tests__/authutil.test.ts
@@ -1,336 +1,336 @@
-import * as io from '@actions/io';
-import fs from 'fs';
-import path from 'path';
-
-const fakeSourcesDirForTesting = path.join(
- __dirname,
- 'runner',
- path.join(Math.random().toString(36).substring(7)),
- 's'
-);
-
-const invalidNuGetConfig: string = ``;
-
-const emptyNuGetConfig: string = `
-
-`;
-
-const nugetorgNuGetConfig: string = `
-
-
-
-
-`;
-
-const gprnugetorgNuGetConfig: string = `
-
-
-
-
-
-`;
-
-const gprNuGetConfig: string = `
-
-
-
-
-`;
-
-const twogprNuGetConfig: string = `
-
-
-
-
-
-`;
-
-const spaceNuGetConfig: string = `
-
-
-
-
-`;
-
-const azureartifactsNuGetConfig: string = `
-
-
-
-
-`;
-
-const azureartifactsnugetorgNuGetConfig: string = `
-
-
-
-
-
-`;
-
-// We want a NuGet.config one level above the sources directory, so it doesn't trample a user's NuGet.config but is still picked up by NuGet/dotnet.
-const nugetConfigFile = path.join(fakeSourcesDirForTesting, '../nuget.config');
-
-process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo';
-import * as auth from '../src/authutil';
-
-describe('authutil tests', () => {
- beforeEach(async () => {
- await io.rmRF(fakeSourcesDirForTesting);
- await io.mkdirP(fakeSourcesDirForTesting);
- }, 30000);
-
- afterAll(async () => {
- await io.rmRF(fakeSourcesDirForTesting);
- }, 30000);
-
- beforeEach(() => {
- if (fs.existsSync(nugetConfigFile)) {
- fs.unlinkSync(nugetConfigFile);
- }
- process.env['INPUT_OWNER'] = '';
- process.env['NUGET_AUTH_TOKEN'] = '';
- });
-
- it('No existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('No existing config, auth token environment variable not provided, throws', async () => {
- let thrown = false;
- try {
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- } catch {
- thrown = true;
- }
- expect(thrown).toBe(true);
- });
-
- it('No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- process.env['INPUT_OWNER'] = 'otherorg';
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/otherorg/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config (invalid), tries to parse an invalid NuGet.config and throws', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig);
- let thrown = false;
- try {
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- } catch {
- thrown = true;
- }
- expect(thrown).toBe(true);
- });
-
- it('Existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig);
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig);
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig);
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig);
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config w/ spaces in key, throws for now', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig);
- let thrown = false;
- try {
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- '',
- fakeSourcesDirForTesting
- );
- } catch {
- thrown = true;
- }
- expect(thrown).toBe(true);
- });
-
- it('Existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigDirectory: string = path.join(
- fakeSourcesDirForTesting,
- 'subfolder'
- );
- const inputNuGetConfigPath: string = path.join(
- inputNuGetConfigDirectory,
- 'nuget.config'
- );
- fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true});
- fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
- await auth.configAuthentication(
- 'https://nuget.pkg.github.com/OwnerName/index.json',
- 'subfolder/nuget.config',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig);
- await auth.configAuthentication(
- 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('Existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- const inputNuGetConfigPath: string = path.join(
- fakeSourcesDirForTesting,
- 'nuget.config'
- );
- fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig);
- await auth.configAuthentication(
- 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-
- it('No existing config, sets up a full NuGet.config with URL and token for other source', async () => {
- process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
- await auth.configAuthentication(
- 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
- '',
- fakeSourcesDirForTesting
- );
- expect(fs.existsSync(nugetConfigFile)).toBe(true);
- expect(
- fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
- ).toMatchSnapshot();
- });
-});
+import * as io from '@actions/io';
+import fs from 'fs';
+import path from 'path';
+
+const fakeSourcesDirForTesting = path.join(
+ __dirname,
+ 'runner',
+ path.join(Math.random().toString(36).substring(7)),
+ 's'
+);
+
+const invalidNuGetConfig = ``;
+
+const emptyNuGetConfig = `
+
+`;
+
+const nugetorgNuGetConfig = `
+
+
+
+
+`;
+
+const gprnugetorgNuGetConfig = `
+
+
+
+
+
+`;
+
+const gprNuGetConfig = `
+
+
+
+
+`;
+
+const twogprNuGetConfig = `
+
+
+
+
+
+`;
+
+const spaceNuGetConfig = `
+
+
+
+
+`;
+
+const azureartifactsNuGetConfig = `
+
+
+
+
+`;
+
+const azureartifactsnugetorgNuGetConfig = `
+
+
+
+
+
+`;
+
+// We want a NuGet.config one level above the sources directory, so it doesn't trample a user's NuGet.config but is still picked up by NuGet/dotnet.
+const nugetConfigFile = path.join(fakeSourcesDirForTesting, '../nuget.config');
+
+process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo';
+import * as auth from '../src/authutil';
+
+describe('authutil tests', () => {
+ beforeEach(async () => {
+ await io.rmRF(fakeSourcesDirForTesting);
+ await io.mkdirP(fakeSourcesDirForTesting);
+ }, 30000);
+
+ afterAll(async () => {
+ await io.rmRF(fakeSourcesDirForTesting);
+ }, 30000);
+
+ beforeEach(() => {
+ if (fs.existsSync(nugetConfigFile)) {
+ fs.unlinkSync(nugetConfigFile);
+ }
+ process.env['INPUT_OWNER'] = '';
+ process.env['NUGET_AUTH_TOKEN'] = '';
+ });
+
+ it('No existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('No existing config, auth token environment variable not provided, throws', async () => {
+ let thrown = false;
+ try {
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ } catch {
+ thrown = true;
+ }
+ expect(thrown).toBe(true);
+ });
+
+ it('No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ process.env['INPUT_OWNER'] = 'otherorg';
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/otherorg/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config (invalid), tries to parse an invalid NuGet.config and throws', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig);
+ let thrown = false;
+ try {
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ } catch {
+ thrown = true;
+ }
+ expect(thrown).toBe(true);
+ });
+
+ it('Existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig);
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig);
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig);
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig);
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config w/ spaces in key, throws for now', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig);
+ let thrown = false;
+ try {
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ } catch {
+ thrown = true;
+ }
+ expect(thrown).toBe(true);
+ });
+
+ it('Existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigDirectory: string = path.join(
+ fakeSourcesDirForTesting,
+ 'subfolder'
+ );
+ const inputNuGetConfigPath: string = path.join(
+ inputNuGetConfigDirectory,
+ 'nuget.config'
+ );
+ fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true});
+ fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
+ await auth.configAuthentication(
+ 'https://nuget.pkg.github.com/OwnerName/index.json',
+ 'subfolder/nuget.config',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig);
+ await auth.configAuthentication(
+ 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('Existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ const inputNuGetConfigPath: string = path.join(
+ fakeSourcesDirForTesting,
+ 'nuget.config'
+ );
+ fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig);
+ await auth.configAuthentication(
+ 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+
+ it('No existing config, sets up a full NuGet.config with URL and token for other source', async () => {
+ process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
+ await auth.configAuthentication(
+ 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
+ '',
+ fakeSourcesDirForTesting
+ );
+ expect(fs.existsSync(nugetConfigFile)).toBe(true);
+ expect(
+ fs.readFileSync(nugetConfigFile, {encoding: 'utf8'})
+ ).toMatchSnapshot();
+ });
+});
diff --git a/__tests__/csc.test.ts b/__tests__/csc.test.ts
index 6862f78..85433b7 100644
--- a/__tests__/csc.test.ts
+++ b/__tests__/csc.test.ts
@@ -1,19 +1,19 @@
+import cscFile from '../.github/csc.json';
describe('csc tests', () => {
it('Valid regular expression', async () => {
- var cscFile = require('../.github/csc.json');
- var regex = cscFile['problemMatcher'][0]['pattern'][0]['regexp'];
+ const regex = cscFile['problemMatcher'][0]['pattern'][0]['regexp'];
console.log(regex);
- var re = new RegExp(regex);
+ const re = new RegExp(regex);
// Ideally we would verify that this
- var stringsToMatch = [
+ const stringsToMatch = [
'Program.cs(10,79): error CS1002: ; expected [/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj]',
"S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs(33,7): error CS1003: Syntax error, ',' expected [S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop]"
];
stringsToMatch.forEach(string => {
- var matchStr = string.match(re);
+ const matchStr = string.match(re);
console.log(matchStr);
expect(matchStr).toEqual(expect.anything());
});
diff --git a/__tests__/installer.test.ts b/__tests__/installer.test.ts
index 79a90c3..1a7e024 100644
--- a/__tests__/installer.test.ts
+++ b/__tests__/installer.test.ts
@@ -68,8 +68,8 @@ describe('DotnetCoreInstaller tests', () => {
expect(fs.existsSync(path.join(toolDir, 'dotnet'))).toBe(true);
}
- expect(process.env.DOTNET_ROOT).toBeDefined;
- expect(process.env.PATH).toBeDefined;
+ expect(process.env.DOTNET_ROOT).toBeDefined();
+ expect(process.env.PATH).toBeDefined();
expect(process.env.DOTNET_ROOT).toBe(toolDir);
expect(process.env.PATH?.startsWith(toolDir)).toBe(true);
}, 600000);
@@ -83,15 +83,15 @@ describe('DotnetCoreInstaller tests', () => {
expect(fs.existsSync(path.join(toolDir, 'dotnet'))).toBe(true);
}
- expect(process.env.DOTNET_ROOT).toBeDefined;
- expect(process.env.PATH).toBeDefined;
+ expect(process.env.DOTNET_ROOT).toBeDefined();
+ expect(process.env.PATH).toBeDefined();
expect(process.env.DOTNET_ROOT).toBe(toolDir);
expect(process.env.PATH?.startsWith(toolDir)).toBe(true);
}, 600000); //This needs some time to download on "slower" internet connections
it('Acquires generic version of dotnet if no matching version is installed', async () => {
await getDotnet('3.1');
- var directory = fs
+ const directory = fs
.readdirSync(path.join(toolDir, 'sdk'))
.filter(fn => fn.startsWith('3.1.'));
expect(directory.length > 0).toBe(true);
@@ -101,17 +101,16 @@ describe('DotnetCoreInstaller tests', () => {
expect(fs.existsSync(path.join(toolDir, 'dotnet'))).toBe(true);
}
- expect(process.env.DOTNET_ROOT).toBeDefined;
- expect(process.env.PATH).toBeDefined;
+ expect(process.env.DOTNET_ROOT).toBeDefined();
+ expect(process.env.PATH).toBeDefined();
expect(process.env.DOTNET_ROOT).toBe(toolDir);
expect(process.env.PATH?.startsWith(toolDir)).toBe(true);
}, 600000); //This needs some time to download on "slower" internet connections
it('Returns string with installed SDK version', async () => {
const version = '3.1.120';
- let installedVersion: string;
- installedVersion = await getDotnet(version);
+ const installedVersion = await getDotnet(version);
expect(installedVersion).toBe('3.1.120');
}, 600000);
@@ -143,7 +142,7 @@ describe('DotnetCoreInstaller tests', () => {
}, 30000);
it('Uses an up to date powershell download script', async () => {
- var httpCallbackClient = new hc.HttpClient('setup-dotnet-test', [], {
+ const httpCallbackClient = new hc.HttpClient('setup-dotnet-test', [], {
allowRetries: true,
maxRetries: 3
});
@@ -180,7 +179,7 @@ describe('DotnetVersionResolver tests', () => {
);
const versionObject = await dotnetVersionResolver.createDotNetVersion();
- expect(!!versionObject.value).toBeTruthy;
+ expect(!!versionObject.value).toBe(true);
}
);
@@ -223,15 +222,27 @@ describe('DotnetVersionResolver tests', () => {
);
each(['3.1', '3.1.x', '3.1.*', '3.1.X']).test(
- "if version: '%s' that can be resolved to 'channel' option is supplied, it should set quality flag to 'true' and type to 'channel' in version object",
+ "if version: '%s' that can be resolved to 'channel' option is supplied, it should set type to 'channel' in version object",
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject = await dotnetVersionResolver.createDotNetVersion();
- expect(versionObject.type.toLowerCase().includes('channel')).toBeTruthy;
- expect(versionObject.qualityFlag).toBeTruthy;
+ expect(versionObject.type.toLowerCase().includes('channel')).toBe(true);
+ }
+ );
+
+ each(['6.0', '6.0.x', '6.0.*', '6.0.X']).test(
+ "if version: '%s' that can be resolved to 'channel' option is supplied and its major tag is >= 6, it should set type to 'channel' and qualityFlag to 'true' in version object",
+ async version => {
+ const dotnetVersionResolver = new installer.DotnetVersionResolver(
+ version
+ );
+ const versionObject = await dotnetVersionResolver.createDotNetVersion();
+
+ expect(versionObject.type.toLowerCase().includes('channel')).toBe(true);
+ expect(versionObject.qualityFlag).toBe(true);
}
);
@@ -243,8 +254,8 @@ describe('DotnetVersionResolver tests', () => {
);
const versionObject = await dotnetVersionResolver.createDotNetVersion();
- expect(versionObject.type.toLowerCase().includes('version')).toBeTruthy;
- expect(versionObject.qualityFlag).toBeFalsy;
+ expect(versionObject.type.toLowerCase().includes('version')).toBe(true);
+ expect(versionObject.qualityFlag).toBe(false);
}
);
@@ -259,11 +270,11 @@ describe('DotnetVersionResolver tests', () => {
const nonWindowsRegEx = new RegExp(/^--[vc]/);
if (IS_WINDOWS) {
- expect(windowsRegEx.test(versionObject.type)).toBeTruthy;
- expect(nonWindowsRegEx.test(versionObject.type)).toBeFalsy;
+ expect(windowsRegEx.test(versionObject.type)).toBe(true);
+ expect(nonWindowsRegEx.test(versionObject.type)).toBe(false);
} else {
- expect(nonWindowsRegEx.test(versionObject.type)).toBeTruthy;
- expect(windowsRegEx.test(versionObject.type)).toBeFalsy;
+ expect(nonWindowsRegEx.test(versionObject.type)).toBe(true);
+ expect(windowsRegEx.test(versionObject.type)).toBe(false);
}
}
);
@@ -276,10 +287,7 @@ function normalizeFileContents(contents: string): string {
.replace(new RegExp('\r', 'g'), '\n');
}
-async function getDotnet(
- version: string,
- quality: string = ''
-): Promise {
+async function getDotnet(version: string, quality = ''): Promise {
const dotnetInstaller = new installer.DotnetCoreInstaller(
version,
quality as QualityOptions
diff --git a/__tests__/setup-dotnet.test.ts b/__tests__/setup-dotnet.test.ts
index 1b2e3cf..bf39881 100644
--- a/__tests__/setup-dotnet.test.ts
+++ b/__tests__/setup-dotnet.test.ts
@@ -21,11 +21,11 @@ if (IS_WINDOWS) {
const tempDir = path.join(__dirname, 'runner', 'temp2');
describe('setup-dotnet tests', () => {
- let getInputSpy = jest.spyOn(core, 'getInput');
- let getMultilineInputSpy = jest.spyOn(core, 'getMultilineInput');
- let setOutputSpy = jest.spyOn(core, 'setOutput');
+ const getInputSpy = jest.spyOn(core, 'getInput');
+ const getMultilineInputSpy = jest.spyOn(core, 'getMultilineInput');
+ const setOutputSpy = jest.spyOn(core, 'setOutput');
- let inputs = {} as any;
+ const inputs = {} as any;
beforeAll(async () => {
process.env.RUNNER_TOOL_CACHE = toolDir;
@@ -74,7 +74,7 @@ describe('setup-dotnet tests', () => {
await setup.run();
- expect(setOutputSpy).toBeCalledWith('dotnet-version', '6.0.401');
+ expect(setOutputSpy).toHaveBeenCalledWith('dotnet-version', '6.0.401');
}, 400000);
it("Sets output with the version specified in global.json, if it's present", async () => {
@@ -93,6 +93,6 @@ describe('setup-dotnet tests', () => {
await setup.run();
- expect(setOutputSpy).toBeCalledWith('dotnet-version', '3.0.103');
+ expect(setOutputSpy).toHaveBeenCalledWith('dotnet-version', '3.0.103');
}, 400000);
});
diff --git a/dist/index.js b/dist/index.js
index 4bc0ba8..bbe2c2b 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -45,7 +45,7 @@ function configAuthentication(feedUrl, existingFileLocation = '', processRoot =
}
exports.configAuthentication = configAuthentication;
function isValidKey(key) {
- return /^[\w\-\.]+$/i.test(key);
+ return /^[\w\-.]+$/i.test(key);
}
function getExistingNugetConfig(processRoot) {
const defaultConfigName = 'nuget.config';
@@ -60,9 +60,9 @@ function getExistingNugetConfig(processRoot) {
function writeFeedToFile(feedUrl, existingFileLocation, tempFileLocation) {
var _a, _b;
core.info(`dotnet-auth: Finding any source references in ${existingFileLocation}, writing a new temporary configuration file with credentials to ${tempFileLocation}`);
- let sourceKeys = [];
+ const sourceKeys = [];
let owner = core.getInput('owner');
- let sourceUrl = feedUrl;
+ const sourceUrl = feedUrl;
if (!owner) {
owner = github.context.repo.owner;
}
@@ -132,7 +132,7 @@ function writeFeedToFile(feedUrl, existingFileLocation, tempFileLocation) {
}
];
if (!sourceKeys.length) {
- let keystring = 'Source';
+ const keystring = 'Source';
xmlSource[1].configuration.push({
packageSources: [
{
@@ -300,9 +300,9 @@ class DotnetVersionResolver {
return __awaiter(this, void 0, void 0, function* () {
const response = yield httpClient.getJson(DotnetVersionResolver.DotNetCoreIndexUrl);
const result = response.result || {};
- let releasesInfo = result['releases-index'];
- let releaseInfo = releasesInfo.find(info => {
- let sdkParts = info['channel-version'].split('.');
+ const releasesInfo = result['releases-index'];
+ const releaseInfo = releasesInfo.find(info => {
+ const sdkParts = info['channel-version'].split('.');
return sdkParts[0] === versionParts[0];
});
if (!releaseInfo) {
@@ -408,8 +408,8 @@ class DotnetCoreInstaller {
outputDotnetVersion(version) {
return __awaiter(this, void 0, void 0, function* () {
const installationPath = process.env['DOTNET_INSTALL_DIR'];
- let versionsOnRunner = yield (0, promises_1.readdir)(path_1.default.join(installationPath.replace(/'/g, ''), 'sdk'));
- let installedVersion = semver_1.default.maxSatisfying(versionsOnRunner, version, {
+ const versionsOnRunner = yield (0, promises_1.readdir)(path_1.default.join(installationPath.replace(/'/g, ''), 'sdk'));
+ const installedVersion = semver_1.default.maxSatisfying(versionsOnRunner, version, {
includePrerelease: true
});
return installedVersion;
diff --git a/docs/contributors.md b/docs/contributors.md
index c0118f8..0141e97 100644
--- a/docs/contributors.md
+++ b/docs/contributors.md
@@ -61,6 +61,7 @@ Pull requests are the easiest way to contribute changes to git repos at GitHub.
- To implement new features or fix bugs, you need to make changes to the `.ts` files, which are located in the `src` folder
- To comply with the code style, **you need to run the `format` script**
+- To lint the code, **you need to run the `lint:fix` script**
- To transpile source code to `javascript` we use [NCC](https://github.com/vercel/ncc). **It is very important to run the `build` script after making changes**, otherwise your changes will not get into the final `javascript` build
**Learn more about how to implement tests:**
diff --git a/package-lock.json b/package-lock.json
index 423b394..903f687 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,11 +21,16 @@
"@types/jest": "^27.0.2",
"@types/node": "^16.11.25",
"@types/semver": "^6.2.2",
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
+ "@typescript-eslint/parser": "^5.54.0",
"@vercel/ncc": "^0.33.4",
+ "eslint": "^8.35.0",
+ "eslint-config-prettier": "^8.6.0",
+ "eslint-plugin-jest": "^27.2.1",
"husky": "^8.0.1",
"jest": "^27.2.5",
"jest-circus": "^27.2.5",
- "prettier": "^2.7.1",
+ "prettier": "^2.8.4",
"ts-jest": "^27.0.5",
"typescript": "^4.8.4",
"wget-improved": "^3.2.1"
@@ -647,6 +652,116 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
"dev": true
},
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
+ "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
+ "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -912,6 +1027,41 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/@octokit/endpoint": {
"version": "5.3.5",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.3.5.tgz",
@@ -1151,6 +1301,12 @@
"pretty-format": "^27.0.0"
}
},
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
"node_modules/@types/node": {
"version": "16.11.25",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.25.tgz",
@@ -1190,6 +1346,245 @@
"integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
"dev": true
},
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz",
+ "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/type-utils": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz",
+ "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
+ "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz",
+ "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz",
+ "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
+ "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz",
+ "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
+ "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.54.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@vercel/ncc": {
"version": "0.33.4",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz",
@@ -1206,9 +1601,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
- "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -1239,6 +1634,15 @@
"node": ">=0.4.0"
}
},
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
"node_modules/acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
@@ -1260,6 +1664,22 @@
"node": ">= 6.0.0"
}
},
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -1322,6 +1742,15 @@
"sprintf-js": "~1.0.2"
}
},
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -1724,9 +2153,9 @@
}
},
"node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -1799,6 +2228,30 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/domexception": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
@@ -1892,6 +2345,415 @@
"source-map": "~0.6.1"
}
},
+ "node_modules/eslint": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
+ "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^2.0.0",
+ "@eslint/js": "8.35.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.4.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
+ "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "27.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz",
+ "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.10.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.0.0",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-scope/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -1905,6 +2767,30 @@
"node": ">=4"
}
},
+ "node_modules/esquery": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+ "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
@@ -1978,6 +2864,40 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -2005,6 +2925,15 @@
"url": "https://paypal.me/naturalintelligence"
}
},
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
"node_modules/fb-watchman": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
@@ -2014,6 +2943,18 @@
"bser": "2.1.1"
}
},
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -2039,6 +2980,25 @@
"node": ">=8"
}
},
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
"node_modules/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
@@ -2137,6 +3097,18 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -2146,12 +3118,38 @@
"node": ">=4"
}
},
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
+ "node_modules/grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -2254,6 +3252,40 @@
"node": ">=0.10.0"
}
},
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/import-local": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
@@ -2319,6 +3351,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -2337,6 +3378,18 @@
"node": ">=6"
}
},
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -2346,6 +3399,15 @@
"node": ">=0.12.0"
}
},
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-potential-custom-element-name": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
@@ -3318,6 +4380,16 @@
}
}
},
+ "node_modules/js-sdsl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/js-sdsl"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3395,6 +4467,18 @@
"node": ">=4"
}
},
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -3461,6 +4545,12 @@
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
},
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
"node_modules/lodash.set": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
@@ -3527,6 +4617,15 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
@@ -3600,6 +4699,12 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
"node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -3791,6 +4896,18 @@
"node": ">=6"
}
},
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/parse5": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
@@ -3829,6 +4946,15 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/picocolors": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
@@ -3881,9 +5007,9 @@
}
},
"node_modules/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
+ "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@@ -3959,12 +5085,44 @@
"node": ">=6"
}
},
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
"dev": true
},
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -4008,6 +5166,16 @@
"node": ">=8"
}
},
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -4023,6 +5191,29 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -4205,6 +5396,18 @@
"node": ">=6"
}
},
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/strnum": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
@@ -4271,6 +5474,12 @@
"node": ">=8"
}
},
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
"node_modules/throat": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
@@ -4385,6 +5594,27 @@
"node": ">=10"
}
},
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
"node_modules/tunnel": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
@@ -4465,6 +5695,15 @@
"node": ">= 4.0.0"
}
},
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@@ -4719,6 +5958,18 @@
"engines": {
"node": ">=10"
}
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
},
"dependencies": {
@@ -5199,6 +6450,84 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
"dev": true
},
+ "@eslint/eslintrc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
+ "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
+ }
+ },
+ "@eslint/js": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
+ "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
+ "dev": true
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ }
+ },
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
"@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -5409,6 +6738,32 @@
"chalk": "^4.0.0"
}
},
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
"@octokit/endpoint": {
"version": "5.3.5",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.3.5.tgz",
@@ -5639,6 +6994,12 @@
"pretty-format": "^27.0.0"
}
},
+ "@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
"@types/node": {
"version": "16.11.25",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.25.tgz",
@@ -5678,6 +7039,144 @@
"integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
"dev": true
},
+ "@typescript-eslint/eslint-plugin": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz",
+ "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/type-utils": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz",
+ "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
+ "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz",
+ "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz",
+ "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
+ "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz",
+ "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "semver": "^7.3.7"
+ },
+ "dependencies": {
+ "@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
+ "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.54.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
"@vercel/ncc": {
"version": "0.33.4",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz",
@@ -5691,9 +7190,9 @@
"dev": true
},
"acorn": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
- "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
"dev": true
},
"acorn-globals": {
@@ -5714,6 +7213,13 @@
}
}
},
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
"acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
@@ -5729,6 +7235,18 @@
"debug": "4"
}
},
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
"ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -5773,6 +7291,12 @@
"sprintf-js": "~1.0.2"
}
},
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -6095,9 +7619,9 @@
}
},
"debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
@@ -6150,6 +7674,24 @@
"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
"dev": true
},
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"domexception": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
@@ -6218,12 +7760,311 @@
"source-map": "~0.6.1"
}
},
+ "eslint": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
+ "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^2.0.0",
+ "@eslint/js": "8.35.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.4.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
+ "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-jest": {
+ "version": "27.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz",
+ "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/utils": "^5.10.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
+ "esquery": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+ "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
@@ -6278,6 +8119,36 @@
}
}
},
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -6298,6 +8169,15 @@
"strnum": "^1.0.5"
}
},
+ "fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
"fb-watchman": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
@@ -6307,6 +8187,15 @@
"bser": "2.1.1"
}
},
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -6326,6 +8215,22 @@
"path-exists": "^4.0.0"
}
},
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
"form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
@@ -6396,18 +8301,47 @@
"path-is-absolute": "^1.0.0"
}
},
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
+ "grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -6480,6 +8414,30 @@
"safer-buffer": ">= 2.1.2 < 3"
}
},
+ "ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ }
+ }
+ },
"import-local": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
@@ -6530,6 +8488,12 @@
"has": "^1.0.3"
}
},
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -6542,12 +8506,27 @@
"integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
"dev": true
},
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
+ "is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true
+ },
"is-potential-custom-element-name": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
@@ -7292,6 +9271,12 @@
}
}
},
+ "js-sdsl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+ "dev": true
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -7349,6 +9334,18 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
"json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -7397,6 +9394,12 @@
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
},
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
"lodash.set": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
@@ -7451,6 +9454,12 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
"micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
@@ -7509,6 +9518,12 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
+ "natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -7655,6 +9670,15 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
"parse5": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
@@ -7684,6 +9708,12 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
"picocolors": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
@@ -7721,9 +9751,9 @@
"dev": true
},
"prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
+ "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
"dev": true
},
"pretty-format": {
@@ -7777,12 +9807,24 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
"dev": true
},
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -7814,6 +9856,12 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -7823,6 +9871,15 @@
"glob": "^7.1.3"
}
},
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -7965,6 +10022,12 @@
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true
},
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
"strnum": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
@@ -8016,6 +10079,12 @@
"minimatch": "^3.0.4"
}
},
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
"throat": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
@@ -8090,6 +10159,21 @@
}
}
},
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
"tunnel": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
@@ -8145,6 +10229,15 @@
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true
},
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
"uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@@ -8339,6 +10432,12 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index b1cd563..9bd5b5c 100644
--- a/package.json
+++ b/package.json
@@ -6,9 +6,10 @@
"main": "lib/setup-dotnet.js",
"scripts": {
"build": "tsc && ncc build",
- "format": "prettier --write **/*.ts",
- "format-check": "prettier --check **/*.ts",
- "lint": "echo \"Fake command that does nothing. It is used in reusable workflows\"",
+ "format": "prettier --no-error-on-unmatched-pattern --config ./.prettierrc.js --write **/*.{ts,yml,yaml}",
+ "format-check": "prettier --no-error-on-unmatched-pattern --config ./.prettierrc.js --check **/*.{ts,yml,yaml}",
+ "lint": "eslint --config ./.eslintrc.js **/*.ts",
+ "lint:fix": "eslint --config ./.eslintrc.js **/*.ts --fix",
"prepare": "husky install",
"test": "jest --coverage --config ./jest.config.js",
"update-installers": "nwget https://dot.net/v1/dotnet-install.ps1 -O externals/install-dotnet.ps1 && nwget https://dot.net/v1/dotnet-install.sh -O externals/install-dotnet.sh"
@@ -37,11 +38,16 @@
"@types/jest": "^27.0.2",
"@types/node": "^16.11.25",
"@types/semver": "^6.2.2",
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
+ "@typescript-eslint/parser": "^5.54.0",
"@vercel/ncc": "^0.33.4",
+ "eslint": "^8.35.0",
+ "eslint-config-prettier": "^8.6.0",
+ "eslint-plugin-jest": "^27.2.1",
"husky": "^8.0.1",
"jest": "^27.2.5",
"jest-circus": "^27.2.5",
- "prettier": "^2.7.1",
+ "prettier": "^2.8.4",
"ts-jest": "^27.0.5",
"typescript": "^4.8.4",
"wget-improved": "^3.2.1"
diff --git a/src/authutil.ts b/src/authutil.ts
index 56b8023..38829e0 100644
--- a/src/authutil.ts
+++ b/src/authutil.ts
@@ -1,196 +1,196 @@
-import * as fs from 'fs';
-import * as path from 'path';
-import * as core from '@actions/core';
-import * as github from '@actions/github';
-import {XMLParser, XMLBuilder} from 'fast-xml-parser';
-
-export function configAuthentication(
- feedUrl: string,
- existingFileLocation: string = '',
- processRoot: string = process.cwd()
-) {
- const existingNuGetConfig: string = path.resolve(
- processRoot,
- existingFileLocation === ''
- ? getExistingNugetConfig(processRoot)
- : existingFileLocation
- );
-
- const tempNuGetConfig: string = path.resolve(
- processRoot,
- '../',
- 'nuget.config'
- );
-
- writeFeedToFile(feedUrl, existingNuGetConfig, tempNuGetConfig);
-}
-
-function isValidKey(key: string): boolean {
- return /^[\w\-\.]+$/i.test(key);
-}
-
-function getExistingNugetConfig(processRoot: string) {
- const defaultConfigName = 'nuget.config';
- const configFileNames = fs
- .readdirSync(processRoot)
- .filter(filename => filename.toLowerCase() === defaultConfigName);
- if (configFileNames.length) {
- return configFileNames[0];
- }
- return defaultConfigName;
-}
-
-function writeFeedToFile(
- feedUrl: string,
- existingFileLocation: string,
- tempFileLocation: string
-) {
- core.info(
- `dotnet-auth: Finding any source references in ${existingFileLocation}, writing a new temporary configuration file with credentials to ${tempFileLocation}`
- );
- let sourceKeys: string[] = [];
- let owner: string = core.getInput('owner');
- let sourceUrl: string = feedUrl;
- if (!owner) {
- owner = github.context.repo.owner;
- }
-
- if (!process.env.NUGET_AUTH_TOKEN) {
- throw new Error(
- 'The NUGET_AUTH_TOKEN environment variable was not provided. In this step, add the following: \r\nenv:\r\n NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}'
- );
- }
-
- if (fs.existsSync(existingFileLocation)) {
- // get key from existing NuGet.config so NuGet/dotnet can match credentials
- const curContents: string = fs.readFileSync(existingFileLocation, 'utf8');
-
- const parserOptions = {
- ignoreAttributes: false
- };
- const parser = new XMLParser(parserOptions);
- const json = parser.parse(curContents);
-
- if (typeof json.configuration === 'undefined') {
- throw new Error(`The provided NuGet.config seems invalid.`);
- }
- if (json.configuration?.packageSources?.add) {
- const packageSources = json.configuration.packageSources.add;
-
- if (Array.isArray(packageSources)) {
- packageSources.forEach(source => {
- const value = source['@_value'];
- core.debug(`source '${value}'`);
- if (value.toLowerCase().includes(feedUrl.toLowerCase())) {
- const key = source['@_key'];
- sourceKeys.push(key);
- core.debug(`Found a URL with key ${key}`);
- }
- });
- } else {
- if (
- packageSources['@_value']
- .toLowerCase()
- .includes(feedUrl.toLowerCase())
- ) {
- const key = packageSources['@_key'];
- sourceKeys.push(key);
- core.debug(`Found a URL with key ${key}`);
- }
- }
- }
- }
-
- const xmlSource: any[] = [
- {
- '?xml': [
- {
- '#text': ''
- }
- ],
- ':@': {
- '@_version': '1.0'
- }
- },
- {
- configuration: [
- {
- config: [
- {
- add: [],
- ':@': {
- '@_key': 'defaultPushSource',
- '@_value': sourceUrl
- }
- }
- ]
- }
- ]
- }
- ];
-
- if (!sourceKeys.length) {
- let keystring = 'Source';
-
- xmlSource[1].configuration.push({
- packageSources: [
- {
- add: [],
- ':@': {
- '@_key': keystring,
- '@_value': sourceUrl
- }
- }
- ]
- });
-
- sourceKeys.push(keystring);
- }
-
- const packageSourceCredentials: any[] = [];
- sourceKeys.forEach(key => {
- if (!isValidKey(key)) {
- throw new Error(
- "Source name can contain letters, numbers, and '-', '_', '.' symbols only. Please, fix source name in NuGet.config and try again."
- );
- }
-
- packageSourceCredentials.push({
- [key]: [
- {
- add: [],
- ':@': {
- '@_key': 'Username',
- '@_value': owner
- }
- },
- {
- add: [],
- ':@': {
- '@_key': 'ClearTextPassword',
- '@_value': process.env.NUGET_AUTH_TOKEN
- }
- }
- ]
- });
- });
-
- xmlSource[1].configuration.push({
- packageSourceCredentials
- });
-
- const xmlBuilderOptions = {
- format: true,
- ignoreAttributes: false,
- preserveOrder: true,
- allowBooleanAttributes: true,
- suppressBooleanAttributes: true,
- suppressEmptyNode: true
- };
-
- const builder = new XMLBuilder(xmlBuilderOptions);
-
- const output = builder.build(xmlSource).trim();
-
- fs.writeFileSync(tempFileLocation, output);
-}
+import * as fs from 'fs';
+import * as path from 'path';
+import * as core from '@actions/core';
+import * as github from '@actions/github';
+import {XMLParser, XMLBuilder} from 'fast-xml-parser';
+
+export function configAuthentication(
+ feedUrl: string,
+ existingFileLocation = '',
+ processRoot: string = process.cwd()
+) {
+ const existingNuGetConfig: string = path.resolve(
+ processRoot,
+ existingFileLocation === ''
+ ? getExistingNugetConfig(processRoot)
+ : existingFileLocation
+ );
+
+ const tempNuGetConfig: string = path.resolve(
+ processRoot,
+ '../',
+ 'nuget.config'
+ );
+
+ writeFeedToFile(feedUrl, existingNuGetConfig, tempNuGetConfig);
+}
+
+function isValidKey(key: string): boolean {
+ return /^[\w\-.]+$/i.test(key);
+}
+
+function getExistingNugetConfig(processRoot: string) {
+ const defaultConfigName = 'nuget.config';
+ const configFileNames = fs
+ .readdirSync(processRoot)
+ .filter(filename => filename.toLowerCase() === defaultConfigName);
+ if (configFileNames.length) {
+ return configFileNames[0];
+ }
+ return defaultConfigName;
+}
+
+function writeFeedToFile(
+ feedUrl: string,
+ existingFileLocation: string,
+ tempFileLocation: string
+) {
+ core.info(
+ `dotnet-auth: Finding any source references in ${existingFileLocation}, writing a new temporary configuration file with credentials to ${tempFileLocation}`
+ );
+ const sourceKeys: string[] = [];
+ let owner: string = core.getInput('owner');
+ const sourceUrl: string = feedUrl;
+ if (!owner) {
+ owner = github.context.repo.owner;
+ }
+
+ if (!process.env.NUGET_AUTH_TOKEN) {
+ throw new Error(
+ 'The NUGET_AUTH_TOKEN environment variable was not provided. In this step, add the following: \r\nenv:\r\n NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}'
+ );
+ }
+
+ if (fs.existsSync(existingFileLocation)) {
+ // get key from existing NuGet.config so NuGet/dotnet can match credentials
+ const curContents: string = fs.readFileSync(existingFileLocation, 'utf8');
+
+ const parserOptions = {
+ ignoreAttributes: false
+ };
+ const parser = new XMLParser(parserOptions);
+ const json = parser.parse(curContents);
+
+ if (typeof json.configuration === 'undefined') {
+ throw new Error(`The provided NuGet.config seems invalid.`);
+ }
+ if (json.configuration?.packageSources?.add) {
+ const packageSources = json.configuration.packageSources.add;
+
+ if (Array.isArray(packageSources)) {
+ packageSources.forEach(source => {
+ const value = source['@_value'];
+ core.debug(`source '${value}'`);
+ if (value.toLowerCase().includes(feedUrl.toLowerCase())) {
+ const key = source['@_key'];
+ sourceKeys.push(key);
+ core.debug(`Found a URL with key ${key}`);
+ }
+ });
+ } else {
+ if (
+ packageSources['@_value']
+ .toLowerCase()
+ .includes(feedUrl.toLowerCase())
+ ) {
+ const key = packageSources['@_key'];
+ sourceKeys.push(key);
+ core.debug(`Found a URL with key ${key}`);
+ }
+ }
+ }
+ }
+
+ const xmlSource: any[] = [
+ {
+ '?xml': [
+ {
+ '#text': ''
+ }
+ ],
+ ':@': {
+ '@_version': '1.0'
+ }
+ },
+ {
+ configuration: [
+ {
+ config: [
+ {
+ add: [],
+ ':@': {
+ '@_key': 'defaultPushSource',
+ '@_value': sourceUrl
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ];
+
+ if (!sourceKeys.length) {
+ const keystring = 'Source';
+
+ xmlSource[1].configuration.push({
+ packageSources: [
+ {
+ add: [],
+ ':@': {
+ '@_key': keystring,
+ '@_value': sourceUrl
+ }
+ }
+ ]
+ });
+
+ sourceKeys.push(keystring);
+ }
+
+ const packageSourceCredentials: any[] = [];
+ sourceKeys.forEach(key => {
+ if (!isValidKey(key)) {
+ throw new Error(
+ "Source name can contain letters, numbers, and '-', '_', '.' symbols only. Please, fix source name in NuGet.config and try again."
+ );
+ }
+
+ packageSourceCredentials.push({
+ [key]: [
+ {
+ add: [],
+ ':@': {
+ '@_key': 'Username',
+ '@_value': owner
+ }
+ },
+ {
+ add: [],
+ ':@': {
+ '@_key': 'ClearTextPassword',
+ '@_value': process.env.NUGET_AUTH_TOKEN
+ }
+ }
+ ]
+ });
+ });
+
+ xmlSource[1].configuration.push({
+ packageSourceCredentials
+ });
+
+ const xmlBuilderOptions = {
+ format: true,
+ ignoreAttributes: false,
+ preserveOrder: true,
+ allowBooleanAttributes: true,
+ suppressBooleanAttributes: true,
+ suppressEmptyNode: true
+ };
+
+ const builder = new XMLBuilder(xmlBuilderOptions);
+
+ const output = builder.build(xmlSource).trim();
+
+ fs.writeFileSync(tempFileLocation, output);
+}
diff --git a/src/installer.ts b/src/installer.ts
index c25af51..ef9e993 100644
--- a/src/installer.ts
+++ b/src/installer.ts
@@ -1,265 +1,265 @@
-// Load tempDirectory before it gets wiped by tool-cache
-import * as core from '@actions/core';
-import * as exec from '@actions/exec';
-import * as io from '@actions/io';
-import * as hc from '@actions/http-client';
-import {chmodSync} from 'fs';
-import {readdir} from 'fs/promises';
-import path from 'path';
-import os from 'os';
-import semver from 'semver';
-import {IS_LINUX, IS_WINDOWS} from './utils';
-import {QualityOptions} from './setup-dotnet';
-
-export interface DotnetVersion {
- type: string;
- value: string;
- qualityFlag: boolean;
-}
-
-export class DotnetVersionResolver {
- private inputVersion: string;
- private resolvedArgument: DotnetVersion;
-
- constructor(version: string) {
- this.inputVersion = version.trim();
- this.resolvedArgument = {type: '', value: '', qualityFlag: false};
- }
-
- private async resolveVersionInput(): Promise {
- if (!semver.validRange(this.inputVersion)) {
- throw new Error(
- `'dotnet-version' was supplied in invalid format: ${this.inputVersion}! Supported syntax: A.B.C, A.B, A.B.x, A, A.x`
- );
- }
- if (semver.valid(this.inputVersion)) {
- this.resolvedArgument.type = 'version';
- this.resolvedArgument.value = this.inputVersion;
- } else {
- const [major, minor] = this.inputVersion.split('.');
-
- if (this.isNumericTag(major)) {
- this.resolvedArgument.type = 'channel';
- if (this.isNumericTag(minor)) {
- this.resolvedArgument.value = `${major}.${minor}`;
- } else {
- const httpClient = new hc.HttpClient('actions/setup-dotnet', [], {
- allowRetries: true,
- maxRetries: 3
- });
- this.resolvedArgument.value = await this.getLatestVersion(
- httpClient,
- [major, minor]
- );
- }
- }
- this.resolvedArgument.qualityFlag = +major >= 6 ? true : false;
- }
- }
-
- private isNumericTag(versionTag): boolean {
- return /^\d+$/.test(versionTag);
- }
-
- public async createDotNetVersion(): Promise<{
- type: string;
- value: string;
- qualityFlag: boolean;
- }> {
- await this.resolveVersionInput();
- if (!this.resolvedArgument.type) {
- return this.resolvedArgument;
- }
- if (IS_WINDOWS) {
- this.resolvedArgument.type =
- this.resolvedArgument.type === 'channel' ? '-Channel' : '-Version';
- } else {
- this.resolvedArgument.type =
- this.resolvedArgument.type === 'channel' ? '--channel' : '--version';
- }
- return this.resolvedArgument;
- }
-
- private async getLatestVersion(
- httpClient: hc.HttpClient,
- versionParts: string[]
- ): Promise {
- const response = await httpClient.getJson(
- DotnetVersionResolver.DotNetCoreIndexUrl
- );
- const result = response.result || {};
- let releasesInfo: any[] = result['releases-index'];
-
- let releaseInfo = releasesInfo.find(info => {
- let sdkParts: string[] = info['channel-version'].split('.');
- return sdkParts[0] === versionParts[0];
- });
-
- if (!releaseInfo) {
- throw new Error(
- `Could not find info for version ${versionParts.join('.')} at ${
- DotnetVersionResolver.DotNetCoreIndexUrl
- }`
- );
- }
-
- return releaseInfo['channel-version'];
- }
-
- static DotNetCoreIndexUrl: string =
- 'https://dotnetcli.azureedge.net/dotnet/release-metadata/releases-index.json';
-}
-
-export class DotnetCoreInstaller {
- private version: string;
- private quality: QualityOptions;
-
- static {
- const installationDirectoryWindows = path.join(
- process.env['PROGRAMFILES'] + '',
- 'dotnet'
- );
- const installationDirectoryLinux = '/usr/share/dotnet';
- const installationDirectoryMac = path.join(
- process.env['HOME'] + '',
- '.dotnet'
- );
- const dotnetInstallDir: string | undefined =
- process.env['DOTNET_INSTALL_DIR'];
- if (dotnetInstallDir) {
- process.env['DOTNET_INSTALL_DIR'] =
- this.convertInstallPathToAbsolute(dotnetInstallDir);
- } else {
- if (IS_WINDOWS) {
- process.env['DOTNET_INSTALL_DIR'] = installationDirectoryWindows;
- } else {
- process.env['DOTNET_INSTALL_DIR'] = IS_LINUX
- ? installationDirectoryLinux
- : installationDirectoryMac;
- }
- }
- }
-
- constructor(version: string, quality: QualityOptions) {
- this.version = version;
- this.quality = quality;
- }
-
- private static convertInstallPathToAbsolute(installDir: string): string {
- let transformedPath;
- if (path.isAbsolute(installDir)) {
- transformedPath = installDir;
- } else {
- transformedPath = installDir.startsWith('~')
- ? path.join(os.homedir(), installDir.slice(1))
- : (transformedPath = path.join(process.cwd(), installDir));
- }
- return path.normalize(transformedPath);
- }
-
- static addToPath() {
- core.addPath(process.env['DOTNET_INSTALL_DIR']!);
- core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']);
- }
-
- private setQuality(
- dotnetVersion: DotnetVersion,
- scriptArguments: string[]
- ): void {
- const option = IS_WINDOWS ? '-Quality' : '--quality';
- if (dotnetVersion.qualityFlag) {
- scriptArguments.push(option, this.quality);
- } else {
- core.warning(
- `'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A and A.x formats where the major tag is higher than 5. You specified: ${this.version}. 'dotnet-quality' input is ignored.`
- );
- }
- }
-
- public async installDotnet(): Promise {
- const windowsDefaultOptions = [
- '-NoLogo',
- '-Sta',
- '-NoProfile',
- '-NonInteractive',
- '-ExecutionPolicy',
- 'Unrestricted',
- '-Command'
- ];
- const scriptName = IS_WINDOWS ? 'install-dotnet.ps1' : 'install-dotnet.sh';
- const escapedScript = path
- .join(__dirname, '..', 'externals', scriptName)
- .replace(/'/g, "''");
- let scriptArguments: string[];
- let scriptPath = '';
-
- const versionResolver = new DotnetVersionResolver(this.version);
- const dotnetVersion = await versionResolver.createDotNetVersion();
-
- if (IS_WINDOWS) {
- scriptArguments = ['&', `'${escapedScript}'`];
-
- if (dotnetVersion.type) {
- scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
- }
-
- if (this.quality) {
- this.setQuality(dotnetVersion, scriptArguments);
- }
-
- if (process.env['https_proxy'] != null) {
- scriptArguments.push(`-ProxyAddress ${process.env['https_proxy']}`);
- }
- // This is not currently an option
- if (process.env['no_proxy'] != null) {
- scriptArguments.push(`-ProxyBypassList ${process.env['no_proxy']}`);
- }
-
- scriptPath =
- (await io.which('pwsh', false)) || (await io.which('powershell', true));
- scriptArguments = windowsDefaultOptions.concat(scriptArguments);
- } else {
- chmodSync(escapedScript, '777');
- scriptPath = await io.which(escapedScript, true);
- scriptArguments = [];
-
- if (dotnetVersion.type) {
- scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
- }
-
- if (this.quality) {
- this.setQuality(dotnetVersion, scriptArguments);
- }
- }
- // process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used
- const getExecOutputOptions = {
- ignoreReturnCode: true,
- env: process.env as {string: string}
- };
- const {exitCode, stderr} = await exec.getExecOutput(
- `"${scriptPath}"`,
- scriptArguments,
- getExecOutputOptions
- );
- if (exitCode) {
- throw new Error(
- `Failed to install dotnet, exit code: ${exitCode}. ${stderr}`
- );
- }
-
- return this.outputDotnetVersion(dotnetVersion.value);
- }
-
- private async outputDotnetVersion(version): Promise {
- const installationPath = process.env['DOTNET_INSTALL_DIR']!;
- let versionsOnRunner: string[] = await readdir(
- path.join(installationPath.replace(/'/g, ''), 'sdk')
- );
-
- let installedVersion = semver.maxSatisfying(versionsOnRunner, version, {
- includePrerelease: true
- })!;
-
- return installedVersion;
- }
-}
+// Load tempDirectory before it gets wiped by tool-cache
+import * as core from '@actions/core';
+import * as exec from '@actions/exec';
+import * as io from '@actions/io';
+import * as hc from '@actions/http-client';
+import {chmodSync} from 'fs';
+import {readdir} from 'fs/promises';
+import path from 'path';
+import os from 'os';
+import semver from 'semver';
+import {IS_LINUX, IS_WINDOWS} from './utils';
+import {QualityOptions} from './setup-dotnet';
+
+export interface DotnetVersion {
+ type: string;
+ value: string;
+ qualityFlag: boolean;
+}
+
+export class DotnetVersionResolver {
+ private inputVersion: string;
+ private resolvedArgument: DotnetVersion;
+
+ constructor(version: string) {
+ this.inputVersion = version.trim();
+ this.resolvedArgument = {type: '', value: '', qualityFlag: false};
+ }
+
+ private async resolveVersionInput(): Promise {
+ if (!semver.validRange(this.inputVersion)) {
+ throw new Error(
+ `'dotnet-version' was supplied in invalid format: ${this.inputVersion}! Supported syntax: A.B.C, A.B, A.B.x, A, A.x`
+ );
+ }
+ if (semver.valid(this.inputVersion)) {
+ this.resolvedArgument.type = 'version';
+ this.resolvedArgument.value = this.inputVersion;
+ } else {
+ const [major, minor] = this.inputVersion.split('.');
+
+ if (this.isNumericTag(major)) {
+ this.resolvedArgument.type = 'channel';
+ if (this.isNumericTag(minor)) {
+ this.resolvedArgument.value = `${major}.${minor}`;
+ } else {
+ const httpClient = new hc.HttpClient('actions/setup-dotnet', [], {
+ allowRetries: true,
+ maxRetries: 3
+ });
+ this.resolvedArgument.value = await this.getLatestVersion(
+ httpClient,
+ [major, minor]
+ );
+ }
+ }
+ this.resolvedArgument.qualityFlag = +major >= 6 ? true : false;
+ }
+ }
+
+ private isNumericTag(versionTag): boolean {
+ return /^\d+$/.test(versionTag);
+ }
+
+ public async createDotNetVersion(): Promise<{
+ type: string;
+ value: string;
+ qualityFlag: boolean;
+ }> {
+ await this.resolveVersionInput();
+ if (!this.resolvedArgument.type) {
+ return this.resolvedArgument;
+ }
+ if (IS_WINDOWS) {
+ this.resolvedArgument.type =
+ this.resolvedArgument.type === 'channel' ? '-Channel' : '-Version';
+ } else {
+ this.resolvedArgument.type =
+ this.resolvedArgument.type === 'channel' ? '--channel' : '--version';
+ }
+ return this.resolvedArgument;
+ }
+
+ private async getLatestVersion(
+ httpClient: hc.HttpClient,
+ versionParts: string[]
+ ): Promise {
+ const response = await httpClient.getJson(
+ DotnetVersionResolver.DotNetCoreIndexUrl
+ );
+ const result = response.result || {};
+ const releasesInfo: any[] = result['releases-index'];
+
+ const releaseInfo = releasesInfo.find(info => {
+ const sdkParts: string[] = info['channel-version'].split('.');
+ return sdkParts[0] === versionParts[0];
+ });
+
+ if (!releaseInfo) {
+ throw new Error(
+ `Could not find info for version ${versionParts.join('.')} at ${
+ DotnetVersionResolver.DotNetCoreIndexUrl
+ }`
+ );
+ }
+
+ return releaseInfo['channel-version'];
+ }
+
+ static DotNetCoreIndexUrl =
+ 'https://dotnetcli.azureedge.net/dotnet/release-metadata/releases-index.json';
+}
+
+export class DotnetCoreInstaller {
+ private version: string;
+ private quality: QualityOptions;
+
+ static {
+ const installationDirectoryWindows = path.join(
+ process.env['PROGRAMFILES'] + '',
+ 'dotnet'
+ );
+ const installationDirectoryLinux = '/usr/share/dotnet';
+ const installationDirectoryMac = path.join(
+ process.env['HOME'] + '',
+ '.dotnet'
+ );
+ const dotnetInstallDir: string | undefined =
+ process.env['DOTNET_INSTALL_DIR'];
+ if (dotnetInstallDir) {
+ process.env['DOTNET_INSTALL_DIR'] =
+ this.convertInstallPathToAbsolute(dotnetInstallDir);
+ } else {
+ if (IS_WINDOWS) {
+ process.env['DOTNET_INSTALL_DIR'] = installationDirectoryWindows;
+ } else {
+ process.env['DOTNET_INSTALL_DIR'] = IS_LINUX
+ ? installationDirectoryLinux
+ : installationDirectoryMac;
+ }
+ }
+ }
+
+ constructor(version: string, quality: QualityOptions) {
+ this.version = version;
+ this.quality = quality;
+ }
+
+ private static convertInstallPathToAbsolute(installDir: string): string {
+ let transformedPath;
+ if (path.isAbsolute(installDir)) {
+ transformedPath = installDir;
+ } else {
+ transformedPath = installDir.startsWith('~')
+ ? path.join(os.homedir(), installDir.slice(1))
+ : (transformedPath = path.join(process.cwd(), installDir));
+ }
+ return path.normalize(transformedPath);
+ }
+
+ static addToPath() {
+ core.addPath(process.env['DOTNET_INSTALL_DIR']!);
+ core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']);
+ }
+
+ private setQuality(
+ dotnetVersion: DotnetVersion,
+ scriptArguments: string[]
+ ): void {
+ const option = IS_WINDOWS ? '-Quality' : '--quality';
+ if (dotnetVersion.qualityFlag) {
+ scriptArguments.push(option, this.quality);
+ } else {
+ core.warning(
+ `'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A and A.x formats where the major tag is higher than 5. You specified: ${this.version}. 'dotnet-quality' input is ignored.`
+ );
+ }
+ }
+
+ public async installDotnet(): Promise {
+ const windowsDefaultOptions = [
+ '-NoLogo',
+ '-Sta',
+ '-NoProfile',
+ '-NonInteractive',
+ '-ExecutionPolicy',
+ 'Unrestricted',
+ '-Command'
+ ];
+ const scriptName = IS_WINDOWS ? 'install-dotnet.ps1' : 'install-dotnet.sh';
+ const escapedScript = path
+ .join(__dirname, '..', 'externals', scriptName)
+ .replace(/'/g, "''");
+ let scriptArguments: string[];
+ let scriptPath = '';
+
+ const versionResolver = new DotnetVersionResolver(this.version);
+ const dotnetVersion = await versionResolver.createDotNetVersion();
+
+ if (IS_WINDOWS) {
+ scriptArguments = ['&', `'${escapedScript}'`];
+
+ if (dotnetVersion.type) {
+ scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
+ }
+
+ if (this.quality) {
+ this.setQuality(dotnetVersion, scriptArguments);
+ }
+
+ if (process.env['https_proxy'] != null) {
+ scriptArguments.push(`-ProxyAddress ${process.env['https_proxy']}`);
+ }
+ // This is not currently an option
+ if (process.env['no_proxy'] != null) {
+ scriptArguments.push(`-ProxyBypassList ${process.env['no_proxy']}`);
+ }
+
+ scriptPath =
+ (await io.which('pwsh', false)) || (await io.which('powershell', true));
+ scriptArguments = windowsDefaultOptions.concat(scriptArguments);
+ } else {
+ chmodSync(escapedScript, '777');
+ scriptPath = await io.which(escapedScript, true);
+ scriptArguments = [];
+
+ if (dotnetVersion.type) {
+ scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
+ }
+
+ if (this.quality) {
+ this.setQuality(dotnetVersion, scriptArguments);
+ }
+ }
+ // process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used
+ const getExecOutputOptions = {
+ ignoreReturnCode: true,
+ env: process.env as {string: string}
+ };
+ const {exitCode, stderr} = await exec.getExecOutput(
+ `"${scriptPath}"`,
+ scriptArguments,
+ getExecOutputOptions
+ );
+ if (exitCode) {
+ throw new Error(
+ `Failed to install dotnet, exit code: ${exitCode}. ${stderr}`
+ );
+ }
+
+ return this.outputDotnetVersion(dotnetVersion.value);
+ }
+
+ private async outputDotnetVersion(version): Promise {
+ const installationPath = process.env['DOTNET_INSTALL_DIR']!;
+ const versionsOnRunner: string[] = await readdir(
+ path.join(installationPath.replace(/'/g, ''), 'sdk')
+ );
+
+ const installedVersion = semver.maxSatisfying(versionsOnRunner, version, {
+ includePrerelease: true
+ })!;
+
+ return installedVersion;
+ }
+}
diff --git a/src/setup-dotnet.ts b/src/setup-dotnet.ts
index c5e5901..119053a 100644
--- a/src/setup-dotnet.ts
+++ b/src/setup-dotnet.ts
@@ -13,7 +13,7 @@ const qualityOptions = [
'ga'
] as const;
-export type QualityOptions = typeof qualityOptions[number];
+export type QualityOptions = (typeof qualityOptions)[number];
export async function run() {
try {
@@ -100,7 +100,7 @@ export async function run() {
}
function getVersionFromGlobalJson(globalJsonPath: string): string {
- let version: string = '';
+ let version = '';
const globalJson = JSON.parse(
// .trim() is necessary to strip BOM https://github.com/nodejs/node/issues/20649
fs.readFileSync(globalJsonPath, {encoding: 'utf8'}).trim()
diff --git a/tsconfig.json b/tsconfig.json
index 8bd57d4..094aea7 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -49,7 +49,8 @@
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
- "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+ "resolveJsonModule": true, /* Allows importing modules with a '.json' extension, which is a common practice in node projects. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */