Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a66eefa2bf | ||
|
|
c2fa09f4bd | ||
|
|
02574b18e2 | ||
|
|
16c7b3c2fa | ||
|
|
131b410979 |
No files matched your search
@@ -495,7 +495,7 @@ jobs:
|
|||||||
test-proxy:
|
test-proxy:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
container:
|
container:
|
||||||
image: ubuntu:22.04
|
image: mcr.microsoft.com/devcontainers/dotnet:10.0
|
||||||
options: --dns 127.0.0.1
|
options: --dns 127.0.0.1
|
||||||
services:
|
services:
|
||||||
squid-proxy:
|
squid-proxy:
|
||||||
@@ -508,15 +508,6 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
- name: Install Powershell
|
|
||||||
run: |
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y wget apt-transport-https software-properties-common
|
|
||||||
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
|
|
||||||
dpkg -i packages-microsoft-prod.deb
|
|
||||||
rm packages-microsoft-prod.deb
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y powershell
|
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -590,3 +581,71 @@ jobs:
|
|||||||
- name: Verify dotnet (higher version)
|
- name: Verify dotnet (higher version)
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.lower-version }}$", "^${{ matrix.higher-version }}$"
|
run: __tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.lower-version }}$", "^${{ matrix.higher-version }}$"
|
||||||
|
|
||||||
|
test-setup-with-workloads-input:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system:
|
||||||
|
[ubuntu-latest, windows-latest, macos-15-intel, macos-latest]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Setup dotnet 9.0 with workloads
|
||||||
|
uses: ./
|
||||||
|
id: setup-dotnet
|
||||||
|
with:
|
||||||
|
dotnet-version: '9.0'
|
||||||
|
workloads: wasm-tools
|
||||||
|
- name: Verify workload
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$output = dotnet workload list | Out-String
|
||||||
|
Write-Host "Workload list output:"
|
||||||
|
Write-Host $output
|
||||||
|
if ($output -notmatch "wasm-tools") {
|
||||||
|
throw "Expected workload 'wasm-tools' not found"
|
||||||
|
}
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^9\.0"
|
||||||
|
|
||||||
|
test-setup-with-architecture-input:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [macos-latest, ubuntu-latest, windows-latest]
|
||||||
|
arch: [x64, arm64]
|
||||||
|
exclude:
|
||||||
|
- os: windows-latest
|
||||||
|
arch: arm64
|
||||||
|
- os: ubuntu-latest
|
||||||
|
arch: arm64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Setup dotnet (${{ matrix.arch }})
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: |
|
||||||
|
8.0.416
|
||||||
|
8.0.x
|
||||||
|
9.0.308
|
||||||
|
10.0.101
|
||||||
|
architecture: ${{ matrix.arch }}
|
||||||
|
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^8.0.416$", "^9.0.308$", "^10.0.101$", "^8.0"
|
||||||
-37
@@ -1,37 +0,0 @@
|
|||||||
---
|
|
||||||
name: fast-xml-parser
|
|
||||||
version: 5.3.3
|
|
||||||
type: npm
|
|
||||||
summary: Validate XML, Parse XML, Build XML without C/C++ based libraries
|
|
||||||
homepage:
|
|
||||||
license: mit
|
|
||||||
licenses:
|
|
||||||
- sources: LICENSE
|
|
||||||
text: |
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2017 Amit Kumar Gupta
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
- sources: README.md
|
|
||||||
text: |-
|
|
||||||
* MIT License
|
|
||||||
|
|
||||||

|
|
||||||
notices: []
|
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: fast-xml-parser
|
name: fast-xml-parser
|
||||||
version: 4.4.1
|
version: 5.3.6
|
||||||
type: npm
|
type: npm
|
||||||
summary: Validate XML, Parse XML, Build XML without C/C++ based libraries
|
summary: Validate XML, Parse XML, Build XML without C/C++ based libraries
|
||||||
homepage:
|
homepage:
|
||||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: minimatch
|
name: minimatch
|
||||||
version: 3.1.2
|
version: 3.1.5
|
||||||
type: npm
|
type: npm
|
||||||
summary: a glob matcher in javascript
|
summary: a glob matcher in javascript
|
||||||
homepage:
|
homepage:
|
||||||
|
|||||||
Generated
-32
@@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
name: strnum
|
|
||||||
version: 1.0.5
|
|
||||||
type: npm
|
|
||||||
summary: Parse String to Number based on configuration
|
|
||||||
homepage:
|
|
||||||
license: mit
|
|
||||||
licenses:
|
|
||||||
- sources: LICENSE
|
|
||||||
text: |
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2021 Natural Intelligence
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
notices: []
|
|
||||||
File renamed without changes.
@@ -59,6 +59,23 @@ The `dotnet-version` input supports following syntax:
|
|||||||
- **A.B.Cxx** (e.g. 8.0.4xx) - available since `.NET 5.0` release. Installs the latest version of the specific SDK release, including prerelease versions (preview, rc).
|
- **A.B.Cxx** (e.g. 8.0.4xx) - available since `.NET 5.0` release. Installs the latest version of the specific SDK release, including prerelease versions (preview, rc).
|
||||||
|
|
||||||
|
|
||||||
|
## Using the `architecture` input
|
||||||
|
Using the architecture input, it is possible to specify the required .NET SDK architecture. Possible values: `x64`, `x86`, `arm64`, `amd64`, `arm`, `s390x`, `ppc64le`, `riscv64`. If the input is not specified, the architecture defaults to the host OS architecture (not all of the architectures are available on all platforms).
|
||||||
|
|
||||||
|
**Example: Install multiple SDK versions for a specific architecture**
|
||||||
|
```yml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
- name: Setup dotnet (x86)
|
||||||
|
uses: actions/setup-dotnet@v5
|
||||||
|
with:
|
||||||
|
dotnet-version: |
|
||||||
|
8.0.x
|
||||||
|
9.0.x
|
||||||
|
architecture: x86
|
||||||
|
- run: dotnet build <my project>
|
||||||
|
```
|
||||||
|
|
||||||
## Using the `dotnet-quality` input
|
## Using the `dotnet-quality` input
|
||||||
This input sets up the action to install the latest build of the specified quality in the channel. The possible values of `dotnet-quality` are: **daily**, **signed**, **validated**, **preview**, **ga**.
|
This input sets up the action to install the latest build of the specified quality in the channel. The possible values of `dotnet-quality` are: **daily**, **signed**, **validated**, **preview**, **ga**.
|
||||||
|
|
||||||
@@ -231,6 +248,22 @@ steps:
|
|||||||
```
|
```
|
||||||
> **Note**: It's the only way to push a package to nuget.org feed for macOS/Linux machines due to API key config store limitations.
|
> **Note**: It's the only way to push a package to nuget.org feed for macOS/Linux machines due to API key config store limitations.
|
||||||
|
|
||||||
|
## Using the `workloads` input
|
||||||
|
The `workloads` input allows you to install .NET workloads as part of the SDK setup. Workloads provide additional platform tools and dependencies for frameworks. This action automatically runs `dotnet workload update` before installing the specified workloads to ensure manifests are refreshed and existing workloads are updated to their latest compatible versions.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- name: Setup .NET with workloads
|
||||||
|
uses: actions/setup-dotnet@v5
|
||||||
|
with:
|
||||||
|
dotnet-version: '9.0.x'
|
||||||
|
workloads: workload1, workload2 # Specify the workloads required for the project, such as wasm-tools, maui, etc.
|
||||||
|
- run: dotnet build <my project>
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**: Ensure workloads are compatible with your runner's OS, architecture, and .NET SDK version before enabling workload installation. Some workloads may require additional installation time due to large toolchain downloads.
|
||||||
|
|
||||||
# Outputs and environment variables
|
# Outputs and environment variables
|
||||||
|
|
||||||
## Outputs
|
## Outputs
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import each from 'jest-each';
|
|||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import fspromises from 'fs/promises';
|
import fspromises from 'fs/promises';
|
||||||
|
import os from 'os';
|
||||||
import * as exec from '@actions/exec';
|
import * as exec from '@actions/exec';
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import * as io from '@actions/io';
|
import * as io from '@actions/io';
|
||||||
@@ -327,6 +328,143 @@ describe('installer tests', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
it(`should supply 'architecture' argument to the installation script when architecture is provided`, async () => {
|
||||||
|
const inputVersion = '10.0.101';
|
||||||
|
const inputQuality = '' as QualityOptions;
|
||||||
|
const inputArchitecture = 'x64';
|
||||||
|
const stdout = `Fictitious dotnet version ${inputVersion} is installed`;
|
||||||
|
|
||||||
|
getExecOutputSpy.mockImplementation(() => {
|
||||||
|
return Promise.resolve({
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: `${stdout}`,
|
||||||
|
stderr: ''
|
||||||
|
});
|
||||||
|
});
|
||||||
|
maxSatisfyingSpy.mockImplementation(() => inputVersion);
|
||||||
|
|
||||||
|
const dotnetInstaller = new installer.DotnetCoreInstaller(
|
||||||
|
inputVersion,
|
||||||
|
inputQuality,
|
||||||
|
inputArchitecture
|
||||||
|
);
|
||||||
|
|
||||||
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
const callIndex = 1;
|
||||||
|
const scriptArguments = (
|
||||||
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
|
).join(' ');
|
||||||
|
const expectedArgument = IS_WINDOWS
|
||||||
|
? `-Architecture ${inputArchitecture}`
|
||||||
|
: `--architecture ${inputArchitecture}`;
|
||||||
|
|
||||||
|
expect(scriptArguments).toContain(expectedArgument);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should NOT supply 'architecture' argument when architecture is not provided`, async () => {
|
||||||
|
const inputVersion = '10.0.101';
|
||||||
|
const inputQuality = '' as QualityOptions;
|
||||||
|
const stdout = `Fictitious dotnet version ${inputVersion} is installed`;
|
||||||
|
|
||||||
|
getExecOutputSpy.mockImplementation(() => {
|
||||||
|
return Promise.resolve({
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: `${stdout}`,
|
||||||
|
stderr: ''
|
||||||
|
});
|
||||||
|
});
|
||||||
|
maxSatisfyingSpy.mockImplementation(() => inputVersion);
|
||||||
|
|
||||||
|
const dotnetInstaller = new installer.DotnetCoreInstaller(
|
||||||
|
inputVersion,
|
||||||
|
inputQuality
|
||||||
|
);
|
||||||
|
|
||||||
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
const callIndex = 1;
|
||||||
|
const scriptArguments = (
|
||||||
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
|
).join(' ');
|
||||||
|
|
||||||
|
expect(scriptArguments).not.toContain('--architecture');
|
||||||
|
expect(scriptArguments).not.toContain('-Architecture');
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should supply 'install-dir' with arch subdirectory for cross-arch install`, async () => {
|
||||||
|
const inputVersion = '10.0.101';
|
||||||
|
const inputQuality = '' as QualityOptions;
|
||||||
|
const inputArchitecture = 'x64';
|
||||||
|
const stdout = `Fictitious dotnet version ${inputVersion} is installed`;
|
||||||
|
|
||||||
|
getExecOutputSpy.mockImplementation(() => {
|
||||||
|
return Promise.resolve({
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: `${stdout}`,
|
||||||
|
stderr: ''
|
||||||
|
});
|
||||||
|
});
|
||||||
|
maxSatisfyingSpy.mockImplementation(() => inputVersion);
|
||||||
|
|
||||||
|
// Mock os.arch() to return a different arch to simulate cross-arch
|
||||||
|
const archSpy = jest.spyOn(os, 'arch').mockReturnValue('arm64');
|
||||||
|
|
||||||
|
const dotnetInstaller = new installer.DotnetCoreInstaller(
|
||||||
|
inputVersion,
|
||||||
|
inputQuality,
|
||||||
|
inputArchitecture
|
||||||
|
);
|
||||||
|
|
||||||
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
const callIndex = 1;
|
||||||
|
const scriptArguments = (
|
||||||
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
|
).join(' ');
|
||||||
|
|
||||||
|
const expectedInstallDirFlag = IS_WINDOWS
|
||||||
|
? '-InstallDir'
|
||||||
|
: '--install-dir';
|
||||||
|
|
||||||
|
expect(scriptArguments).toContain(expectedInstallDirFlag);
|
||||||
|
expect(scriptArguments).toContain(inputArchitecture);
|
||||||
|
|
||||||
|
archSpy.mockRestore();
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should NOT supply 'install-dir' when architecture matches runner's native arch`, async () => {
|
||||||
|
const inputVersion = '10.0.101';
|
||||||
|
const inputQuality = '' as QualityOptions;
|
||||||
|
const nativeArch = os.arch().toLowerCase();
|
||||||
|
const stdout = `Fictitious dotnet version ${inputVersion} is installed`;
|
||||||
|
|
||||||
|
getExecOutputSpy.mockImplementation(() => {
|
||||||
|
return Promise.resolve({
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: `${stdout}`,
|
||||||
|
stderr: ''
|
||||||
|
});
|
||||||
|
});
|
||||||
|
maxSatisfyingSpy.mockImplementation(() => inputVersion);
|
||||||
|
|
||||||
|
const dotnetInstaller = new installer.DotnetCoreInstaller(
|
||||||
|
inputVersion,
|
||||||
|
inputQuality,
|
||||||
|
nativeArch
|
||||||
|
);
|
||||||
|
|
||||||
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
const callIndex = 1;
|
||||||
|
const scriptArguments = (
|
||||||
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
|
).join(' ');
|
||||||
|
|
||||||
|
expect(scriptArguments).not.toContain('--install-dir');
|
||||||
|
expect(scriptArguments).not.toContain('-InstallDir');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('addToPath() tests', () => {
|
describe('addToPath() tests', () => {
|
||||||
@@ -346,6 +484,32 @@ describe('installer tests', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('normalizeArch() tests', () => {
|
||||||
|
it(`should normalize 'amd64' to 'x64'`, () => {
|
||||||
|
expect(installer.normalizeArch('amd64')).toBe('x64');
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should normalize 'AMD64' to 'x64' (case-insensitive)`, () => {
|
||||||
|
expect(installer.normalizeArch('AMD64')).toBe('x64');
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should pass through 'x64' unchanged`, () => {
|
||||||
|
expect(installer.normalizeArch('x64')).toBe('x64');
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should pass through 'arm64' unchanged`, () => {
|
||||||
|
expect(installer.normalizeArch('arm64')).toBe('arm64');
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should lowercase 'ARM64'`, () => {
|
||||||
|
expect(installer.normalizeArch('ARM64')).toBe('arm64');
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should pass through 'x86' unchanged`, () => {
|
||||||
|
expect(installer.normalizeArch('x86')).toBe('x86');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('DotnetVersionResolver tests', () => {
|
describe('DotnetVersionResolver tests', () => {
|
||||||
describe('createDotnetVersion() tests', () => {
|
describe('createDotnetVersion() tests', () => {
|
||||||
each([
|
each([
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import * as core from '@actions/core';
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
import * as auth from '../src/authutil';
|
import * as auth from '../src/authutil';
|
||||||
|
import os from 'os';
|
||||||
import * as setup from '../src/setup-dotnet';
|
import * as setup from '../src/setup-dotnet';
|
||||||
import {DotnetCoreInstaller, DotnetInstallDir} from '../src/installer';
|
import {DotnetCoreInstaller, DotnetInstallDir} from '../src/installer';
|
||||||
import * as cacheUtils from '../src/cache-utils';
|
import * as cacheUtils from '../src/cache-utils';
|
||||||
@@ -221,5 +221,40 @@ describe('setup-dotnet tests', () => {
|
|||||||
await setup.run();
|
await setup.run();
|
||||||
expect(restoreCacheSpy).not.toHaveBeenCalled();
|
expect(restoreCacheSpy).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should pass valid architecture input to DotnetCoreInstaller', async () => {
|
||||||
|
inputs['dotnet-version'] = ['10.0.101'];
|
||||||
|
inputs['dotnet-quality'] = '';
|
||||||
|
inputs['architecture'] = os.arch().toLowerCase();
|
||||||
|
|
||||||
|
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
||||||
|
|
||||||
|
await setup.run();
|
||||||
|
expect(installDotnetSpy).toHaveBeenCalledTimes(1);
|
||||||
|
expect(DotnetInstallDir.addToPath).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should work with empty architecture input for auto-detection', async () => {
|
||||||
|
inputs['dotnet-version'] = ['10.0.101'];
|
||||||
|
inputs['dotnet-quality'] = '';
|
||||||
|
inputs['architecture'] = '';
|
||||||
|
|
||||||
|
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
||||||
|
|
||||||
|
await setup.run();
|
||||||
|
expect(installDotnetSpy).toHaveBeenCalledTimes(1);
|
||||||
|
expect(DotnetInstallDir.addToPath).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail the action if unsupported architecture is provided', async () => {
|
||||||
|
inputs['dotnet-version'] = ['10.0.101'];
|
||||||
|
inputs['dotnet-quality'] = '';
|
||||||
|
inputs['architecture'] = 'x688';
|
||||||
|
|
||||||
|
const expectedErrorMessage = `Value 'x688' is not supported for the 'architecture' option. Supported values are: x64, x86, arm64, amd64, arm, s390x, ppc64le, riscv64.`;
|
||||||
|
|
||||||
|
await setup.run();
|
||||||
|
expect(setFailedSpy).toHaveBeenCalledWith(expectedErrorMessage);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -24,6 +24,12 @@ inputs:
|
|||||||
cache-dependency-path:
|
cache-dependency-path:
|
||||||
description: 'Used to specify the path to a dependency file: packages.lock.json. Supports wildcards or a list of file names for caching multiple dependencies.'
|
description: 'Used to specify the path to a dependency file: packages.lock.json. Supports wildcards or a list of file names for caching multiple dependencies.'
|
||||||
required: false
|
required: false
|
||||||
|
workloads:
|
||||||
|
description: 'Optional SDK workloads to install for additional platform support. Examples: wasm-tools, maui, aspire.'
|
||||||
|
required: false
|
||||||
|
architecture:
|
||||||
|
description: 'Optional architecture for the .NET install. Supported values: x64, x86, arm64, amd64, arm, s390x, ppc64le, riscv64. If not set, the installer auto-detects the current system architecture.'
|
||||||
|
required: false
|
||||||
outputs:
|
outputs:
|
||||||
cache-hit:
|
cache-hit:
|
||||||
description: 'A boolean value to indicate if a cache was hit.'
|
description: 'A boolean value to indicate if a cache was hit.'
|
||||||
|
|||||||
Vendored
+163
-105
@@ -20510,6 +20510,8 @@ function Minimatch (pattern, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.options = options
|
this.options = options
|
||||||
|
this.maxGlobstarRecursion = options.maxGlobstarRecursion !== undefined
|
||||||
|
? options.maxGlobstarRecursion : 200
|
||||||
this.set = []
|
this.set = []
|
||||||
this.pattern = pattern
|
this.pattern = pattern
|
||||||
this.regexp = null
|
this.regexp = null
|
||||||
@@ -20758,6 +20760,9 @@ function parse (pattern, isSub) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// coalesce consecutive non-globstar * characters
|
||||||
|
if (c === '*' && stateChar === '*') continue
|
||||||
|
|
||||||
// if we already have a stateChar, then it means
|
// if we already have a stateChar, then it means
|
||||||
// that there was something like ** or +? in there.
|
// that there was something like ** or +? in there.
|
||||||
// Handle the stateChar, then proceed with this one.
|
// Handle the stateChar, then proceed with this one.
|
||||||
@@ -21152,19 +21157,163 @@ Minimatch.prototype.match = function match (f, partial) {
|
|||||||
// out of pattern, then that's fine, as long as all
|
// out of pattern, then that's fine, as long as all
|
||||||
// the parts match.
|
// the parts match.
|
||||||
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
||||||
var options = this.options
|
if (pattern.indexOf(GLOBSTAR) !== -1) {
|
||||||
|
return this._matchGlobstar(file, pattern, partial, 0, 0)
|
||||||
|
}
|
||||||
|
return this._matchOne(file, pattern, partial, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
this.debug('matchOne',
|
Minimatch.prototype._matchGlobstar = function (file, pattern, partial, fileIndex, patternIndex) {
|
||||||
{ 'this': this, file: file, pattern: pattern })
|
var i
|
||||||
|
|
||||||
this.debug('matchOne', file.length, pattern.length)
|
// find first globstar from patternIndex
|
||||||
|
var firstgs = -1
|
||||||
|
for (i = patternIndex; i < pattern.length; i++) {
|
||||||
|
if (pattern[i] === GLOBSTAR) { firstgs = i; break }
|
||||||
|
}
|
||||||
|
|
||||||
for (var fi = 0,
|
// find last globstar
|
||||||
pi = 0,
|
var lastgs = -1
|
||||||
fl = file.length,
|
for (i = pattern.length - 1; i >= 0; i--) {
|
||||||
pl = pattern.length
|
if (pattern[i] === GLOBSTAR) { lastgs = i; break }
|
||||||
; (fi < fl) && (pi < pl)
|
}
|
||||||
; fi++, pi++) {
|
|
||||||
|
var head = pattern.slice(patternIndex, firstgs)
|
||||||
|
var body = partial ? pattern.slice(firstgs + 1) : pattern.slice(firstgs + 1, lastgs)
|
||||||
|
var tail = partial ? [] : pattern.slice(lastgs + 1)
|
||||||
|
|
||||||
|
// check the head
|
||||||
|
if (head.length) {
|
||||||
|
var fileHead = file.slice(fileIndex, fileIndex + head.length)
|
||||||
|
if (!this._matchOne(fileHead, head, partial, 0, 0)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fileIndex += head.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// check the tail
|
||||||
|
var fileTailMatch = 0
|
||||||
|
if (tail.length) {
|
||||||
|
if (tail.length + fileIndex > file.length) return false
|
||||||
|
|
||||||
|
var tailStart = file.length - tail.length
|
||||||
|
if (this._matchOne(file, tail, partial, tailStart, 0)) {
|
||||||
|
fileTailMatch = tail.length
|
||||||
|
} else {
|
||||||
|
// affordance for stuff like a/**/* matching a/b/
|
||||||
|
if (file[file.length - 1] !== '' ||
|
||||||
|
fileIndex + tail.length === file.length) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
tailStart--
|
||||||
|
if (!this._matchOne(file, tail, partial, tailStart, 0)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fileTailMatch = tail.length + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if body is empty (single ** between head and tail)
|
||||||
|
if (!body.length) {
|
||||||
|
var sawSome = !!fileTailMatch
|
||||||
|
for (i = fileIndex; i < file.length - fileTailMatch; i++) {
|
||||||
|
var f = String(file[i])
|
||||||
|
sawSome = true
|
||||||
|
if (f === '.' || f === '..' ||
|
||||||
|
(!this.options.dot && f.charAt(0) === '.')) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return partial || sawSome
|
||||||
|
}
|
||||||
|
|
||||||
|
// split body into segments at each GLOBSTAR
|
||||||
|
var bodySegments = [[[], 0]]
|
||||||
|
var currentBody = bodySegments[0]
|
||||||
|
var nonGsParts = 0
|
||||||
|
var nonGsPartsSums = [0]
|
||||||
|
for (var bi = 0; bi < body.length; bi++) {
|
||||||
|
var b = body[bi]
|
||||||
|
if (b === GLOBSTAR) {
|
||||||
|
nonGsPartsSums.push(nonGsParts)
|
||||||
|
currentBody = [[], 0]
|
||||||
|
bodySegments.push(currentBody)
|
||||||
|
} else {
|
||||||
|
currentBody[0].push(b)
|
||||||
|
nonGsParts++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var idx = bodySegments.length - 1
|
||||||
|
var fileLength = file.length - fileTailMatch
|
||||||
|
for (var si = 0; si < bodySegments.length; si++) {
|
||||||
|
bodySegments[si][1] = fileLength -
|
||||||
|
(nonGsPartsSums[idx--] + bodySegments[si][0].length)
|
||||||
|
}
|
||||||
|
|
||||||
|
return !!this._matchGlobStarBodySections(
|
||||||
|
file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// return false for "nope, not matching"
|
||||||
|
// return null for "not matching, cannot keep trying"
|
||||||
|
Minimatch.prototype._matchGlobStarBodySections = function (
|
||||||
|
file, bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail
|
||||||
|
) {
|
||||||
|
var bs = bodySegments[bodyIndex]
|
||||||
|
if (!bs) {
|
||||||
|
// just make sure there are no bad dots
|
||||||
|
for (var i = fileIndex; i < file.length; i++) {
|
||||||
|
sawTail = true
|
||||||
|
var f = file[i]
|
||||||
|
if (f === '.' || f === '..' ||
|
||||||
|
(!this.options.dot && f.charAt(0) === '.')) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sawTail
|
||||||
|
}
|
||||||
|
|
||||||
|
var body = bs[0]
|
||||||
|
var after = bs[1]
|
||||||
|
while (fileIndex <= after) {
|
||||||
|
var m = this._matchOne(
|
||||||
|
file.slice(0, fileIndex + body.length),
|
||||||
|
body,
|
||||||
|
partial,
|
||||||
|
fileIndex,
|
||||||
|
0
|
||||||
|
)
|
||||||
|
// if limit exceeded, no match. intentional false negative,
|
||||||
|
// acceptable break in correctness for security.
|
||||||
|
if (m && globStarDepth < this.maxGlobstarRecursion) {
|
||||||
|
var sub = this._matchGlobStarBodySections(
|
||||||
|
file, bodySegments,
|
||||||
|
fileIndex + body.length, bodyIndex + 1,
|
||||||
|
partial, globStarDepth + 1, sawTail
|
||||||
|
)
|
||||||
|
if (sub !== false) {
|
||||||
|
return sub
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var f = file[fileIndex]
|
||||||
|
if (f === '.' || f === '..' ||
|
||||||
|
(!this.options.dot && f.charAt(0) === '.')) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fileIndex++
|
||||||
|
}
|
||||||
|
return partial || null
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype._matchOne = function (file, pattern, partial, fileIndex, patternIndex) {
|
||||||
|
var fi, pi, fl, pl
|
||||||
|
for (
|
||||||
|
fi = fileIndex, pi = patternIndex, fl = file.length, pl = pattern.length
|
||||||
|
; (fi < fl) && (pi < pl)
|
||||||
|
; fi++, pi++
|
||||||
|
) {
|
||||||
this.debug('matchOne loop')
|
this.debug('matchOne loop')
|
||||||
var p = pattern[pi]
|
var p = pattern[pi]
|
||||||
var f = file[fi]
|
var f = file[fi]
|
||||||
@@ -21174,87 +21323,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
|||||||
// should be impossible.
|
// should be impossible.
|
||||||
// some invalid regexp stuff in the set.
|
// some invalid regexp stuff in the set.
|
||||||
/* istanbul ignore if */
|
/* istanbul ignore if */
|
||||||
if (p === false) return false
|
if (p === false || p === GLOBSTAR) return false
|
||||||
|
|
||||||
if (p === GLOBSTAR) {
|
|
||||||
this.debug('GLOBSTAR', [pattern, p, f])
|
|
||||||
|
|
||||||
// "**"
|
|
||||||
// a/**/b/**/c would match the following:
|
|
||||||
// a/b/x/y/z/c
|
|
||||||
// a/x/y/z/b/c
|
|
||||||
// a/b/x/b/x/c
|
|
||||||
// a/b/c
|
|
||||||
// To do this, take the rest of the pattern after
|
|
||||||
// the **, and see if it would match the file remainder.
|
|
||||||
// If so, return success.
|
|
||||||
// If not, the ** "swallows" a segment, and try again.
|
|
||||||
// This is recursively awful.
|
|
||||||
//
|
|
||||||
// a/**/b/**/c matching a/b/x/y/z/c
|
|
||||||
// - a matches a
|
|
||||||
// - doublestar
|
|
||||||
// - matchOne(b/x/y/z/c, b/**/c)
|
|
||||||
// - b matches b
|
|
||||||
// - doublestar
|
|
||||||
// - matchOne(x/y/z/c, c) -> no
|
|
||||||
// - matchOne(y/z/c, c) -> no
|
|
||||||
// - matchOne(z/c, c) -> no
|
|
||||||
// - matchOne(c, c) yes, hit
|
|
||||||
var fr = fi
|
|
||||||
var pr = pi + 1
|
|
||||||
if (pr === pl) {
|
|
||||||
this.debug('** at the end')
|
|
||||||
// a ** at the end will just swallow the rest.
|
|
||||||
// We have found a match.
|
|
||||||
// however, it will not swallow /.x, unless
|
|
||||||
// options.dot is set.
|
|
||||||
// . and .. are *never* matched by **, for explosively
|
|
||||||
// exponential reasons.
|
|
||||||
for (; fi < fl; fi++) {
|
|
||||||
if (file[fi] === '.' || file[fi] === '..' ||
|
|
||||||
(!options.dot && file[fi].charAt(0) === '.')) return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// ok, let's see if we can swallow whatever we can.
|
|
||||||
while (fr < fl) {
|
|
||||||
var swallowee = file[fr]
|
|
||||||
|
|
||||||
this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
|
|
||||||
|
|
||||||
// XXX remove this slice. Just pass the start index.
|
|
||||||
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
|
||||||
this.debug('globstar found match!', fr, fl, swallowee)
|
|
||||||
// found a match.
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
// can't swallow "." or ".." ever.
|
|
||||||
// can only swallow ".foo" when explicitly asked.
|
|
||||||
if (swallowee === '.' || swallowee === '..' ||
|
|
||||||
(!options.dot && swallowee.charAt(0) === '.')) {
|
|
||||||
this.debug('dot detected!', file, fr, pattern, pr)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// ** swallows a segment, and continue.
|
|
||||||
this.debug('globstar swallow a segment, and continue')
|
|
||||||
fr++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// no match was found.
|
|
||||||
// However, in partial mode, we can't say this is necessarily over.
|
|
||||||
// If there's more *pattern* left, then
|
|
||||||
/* istanbul ignore if */
|
|
||||||
if (partial) {
|
|
||||||
// ran out of file
|
|
||||||
this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
|
|
||||||
if (fr === fl) return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// something other than **
|
// something other than **
|
||||||
// non-magic patterns just have to match exactly
|
// non-magic patterns just have to match exactly
|
||||||
@@ -21271,17 +21340,6 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
|||||||
if (!hit) return false
|
if (!hit) return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: ending in / means that we'll get a final ""
|
|
||||||
// at the end of the pattern. This can only match a
|
|
||||||
// corresponding "" at the end of the file.
|
|
||||||
// If the file ends in /, then it can only match a
|
|
||||||
// a pattern that ends in /, unless the pattern just
|
|
||||||
// doesn't have any more for it. But, a/b/ should *not*
|
|
||||||
// match "a/b/*", even though "" matches against the
|
|
||||||
// [^/]*? pattern, except in partial mode, where it might
|
|
||||||
// simply not be reached yet.
|
|
||||||
// However, a/b/ should still satisfy a/*
|
|
||||||
|
|
||||||
// now either we fell off the end of the pattern, or we're done.
|
// now either we fell off the end of the pattern, or we're done.
|
||||||
if (fi === fl && pi === pl) {
|
if (fi === fl && pi === pl) {
|
||||||
// ran out of pattern and filename at the same time.
|
// ran out of pattern and filename at the same time.
|
||||||
@@ -52241,7 +52299,7 @@ exports.XML_CHARKEY = "_";
|
|||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.stringifyXML = stringifyXML;
|
exports.stringifyXML = stringifyXML;
|
||||||
exports.parseXML = parseXML;
|
exports.parseXML = parseXML;
|
||||||
const fast_xml_parser_1 = __nccwpck_require__(95430);
|
const fast_xml_parser_1 = __nccwpck_require__(74577);
|
||||||
const xml_common_js_1 = __nccwpck_require__(62060);
|
const xml_common_js_1 = __nccwpck_require__(62060);
|
||||||
function getCommonOptions(options) {
|
function getCommonOptions(options) {
|
||||||
var _a;
|
var _a;
|
||||||
@@ -87787,10 +87845,10 @@ function randomUUID() {
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 95430:
|
/***/ 74577:
|
||||||
/***/ ((module) => {
|
/***/ ((module) => {
|
||||||
|
|
||||||
(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>lt,XMLParser:()=>tt,XMLValidator:()=>pt});const i=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",n=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const i=[];let n=e.exec(t);for(;n;){const s=[];s.startIndex=e.lastIndex-n[0].length;const r=n.length;for(let t=0;t<r;t++)s.push(n[t]);i.push(s),n=e.exec(t)}return i}const r=function(t){return!(null==n.exec(t))},o={allowBooleanAttributes:!1,unpairedTags:[]};function a(t,e){e=Object.assign({},o,e);const i=[];let n=!1,s=!1;"\ufeff"===t[0]&&(t=t.substr(1));for(let o=0;o<t.length;o++)if("<"===t[o]&&"?"===t[o+1]){if(o+=2,o=u(t,o),o.err)return o}else{if("<"!==t[o]){if(l(t[o]))continue;return x("InvalidChar","char '"+t[o]+"' is not expected.",b(t,o))}{let a=o;if(o++,"!"===t[o]){o=h(t,o);continue}{let d=!1;"/"===t[o]&&(d=!0,o++);let p="";for(;o<t.length&&">"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)p+=t[o];if(p=p.trim(),"/"===p[p.length-1]&&(p=p.substring(0,p.length-1),o--),!r(p)){let e;return e=0===p.trim().length?"Invalid space after '<'.":"Tag '"+p+"' is an invalid name.",x("InvalidTag",e,b(t,o))}const c=f(t,o);if(!1===c)return x("InvalidAttr","Attributes for '"+p+"' have open quote.",b(t,o));let N=c.value;if(o=c.index,"/"===N[N.length-1]){const i=o-N.length;N=N.substring(0,N.length-1);const s=g(N,e);if(!0!==s)return x(s.err.code,s.err.msg,b(t,i+s.err.line));n=!0}else if(d){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+p+"' doesn't have proper closing.",b(t,o));if(N.trim().length>0)return x("InvalidTag","Closing tag '"+p+"' can't have attributes or invalid starting.",b(t,a));if(0===i.length)return x("InvalidTag","Closing tag '"+p+"' has not been opened.",b(t,a));{const e=i.pop();if(p!==e.tagName){let i=b(t,e.tagStartPos);return x("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+i.line+", col "+i.col+") instead of closing tag '"+p+"'.",b(t,a))}0==i.length&&(s=!0)}}else{const r=g(N,e);if(!0!==r)return x(r.err.code,r.err.msg,b(t,o-N.length+r.err.line));if(!0===s)return x("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(p)||i.push({tagName:p,tagStartPos:a}),n=!0}for(o++;o<t.length;o++)if("<"===t[o]){if("!"===t[o+1]){o++,o=h(t,o);continue}if("?"!==t[o+1])break;if(o=u(t,++o),o.err)return o}else if("&"===t[o]){const e=m(t,o);if(-1==e)return x("InvalidChar","char '&' is not expected.",b(t,o));o=e}else if(!0===s&&!l(t[o]))return x("InvalidXml","Extra text at the end",b(t,o));"<"===t[o]&&o--}}}return n?1==i.length?x("InvalidTag","Unclosed tag '"+i[0].tagName+"'.",b(t,i[0].tagStartPos)):!(i.length>0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map((t=>t.tagName)),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function l(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){const i=e;for(;e<t.length;e++)if("?"!=t[e]&&" "!=t[e]);else{const n=t.substr(i,e-i);if(e>5&&"xml"===n)return x("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function h(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e<t.length;e++)if("-"===t[e]&&"-"===t[e+1]&&">"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let i=1;for(e+=8;e<t.length;e++)if("<"===t[e])i++;else if(">"===t[e]&&(i--,0===i))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e<t.length;e++)if("]"===t[e]&&"]"===t[e+1]&&">"===t[e+2]){e+=2;break}return e}const d='"',p="'";function f(t,e){let i="",n="",s=!1;for(;e<t.length;e++){if(t[e]===d||t[e]===p)""===n?n=t[e]:n!==t[e]||(n="");else if(">"===t[e]&&""===n){s=!0;break}i+=t[e]}return""===n&&{value:i,index:e,tagClosed:s}}const c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const i=s(t,c),n={};for(let t=0;t<i.length;t++){if(0===i[t][1].length)return x("InvalidAttr","Attribute '"+i[t][2]+"' has no space in starting.",E(i[t]));if(void 0!==i[t][3]&&void 0===i[t][4])return x("InvalidAttr","Attribute '"+i[t][2]+"' is without value.",E(i[t]));if(void 0===i[t][3]&&!e.allowBooleanAttributes)return x("InvalidAttr","boolean attribute '"+i[t][2]+"' is not allowed.",E(i[t]));const s=i[t][2];if(!N(s))return x("InvalidAttr","Attribute '"+s+"' is an invalid name.",E(i[t]));if(n.hasOwnProperty(s))return x("InvalidAttr","AttriLine truncated
|
(()=>{"use strict";var t={d:(e,n)=>{for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>dt,XMLParser:()=>it,XMLValidator:()=>gt});const n=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+n+"]["+n+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const n=[];let i=e.exec(t);for(;i;){const s=[];s.startIndex=e.lastIndex-i[0].length;const r=i.length;for(let t=0;t<r;t++)s.push(i[t]);n.push(s),i=e.exec(t)}return n}const r=function(t){return!(null==i.exec(t))},o={allowBooleanAttributes:!1,unpairedTags:[]};function a(t,e){e=Object.assign({},o,e);const n=[];let i=!1,s=!1;"\ufeff"===t[0]&&(t=t.substr(1));for(let o=0;o<t.length;o++)if("<"===t[o]&&"?"===t[o+1]){if(o+=2,o=u(t,o),o.err)return o}else{if("<"!==t[o]){if(l(t[o]))continue;return m("InvalidChar","char '"+t[o]+"' is not expected.",b(t,o))}{let a=o;if(o++,"!"===t[o]){o=h(t,o);continue}{let d=!1;"/"===t[o]&&(d=!0,o++);let p="";for(;o<t.length&&">"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)p+=t[o];if(p=p.trim(),"/"===p[p.length-1]&&(p=p.substring(0,p.length-1),o--),!r(p)){let e;return e=0===p.trim().length?"Invalid space after '<'.":"Tag '"+p+"' is an invalid name.",m("InvalidTag",e,b(t,o))}const c=f(t,o);if(!1===c)return m("InvalidAttr","Attributes for '"+p+"' have open quote.",b(t,o));let E=c.value;if(o=c.index,"/"===E[E.length-1]){const n=o-E.length;E=E.substring(0,E.length-1);const s=g(E,e);if(!0!==s)return m(s.err.code,s.err.msg,b(t,n+s.err.line));i=!0}else if(d){if(!c.tagClosed)return m("InvalidTag","Closing tag '"+p+"' doesn't have proper closing.",b(t,o));if(E.trim().length>0)return m("InvalidTag","Closing tag '"+p+"' can't have attributes or invalid starting.",b(t,a));if(0===n.length)return m("InvalidTag","Closing tag '"+p+"' has not been opened.",b(t,a));{const e=n.pop();if(p!==e.tagName){let n=b(t,e.tagStartPos);return m("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+n.line+", col "+n.col+") instead of closing tag '"+p+"'.",b(t,a))}0==n.length&&(s=!0)}}else{const r=g(E,e);if(!0!==r)return m(r.err.code,r.err.msg,b(t,o-E.length+r.err.line));if(!0===s)return m("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(p)||n.push({tagName:p,tagStartPos:a}),i=!0}for(o++;o<t.length;o++)if("<"===t[o]){if("!"===t[o+1]){o++,o=h(t,o);continue}if("?"!==t[o+1])break;if(o=u(t,++o),o.err)return o}else if("&"===t[o]){const e=x(t,o);if(-1==e)return m("InvalidChar","char '&' is not expected.",b(t,o));o=e}else if(!0===s&&!l(t[o]))return m("InvalidXml","Extra text at the end",b(t,o));"<"===t[o]&&o--}}}return i?1==n.length?m("InvalidTag","Unclosed tag '"+n[0].tagName+"'.",b(t,n[0].tagStartPos)):!(n.length>0)||m("InvalidXml","Invalid '"+JSON.stringify(n.map((t=>t.tagName)),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):m("InvalidXml","Start tag expected.",1)}function l(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){const n=e;for(;e<t.length;e++)if("?"!=t[e]&&" "!=t[e]);else{const i=t.substr(n,e-n);if(e>5&&"xml"===i)return m("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function h(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e<t.length;e++)if("-"===t[e]&&"-"===t[e+1]&&">"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let n=1;for(e+=8;e<t.length;e++)if("<"===t[e])n++;else if(">"===t[e]&&(n--,0===n))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e<t.length;e++)if("]"===t[e]&&"]"===t[e+1]&&">"===t[e+2]){e+=2;break}return e}const d='"',p="'";function f(t,e){let n="",i="",s=!1;for(;e<t.length;e++){if(t[e]===d||t[e]===p)""===i?i=t[e]:i!==t[e]||(i="");else if(">"===t[e]&&""===i){s=!0;break}n+=t[e]}return""===i&&{value:n,index:e,tagClosed:s}}const c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const n=s(t,c),i={};for(let t=0;t<n.length;t++){if(0===n[t][1].length)return m("InvalidAttr","Attribute '"+n[t][2]+"' has no space in starting.",N(n[t]));if(void 0!==n[t][3]&&void 0===n[t][4])return m("InvalidAttr","Attribute '"+n[t][2]+"' is without value.",N(n[t]));if(void 0===n[t][3]&&!e.allowBooleanAttributes)return m("InvalidAttr","boolean attribute '"+n[t][2]+"' is not allowed.",N(n[t]));const s=n[t][2];if(!E(s))return m("InvalidAttr","Attribute '"+s+"' is an invalid name.",N(n[t]));if(i.hasOwnProperty(s))return m("InvalidAttr","AttriLine truncated
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
|||||||
Vendored
+245
-2241
File diff suppressed because it is too large.
Load diff
Generated
+104
-75
@@ -16,7 +16,7 @@
|
|||||||
"@actions/glob": "^0.5.0",
|
"@actions/glob": "^0.5.0",
|
||||||
"@actions/http-client": "^3.0.0",
|
"@actions/http-client": "^3.0.0",
|
||||||
"@actions/io": "^1.0.2",
|
"@actions/io": "^1.0.2",
|
||||||
"fast-xml-parser": "^4.4.1",
|
"fast-xml-parser": "^5.3.6",
|
||||||
"json5": "^2.2.3",
|
"json5": "^2.2.3",
|
||||||
"semver": "^7.6.0"
|
"semver": "^7.6.0"
|
||||||
},
|
},
|
||||||
@@ -400,34 +400,6 @@
|
|||||||
"node": ">=20.0.0"
|
"node": ">=20.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@azure/core-xml/node_modules/fast-xml-parser": {
|
|
||||||
"version": "5.3.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.3.tgz",
|
|
||||||
"integrity": "sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/NaturalIntelligence"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"strnum": "^2.1.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"fxparser": "src/cli/cli.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@azure/core-xml/node_modules/strnum": {
|
|
||||||
"version": "2.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz",
|
|
||||||
"integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/NaturalIntelligence"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/@azure/logger": {
|
"node_modules/@azure/logger": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz",
|
||||||
@@ -2058,24 +2030,37 @@
|
|||||||
"url": "https://opencollective.com/typescript-eslint"
|
"url": "https://opencollective.com/typescript-eslint"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@typescript-eslint/eslint-plugin/node_modules/balanced-match": {
|
||||||
|
"version": "4.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
|
||||||
|
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": {
|
"node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": {
|
||||||
"version": "2.0.2",
|
"version": "5.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
"integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0"
|
"balanced-match": "^4.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": {
|
"node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": {
|
||||||
"version": "9.0.5",
|
"version": "9.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.8.tgz",
|
||||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
"integrity": "sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^2.0.1"
|
"brace-expansion": "^5.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16 || 14 >=14.17"
|
"node": ">=16 || 14 >=14.17"
|
||||||
@@ -2192,24 +2177,37 @@
|
|||||||
"url": "https://opencollective.com/typescript-eslint"
|
"url": "https://opencollective.com/typescript-eslint"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@typescript-eslint/parser/node_modules/balanced-match": {
|
||||||
|
"version": "4.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
|
||||||
|
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@typescript-eslint/parser/node_modules/brace-expansion": {
|
"node_modules/@typescript-eslint/parser/node_modules/brace-expansion": {
|
||||||
"version": "2.0.2",
|
"version": "5.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
"integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0"
|
"balanced-match": "^4.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser/node_modules/minimatch": {
|
"node_modules/@typescript-eslint/parser/node_modules/minimatch": {
|
||||||
"version": "9.0.5",
|
"version": "9.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.8.tgz",
|
||||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
"integrity": "sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^2.0.1"
|
"brace-expansion": "^5.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16 || 14 >=14.17"
|
"node": ">=16 || 14 >=14.17"
|
||||||
@@ -2402,24 +2400,37 @@
|
|||||||
"url": "https://opencollective.com/typescript-eslint"
|
"url": "https://opencollective.com/typescript-eslint"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@typescript-eslint/type-utils/node_modules/balanced-match": {
|
||||||
|
"version": "4.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
|
||||||
|
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": {
|
"node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": {
|
||||||
"version": "2.0.2",
|
"version": "5.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
"integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0"
|
"balanced-match": "^4.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
|
"node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
|
||||||
"version": "9.0.5",
|
"version": "9.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.8.tgz",
|
||||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
"integrity": "sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^2.0.1"
|
"brace-expansion": "^5.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16 || 14 >=14.17"
|
"node": ">=16 || 14 >=14.17"
|
||||||
@@ -2471,24 +2482,37 @@
|
|||||||
"typescript": ">=4.8.4 <6.0.0"
|
"typescript": ">=4.8.4 <6.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
|
||||||
|
"version": "4.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
|
||||||
|
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
|
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
|
||||||
"version": "2.0.2",
|
"version": "5.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
"integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0"
|
"balanced-match": "^4.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "18 || 20 || >=22"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
|
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
|
||||||
"version": "9.0.5",
|
"version": "9.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.8.tgz",
|
||||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
"integrity": "sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^2.0.1"
|
"brace-expansion": "^5.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16 || 14 >=14.17"
|
"node": ">=16 || 14 >=14.17"
|
||||||
@@ -3628,21 +3652,18 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/fast-xml-parser": {
|
"node_modules/fast-xml-parser": {
|
||||||
"version": "4.4.1",
|
"version": "5.3.6",
|
||||||
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
|
||||||
"integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
|
"integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "github",
|
"type": "github",
|
||||||
"url": "https://github.com/sponsors/NaturalIntelligence"
|
"url": "https://github.com/sponsors/NaturalIntelligence"
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "paypal",
|
|
||||||
"url": "https://paypal.me/naturalintelligence"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"strnum": "^1.0.5"
|
"strnum": "^2.1.2"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"fxparser": "src/cli/cli.js"
|
"fxparser": "src/cli/cli.js"
|
||||||
@@ -4965,9 +4986,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.5",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
|
||||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
|
||||||
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^1.1.7"
|
"brace-expansion": "^1.1.7"
|
||||||
},
|
},
|
||||||
@@ -5696,9 +5718,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/strnum": {
|
"node_modules/strnum": {
|
||||||
"version": "1.0.5",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz",
|
||||||
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
|
"integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/NaturalIntelligence"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/supports-color": {
|
"node_modules/supports-color": {
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@
|
|||||||
"@actions/glob": "^0.5.0",
|
"@actions/glob": "^0.5.0",
|
||||||
"@actions/http-client": "^3.0.0",
|
"@actions/http-client": "^3.0.0",
|
||||||
"@actions/io": "^1.0.2",
|
"@actions/io": "^1.0.2",
|
||||||
"fast-xml-parser": "^4.4.1",
|
"fast-xml-parser": "^5.3.6",
|
||||||
"json5": "^2.2.3",
|
"json5": "^2.2.3",
|
||||||
"semver": "^7.6.0"
|
"semver": "^7.6.0"
|
||||||
},
|
},
|
||||||
|
|||||||
+38
-2
@@ -184,6 +184,16 @@ export class DotnetInstallScript {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When architecture is empty/undefined, the installer auto-detects the current runner architecture.
|
||||||
|
public useArchitecture(architecture?: string) {
|
||||||
|
if (!architecture) return this;
|
||||||
|
this.useArguments(
|
||||||
|
IS_WINDOWS ? '-Architecture' : '--architecture',
|
||||||
|
architecture
|
||||||
|
);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public useVersion(dotnetVersion: DotnetVersion, quality?: QualityOptions) {
|
public useVersion(dotnetVersion: DotnetVersion, quality?: QualityOptions) {
|
||||||
if (dotnetVersion.type) {
|
if (dotnetVersion.type) {
|
||||||
this.useArguments(dotnetVersion.type, dotnetVersion.value);
|
this.useArguments(dotnetVersion.type, dotnetVersion.value);
|
||||||
@@ -250,6 +260,17 @@ export abstract class DotnetInstallDir {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function normalizeArch(arch: string): string {
|
||||||
|
switch (arch.toLowerCase()) {
|
||||||
|
case 'amd64':
|
||||||
|
return 'x64';
|
||||||
|
case 'ia32':
|
||||||
|
return 'x86';
|
||||||
|
default:
|
||||||
|
return arch.toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class DotnetCoreInstaller {
|
export class DotnetCoreInstaller {
|
||||||
static {
|
static {
|
||||||
DotnetInstallDir.setEnvironmentVariable();
|
DotnetInstallDir.setEnvironmentVariable();
|
||||||
@@ -257,18 +278,30 @@ export class DotnetCoreInstaller {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private version: string,
|
private version: string,
|
||||||
private quality: QualityOptions
|
private quality: QualityOptions,
|
||||||
|
private architecture?: string
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public async installDotnet(): Promise<string | null> {
|
public async installDotnet(): Promise<string | null> {
|
||||||
const versionResolver = new DotnetVersionResolver(this.version);
|
const versionResolver = new DotnetVersionResolver(this.version);
|
||||||
const dotnetVersion = await versionResolver.createDotnetVersion();
|
const dotnetVersion = await versionResolver.createDotnetVersion();
|
||||||
|
|
||||||
|
const architectureArguments =
|
||||||
|
this.architecture &&
|
||||||
|
normalizeArch(this.architecture) !== normalizeArch(os.arch())
|
||||||
|
? [
|
||||||
|
IS_WINDOWS ? '-InstallDir' : '--install-dir',
|
||||||
|
IS_WINDOWS
|
||||||
|
? `"${path.join(DotnetInstallDir.dirPath, this.architecture)}"`
|
||||||
|
: path.join(DotnetInstallDir.dirPath, this.architecture)
|
||||||
|
]
|
||||||
|
: [];
|
||||||
/**
|
/**
|
||||||
* Install dotnet runitme first in order to get
|
* Install dotnet runtime first in order to get
|
||||||
* the latest stable version of dotnet CLI
|
* the latest stable version of dotnet CLI
|
||||||
*/
|
*/
|
||||||
const runtimeInstallOutput = await new DotnetInstallScript()
|
const runtimeInstallOutput = await new DotnetInstallScript()
|
||||||
|
.useArchitecture(this.architecture)
|
||||||
// If dotnet CLI is already installed - avoid overwriting it
|
// If dotnet CLI is already installed - avoid overwriting it
|
||||||
.useArguments(
|
.useArguments(
|
||||||
IS_WINDOWS ? '-SkipNonVersionedFiles' : '--skip-non-versioned-files'
|
IS_WINDOWS ? '-SkipNonVersionedFiles' : '--skip-non-versioned-files'
|
||||||
@@ -277,6 +310,7 @@ export class DotnetCoreInstaller {
|
|||||||
.useArguments(IS_WINDOWS ? '-Runtime' : '--runtime', 'dotnet')
|
.useArguments(IS_WINDOWS ? '-Runtime' : '--runtime', 'dotnet')
|
||||||
// Use latest stable version
|
// Use latest stable version
|
||||||
.useArguments(IS_WINDOWS ? '-Channel' : '--channel', 'LTS')
|
.useArguments(IS_WINDOWS ? '-Channel' : '--channel', 'LTS')
|
||||||
|
.useArguments(...architectureArguments)
|
||||||
.execute();
|
.execute();
|
||||||
|
|
||||||
if (runtimeInstallOutput.exitCode) {
|
if (runtimeInstallOutput.exitCode) {
|
||||||
@@ -294,12 +328,14 @@ export class DotnetCoreInstaller {
|
|||||||
* dotnet CLI
|
* dotnet CLI
|
||||||
*/
|
*/
|
||||||
const dotnetInstallOutput = await new DotnetInstallScript()
|
const dotnetInstallOutput = await new DotnetInstallScript()
|
||||||
|
.useArchitecture(this.architecture)
|
||||||
// Don't overwrite CLI because it should be already installed
|
// Don't overwrite CLI because it should be already installed
|
||||||
.useArguments(
|
.useArguments(
|
||||||
IS_WINDOWS ? '-SkipNonVersionedFiles' : '--skip-non-versioned-files'
|
IS_WINDOWS ? '-SkipNonVersionedFiles' : '--skip-non-versioned-files'
|
||||||
)
|
)
|
||||||
// Use version provided by user
|
// Use version provided by user
|
||||||
.useVersion(dotnetVersion, this.quality)
|
.useVersion(dotnetVersion, this.quality)
|
||||||
|
.useArguments(...architectureArguments)
|
||||||
.execute();
|
.execute();
|
||||||
|
|
||||||
if (dotnetInstallOutput.exitCode) {
|
if (dotnetInstallOutput.exitCode) {
|
||||||
|
|||||||
+69
-2
@@ -1,8 +1,14 @@
|
|||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import {DotnetCoreInstaller, DotnetInstallDir} from './installer';
|
import * as exec from '@actions/exec';
|
||||||
|
import {
|
||||||
|
DotnetCoreInstaller,
|
||||||
|
DotnetInstallDir,
|
||||||
|
normalizeArch
|
||||||
|
} from './installer';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
|
import os from 'os';
|
||||||
import * as auth from './authutil';
|
import * as auth from './authutil';
|
||||||
import {isCacheFeatureAvailable} from './cache-utils';
|
import {isCacheFeatureAvailable} from './cache-utils';
|
||||||
import {restoreCache} from './cache-restore';
|
import {restoreCache} from './cache-restore';
|
||||||
@@ -16,6 +22,17 @@ const qualityOptions = [
|
|||||||
'preview',
|
'preview',
|
||||||
'ga'
|
'ga'
|
||||||
] as const;
|
] as const;
|
||||||
|
const supportedArchitectures = [
|
||||||
|
'x64',
|
||||||
|
'x86',
|
||||||
|
'arm64',
|
||||||
|
'amd64',
|
||||||
|
'arm',
|
||||||
|
's390x',
|
||||||
|
'ppc64le',
|
||||||
|
'riscv64'
|
||||||
|
] as const;
|
||||||
|
type SupportedArchitecture = (typeof supportedArchitectures)[number];
|
||||||
|
|
||||||
export type QualityOptions = (typeof qualityOptions)[number];
|
export type QualityOptions = (typeof qualityOptions)[number];
|
||||||
|
|
||||||
@@ -32,6 +49,7 @@ export async function run() {
|
|||||||
//
|
//
|
||||||
const versions = core.getMultilineInput('dotnet-version');
|
const versions = core.getMultilineInput('dotnet-version');
|
||||||
const installedDotnetVersions: (string | null)[] = [];
|
const installedDotnetVersions: (string | null)[] = [];
|
||||||
|
const architecture = getArchitectureInput();
|
||||||
|
|
||||||
const globalJsonFileInput = core.getInput('global-json-file');
|
const globalJsonFileInput = core.getInput('global-json-file');
|
||||||
if (globalJsonFileInput) {
|
if (globalJsonFileInput) {
|
||||||
@@ -69,11 +87,46 @@ export async function run() {
|
|||||||
let dotnetInstaller: DotnetCoreInstaller;
|
let dotnetInstaller: DotnetCoreInstaller;
|
||||||
const uniqueVersions = new Set<string>(versions);
|
const uniqueVersions = new Set<string>(versions);
|
||||||
for (const version of uniqueVersions) {
|
for (const version of uniqueVersions) {
|
||||||
dotnetInstaller = new DotnetCoreInstaller(version, quality);
|
dotnetInstaller = new DotnetCoreInstaller(
|
||||||
|
version,
|
||||||
|
quality,
|
||||||
|
architecture
|
||||||
|
);
|
||||||
const installedVersion = await dotnetInstaller.installDotnet();
|
const installedVersion = await dotnetInstaller.installDotnet();
|
||||||
installedDotnetVersions.push(installedVersion);
|
installedDotnetVersions.push(installedVersion);
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
architecture &&
|
||||||
|
normalizeArch(architecture) !== normalizeArch(os.arch())
|
||||||
|
) {
|
||||||
|
process.env['DOTNET_INSTALL_DIR'] = path.join(
|
||||||
|
DotnetInstallDir.dirPath,
|
||||||
|
architecture
|
||||||
|
);
|
||||||
|
}
|
||||||
DotnetInstallDir.addToPath();
|
DotnetInstallDir.addToPath();
|
||||||
|
|
||||||
|
const workloadsInput = core.getInput('workloads');
|
||||||
|
if (workloadsInput) {
|
||||||
|
const workloads = workloadsInput
|
||||||
|
.split(',')
|
||||||
|
.map(w => w.trim())
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
if (workloads.length) {
|
||||||
|
try {
|
||||||
|
core.info(`Refreshing workload manifests...`);
|
||||||
|
await exec.exec('dotnet', ['workload', 'update']);
|
||||||
|
|
||||||
|
core.info(`Installing workloads: ${workloads.join(', ')}`);
|
||||||
|
await exec.exec('dotnet', ['workload', 'install', ...workloads]);
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(
|
||||||
|
`Failed to install workloads [${workloads.join(', ')}]: ${err}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const sourceUrl: string = core.getInput('source-url');
|
const sourceUrl: string = core.getInput('source-url');
|
||||||
@@ -96,6 +149,20 @@ export async function run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getArchitectureInput(): SupportedArchitecture | '' {
|
||||||
|
const raw = (core.getInput('architecture') || '').trim();
|
||||||
|
if (!raw) return '';
|
||||||
|
const normalized = raw.toLowerCase();
|
||||||
|
if ((supportedArchitectures as readonly string[]).includes(normalized)) {
|
||||||
|
return normalizeArch(normalized) as SupportedArchitecture;
|
||||||
|
}
|
||||||
|
throw new Error(
|
||||||
|
`Value '${raw}' is not supported for the 'architecture' option. Supported values are: ${supportedArchitectures.join(
|
||||||
|
', '
|
||||||
|
)}.`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function getVersionFromGlobalJson(globalJsonPath: string): string {
|
function getVersionFromGlobalJson(globalJsonPath: string): string {
|
||||||
let version = '';
|
let version = '';
|
||||||
const globalJson = JSON5.parse(
|
const globalJson = JSON5.parse(
|
||||||
|
|||||||
Reference in new issue
Block a user