feature: add update-environment input (#411)
				
					
				
			This option allows to specify if the action shall update environment variables (default) or not. This allows to use the setup-python action in a composite action without side effect (except downloading/installing python if version is missing).
This commit is contained in:
		
							parent
							
								
									ffcd00020c
								
							
						
					
					
						commit
						00a5248c77
					
				
							
								
								
									
										26
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							| @ -65,3 +65,29 @@ jobs: | ||||
|           EXECUTABLE=${EXECUTABLE%%-*}  # remove any -* suffixe | ||||
|           ${EXECUTABLE} --version | ||||
|         shell: bash | ||||
| 
 | ||||
|   setup-pypy-noenv: | ||||
|     name: Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) | ||||
|     runs-on: ${{ matrix.os }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-18.04, ubuntu-latest] | ||||
|         pypy: ['pypy2.7', 'pypy3.7', 'pypy3.8', 'pypy3.9-nightly'] | ||||
| 
 | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
| 
 | ||||
|       - name: setup-python ${{ matrix.pypy }} | ||||
|         id: setup-python | ||||
|         uses: ./ | ||||
|         with: | ||||
|           python-version: ${{ matrix.pypy }} | ||||
|           update-environment: false | ||||
| 
 | ||||
|       - name: PyPy and Python version | ||||
|         run: ${{ steps.setup-python.outputs.python-path }} --version | ||||
| 
 | ||||
|       - name: Run simple code | ||||
|         run: ${{ steps.setup-python.outputs.python-path }} -c 'import math; print(math.factorial(5))' | ||||
|  | ||||
							
								
								
									
										25
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							| @ -147,3 +147,28 @@ jobs: | ||||
| 
 | ||||
|     - name: Run simple code | ||||
|       run: python -c 'import math; print(math.factorial(5))' | ||||
| 
 | ||||
|   setup-versions-noenv: | ||||
|     name: Setup ${{ matrix.python }} ${{ matrix.os }} (noenv) | ||||
|     runs-on: ${{ matrix.os }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-18.04, ubuntu-20.04] | ||||
|         python: ["3.7", "3.8", "3.9", "3.10"] | ||||
|     steps: | ||||
|     - name: Checkout | ||||
|       uses: actions/checkout@v3 | ||||
| 
 | ||||
|     - name: setup-python ${{ matrix.python }} | ||||
|       id: setup-python | ||||
|       uses: ./ | ||||
|       with: | ||||
|         python-version: ${{ matrix.python }} | ||||
|         update-environment: false | ||||
| 
 | ||||
|     - name: Python version | ||||
|       run: ${{ steps.setup-python.outputs.python-path }} --version | ||||
| 
 | ||||
|     - name: Run simple code | ||||
|       run: ${{ steps.setup-python.outputs.python-path }} -c 'import math; print(math.factorial(5))' | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								.licenses/npm/@actions/core.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.licenses/npm/@actions/core.dep.yml
									
									
									
										generated
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								.licenses/npm/@actions/http-client-1.0.8.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.licenses/npm/@actions/http-client-1.0.8.dep.yml
									
									
									
										generated
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										20
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								README.md
									
									
									
									
									
								
							| @ -320,6 +320,26 @@ steps: | ||||
| - run: pipenv install | ||||
| ``` | ||||
| 
 | ||||
| # Environment variables | ||||
| 
 | ||||
|  The `update-environment` flag defaults to `true`. | ||||
|  With this setting, the action will add/update environment variables (e.g. `PATH`, `PKG_CONFIG_PATH`, `pythonLocation`) for `python` to just work out of the box. | ||||
| 
 | ||||
|  If `update-environment` is set to `false`, the action will not add/update environment variables. | ||||
|  This can prove useful if you want the only side-effect to be to ensure python is installed and rely on the `python-path` output to run python. | ||||
|  Such a requirement on side-effect could be because you don't want your composite action messing with your user's workflows. | ||||
| 
 | ||||
|  ```yaml | ||||
|  steps: | ||||
|    - uses: actions/checkout@v3 | ||||
|    - uses: actions/setup-python@v4 | ||||
|      id: cp310 | ||||
|      with: | ||||
|        python-version: '3.10' | ||||
|        update-environment: false | ||||
|    - run: ${{ steps.cp310.outputs.python-path }} my_script.py | ||||
|  ``` | ||||
| 
 | ||||
| # Using `setup-python` with a self hosted runner | ||||
| 
 | ||||
| Python distributions are only available for the same [environments](https://github.com/actions/virtual-environments#available-environments) that GitHub Actions hosted environments are available for. If you are using an unsupported version of Ubuntu such as `19.04` or another Linux distribution such as Fedora, `setup-python` will not work. If you have a supported self-hosted runner and you would like to use `setup-python`, there are a few extra things you need to make sure are set up so that new versions of Python can be downloaded and configured on your runner. | ||||
|  | ||||
| @ -5,6 +5,7 @@ import {HttpClient} from '@actions/http-client'; | ||||
| import * as ifm from '@actions/http-client/interfaces'; | ||||
| import * as tc from '@actions/tool-cache'; | ||||
| import * as exec from '@actions/exec'; | ||||
| import * as core from '@actions/core'; | ||||
| 
 | ||||
| import * as path from 'path'; | ||||
| import * as semver from 'semver'; | ||||
| @ -148,6 +149,8 @@ describe('findPyPyVersion', () => { | ||||
|   let spyWriteExactPyPyVersionFile: jest.SpyInstance; | ||||
|   let spyCacheDir: jest.SpyInstance; | ||||
|   let spyChmodSync: jest.SpyInstance; | ||||
|   let spyCoreAddPath: jest.SpyInstance; | ||||
|   let spyCoreExportVariable: jest.SpyInstance; | ||||
| 
 | ||||
|   beforeEach(() => { | ||||
|     tcFind = jest.spyOn(tc, 'find'); | ||||
| @ -201,6 +204,10 @@ describe('findPyPyVersion', () => { | ||||
| 
 | ||||
|     spyExistsSync = jest.spyOn(fs, 'existsSync'); | ||||
|     spyExistsSync.mockReturnValue(true); | ||||
| 
 | ||||
|     spyCoreAddPath = jest.spyOn(core, 'addPath'); | ||||
| 
 | ||||
|     spyCoreExportVariable = jest.spyOn(core, 'exportVariable'); | ||||
|   }); | ||||
| 
 | ||||
|   afterEach(() => { | ||||
| @ -211,22 +218,31 @@ describe('findPyPyVersion', () => { | ||||
| 
 | ||||
|   it('found PyPy in toolcache', async () => { | ||||
|     await expect( | ||||
|       finder.findPyPyVersion('pypy-3.6-v7.3.x', architecture) | ||||
|       finder.findPyPyVersion('pypy-3.6-v7.3.x', architecture, true) | ||||
|     ).resolves.toEqual({ | ||||
|       resolvedPythonVersion: '3.6.12', | ||||
|       resolvedPyPyVersion: '7.3.3' | ||||
|     }); | ||||
|     expect(spyCoreAddPath).toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'pythonLocation', | ||||
|       expect.anything() | ||||
|     ); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'PKG_CONFIG_PATH', | ||||
|       expect.anything() | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   it('throw on invalid input format', async () => { | ||||
|     await expect( | ||||
|       finder.findPyPyVersion('pypy3.7-v7.3.x', architecture) | ||||
|       finder.findPyPyVersion('pypy3.7-v7.3.x', architecture, true) | ||||
|     ).rejects.toThrow(); | ||||
|   }); | ||||
| 
 | ||||
|   it('throw on invalid input format pypy3.7-7.3.x', async () => { | ||||
|     await expect( | ||||
|       finder.findPyPyVersion('pypy3.7-v7.3.x', architecture) | ||||
|       finder.findPyPyVersion('pypy3.7-v7.3.x', architecture, true) | ||||
|     ).rejects.toThrow(); | ||||
|   }); | ||||
| 
 | ||||
| @ -238,16 +254,42 @@ describe('findPyPyVersion', () => { | ||||
|     spyChmodSync = jest.spyOn(fs, 'chmodSync'); | ||||
|     spyChmodSync.mockImplementation(() => undefined); | ||||
|     await expect( | ||||
|       finder.findPyPyVersion('pypy-3.7-v7.3.x', architecture) | ||||
|       finder.findPyPyVersion('pypy-3.7-v7.3.x', architecture, true) | ||||
|     ).resolves.toEqual({ | ||||
|       resolvedPythonVersion: '3.7.9', | ||||
|       resolvedPyPyVersion: '7.3.3' | ||||
|     }); | ||||
|     expect(spyCoreAddPath).toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'pythonLocation', | ||||
|       expect.anything() | ||||
|     ); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'PKG_CONFIG_PATH', | ||||
|       expect.anything() | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   it('found and install successfully without environment update', async () => { | ||||
|     spyCacheDir = jest.spyOn(tc, 'cacheDir'); | ||||
|     spyCacheDir.mockImplementation(() => | ||||
|       path.join(toolDir, 'PyPy', '3.7.7', architecture) | ||||
|     ); | ||||
|     spyChmodSync = jest.spyOn(fs, 'chmodSync'); | ||||
|     spyChmodSync.mockImplementation(() => undefined); | ||||
|     await expect( | ||||
|       finder.findPyPyVersion('pypy-3.7-v7.3.x', architecture, false) | ||||
|     ).resolves.toEqual({ | ||||
|       resolvedPythonVersion: '3.7.9', | ||||
|       resolvedPyPyVersion: '7.3.3' | ||||
|     }); | ||||
|     expect(spyCoreAddPath).not.toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).not.toHaveBeenCalled(); | ||||
|   }); | ||||
| 
 | ||||
|   it('throw if release is not found', async () => { | ||||
|     await expect( | ||||
|       finder.findPyPyVersion('pypy-3.7-v7.5.x', architecture) | ||||
|       finder.findPyPyVersion('pypy-3.7-v7.5.x', architecture, true) | ||||
|     ).rejects.toThrowError( | ||||
|       `PyPy version 3.7 (v7.5.x) with arch ${architecture} not found` | ||||
|     ); | ||||
|  | ||||
| @ -19,15 +19,26 @@ process.env['RUNNER_TOOL_CACHE'] = toolDir; | ||||
| process.env['RUNNER_TEMP'] = tempDir; | ||||
| 
 | ||||
| import * as tc from '@actions/tool-cache'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as finder from '../src/find-python'; | ||||
| import * as installer from '../src/install-python'; | ||||
| 
 | ||||
| const manifestData = require('./data/versions-manifest.json'); | ||||
| 
 | ||||
| describe('Finder tests', () => { | ||||
|   let spyCoreAddPath: jest.SpyInstance; | ||||
|   let spyCoreExportVariable: jest.SpyInstance; | ||||
| 
 | ||||
|   beforeEach(() => { | ||||
|     spyCoreAddPath = jest.spyOn(core, 'addPath'); | ||||
| 
 | ||||
|     spyCoreExportVariable = jest.spyOn(core, 'exportVariable'); | ||||
|   }); | ||||
| 
 | ||||
|   afterEach(() => { | ||||
|     jest.resetAllMocks(); | ||||
|     jest.clearAllMocks(); | ||||
|     jest.restoreAllMocks(); | ||||
|   }); | ||||
| 
 | ||||
|   it('Finds Python if it is installed', async () => { | ||||
| @ -35,7 +46,27 @@ describe('Finder tests', () => { | ||||
|     await io.mkdirP(pythonDir); | ||||
|     fs.writeFileSync(`${pythonDir}.complete`, 'hello'); | ||||
|     // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
 | ||||
|     await finder.useCpythonVersion('3.x', 'x64'); | ||||
|     await finder.useCpythonVersion('3.x', 'x64', true); | ||||
|     expect(spyCoreAddPath).toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'pythonLocation', | ||||
|       expect.anything() | ||||
|     ); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'PKG_CONFIG_PATH', | ||||
|       expect.anything() | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   it('Finds Python if it is installed without environment update', async () => { | ||||
|     const pythonDir: string = path.join(toolDir, 'Python', '3.0.0', 'x64'); | ||||
|     await io.mkdirP(pythonDir); | ||||
|     fs.writeFileSync(`${pythonDir}.complete`, 'hello'); | ||||
|     // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
 | ||||
|     await finder.useCpythonVersion('3.x', 'x64', false); | ||||
|     expect(spyCoreAddPath).not.toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).not.toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).not.toHaveBeenCalled(); | ||||
|   }); | ||||
| 
 | ||||
|   it('Finds stable Python version if it is not installed, but exists in the manifest', async () => { | ||||
| @ -52,7 +83,16 @@ describe('Finder tests', () => { | ||||
|       fs.writeFileSync(`${pythonDir}.complete`, 'hello'); | ||||
|     }); | ||||
|     // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
 | ||||
|     await finder.useCpythonVersion('1.2.3', 'x64'); | ||||
|     await finder.useCpythonVersion('1.2.3', 'x64', true); | ||||
|     expect(spyCoreAddPath).toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'pythonLocation', | ||||
|       expect.anything() | ||||
|     ); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'PKG_CONFIG_PATH', | ||||
|       expect.anything() | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   it('Finds pre-release Python version in the manifest', async () => { | ||||
| @ -74,17 +114,28 @@ describe('Finder tests', () => { | ||||
|       fs.writeFileSync(`${pythonDir}.complete`, 'hello'); | ||||
|     }); | ||||
|     // This will throw if it doesn't find it in the manifest (because no such version exists)
 | ||||
|     await finder.useCpythonVersion('1.2.3-beta.2', 'x64'); | ||||
|     await finder.useCpythonVersion('1.2.3-beta.2', 'x64', true); | ||||
|     expect(spyCoreAddPath).toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'pythonLocation', | ||||
|       expect.anything() | ||||
|     ); | ||||
|     expect(spyCoreExportVariable).toHaveBeenCalledWith( | ||||
|       'PKG_CONFIG_PATH', | ||||
|       expect.anything() | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   it('Errors if Python is not installed', async () => { | ||||
|     // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
 | ||||
|     let thrown = false; | ||||
|     try { | ||||
|       await finder.useCpythonVersion('3.300000', 'x64'); | ||||
|       await finder.useCpythonVersion('3.300000', 'x64', true); | ||||
|     } catch { | ||||
|       thrown = true; | ||||
|     } | ||||
|     expect(thrown).toBeTruthy(); | ||||
|     expect(spyCoreAddPath).not.toHaveBeenCalled(); | ||||
|     expect(spyCoreExportVariable).not.toHaveBeenCalled(); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @ -17,6 +17,9 @@ inputs: | ||||
|     default: ${{ github.token }} | ||||
|   cache-dependency-path: | ||||
|     description: 'Used to specify the path to dependency files. Supports wildcards or a list of file names for caching multiple dependencies.' | ||||
|   update-environment: | ||||
|     description: 'Set this option if you want the action to update environment variables.' | ||||
|     default: true | ||||
| outputs: | ||||
|   python-version: | ||||
|     description: "The installed python version. Useful when given a version range as input." | ||||
|  | ||||
							
								
								
									
										1890
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1890
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							| @ -214,8 +214,8 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(7320); | ||||
| const auth_1 = __nccwpck_require__(7093); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const auth_1 = __nccwpck_require__(3702); | ||||
| const crypto = __importStar(__nccwpck_require__(6113)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| const url_1 = __nccwpck_require__(7310); | ||||
| @ -647,7 +647,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(7320); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const storage_blob_1 = __nccwpck_require__(4100); | ||||
| const buffer = __importStar(__nccwpck_require__(4300)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| @ -885,7 +885,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(7320); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const constants_1 = __nccwpck_require__(8840); | ||||
| function isSuccessStatusCode(statusCode) { | ||||
|     if (!statusCode) { | ||||
| @ -2290,682 +2290,6 @@ class SearchState { | ||||
| exports.SearchState = SearchState; | ||||
| //# sourceMappingURL=internal-search-state.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 7093: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| class BasicCredentialHandler { | ||||
|     constructor(username, password) { | ||||
|         this.username = username; | ||||
|         this.password = password; | ||||
|     } | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + | ||||
|                 Buffer.from(this.username + ':' + this.password).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BasicCredentialHandler = BasicCredentialHandler; | ||||
| class BearerCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = 'Bearer ' + this.token; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BearerCredentialHandler = BearerCredentialHandler; | ||||
| class PersonalAccessTokenCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + Buffer.from('PAT:' + this.token).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 7320: | ||||
| /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const http = __nccwpck_require__(3685); | ||||
| const https = __nccwpck_require__(5687); | ||||
| const pm = __nccwpck_require__(7326); | ||||
| let tunnel; | ||||
| var HttpCodes; | ||||
| (function (HttpCodes) { | ||||
|     HttpCodes[HttpCodes["OK"] = 200] = "OK"; | ||||
|     HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; | ||||
|     HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; | ||||
|     HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; | ||||
|     HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; | ||||
|     HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; | ||||
|     HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; | ||||
|     HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; | ||||
|     HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; | ||||
|     HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; | ||||
|     HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; | ||||
|     HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; | ||||
|     HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; | ||||
|     HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; | ||||
|     HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; | ||||
|     HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; | ||||
|     HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; | ||||
|     HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; | ||||
|     HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; | ||||
|     HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; | ||||
|     HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; | ||||
|     HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; | ||||
|     HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; | ||||
|     HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; | ||||
|     HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; | ||||
|     HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; | ||||
|     HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; | ||||
| })(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); | ||||
| var Headers; | ||||
| (function (Headers) { | ||||
|     Headers["Accept"] = "accept"; | ||||
|     Headers["ContentType"] = "content-type"; | ||||
| })(Headers = exports.Headers || (exports.Headers = {})); | ||||
| var MediaTypes; | ||||
| (function (MediaTypes) { | ||||
|     MediaTypes["ApplicationJson"] = "application/json"; | ||||
| })(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); | ||||
| /** | ||||
|  * Returns the proxy URL, depending upon the supplied url and proxy environment variables. | ||||
|  * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|  */ | ||||
| function getProxyUrl(serverUrl) { | ||||
|     let proxyUrl = pm.getProxyUrl(new URL(serverUrl)); | ||||
|     return proxyUrl ? proxyUrl.href : ''; | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| const HttpRedirectCodes = [ | ||||
|     HttpCodes.MovedPermanently, | ||||
|     HttpCodes.ResourceMoved, | ||||
|     HttpCodes.SeeOther, | ||||
|     HttpCodes.TemporaryRedirect, | ||||
|     HttpCodes.PermanentRedirect | ||||
| ]; | ||||
| const HttpResponseRetryCodes = [ | ||||
|     HttpCodes.BadGateway, | ||||
|     HttpCodes.ServiceUnavailable, | ||||
|     HttpCodes.GatewayTimeout | ||||
| ]; | ||||
| const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; | ||||
| const ExponentialBackoffCeiling = 10; | ||||
| const ExponentialBackoffTimeSlice = 5; | ||||
| class HttpClientError extends Error { | ||||
|     constructor(message, statusCode) { | ||||
|         super(message); | ||||
|         this.name = 'HttpClientError'; | ||||
|         this.statusCode = statusCode; | ||||
|         Object.setPrototypeOf(this, HttpClientError.prototype); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientError = HttpClientError; | ||||
| class HttpClientResponse { | ||||
|     constructor(message) { | ||||
|         this.message = message; | ||||
|     } | ||||
|     readBody() { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             let output = Buffer.alloc(0); | ||||
|             this.message.on('data', (chunk) => { | ||||
|                 output = Buffer.concat([output, chunk]); | ||||
|             }); | ||||
|             this.message.on('end', () => { | ||||
|                 resolve(output.toString()); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientResponse = HttpClientResponse; | ||||
| function isHttps(requestUrl) { | ||||
|     let parsedUrl = new URL(requestUrl); | ||||
|     return parsedUrl.protocol === 'https:'; | ||||
| } | ||||
| exports.isHttps = isHttps; | ||||
| class HttpClient { | ||||
|     constructor(userAgent, handlers, requestOptions) { | ||||
|         this._ignoreSslError = false; | ||||
|         this._allowRedirects = true; | ||||
|         this._allowRedirectDowngrade = false; | ||||
|         this._maxRedirects = 50; | ||||
|         this._allowRetries = false; | ||||
|         this._maxRetries = 1; | ||||
|         this._keepAlive = false; | ||||
|         this._disposed = false; | ||||
|         this.userAgent = userAgent; | ||||
|         this.handlers = handlers || []; | ||||
|         this.requestOptions = requestOptions; | ||||
|         if (requestOptions) { | ||||
|             if (requestOptions.ignoreSslError != null) { | ||||
|                 this._ignoreSslError = requestOptions.ignoreSslError; | ||||
|             } | ||||
|             this._socketTimeout = requestOptions.socketTimeout; | ||||
|             if (requestOptions.allowRedirects != null) { | ||||
|                 this._allowRedirects = requestOptions.allowRedirects; | ||||
|             } | ||||
|             if (requestOptions.allowRedirectDowngrade != null) { | ||||
|                 this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; | ||||
|             } | ||||
|             if (requestOptions.maxRedirects != null) { | ||||
|                 this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); | ||||
|             } | ||||
|             if (requestOptions.keepAlive != null) { | ||||
|                 this._keepAlive = requestOptions.keepAlive; | ||||
|             } | ||||
|             if (requestOptions.allowRetries != null) { | ||||
|                 this._allowRetries = requestOptions.allowRetries; | ||||
|             } | ||||
|             if (requestOptions.maxRetries != null) { | ||||
|                 this._maxRetries = requestOptions.maxRetries; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     options(requestUrl, additionalHeaders) { | ||||
|         return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     get(requestUrl, additionalHeaders) { | ||||
|         return this.request('GET', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     del(requestUrl, additionalHeaders) { | ||||
|         return this.request('DELETE', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     post(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('POST', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     patch(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('PATCH', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     put(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('PUT', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     head(requestUrl, additionalHeaders) { | ||||
|         return this.request('HEAD', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     sendStream(verb, requestUrl, stream, additionalHeaders) { | ||||
|         return this.request(verb, requestUrl, stream, additionalHeaders); | ||||
|     } | ||||
|     /** | ||||
|      * Gets a typed object from an endpoint | ||||
|      * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise | ||||
|      */ | ||||
|     async getJson(requestUrl, additionalHeaders = {}) { | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         let res = await this.get(requestUrl, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async postJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.post(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async putJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.put(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async patchJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.patch(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     /** | ||||
|      * Makes a raw http request. | ||||
|      * All other methods such as get, post, patch, and request ultimately call this. | ||||
|      * Prefer get, del, post and patch | ||||
|      */ | ||||
|     async request(verb, requestUrl, data, headers) { | ||||
|         if (this._disposed) { | ||||
|             throw new Error('Client has already been disposed.'); | ||||
|         } | ||||
|         let parsedUrl = new URL(requestUrl); | ||||
|         let info = this._prepareRequest(verb, parsedUrl, headers); | ||||
|         // Only perform retries on reads since writes may not be idempotent.
 | ||||
|         let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1 | ||||
|             ? this._maxRetries + 1 | ||||
|             : 1; | ||||
|         let numTries = 0; | ||||
|         let response; | ||||
|         while (numTries < maxTries) { | ||||
|             response = await this.requestRaw(info, data); | ||||
|             // Check if it's an authentication challenge
 | ||||
|             if (response && | ||||
|                 response.message && | ||||
|                 response.message.statusCode === HttpCodes.Unauthorized) { | ||||
|                 let authenticationHandler; | ||||
|                 for (let i = 0; i < this.handlers.length; i++) { | ||||
|                     if (this.handlers[i].canHandleAuthentication(response)) { | ||||
|                         authenticationHandler = this.handlers[i]; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 if (authenticationHandler) { | ||||
|                     return authenticationHandler.handleAuthentication(this, info, data); | ||||
|                 } | ||||
|                 else { | ||||
|                     // We have received an unauthorized response but have no handlers to handle it.
 | ||||
|                     // Let the response return to the caller.
 | ||||
|                     return response; | ||||
|                 } | ||||
|             } | ||||
|             let redirectsRemaining = this._maxRedirects; | ||||
|             while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 && | ||||
|                 this._allowRedirects && | ||||
|                 redirectsRemaining > 0) { | ||||
|                 const redirectUrl = response.message.headers['location']; | ||||
|                 if (!redirectUrl) { | ||||
|                     // if there's no location to redirect to, we won't
 | ||||
|                     break; | ||||
|                 } | ||||
|                 let parsedRedirectUrl = new URL(redirectUrl); | ||||
|                 if (parsedUrl.protocol == 'https:' && | ||||
|                     parsedUrl.protocol != parsedRedirectUrl.protocol && | ||||
|                     !this._allowRedirectDowngrade) { | ||||
|                     throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); | ||||
|                 } | ||||
|                 // we need to finish reading the response before reassigning response
 | ||||
|                 // which will leak the open socket.
 | ||||
|                 await response.readBody(); | ||||
|                 // strip authorization header if redirected to a different hostname
 | ||||
|                 if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { | ||||
|                     for (let header in headers) { | ||||
|                         // header names are case insensitive
 | ||||
|                         if (header.toLowerCase() === 'authorization') { | ||||
|                             delete headers[header]; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 // let's make the request with the new redirectUrl
 | ||||
|                 info = this._prepareRequest(verb, parsedRedirectUrl, headers); | ||||
|                 response = await this.requestRaw(info, data); | ||||
|                 redirectsRemaining--; | ||||
|             } | ||||
|             if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { | ||||
|                 // If not a retry code, return immediately instead of retrying
 | ||||
|                 return response; | ||||
|             } | ||||
|             numTries += 1; | ||||
|             if (numTries < maxTries) { | ||||
|                 await response.readBody(); | ||||
|                 await this._performExponentialBackoff(numTries); | ||||
|             } | ||||
|         } | ||||
|         return response; | ||||
|     } | ||||
|     /** | ||||
|      * Needs to be called if keepAlive is set to true in request options. | ||||
|      */ | ||||
|     dispose() { | ||||
|         if (this._agent) { | ||||
|             this._agent.destroy(); | ||||
|         } | ||||
|         this._disposed = true; | ||||
|     } | ||||
|     /** | ||||
|      * Raw request. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      */ | ||||
|     requestRaw(info, data) { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             let callbackForResult = function (err, res) { | ||||
|                 if (err) { | ||||
|                     reject(err); | ||||
|                 } | ||||
|                 resolve(res); | ||||
|             }; | ||||
|             this.requestRawWithCallback(info, data, callbackForResult); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Raw request with callback. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      * @param onResult | ||||
|      */ | ||||
|     requestRawWithCallback(info, data, onResult) { | ||||
|         let socket; | ||||
|         if (typeof data === 'string') { | ||||
|             info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); | ||||
|         } | ||||
|         let callbackCalled = false; | ||||
|         let handleResult = (err, res) => { | ||||
|             if (!callbackCalled) { | ||||
|                 callbackCalled = true; | ||||
|                 onResult(err, res); | ||||
|             } | ||||
|         }; | ||||
|         let req = info.httpModule.request(info.options, (msg) => { | ||||
|             let res = new HttpClientResponse(msg); | ||||
|             handleResult(null, res); | ||||
|         }); | ||||
|         req.on('socket', sock => { | ||||
|             socket = sock; | ||||
|         }); | ||||
|         // If we ever get disconnected, we want the socket to timeout eventually
 | ||||
|         req.setTimeout(this._socketTimeout || 3 * 60000, () => { | ||||
|             if (socket) { | ||||
|                 socket.end(); | ||||
|             } | ||||
|             handleResult(new Error('Request timeout: ' + info.options.path), null); | ||||
|         }); | ||||
|         req.on('error', function (err) { | ||||
|             // err has statusCode property
 | ||||
|             // res should have headers
 | ||||
|             handleResult(err, null); | ||||
|         }); | ||||
|         if (data && typeof data === 'string') { | ||||
|             req.write(data, 'utf8'); | ||||
|         } | ||||
|         if (data && typeof data !== 'string') { | ||||
|             data.on('close', function () { | ||||
|                 req.end(); | ||||
|             }); | ||||
|             data.pipe(req); | ||||
|         } | ||||
|         else { | ||||
|             req.end(); | ||||
|         } | ||||
|     } | ||||
|     /** | ||||
|      * Gets an http agent. This function is useful when you need an http agent that handles | ||||
|      * routing through a proxy server - depending upon the url and proxy environment variables. | ||||
|      * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|      */ | ||||
|     getAgent(serverUrl) { | ||||
|         let parsedUrl = new URL(serverUrl); | ||||
|         return this._getAgent(parsedUrl); | ||||
|     } | ||||
|     _prepareRequest(method, requestUrl, headers) { | ||||
|         const info = {}; | ||||
|         info.parsedUrl = requestUrl; | ||||
|         const usingSsl = info.parsedUrl.protocol === 'https:'; | ||||
|         info.httpModule = usingSsl ? https : http; | ||||
|         const defaultPort = usingSsl ? 443 : 80; | ||||
|         info.options = {}; | ||||
|         info.options.host = info.parsedUrl.hostname; | ||||
|         info.options.port = info.parsedUrl.port | ||||
|             ? parseInt(info.parsedUrl.port) | ||||
|             : defaultPort; | ||||
|         info.options.path = | ||||
|             (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); | ||||
|         info.options.method = method; | ||||
|         info.options.headers = this._mergeHeaders(headers); | ||||
|         if (this.userAgent != null) { | ||||
|             info.options.headers['user-agent'] = this.userAgent; | ||||
|         } | ||||
|         info.options.agent = this._getAgent(info.parsedUrl); | ||||
|         // gives handlers an opportunity to participate
 | ||||
|         if (this.handlers) { | ||||
|             this.handlers.forEach(handler => { | ||||
|                 handler.prepareRequest(info.options); | ||||
|             }); | ||||
|         } | ||||
|         return info; | ||||
|     } | ||||
|     _mergeHeaders(headers) { | ||||
|         const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); | ||||
|         } | ||||
|         return lowercaseKeys(headers || {}); | ||||
|     } | ||||
|     _getExistingOrDefaultHeader(additionalHeaders, header, _default) { | ||||
|         const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
|         let clientHeader; | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; | ||||
|         } | ||||
|         return additionalHeaders[header] || clientHeader || _default; | ||||
|     } | ||||
|     _getAgent(parsedUrl) { | ||||
|         let agent; | ||||
|         let proxyUrl = pm.getProxyUrl(parsedUrl); | ||||
|         let useProxy = proxyUrl && proxyUrl.hostname; | ||||
|         if (this._keepAlive && useProxy) { | ||||
|             agent = this._proxyAgent; | ||||
|         } | ||||
|         if (this._keepAlive && !useProxy) { | ||||
|             agent = this._agent; | ||||
|         } | ||||
|         // if agent is already assigned use that agent.
 | ||||
|         if (!!agent) { | ||||
|             return agent; | ||||
|         } | ||||
|         const usingSsl = parsedUrl.protocol === 'https:'; | ||||
|         let maxSockets = 100; | ||||
|         if (!!this.requestOptions) { | ||||
|             maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; | ||||
|         } | ||||
|         if (useProxy) { | ||||
|             // If using proxy, need tunnel
 | ||||
|             if (!tunnel) { | ||||
|                 tunnel = __nccwpck_require__(4294); | ||||
|             } | ||||
|             const agentOptions = { | ||||
|                 maxSockets: maxSockets, | ||||
|                 keepAlive: this._keepAlive, | ||||
|                 proxy: { | ||||
|                     ...((proxyUrl.username || proxyUrl.password) && { | ||||
|                         proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` | ||||
|                     }), | ||||
|                     host: proxyUrl.hostname, | ||||
|                     port: proxyUrl.port | ||||
|                 } | ||||
|             }; | ||||
|             let tunnelAgent; | ||||
|             const overHttps = proxyUrl.protocol === 'https:'; | ||||
|             if (usingSsl) { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; | ||||
|             } | ||||
|             else { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; | ||||
|             } | ||||
|             agent = tunnelAgent(agentOptions); | ||||
|             this._proxyAgent = agent; | ||||
|         } | ||||
|         // if reusing agent across request and tunneling agent isn't assigned create a new agent
 | ||||
|         if (this._keepAlive && !agent) { | ||||
|             const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; | ||||
|             agent = usingSsl ? new https.Agent(options) : new http.Agent(options); | ||||
|             this._agent = agent; | ||||
|         } | ||||
|         // if not using private agent and tunnel agent isn't setup then use global agent
 | ||||
|         if (!agent) { | ||||
|             agent = usingSsl ? https.globalAgent : http.globalAgent; | ||||
|         } | ||||
|         if (usingSsl && this._ignoreSslError) { | ||||
|             // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
 | ||||
|             // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
 | ||||
|             // we have to cast it to any and change it directly
 | ||||
|             agent.options = Object.assign(agent.options || {}, { | ||||
|                 rejectUnauthorized: false | ||||
|             }); | ||||
|         } | ||||
|         return agent; | ||||
|     } | ||||
|     _performExponentialBackoff(retryNumber) { | ||||
|         retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); | ||||
|         const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); | ||||
|         return new Promise(resolve => setTimeout(() => resolve(), ms)); | ||||
|     } | ||||
|     static dateTimeDeserializer(key, value) { | ||||
|         if (typeof value === 'string') { | ||||
|             let a = new Date(value); | ||||
|             if (!isNaN(a.valueOf())) { | ||||
|                 return a; | ||||
|             } | ||||
|         } | ||||
|         return value; | ||||
|     } | ||||
|     async _processResponse(res, options) { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             const statusCode = res.message.statusCode; | ||||
|             const response = { | ||||
|                 statusCode: statusCode, | ||||
|                 result: null, | ||||
|                 headers: {} | ||||
|             }; | ||||
|             // not found leads to null obj returned
 | ||||
|             if (statusCode == HttpCodes.NotFound) { | ||||
|                 resolve(response); | ||||
|             } | ||||
|             let obj; | ||||
|             let contents; | ||||
|             // get the result from the body
 | ||||
|             try { | ||||
|                 contents = await res.readBody(); | ||||
|                 if (contents && contents.length > 0) { | ||||
|                     if (options && options.deserializeDates) { | ||||
|                         obj = JSON.parse(contents, HttpClient.dateTimeDeserializer); | ||||
|                     } | ||||
|                     else { | ||||
|                         obj = JSON.parse(contents); | ||||
|                     } | ||||
|                     response.result = obj; | ||||
|                 } | ||||
|                 response.headers = res.message.headers; | ||||
|             } | ||||
|             catch (err) { | ||||
|                 // Invalid resource (contents not json);  leaving result obj null
 | ||||
|             } | ||||
|             // note that 3xx redirects are handled by the http layer.
 | ||||
|             if (statusCode > 299) { | ||||
|                 let msg; | ||||
|                 // if exception/error in body, attempt to get better error
 | ||||
|                 if (obj && obj.message) { | ||||
|                     msg = obj.message; | ||||
|                 } | ||||
|                 else if (contents && contents.length > 0) { | ||||
|                     // it may be the case that the exception is in the body message as string
 | ||||
|                     msg = contents; | ||||
|                 } | ||||
|                 else { | ||||
|                     msg = 'Failed request: (' + statusCode + ')'; | ||||
|                 } | ||||
|                 let err = new HttpClientError(msg, statusCode); | ||||
|                 err.result = response.result; | ||||
|                 reject(err); | ||||
|             } | ||||
|             else { | ||||
|                 resolve(response); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClient = HttpClient; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 7326: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| function getProxyUrl(reqUrl) { | ||||
|     let usingSsl = reqUrl.protocol === 'https:'; | ||||
|     let proxyUrl; | ||||
|     if (checkBypass(reqUrl)) { | ||||
|         return proxyUrl; | ||||
|     } | ||||
|     let proxyVar; | ||||
|     if (usingSsl) { | ||||
|         proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY']; | ||||
|     } | ||||
|     else { | ||||
|         proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY']; | ||||
|     } | ||||
|     if (proxyVar) { | ||||
|         proxyUrl = new URL(proxyVar); | ||||
|     } | ||||
|     return proxyUrl; | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| function checkBypass(reqUrl) { | ||||
|     if (!reqUrl.hostname) { | ||||
|         return false; | ||||
|     } | ||||
|     let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; | ||||
|     if (!noProxy) { | ||||
|         return false; | ||||
|     } | ||||
|     // Determine the request port
 | ||||
|     let reqPort; | ||||
|     if (reqUrl.port) { | ||||
|         reqPort = Number(reqUrl.port); | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'http:') { | ||||
|         reqPort = 80; | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'https:') { | ||||
|         reqPort = 443; | ||||
|     } | ||||
|     // Format the request hostname and hostname with port
 | ||||
|     let upperReqHosts = [reqUrl.hostname.toUpperCase()]; | ||||
|     if (typeof reqPort === 'number') { | ||||
|         upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); | ||||
|     } | ||||
|     // Compare request host against noproxy
 | ||||
|     for (let upperNoProxyItem of noProxy | ||||
|         .split(',') | ||||
|         .map(x => x.trim().toUpperCase()) | ||||
|         .filter(x => x)) { | ||||
|         if (upperReqHosts.some(x => x === upperNoProxyItem)) { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| exports.checkBypass = checkBypass; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 3771: | ||||
| @ -4576,14 +3900,27 @@ function coerce (version, options) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.issue = exports.issueCommand = void 0; | ||||
| const os = __importStar(__nccwpck_require__(2037)); | ||||
| const utils_1 = __nccwpck_require__(5278); | ||||
| /** | ||||
| @ -4662,6 +3999,25 @@ function escapeProperty(s) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
| @ -4671,19 +4027,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; | ||||
| const command_1 = __nccwpck_require__(7351); | ||||
| const file_command_1 = __nccwpck_require__(717); | ||||
| const utils_1 = __nccwpck_require__(5278); | ||||
| const os = __importStar(__nccwpck_require__(2037)); | ||||
| const path = __importStar(__nccwpck_require__(1017)); | ||||
| const oidc_utils_1 = __nccwpck_require__(8041); | ||||
| /** | ||||
|  * The code to exit an action | ||||
|  */ | ||||
| @ -4745,7 +4096,9 @@ function addPath(inputPath) { | ||||
| } | ||||
| exports.addPath = addPath; | ||||
| /** | ||||
|  * Gets the value of an input.  The value is also trimmed. | ||||
|  * Gets the value of an input. | ||||
|  * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. | ||||
|  * Returns an empty string if the value is not defined. | ||||
|  * | ||||
|  * @param     name     name of the input to get | ||||
|  * @param     options  optional. See InputOptions. | ||||
| @ -4756,9 +4109,49 @@ function getInput(name, options) { | ||||
|     if (options && options.required && !val) { | ||||
|         throw new Error(`Input required and not supplied: ${name}`); | ||||
|     } | ||||
|     if (options && options.trimWhitespace === false) { | ||||
|         return val; | ||||
|     } | ||||
|     return val.trim(); | ||||
| } | ||||
| exports.getInput = getInput; | ||||
| /** | ||||
|  * Gets the values of an multiline input.  Each value is also trimmed. | ||||
|  * | ||||
|  * @param     name     name of the input to get | ||||
|  * @param     options  optional. See InputOptions. | ||||
|  * @returns   string[] | ||||
|  * | ||||
|  */ | ||||
| function getMultilineInput(name, options) { | ||||
|     const inputs = getInput(name, options) | ||||
|         .split('\n') | ||||
|         .filter(x => x !== ''); | ||||
|     return inputs; | ||||
| } | ||||
| exports.getMultilineInput = getMultilineInput; | ||||
| /** | ||||
|  * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. | ||||
|  * Support boolean input list: `true | True | TRUE | false | False | FALSE` . | ||||
|  * The return value is also in boolean type. | ||||
|  * ref: https://yaml.org/spec/1.2/spec.html#id2804923
 | ||||
|  * | ||||
|  * @param     name     name of the input to get | ||||
|  * @param     options  optional. See InputOptions. | ||||
|  * @returns   boolean | ||||
|  */ | ||||
| function getBooleanInput(name, options) { | ||||
|     const trueValue = ['true', 'True', 'TRUE']; | ||||
|     const falseValue = ['false', 'False', 'FALSE']; | ||||
|     const val = getInput(name, options); | ||||
|     if (trueValue.includes(val)) | ||||
|         return true; | ||||
|     if (falseValue.includes(val)) | ||||
|         return false; | ||||
|     throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + | ||||
|         `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); | ||||
| } | ||||
| exports.getBooleanInput = getBooleanInput; | ||||
| /** | ||||
|  * Sets the value of an output. | ||||
|  * | ||||
| @ -4767,6 +4160,7 @@ exports.getInput = getInput; | ||||
|  */ | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | ||||
| function setOutput(name, value) { | ||||
|     process.stdout.write(os.EOL); | ||||
|     command_1.issueCommand('set-output', { name }, value); | ||||
| } | ||||
| exports.setOutput = setOutput; | ||||
| @ -4813,19 +4207,30 @@ exports.debug = debug; | ||||
| /** | ||||
|  * Adds an error issue | ||||
|  * @param message error issue message. Errors will be converted to string via toString() | ||||
|  * @param properties optional properties to add to the annotation. | ||||
|  */ | ||||
| function error(message) { | ||||
|     command_1.issue('error', message instanceof Error ? message.toString() : message); | ||||
| function error(message, properties = {}) { | ||||
|     command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.error = error; | ||||
| /** | ||||
|  * Adds an warning issue | ||||
|  * Adds a warning issue | ||||
|  * @param message warning issue message. Errors will be converted to string via toString() | ||||
|  * @param properties optional properties to add to the annotation. | ||||
|  */ | ||||
| function warning(message) { | ||||
|     command_1.issue('warning', message instanceof Error ? message.toString() : message); | ||||
| function warning(message, properties = {}) { | ||||
|     command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.warning = warning; | ||||
| /** | ||||
|  * Adds a notice issue | ||||
|  * @param message notice issue message. Errors will be converted to string via toString() | ||||
|  * @param properties optional properties to add to the annotation. | ||||
|  */ | ||||
| function notice(message, properties = {}) { | ||||
|     command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.notice = notice; | ||||
| /** | ||||
|  * Writes info to log with console.log. | ||||
|  * @param message info message | ||||
| @ -4898,6 +4303,17 @@ function getState(name) { | ||||
|     return process.env[`STATE_${name}`] || ''; | ||||
| } | ||||
| exports.getState = getState; | ||||
| function getIDToken(aud) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         return yield oidc_utils_1.OidcClient.getIDToken(aud); | ||||
|     }); | ||||
| } | ||||
| exports.getIDToken = getIDToken; | ||||
| /** | ||||
|  * Markdown summary exports | ||||
|  */ | ||||
| var markdown_summary_1 = __nccwpck_require__(8042); | ||||
| Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return markdown_summary_1.markdownSummary; } })); | ||||
| //# sourceMappingURL=core.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| @ -4908,14 +4324,27 @@ exports.getState = getState; | ||||
| "use strict"; | ||||
| 
 | ||||
| // For internal use, subject to change.
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.issueCommand = void 0; | ||||
| // We use any as a valid input type
 | ||||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| @ -4938,6 +4367,376 @@ exports.issueCommand = issueCommand; | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 8042: | ||||
| /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; | ||||
| const os_1 = __nccwpck_require__(2037); | ||||
| const fs_1 = __nccwpck_require__(7147); | ||||
| const { access, appendFile, writeFile } = fs_1.promises; | ||||
| exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; | ||||
| exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-markdown-summary'; | ||||
| class MarkdownSummary { | ||||
|     constructor() { | ||||
|         this._buffer = ''; | ||||
|     } | ||||
|     /** | ||||
|      * Finds the summary file path from the environment, rejects if env var is not found or file does not exist | ||||
|      * Also checks r/w permissions. | ||||
|      * | ||||
|      * @returns step summary file path | ||||
|      */ | ||||
|     filePath() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             if (this._filePath) { | ||||
|                 return this._filePath; | ||||
|             } | ||||
|             const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; | ||||
|             if (!pathFromEnv) { | ||||
|                 throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports markdown summaries.`); | ||||
|             } | ||||
|             try { | ||||
|                 yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); | ||||
|             } | ||||
|             catch (_a) { | ||||
|                 throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); | ||||
|             } | ||||
|             this._filePath = pathFromEnv; | ||||
|             return this._filePath; | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Wraps content in an HTML tag, adding any HTML attributes | ||||
|      * | ||||
|      * @param {string} tag HTML tag to wrap | ||||
|      * @param {string | null} content content within the tag | ||||
|      * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add | ||||
|      * | ||||
|      * @returns {string} content wrapped in HTML element | ||||
|      */ | ||||
|     wrap(tag, content, attrs = {}) { | ||||
|         const htmlAttrs = Object.entries(attrs) | ||||
|             .map(([key, value]) => ` ${key}="${value}"`) | ||||
|             .join(''); | ||||
|         if (!content) { | ||||
|             return `<${tag}${htmlAttrs}>`; | ||||
|         } | ||||
|         return `<${tag}${htmlAttrs}>${content}</${tag}>`; | ||||
|     } | ||||
|     /** | ||||
|      * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. | ||||
|      * | ||||
|      * @param {SummaryWriteOptions} [options] (optional) options for write operation | ||||
|      * | ||||
|      * @returns {Promise<MarkdownSummary>} markdown summary instance | ||||
|      */ | ||||
|     write(options) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); | ||||
|             const filePath = yield this.filePath(); | ||||
|             const writeFunc = overwrite ? writeFile : appendFile; | ||||
|             yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); | ||||
|             return this.emptyBuffer(); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Clears the summary buffer and wipes the summary file | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     clear() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.emptyBuffer().write({ overwrite: true }); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Returns the current summary buffer as a string | ||||
|      * | ||||
|      * @returns {string} string of summary buffer | ||||
|      */ | ||||
|     stringify() { | ||||
|         return this._buffer; | ||||
|     } | ||||
|     /** | ||||
|      * If the summary buffer is empty | ||||
|      * | ||||
|      * @returns {boolen} true if the buffer is empty | ||||
|      */ | ||||
|     isEmptyBuffer() { | ||||
|         return this._buffer.length === 0; | ||||
|     } | ||||
|     /** | ||||
|      * Resets the summary buffer without writing to summary file | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     emptyBuffer() { | ||||
|         this._buffer = ''; | ||||
|         return this; | ||||
|     } | ||||
|     /** | ||||
|      * Adds raw text to the summary buffer | ||||
|      * | ||||
|      * @param {string} text content to add | ||||
|      * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addRaw(text, addEOL = false) { | ||||
|         this._buffer += text; | ||||
|         return addEOL ? this.addEOL() : this; | ||||
|     } | ||||
|     /** | ||||
|      * Adds the operating system-specific end-of-line marker to the buffer | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addEOL() { | ||||
|         return this.addRaw(os_1.EOL); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML codeblock to the summary buffer | ||||
|      * | ||||
|      * @param {string} code content to render within fenced code block | ||||
|      * @param {string} lang (optional) language to syntax highlight code | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addCodeBlock(code, lang) { | ||||
|         const attrs = Object.assign({}, (lang && { lang })); | ||||
|         const element = this.wrap('pre', this.wrap('code', code), attrs); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML list to the summary buffer | ||||
|      * | ||||
|      * @param {string[]} items list of items to render | ||||
|      * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addList(items, ordered = false) { | ||||
|         const tag = ordered ? 'ol' : 'ul'; | ||||
|         const listItems = items.map(item => this.wrap('li', item)).join(''); | ||||
|         const element = this.wrap(tag, listItems); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML table to the summary buffer | ||||
|      * | ||||
|      * @param {SummaryTableCell[]} rows table rows | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addTable(rows) { | ||||
|         const tableBody = rows | ||||
|             .map(row => { | ||||
|             const cells = row | ||||
|                 .map(cell => { | ||||
|                 if (typeof cell === 'string') { | ||||
|                     return this.wrap('td', cell); | ||||
|                 } | ||||
|                 const { header, data, colspan, rowspan } = cell; | ||||
|                 const tag = header ? 'th' : 'td'; | ||||
|                 const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); | ||||
|                 return this.wrap(tag, data, attrs); | ||||
|             }) | ||||
|                 .join(''); | ||||
|             return this.wrap('tr', cells); | ||||
|         }) | ||||
|             .join(''); | ||||
|         const element = this.wrap('table', tableBody); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds a collapsable HTML details element to the summary buffer | ||||
|      * | ||||
|      * @param {string} label text for the closed state | ||||
|      * @param {string} content collapsable content | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addDetails(label, content) { | ||||
|         const element = this.wrap('details', this.wrap('summary', label) + content); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML image tag to the summary buffer | ||||
|      * | ||||
|      * @param {string} src path to the image you to embed | ||||
|      * @param {string} alt text description of the image | ||||
|      * @param {SummaryImageOptions} options (optional) addition image attributes | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addImage(src, alt, options) { | ||||
|         const { width, height } = options || {}; | ||||
|         const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); | ||||
|         const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML section heading element | ||||
|      * | ||||
|      * @param {string} text heading text | ||||
|      * @param {number | string} [level=1] (optional) the heading level, default: 1 | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addHeading(text, level) { | ||||
|         const tag = `h${level}`; | ||||
|         const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) | ||||
|             ? tag | ||||
|             : 'h1'; | ||||
|         const element = this.wrap(allowedTag, text); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML thematic break (<hr>) to the summary buffer | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addSeparator() { | ||||
|         const element = this.wrap('hr', null); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML line break (<br>) to the summary buffer | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addBreak() { | ||||
|         const element = this.wrap('br', null); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML blockquote to the summary buffer | ||||
|      * | ||||
|      * @param {string} text quote text | ||||
|      * @param {string} cite (optional) citation url | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addQuote(text, cite) { | ||||
|         const attrs = Object.assign({}, (cite && { cite })); | ||||
|         const element = this.wrap('blockquote', text, attrs); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML anchor tag to the summary buffer | ||||
|      * | ||||
|      * @param {string} text link text/content | ||||
|      * @param {string} href hyperlink | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addLink(text, href) { | ||||
|         const element = this.wrap('a', text, { href }); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
| } | ||||
| // singleton export
 | ||||
| exports.markdownSummary = new MarkdownSummary(); | ||||
| //# sourceMappingURL=markdown-summary.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 8041: | ||||
| /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.OidcClient = void 0; | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const auth_1 = __nccwpck_require__(3702); | ||||
| const core_1 = __nccwpck_require__(2186); | ||||
| class OidcClient { | ||||
|     static createHttpClient(allowRetry = true, maxRetry = 10) { | ||||
|         const requestOptions = { | ||||
|             allowRetries: allowRetry, | ||||
|             maxRetries: maxRetry | ||||
|         }; | ||||
|         return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); | ||||
|     } | ||||
|     static getRequestToken() { | ||||
|         const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; | ||||
|         if (!token) { | ||||
|             throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); | ||||
|         } | ||||
|         return token; | ||||
|     } | ||||
|     static getIDTokenUrl() { | ||||
|         const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; | ||||
|         if (!runtimeUrl) { | ||||
|             throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); | ||||
|         } | ||||
|         return runtimeUrl; | ||||
|     } | ||||
|     static getCall(id_token_url) { | ||||
|         var _a; | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const httpclient = OidcClient.createHttpClient(); | ||||
|             const res = yield httpclient | ||||
|                 .getJson(id_token_url) | ||||
|                 .catch(error => { | ||||
|                 throw new Error(`Failed to get ID Token. \n 
 | ||||
|         Error Code : ${error.statusCode}\n  | ||||
|         Error Message: ${error.result.message}`);
 | ||||
|             }); | ||||
|             const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; | ||||
|             if (!id_token) { | ||||
|                 throw new Error('Response json body do not have ID Token field'); | ||||
|             } | ||||
|             return id_token; | ||||
|         }); | ||||
|     } | ||||
|     static getIDToken(audience) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             try { | ||||
|                 // New ID Token is requested from action service
 | ||||
|                 let id_token_url = OidcClient.getIDTokenUrl(); | ||||
|                 if (audience) { | ||||
|                     const encodedAudience = encodeURIComponent(audience); | ||||
|                     id_token_url = `${id_token_url}&audience=${encodedAudience}`; | ||||
|                 } | ||||
|                 core_1.debug(`ID token url is ${id_token_url}`); | ||||
|                 const id_token = yield OidcClient.getCall(id_token_url); | ||||
|                 core_1.setSecret(id_token); | ||||
|                 return id_token; | ||||
|             } | ||||
|             catch (error) { | ||||
|                 throw new Error(`Error message: ${error.message}`); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.OidcClient = OidcClient; | ||||
| //# sourceMappingURL=oidc-utils.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 5278: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| @ -4946,6 +4745,7 @@ exports.issueCommand = issueCommand; | ||||
| // We use any as a valid input type
 | ||||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.toCommandProperties = exports.toCommandValue = void 0; | ||||
| /** | ||||
|  * Sanitizes an input into a string so it can be passed into issueCommand safely | ||||
|  * @param input input to sanitize into a string | ||||
| @ -4960,6 +4760,26 @@ function toCommandValue(input) { | ||||
|     return JSON.stringify(input); | ||||
| } | ||||
| exports.toCommandValue = toCommandValue; | ||||
| /** | ||||
|  * | ||||
|  * @param annotationProperties | ||||
|  * @returns The command properties to send with the actual annotation command | ||||
|  * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646
 | ||||
|  */ | ||||
| function toCommandProperties(annotationProperties) { | ||||
|     if (!Object.keys(annotationProperties).length) { | ||||
|         return {}; | ||||
|     } | ||||
|     return { | ||||
|         title: annotationProperties.title, | ||||
|         file: annotationProperties.file, | ||||
|         line: annotationProperties.startLine, | ||||
|         endLine: annotationProperties.endLine, | ||||
|         col: annotationProperties.startColumn, | ||||
|         endColumn: annotationProperties.endColumn | ||||
|     }; | ||||
| } | ||||
| exports.toCommandProperties = toCommandProperties; | ||||
| //# sourceMappingURL=utils.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| @ -5697,6 +5517,682 @@ class ExecState extends events.EventEmitter { | ||||
| } | ||||
| //# sourceMappingURL=toolrunner.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 3702: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| class BasicCredentialHandler { | ||||
|     constructor(username, password) { | ||||
|         this.username = username; | ||||
|         this.password = password; | ||||
|     } | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + | ||||
|                 Buffer.from(this.username + ':' + this.password).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BasicCredentialHandler = BasicCredentialHandler; | ||||
| class BearerCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = 'Bearer ' + this.token; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BearerCredentialHandler = BearerCredentialHandler; | ||||
| class PersonalAccessTokenCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + Buffer.from('PAT:' + this.token).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 9925: | ||||
| /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const http = __nccwpck_require__(3685); | ||||
| const https = __nccwpck_require__(5687); | ||||
| const pm = __nccwpck_require__(6443); | ||||
| let tunnel; | ||||
| var HttpCodes; | ||||
| (function (HttpCodes) { | ||||
|     HttpCodes[HttpCodes["OK"] = 200] = "OK"; | ||||
|     HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; | ||||
|     HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; | ||||
|     HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; | ||||
|     HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; | ||||
|     HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; | ||||
|     HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; | ||||
|     HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; | ||||
|     HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; | ||||
|     HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; | ||||
|     HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; | ||||
|     HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; | ||||
|     HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; | ||||
|     HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; | ||||
|     HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; | ||||
|     HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; | ||||
|     HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; | ||||
|     HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; | ||||
|     HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; | ||||
|     HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; | ||||
|     HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; | ||||
|     HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; | ||||
|     HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; | ||||
|     HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; | ||||
|     HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; | ||||
|     HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; | ||||
|     HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; | ||||
| })(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); | ||||
| var Headers; | ||||
| (function (Headers) { | ||||
|     Headers["Accept"] = "accept"; | ||||
|     Headers["ContentType"] = "content-type"; | ||||
| })(Headers = exports.Headers || (exports.Headers = {})); | ||||
| var MediaTypes; | ||||
| (function (MediaTypes) { | ||||
|     MediaTypes["ApplicationJson"] = "application/json"; | ||||
| })(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); | ||||
| /** | ||||
|  * Returns the proxy URL, depending upon the supplied url and proxy environment variables. | ||||
|  * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|  */ | ||||
| function getProxyUrl(serverUrl) { | ||||
|     let proxyUrl = pm.getProxyUrl(new URL(serverUrl)); | ||||
|     return proxyUrl ? proxyUrl.href : ''; | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| const HttpRedirectCodes = [ | ||||
|     HttpCodes.MovedPermanently, | ||||
|     HttpCodes.ResourceMoved, | ||||
|     HttpCodes.SeeOther, | ||||
|     HttpCodes.TemporaryRedirect, | ||||
|     HttpCodes.PermanentRedirect | ||||
| ]; | ||||
| const HttpResponseRetryCodes = [ | ||||
|     HttpCodes.BadGateway, | ||||
|     HttpCodes.ServiceUnavailable, | ||||
|     HttpCodes.GatewayTimeout | ||||
| ]; | ||||
| const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; | ||||
| const ExponentialBackoffCeiling = 10; | ||||
| const ExponentialBackoffTimeSlice = 5; | ||||
| class HttpClientError extends Error { | ||||
|     constructor(message, statusCode) { | ||||
|         super(message); | ||||
|         this.name = 'HttpClientError'; | ||||
|         this.statusCode = statusCode; | ||||
|         Object.setPrototypeOf(this, HttpClientError.prototype); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientError = HttpClientError; | ||||
| class HttpClientResponse { | ||||
|     constructor(message) { | ||||
|         this.message = message; | ||||
|     } | ||||
|     readBody() { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             let output = Buffer.alloc(0); | ||||
|             this.message.on('data', (chunk) => { | ||||
|                 output = Buffer.concat([output, chunk]); | ||||
|             }); | ||||
|             this.message.on('end', () => { | ||||
|                 resolve(output.toString()); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientResponse = HttpClientResponse; | ||||
| function isHttps(requestUrl) { | ||||
|     let parsedUrl = new URL(requestUrl); | ||||
|     return parsedUrl.protocol === 'https:'; | ||||
| } | ||||
| exports.isHttps = isHttps; | ||||
| class HttpClient { | ||||
|     constructor(userAgent, handlers, requestOptions) { | ||||
|         this._ignoreSslError = false; | ||||
|         this._allowRedirects = true; | ||||
|         this._allowRedirectDowngrade = false; | ||||
|         this._maxRedirects = 50; | ||||
|         this._allowRetries = false; | ||||
|         this._maxRetries = 1; | ||||
|         this._keepAlive = false; | ||||
|         this._disposed = false; | ||||
|         this.userAgent = userAgent; | ||||
|         this.handlers = handlers || []; | ||||
|         this.requestOptions = requestOptions; | ||||
|         if (requestOptions) { | ||||
|             if (requestOptions.ignoreSslError != null) { | ||||
|                 this._ignoreSslError = requestOptions.ignoreSslError; | ||||
|             } | ||||
|             this._socketTimeout = requestOptions.socketTimeout; | ||||
|             if (requestOptions.allowRedirects != null) { | ||||
|                 this._allowRedirects = requestOptions.allowRedirects; | ||||
|             } | ||||
|             if (requestOptions.allowRedirectDowngrade != null) { | ||||
|                 this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; | ||||
|             } | ||||
|             if (requestOptions.maxRedirects != null) { | ||||
|                 this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); | ||||
|             } | ||||
|             if (requestOptions.keepAlive != null) { | ||||
|                 this._keepAlive = requestOptions.keepAlive; | ||||
|             } | ||||
|             if (requestOptions.allowRetries != null) { | ||||
|                 this._allowRetries = requestOptions.allowRetries; | ||||
|             } | ||||
|             if (requestOptions.maxRetries != null) { | ||||
|                 this._maxRetries = requestOptions.maxRetries; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     options(requestUrl, additionalHeaders) { | ||||
|         return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     get(requestUrl, additionalHeaders) { | ||||
|         return this.request('GET', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     del(requestUrl, additionalHeaders) { | ||||
|         return this.request('DELETE', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     post(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('POST', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     patch(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('PATCH', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     put(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('PUT', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     head(requestUrl, additionalHeaders) { | ||||
|         return this.request('HEAD', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     sendStream(verb, requestUrl, stream, additionalHeaders) { | ||||
|         return this.request(verb, requestUrl, stream, additionalHeaders); | ||||
|     } | ||||
|     /** | ||||
|      * Gets a typed object from an endpoint | ||||
|      * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise | ||||
|      */ | ||||
|     async getJson(requestUrl, additionalHeaders = {}) { | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         let res = await this.get(requestUrl, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async postJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.post(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async putJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.put(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async patchJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.patch(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     /** | ||||
|      * Makes a raw http request. | ||||
|      * All other methods such as get, post, patch, and request ultimately call this. | ||||
|      * Prefer get, del, post and patch | ||||
|      */ | ||||
|     async request(verb, requestUrl, data, headers) { | ||||
|         if (this._disposed) { | ||||
|             throw new Error('Client has already been disposed.'); | ||||
|         } | ||||
|         let parsedUrl = new URL(requestUrl); | ||||
|         let info = this._prepareRequest(verb, parsedUrl, headers); | ||||
|         // Only perform retries on reads since writes may not be idempotent.
 | ||||
|         let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1 | ||||
|             ? this._maxRetries + 1 | ||||
|             : 1; | ||||
|         let numTries = 0; | ||||
|         let response; | ||||
|         while (numTries < maxTries) { | ||||
|             response = await this.requestRaw(info, data); | ||||
|             // Check if it's an authentication challenge
 | ||||
|             if (response && | ||||
|                 response.message && | ||||
|                 response.message.statusCode === HttpCodes.Unauthorized) { | ||||
|                 let authenticationHandler; | ||||
|                 for (let i = 0; i < this.handlers.length; i++) { | ||||
|                     if (this.handlers[i].canHandleAuthentication(response)) { | ||||
|                         authenticationHandler = this.handlers[i]; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 if (authenticationHandler) { | ||||
|                     return authenticationHandler.handleAuthentication(this, info, data); | ||||
|                 } | ||||
|                 else { | ||||
|                     // We have received an unauthorized response but have no handlers to handle it.
 | ||||
|                     // Let the response return to the caller.
 | ||||
|                     return response; | ||||
|                 } | ||||
|             } | ||||
|             let redirectsRemaining = this._maxRedirects; | ||||
|             while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 && | ||||
|                 this._allowRedirects && | ||||
|                 redirectsRemaining > 0) { | ||||
|                 const redirectUrl = response.message.headers['location']; | ||||
|                 if (!redirectUrl) { | ||||
|                     // if there's no location to redirect to, we won't
 | ||||
|                     break; | ||||
|                 } | ||||
|                 let parsedRedirectUrl = new URL(redirectUrl); | ||||
|                 if (parsedUrl.protocol == 'https:' && | ||||
|                     parsedUrl.protocol != parsedRedirectUrl.protocol && | ||||
|                     !this._allowRedirectDowngrade) { | ||||
|                     throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); | ||||
|                 } | ||||
|                 // we need to finish reading the response before reassigning response
 | ||||
|                 // which will leak the open socket.
 | ||||
|                 await response.readBody(); | ||||
|                 // strip authorization header if redirected to a different hostname
 | ||||
|                 if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { | ||||
|                     for (let header in headers) { | ||||
|                         // header names are case insensitive
 | ||||
|                         if (header.toLowerCase() === 'authorization') { | ||||
|                             delete headers[header]; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 // let's make the request with the new redirectUrl
 | ||||
|                 info = this._prepareRequest(verb, parsedRedirectUrl, headers); | ||||
|                 response = await this.requestRaw(info, data); | ||||
|                 redirectsRemaining--; | ||||
|             } | ||||
|             if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { | ||||
|                 // If not a retry code, return immediately instead of retrying
 | ||||
|                 return response; | ||||
|             } | ||||
|             numTries += 1; | ||||
|             if (numTries < maxTries) { | ||||
|                 await response.readBody(); | ||||
|                 await this._performExponentialBackoff(numTries); | ||||
|             } | ||||
|         } | ||||
|         return response; | ||||
|     } | ||||
|     /** | ||||
|      * Needs to be called if keepAlive is set to true in request options. | ||||
|      */ | ||||
|     dispose() { | ||||
|         if (this._agent) { | ||||
|             this._agent.destroy(); | ||||
|         } | ||||
|         this._disposed = true; | ||||
|     } | ||||
|     /** | ||||
|      * Raw request. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      */ | ||||
|     requestRaw(info, data) { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             let callbackForResult = function (err, res) { | ||||
|                 if (err) { | ||||
|                     reject(err); | ||||
|                 } | ||||
|                 resolve(res); | ||||
|             }; | ||||
|             this.requestRawWithCallback(info, data, callbackForResult); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Raw request with callback. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      * @param onResult | ||||
|      */ | ||||
|     requestRawWithCallback(info, data, onResult) { | ||||
|         let socket; | ||||
|         if (typeof data === 'string') { | ||||
|             info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); | ||||
|         } | ||||
|         let callbackCalled = false; | ||||
|         let handleResult = (err, res) => { | ||||
|             if (!callbackCalled) { | ||||
|                 callbackCalled = true; | ||||
|                 onResult(err, res); | ||||
|             } | ||||
|         }; | ||||
|         let req = info.httpModule.request(info.options, (msg) => { | ||||
|             let res = new HttpClientResponse(msg); | ||||
|             handleResult(null, res); | ||||
|         }); | ||||
|         req.on('socket', sock => { | ||||
|             socket = sock; | ||||
|         }); | ||||
|         // If we ever get disconnected, we want the socket to timeout eventually
 | ||||
|         req.setTimeout(this._socketTimeout || 3 * 60000, () => { | ||||
|             if (socket) { | ||||
|                 socket.end(); | ||||
|             } | ||||
|             handleResult(new Error('Request timeout: ' + info.options.path), null); | ||||
|         }); | ||||
|         req.on('error', function (err) { | ||||
|             // err has statusCode property
 | ||||
|             // res should have headers
 | ||||
|             handleResult(err, null); | ||||
|         }); | ||||
|         if (data && typeof data === 'string') { | ||||
|             req.write(data, 'utf8'); | ||||
|         } | ||||
|         if (data && typeof data !== 'string') { | ||||
|             data.on('close', function () { | ||||
|                 req.end(); | ||||
|             }); | ||||
|             data.pipe(req); | ||||
|         } | ||||
|         else { | ||||
|             req.end(); | ||||
|         } | ||||
|     } | ||||
|     /** | ||||
|      * Gets an http agent. This function is useful when you need an http agent that handles | ||||
|      * routing through a proxy server - depending upon the url and proxy environment variables. | ||||
|      * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|      */ | ||||
|     getAgent(serverUrl) { | ||||
|         let parsedUrl = new URL(serverUrl); | ||||
|         return this._getAgent(parsedUrl); | ||||
|     } | ||||
|     _prepareRequest(method, requestUrl, headers) { | ||||
|         const info = {}; | ||||
|         info.parsedUrl = requestUrl; | ||||
|         const usingSsl = info.parsedUrl.protocol === 'https:'; | ||||
|         info.httpModule = usingSsl ? https : http; | ||||
|         const defaultPort = usingSsl ? 443 : 80; | ||||
|         info.options = {}; | ||||
|         info.options.host = info.parsedUrl.hostname; | ||||
|         info.options.port = info.parsedUrl.port | ||||
|             ? parseInt(info.parsedUrl.port) | ||||
|             : defaultPort; | ||||
|         info.options.path = | ||||
|             (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); | ||||
|         info.options.method = method; | ||||
|         info.options.headers = this._mergeHeaders(headers); | ||||
|         if (this.userAgent != null) { | ||||
|             info.options.headers['user-agent'] = this.userAgent; | ||||
|         } | ||||
|         info.options.agent = this._getAgent(info.parsedUrl); | ||||
|         // gives handlers an opportunity to participate
 | ||||
|         if (this.handlers) { | ||||
|             this.handlers.forEach(handler => { | ||||
|                 handler.prepareRequest(info.options); | ||||
|             }); | ||||
|         } | ||||
|         return info; | ||||
|     } | ||||
|     _mergeHeaders(headers) { | ||||
|         const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); | ||||
|         } | ||||
|         return lowercaseKeys(headers || {}); | ||||
|     } | ||||
|     _getExistingOrDefaultHeader(additionalHeaders, header, _default) { | ||||
|         const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
|         let clientHeader; | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; | ||||
|         } | ||||
|         return additionalHeaders[header] || clientHeader || _default; | ||||
|     } | ||||
|     _getAgent(parsedUrl) { | ||||
|         let agent; | ||||
|         let proxyUrl = pm.getProxyUrl(parsedUrl); | ||||
|         let useProxy = proxyUrl && proxyUrl.hostname; | ||||
|         if (this._keepAlive && useProxy) { | ||||
|             agent = this._proxyAgent; | ||||
|         } | ||||
|         if (this._keepAlive && !useProxy) { | ||||
|             agent = this._agent; | ||||
|         } | ||||
|         // if agent is already assigned use that agent.
 | ||||
|         if (!!agent) { | ||||
|             return agent; | ||||
|         } | ||||
|         const usingSsl = parsedUrl.protocol === 'https:'; | ||||
|         let maxSockets = 100; | ||||
|         if (!!this.requestOptions) { | ||||
|             maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; | ||||
|         } | ||||
|         if (useProxy) { | ||||
|             // If using proxy, need tunnel
 | ||||
|             if (!tunnel) { | ||||
|                 tunnel = __nccwpck_require__(4294); | ||||
|             } | ||||
|             const agentOptions = { | ||||
|                 maxSockets: maxSockets, | ||||
|                 keepAlive: this._keepAlive, | ||||
|                 proxy: { | ||||
|                     ...((proxyUrl.username || proxyUrl.password) && { | ||||
|                         proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` | ||||
|                     }), | ||||
|                     host: proxyUrl.hostname, | ||||
|                     port: proxyUrl.port | ||||
|                 } | ||||
|             }; | ||||
|             let tunnelAgent; | ||||
|             const overHttps = proxyUrl.protocol === 'https:'; | ||||
|             if (usingSsl) { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; | ||||
|             } | ||||
|             else { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; | ||||
|             } | ||||
|             agent = tunnelAgent(agentOptions); | ||||
|             this._proxyAgent = agent; | ||||
|         } | ||||
|         // if reusing agent across request and tunneling agent isn't assigned create a new agent
 | ||||
|         if (this._keepAlive && !agent) { | ||||
|             const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; | ||||
|             agent = usingSsl ? new https.Agent(options) : new http.Agent(options); | ||||
|             this._agent = agent; | ||||
|         } | ||||
|         // if not using private agent and tunnel agent isn't setup then use global agent
 | ||||
|         if (!agent) { | ||||
|             agent = usingSsl ? https.globalAgent : http.globalAgent; | ||||
|         } | ||||
|         if (usingSsl && this._ignoreSslError) { | ||||
|             // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
 | ||||
|             // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
 | ||||
|             // we have to cast it to any and change it directly
 | ||||
|             agent.options = Object.assign(agent.options || {}, { | ||||
|                 rejectUnauthorized: false | ||||
|             }); | ||||
|         } | ||||
|         return agent; | ||||
|     } | ||||
|     _performExponentialBackoff(retryNumber) { | ||||
|         retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); | ||||
|         const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); | ||||
|         return new Promise(resolve => setTimeout(() => resolve(), ms)); | ||||
|     } | ||||
|     static dateTimeDeserializer(key, value) { | ||||
|         if (typeof value === 'string') { | ||||
|             let a = new Date(value); | ||||
|             if (!isNaN(a.valueOf())) { | ||||
|                 return a; | ||||
|             } | ||||
|         } | ||||
|         return value; | ||||
|     } | ||||
|     async _processResponse(res, options) { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             const statusCode = res.message.statusCode; | ||||
|             const response = { | ||||
|                 statusCode: statusCode, | ||||
|                 result: null, | ||||
|                 headers: {} | ||||
|             }; | ||||
|             // not found leads to null obj returned
 | ||||
|             if (statusCode == HttpCodes.NotFound) { | ||||
|                 resolve(response); | ||||
|             } | ||||
|             let obj; | ||||
|             let contents; | ||||
|             // get the result from the body
 | ||||
|             try { | ||||
|                 contents = await res.readBody(); | ||||
|                 if (contents && contents.length > 0) { | ||||
|                     if (options && options.deserializeDates) { | ||||
|                         obj = JSON.parse(contents, HttpClient.dateTimeDeserializer); | ||||
|                     } | ||||
|                     else { | ||||
|                         obj = JSON.parse(contents); | ||||
|                     } | ||||
|                     response.result = obj; | ||||
|                 } | ||||
|                 response.headers = res.message.headers; | ||||
|             } | ||||
|             catch (err) { | ||||
|                 // Invalid resource (contents not json);  leaving result obj null
 | ||||
|             } | ||||
|             // note that 3xx redirects are handled by the http layer.
 | ||||
|             if (statusCode > 299) { | ||||
|                 let msg; | ||||
|                 // if exception/error in body, attempt to get better error
 | ||||
|                 if (obj && obj.message) { | ||||
|                     msg = obj.message; | ||||
|                 } | ||||
|                 else if (contents && contents.length > 0) { | ||||
|                     // it may be the case that the exception is in the body message as string
 | ||||
|                     msg = contents; | ||||
|                 } | ||||
|                 else { | ||||
|                     msg = 'Failed request: (' + statusCode + ')'; | ||||
|                 } | ||||
|                 let err = new HttpClientError(msg, statusCode); | ||||
|                 err.result = response.result; | ||||
|                 reject(err); | ||||
|             } | ||||
|             else { | ||||
|                 resolve(response); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClient = HttpClient; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 6443: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| function getProxyUrl(reqUrl) { | ||||
|     let usingSsl = reqUrl.protocol === 'https:'; | ||||
|     let proxyUrl; | ||||
|     if (checkBypass(reqUrl)) { | ||||
|         return proxyUrl; | ||||
|     } | ||||
|     let proxyVar; | ||||
|     if (usingSsl) { | ||||
|         proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY']; | ||||
|     } | ||||
|     else { | ||||
|         proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY']; | ||||
|     } | ||||
|     if (proxyVar) { | ||||
|         proxyUrl = new URL(proxyVar); | ||||
|     } | ||||
|     return proxyUrl; | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| function checkBypass(reqUrl) { | ||||
|     if (!reqUrl.hostname) { | ||||
|         return false; | ||||
|     } | ||||
|     let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; | ||||
|     if (!noProxy) { | ||||
|         return false; | ||||
|     } | ||||
|     // Determine the request port
 | ||||
|     let reqPort; | ||||
|     if (reqUrl.port) { | ||||
|         reqPort = Number(reqUrl.port); | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'http:') { | ||||
|         reqPort = 80; | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'https:') { | ||||
|         reqPort = 443; | ||||
|     } | ||||
|     // Format the request hostname and hostname with port
 | ||||
|     let upperReqHosts = [reqUrl.hostname.toUpperCase()]; | ||||
|     if (typeof reqPort === 'number') { | ||||
|         upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); | ||||
|     } | ||||
|     // Compare request host against noproxy
 | ||||
|     for (let upperNoProxyItem of noProxy | ||||
|         .split(',') | ||||
|         .map(x => x.trim().toUpperCase()) | ||||
|         .filter(x => x)) { | ||||
|         if (upperReqHosts.some(x => x === upperNoProxyItem)) { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| exports.checkBypass = checkBypass; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 1962: | ||||
|  | ||||
							
								
								
									
										1384
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1384
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -214,8 +214,8 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(7320); | ||||
| const auth_1 = __nccwpck_require__(7093); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const auth_1 = __nccwpck_require__(3702); | ||||
| const crypto = __importStar(__nccwpck_require__(6113)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| const url_1 = __nccwpck_require__(7310); | ||||
| @ -647,7 +647,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(7320); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const storage_blob_1 = __nccwpck_require__(4100); | ||||
| const buffer = __importStar(__nccwpck_require__(4300)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| @ -885,7 +885,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(7320); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const constants_1 = __nccwpck_require__(8840); | ||||
| function isSuccessStatusCode(statusCode) { | ||||
|     if (!statusCode) { | ||||
| @ -2290,682 +2290,6 @@ class SearchState { | ||||
| exports.SearchState = SearchState; | ||||
| //# sourceMappingURL=internal-search-state.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 7093: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| class BasicCredentialHandler { | ||||
|     constructor(username, password) { | ||||
|         this.username = username; | ||||
|         this.password = password; | ||||
|     } | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + | ||||
|                 Buffer.from(this.username + ':' + this.password).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BasicCredentialHandler = BasicCredentialHandler; | ||||
| class BearerCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = 'Bearer ' + this.token; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BearerCredentialHandler = BearerCredentialHandler; | ||||
| class PersonalAccessTokenCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + Buffer.from('PAT:' + this.token).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 7320: | ||||
| /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const http = __nccwpck_require__(3685); | ||||
| const https = __nccwpck_require__(5687); | ||||
| const pm = __nccwpck_require__(7326); | ||||
| let tunnel; | ||||
| var HttpCodes; | ||||
| (function (HttpCodes) { | ||||
|     HttpCodes[HttpCodes["OK"] = 200] = "OK"; | ||||
|     HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; | ||||
|     HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; | ||||
|     HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; | ||||
|     HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; | ||||
|     HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; | ||||
|     HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; | ||||
|     HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; | ||||
|     HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; | ||||
|     HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; | ||||
|     HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; | ||||
|     HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; | ||||
|     HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; | ||||
|     HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; | ||||
|     HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; | ||||
|     HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; | ||||
|     HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; | ||||
|     HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; | ||||
|     HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; | ||||
|     HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; | ||||
|     HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; | ||||
|     HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; | ||||
|     HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; | ||||
|     HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; | ||||
|     HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; | ||||
|     HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; | ||||
|     HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; | ||||
| })(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); | ||||
| var Headers; | ||||
| (function (Headers) { | ||||
|     Headers["Accept"] = "accept"; | ||||
|     Headers["ContentType"] = "content-type"; | ||||
| })(Headers = exports.Headers || (exports.Headers = {})); | ||||
| var MediaTypes; | ||||
| (function (MediaTypes) { | ||||
|     MediaTypes["ApplicationJson"] = "application/json"; | ||||
| })(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); | ||||
| /** | ||||
|  * Returns the proxy URL, depending upon the supplied url and proxy environment variables. | ||||
|  * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|  */ | ||||
| function getProxyUrl(serverUrl) { | ||||
|     let proxyUrl = pm.getProxyUrl(new URL(serverUrl)); | ||||
|     return proxyUrl ? proxyUrl.href : ''; | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| const HttpRedirectCodes = [ | ||||
|     HttpCodes.MovedPermanently, | ||||
|     HttpCodes.ResourceMoved, | ||||
|     HttpCodes.SeeOther, | ||||
|     HttpCodes.TemporaryRedirect, | ||||
|     HttpCodes.PermanentRedirect | ||||
| ]; | ||||
| const HttpResponseRetryCodes = [ | ||||
|     HttpCodes.BadGateway, | ||||
|     HttpCodes.ServiceUnavailable, | ||||
|     HttpCodes.GatewayTimeout | ||||
| ]; | ||||
| const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; | ||||
| const ExponentialBackoffCeiling = 10; | ||||
| const ExponentialBackoffTimeSlice = 5; | ||||
| class HttpClientError extends Error { | ||||
|     constructor(message, statusCode) { | ||||
|         super(message); | ||||
|         this.name = 'HttpClientError'; | ||||
|         this.statusCode = statusCode; | ||||
|         Object.setPrototypeOf(this, HttpClientError.prototype); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientError = HttpClientError; | ||||
| class HttpClientResponse { | ||||
|     constructor(message) { | ||||
|         this.message = message; | ||||
|     } | ||||
|     readBody() { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             let output = Buffer.alloc(0); | ||||
|             this.message.on('data', (chunk) => { | ||||
|                 output = Buffer.concat([output, chunk]); | ||||
|             }); | ||||
|             this.message.on('end', () => { | ||||
|                 resolve(output.toString()); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientResponse = HttpClientResponse; | ||||
| function isHttps(requestUrl) { | ||||
|     let parsedUrl = new URL(requestUrl); | ||||
|     return parsedUrl.protocol === 'https:'; | ||||
| } | ||||
| exports.isHttps = isHttps; | ||||
| class HttpClient { | ||||
|     constructor(userAgent, handlers, requestOptions) { | ||||
|         this._ignoreSslError = false; | ||||
|         this._allowRedirects = true; | ||||
|         this._allowRedirectDowngrade = false; | ||||
|         this._maxRedirects = 50; | ||||
|         this._allowRetries = false; | ||||
|         this._maxRetries = 1; | ||||
|         this._keepAlive = false; | ||||
|         this._disposed = false; | ||||
|         this.userAgent = userAgent; | ||||
|         this.handlers = handlers || []; | ||||
|         this.requestOptions = requestOptions; | ||||
|         if (requestOptions) { | ||||
|             if (requestOptions.ignoreSslError != null) { | ||||
|                 this._ignoreSslError = requestOptions.ignoreSslError; | ||||
|             } | ||||
|             this._socketTimeout = requestOptions.socketTimeout; | ||||
|             if (requestOptions.allowRedirects != null) { | ||||
|                 this._allowRedirects = requestOptions.allowRedirects; | ||||
|             } | ||||
|             if (requestOptions.allowRedirectDowngrade != null) { | ||||
|                 this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; | ||||
|             } | ||||
|             if (requestOptions.maxRedirects != null) { | ||||
|                 this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); | ||||
|             } | ||||
|             if (requestOptions.keepAlive != null) { | ||||
|                 this._keepAlive = requestOptions.keepAlive; | ||||
|             } | ||||
|             if (requestOptions.allowRetries != null) { | ||||
|                 this._allowRetries = requestOptions.allowRetries; | ||||
|             } | ||||
|             if (requestOptions.maxRetries != null) { | ||||
|                 this._maxRetries = requestOptions.maxRetries; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     options(requestUrl, additionalHeaders) { | ||||
|         return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     get(requestUrl, additionalHeaders) { | ||||
|         return this.request('GET', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     del(requestUrl, additionalHeaders) { | ||||
|         return this.request('DELETE', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     post(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('POST', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     patch(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('PATCH', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     put(requestUrl, data, additionalHeaders) { | ||||
|         return this.request('PUT', requestUrl, data, additionalHeaders || {}); | ||||
|     } | ||||
|     head(requestUrl, additionalHeaders) { | ||||
|         return this.request('HEAD', requestUrl, null, additionalHeaders || {}); | ||||
|     } | ||||
|     sendStream(verb, requestUrl, stream, additionalHeaders) { | ||||
|         return this.request(verb, requestUrl, stream, additionalHeaders); | ||||
|     } | ||||
|     /** | ||||
|      * Gets a typed object from an endpoint | ||||
|      * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise | ||||
|      */ | ||||
|     async getJson(requestUrl, additionalHeaders = {}) { | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         let res = await this.get(requestUrl, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async postJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.post(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async putJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.put(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     async patchJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         let data = JSON.stringify(obj, null, 2); | ||||
|         additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|         additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|         let res = await this.patch(requestUrl, data, additionalHeaders); | ||||
|         return this._processResponse(res, this.requestOptions); | ||||
|     } | ||||
|     /** | ||||
|      * Makes a raw http request. | ||||
|      * All other methods such as get, post, patch, and request ultimately call this. | ||||
|      * Prefer get, del, post and patch | ||||
|      */ | ||||
|     async request(verb, requestUrl, data, headers) { | ||||
|         if (this._disposed) { | ||||
|             throw new Error('Client has already been disposed.'); | ||||
|         } | ||||
|         let parsedUrl = new URL(requestUrl); | ||||
|         let info = this._prepareRequest(verb, parsedUrl, headers); | ||||
|         // Only perform retries on reads since writes may not be idempotent.
 | ||||
|         let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1 | ||||
|             ? this._maxRetries + 1 | ||||
|             : 1; | ||||
|         let numTries = 0; | ||||
|         let response; | ||||
|         while (numTries < maxTries) { | ||||
|             response = await this.requestRaw(info, data); | ||||
|             // Check if it's an authentication challenge
 | ||||
|             if (response && | ||||
|                 response.message && | ||||
|                 response.message.statusCode === HttpCodes.Unauthorized) { | ||||
|                 let authenticationHandler; | ||||
|                 for (let i = 0; i < this.handlers.length; i++) { | ||||
|                     if (this.handlers[i].canHandleAuthentication(response)) { | ||||
|                         authenticationHandler = this.handlers[i]; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 if (authenticationHandler) { | ||||
|                     return authenticationHandler.handleAuthentication(this, info, data); | ||||
|                 } | ||||
|                 else { | ||||
|                     // We have received an unauthorized response but have no handlers to handle it.
 | ||||
|                     // Let the response return to the caller.
 | ||||
|                     return response; | ||||
|                 } | ||||
|             } | ||||
|             let redirectsRemaining = this._maxRedirects; | ||||
|             while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 && | ||||
|                 this._allowRedirects && | ||||
|                 redirectsRemaining > 0) { | ||||
|                 const redirectUrl = response.message.headers['location']; | ||||
|                 if (!redirectUrl) { | ||||
|                     // if there's no location to redirect to, we won't
 | ||||
|                     break; | ||||
|                 } | ||||
|                 let parsedRedirectUrl = new URL(redirectUrl); | ||||
|                 if (parsedUrl.protocol == 'https:' && | ||||
|                     parsedUrl.protocol != parsedRedirectUrl.protocol && | ||||
|                     !this._allowRedirectDowngrade) { | ||||
|                     throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); | ||||
|                 } | ||||
|                 // we need to finish reading the response before reassigning response
 | ||||
|                 // which will leak the open socket.
 | ||||
|                 await response.readBody(); | ||||
|                 // strip authorization header if redirected to a different hostname
 | ||||
|                 if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { | ||||
|                     for (let header in headers) { | ||||
|                         // header names are case insensitive
 | ||||
|                         if (header.toLowerCase() === 'authorization') { | ||||
|                             delete headers[header]; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 // let's make the request with the new redirectUrl
 | ||||
|                 info = this._prepareRequest(verb, parsedRedirectUrl, headers); | ||||
|                 response = await this.requestRaw(info, data); | ||||
|                 redirectsRemaining--; | ||||
|             } | ||||
|             if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { | ||||
|                 // If not a retry code, return immediately instead of retrying
 | ||||
|                 return response; | ||||
|             } | ||||
|             numTries += 1; | ||||
|             if (numTries < maxTries) { | ||||
|                 await response.readBody(); | ||||
|                 await this._performExponentialBackoff(numTries); | ||||
|             } | ||||
|         } | ||||
|         return response; | ||||
|     } | ||||
|     /** | ||||
|      * Needs to be called if keepAlive is set to true in request options. | ||||
|      */ | ||||
|     dispose() { | ||||
|         if (this._agent) { | ||||
|             this._agent.destroy(); | ||||
|         } | ||||
|         this._disposed = true; | ||||
|     } | ||||
|     /** | ||||
|      * Raw request. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      */ | ||||
|     requestRaw(info, data) { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             let callbackForResult = function (err, res) { | ||||
|                 if (err) { | ||||
|                     reject(err); | ||||
|                 } | ||||
|                 resolve(res); | ||||
|             }; | ||||
|             this.requestRawWithCallback(info, data, callbackForResult); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Raw request with callback. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      * @param onResult | ||||
|      */ | ||||
|     requestRawWithCallback(info, data, onResult) { | ||||
|         let socket; | ||||
|         if (typeof data === 'string') { | ||||
|             info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); | ||||
|         } | ||||
|         let callbackCalled = false; | ||||
|         let handleResult = (err, res) => { | ||||
|             if (!callbackCalled) { | ||||
|                 callbackCalled = true; | ||||
|                 onResult(err, res); | ||||
|             } | ||||
|         }; | ||||
|         let req = info.httpModule.request(info.options, (msg) => { | ||||
|             let res = new HttpClientResponse(msg); | ||||
|             handleResult(null, res); | ||||
|         }); | ||||
|         req.on('socket', sock => { | ||||
|             socket = sock; | ||||
|         }); | ||||
|         // If we ever get disconnected, we want the socket to timeout eventually
 | ||||
|         req.setTimeout(this._socketTimeout || 3 * 60000, () => { | ||||
|             if (socket) { | ||||
|                 socket.end(); | ||||
|             } | ||||
|             handleResult(new Error('Request timeout: ' + info.options.path), null); | ||||
|         }); | ||||
|         req.on('error', function (err) { | ||||
|             // err has statusCode property
 | ||||
|             // res should have headers
 | ||||
|             handleResult(err, null); | ||||
|         }); | ||||
|         if (data && typeof data === 'string') { | ||||
|             req.write(data, 'utf8'); | ||||
|         } | ||||
|         if (data && typeof data !== 'string') { | ||||
|             data.on('close', function () { | ||||
|                 req.end(); | ||||
|             }); | ||||
|             data.pipe(req); | ||||
|         } | ||||
|         else { | ||||
|             req.end(); | ||||
|         } | ||||
|     } | ||||
|     /** | ||||
|      * Gets an http agent. This function is useful when you need an http agent that handles | ||||
|      * routing through a proxy server - depending upon the url and proxy environment variables. | ||||
|      * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|      */ | ||||
|     getAgent(serverUrl) { | ||||
|         let parsedUrl = new URL(serverUrl); | ||||
|         return this._getAgent(parsedUrl); | ||||
|     } | ||||
|     _prepareRequest(method, requestUrl, headers) { | ||||
|         const info = {}; | ||||
|         info.parsedUrl = requestUrl; | ||||
|         const usingSsl = info.parsedUrl.protocol === 'https:'; | ||||
|         info.httpModule = usingSsl ? https : http; | ||||
|         const defaultPort = usingSsl ? 443 : 80; | ||||
|         info.options = {}; | ||||
|         info.options.host = info.parsedUrl.hostname; | ||||
|         info.options.port = info.parsedUrl.port | ||||
|             ? parseInt(info.parsedUrl.port) | ||||
|             : defaultPort; | ||||
|         info.options.path = | ||||
|             (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); | ||||
|         info.options.method = method; | ||||
|         info.options.headers = this._mergeHeaders(headers); | ||||
|         if (this.userAgent != null) { | ||||
|             info.options.headers['user-agent'] = this.userAgent; | ||||
|         } | ||||
|         info.options.agent = this._getAgent(info.parsedUrl); | ||||
|         // gives handlers an opportunity to participate
 | ||||
|         if (this.handlers) { | ||||
|             this.handlers.forEach(handler => { | ||||
|                 handler.prepareRequest(info.options); | ||||
|             }); | ||||
|         } | ||||
|         return info; | ||||
|     } | ||||
|     _mergeHeaders(headers) { | ||||
|         const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); | ||||
|         } | ||||
|         return lowercaseKeys(headers || {}); | ||||
|     } | ||||
|     _getExistingOrDefaultHeader(additionalHeaders, header, _default) { | ||||
|         const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
|         let clientHeader; | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; | ||||
|         } | ||||
|         return additionalHeaders[header] || clientHeader || _default; | ||||
|     } | ||||
|     _getAgent(parsedUrl) { | ||||
|         let agent; | ||||
|         let proxyUrl = pm.getProxyUrl(parsedUrl); | ||||
|         let useProxy = proxyUrl && proxyUrl.hostname; | ||||
|         if (this._keepAlive && useProxy) { | ||||
|             agent = this._proxyAgent; | ||||
|         } | ||||
|         if (this._keepAlive && !useProxy) { | ||||
|             agent = this._agent; | ||||
|         } | ||||
|         // if agent is already assigned use that agent.
 | ||||
|         if (!!agent) { | ||||
|             return agent; | ||||
|         } | ||||
|         const usingSsl = parsedUrl.protocol === 'https:'; | ||||
|         let maxSockets = 100; | ||||
|         if (!!this.requestOptions) { | ||||
|             maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; | ||||
|         } | ||||
|         if (useProxy) { | ||||
|             // If using proxy, need tunnel
 | ||||
|             if (!tunnel) { | ||||
|                 tunnel = __nccwpck_require__(4294); | ||||
|             } | ||||
|             const agentOptions = { | ||||
|                 maxSockets: maxSockets, | ||||
|                 keepAlive: this._keepAlive, | ||||
|                 proxy: { | ||||
|                     ...((proxyUrl.username || proxyUrl.password) && { | ||||
|                         proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` | ||||
|                     }), | ||||
|                     host: proxyUrl.hostname, | ||||
|                     port: proxyUrl.port | ||||
|                 } | ||||
|             }; | ||||
|             let tunnelAgent; | ||||
|             const overHttps = proxyUrl.protocol === 'https:'; | ||||
|             if (usingSsl) { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; | ||||
|             } | ||||
|             else { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; | ||||
|             } | ||||
|             agent = tunnelAgent(agentOptions); | ||||
|             this._proxyAgent = agent; | ||||
|         } | ||||
|         // if reusing agent across request and tunneling agent isn't assigned create a new agent
 | ||||
|         if (this._keepAlive && !agent) { | ||||
|             const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; | ||||
|             agent = usingSsl ? new https.Agent(options) : new http.Agent(options); | ||||
|             this._agent = agent; | ||||
|         } | ||||
|         // if not using private agent and tunnel agent isn't setup then use global agent
 | ||||
|         if (!agent) { | ||||
|             agent = usingSsl ? https.globalAgent : http.globalAgent; | ||||
|         } | ||||
|         if (usingSsl && this._ignoreSslError) { | ||||
|             // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
 | ||||
|             // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
 | ||||
|             // we have to cast it to any and change it directly
 | ||||
|             agent.options = Object.assign(agent.options || {}, { | ||||
|                 rejectUnauthorized: false | ||||
|             }); | ||||
|         } | ||||
|         return agent; | ||||
|     } | ||||
|     _performExponentialBackoff(retryNumber) { | ||||
|         retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); | ||||
|         const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); | ||||
|         return new Promise(resolve => setTimeout(() => resolve(), ms)); | ||||
|     } | ||||
|     static dateTimeDeserializer(key, value) { | ||||
|         if (typeof value === 'string') { | ||||
|             let a = new Date(value); | ||||
|             if (!isNaN(a.valueOf())) { | ||||
|                 return a; | ||||
|             } | ||||
|         } | ||||
|         return value; | ||||
|     } | ||||
|     async _processResponse(res, options) { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             const statusCode = res.message.statusCode; | ||||
|             const response = { | ||||
|                 statusCode: statusCode, | ||||
|                 result: null, | ||||
|                 headers: {} | ||||
|             }; | ||||
|             // not found leads to null obj returned
 | ||||
|             if (statusCode == HttpCodes.NotFound) { | ||||
|                 resolve(response); | ||||
|             } | ||||
|             let obj; | ||||
|             let contents; | ||||
|             // get the result from the body
 | ||||
|             try { | ||||
|                 contents = await res.readBody(); | ||||
|                 if (contents && contents.length > 0) { | ||||
|                     if (options && options.deserializeDates) { | ||||
|                         obj = JSON.parse(contents, HttpClient.dateTimeDeserializer); | ||||
|                     } | ||||
|                     else { | ||||
|                         obj = JSON.parse(contents); | ||||
|                     } | ||||
|                     response.result = obj; | ||||
|                 } | ||||
|                 response.headers = res.message.headers; | ||||
|             } | ||||
|             catch (err) { | ||||
|                 // Invalid resource (contents not json);  leaving result obj null
 | ||||
|             } | ||||
|             // note that 3xx redirects are handled by the http layer.
 | ||||
|             if (statusCode > 299) { | ||||
|                 let msg; | ||||
|                 // if exception/error in body, attempt to get better error
 | ||||
|                 if (obj && obj.message) { | ||||
|                     msg = obj.message; | ||||
|                 } | ||||
|                 else if (contents && contents.length > 0) { | ||||
|                     // it may be the case that the exception is in the body message as string
 | ||||
|                     msg = contents; | ||||
|                 } | ||||
|                 else { | ||||
|                     msg = 'Failed request: (' + statusCode + ')'; | ||||
|                 } | ||||
|                 let err = new HttpClientError(msg, statusCode); | ||||
|                 err.result = response.result; | ||||
|                 reject(err); | ||||
|             } | ||||
|             else { | ||||
|                 resolve(response); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClient = HttpClient; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 7326: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| function getProxyUrl(reqUrl) { | ||||
|     let usingSsl = reqUrl.protocol === 'https:'; | ||||
|     let proxyUrl; | ||||
|     if (checkBypass(reqUrl)) { | ||||
|         return proxyUrl; | ||||
|     } | ||||
|     let proxyVar; | ||||
|     if (usingSsl) { | ||||
|         proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY']; | ||||
|     } | ||||
|     else { | ||||
|         proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY']; | ||||
|     } | ||||
|     if (proxyVar) { | ||||
|         proxyUrl = new URL(proxyVar); | ||||
|     } | ||||
|     return proxyUrl; | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| function checkBypass(reqUrl) { | ||||
|     if (!reqUrl.hostname) { | ||||
|         return false; | ||||
|     } | ||||
|     let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; | ||||
|     if (!noProxy) { | ||||
|         return false; | ||||
|     } | ||||
|     // Determine the request port
 | ||||
|     let reqPort; | ||||
|     if (reqUrl.port) { | ||||
|         reqPort = Number(reqUrl.port); | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'http:') { | ||||
|         reqPort = 80; | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'https:') { | ||||
|         reqPort = 443; | ||||
|     } | ||||
|     // Format the request hostname and hostname with port
 | ||||
|     let upperReqHosts = [reqUrl.hostname.toUpperCase()]; | ||||
|     if (typeof reqPort === 'number') { | ||||
|         upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); | ||||
|     } | ||||
|     // Compare request host against noproxy
 | ||||
|     for (let upperNoProxyItem of noProxy | ||||
|         .split(',') | ||||
|         .map(x => x.trim().toUpperCase()) | ||||
|         .filter(x => x)) { | ||||
|         if (upperReqHosts.some(x => x === upperNoProxyItem)) { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| exports.checkBypass = checkBypass; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 3771: | ||||
| @ -4576,14 +3900,27 @@ function coerce (version, options) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.issue = exports.issueCommand = void 0; | ||||
| const os = __importStar(__nccwpck_require__(2037)); | ||||
| const utils_1 = __nccwpck_require__(5278); | ||||
| /** | ||||
| @ -4662,6 +3999,25 @@ function escapeProperty(s) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
| @ -4671,19 +4027,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; | ||||
| const command_1 = __nccwpck_require__(7351); | ||||
| const file_command_1 = __nccwpck_require__(717); | ||||
| const utils_1 = __nccwpck_require__(5278); | ||||
| const os = __importStar(__nccwpck_require__(2037)); | ||||
| const path = __importStar(__nccwpck_require__(1017)); | ||||
| const oidc_utils_1 = __nccwpck_require__(8041); | ||||
| /** | ||||
|  * The code to exit an action | ||||
|  */ | ||||
| @ -4745,7 +4096,9 @@ function addPath(inputPath) { | ||||
| } | ||||
| exports.addPath = addPath; | ||||
| /** | ||||
|  * Gets the value of an input.  The value is also trimmed. | ||||
|  * Gets the value of an input. | ||||
|  * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. | ||||
|  * Returns an empty string if the value is not defined. | ||||
|  * | ||||
|  * @param     name     name of the input to get | ||||
|  * @param     options  optional. See InputOptions. | ||||
| @ -4756,9 +4109,49 @@ function getInput(name, options) { | ||||
|     if (options && options.required && !val) { | ||||
|         throw new Error(`Input required and not supplied: ${name}`); | ||||
|     } | ||||
|     if (options && options.trimWhitespace === false) { | ||||
|         return val; | ||||
|     } | ||||
|     return val.trim(); | ||||
| } | ||||
| exports.getInput = getInput; | ||||
| /** | ||||
|  * Gets the values of an multiline input.  Each value is also trimmed. | ||||
|  * | ||||
|  * @param     name     name of the input to get | ||||
|  * @param     options  optional. See InputOptions. | ||||
|  * @returns   string[] | ||||
|  * | ||||
|  */ | ||||
| function getMultilineInput(name, options) { | ||||
|     const inputs = getInput(name, options) | ||||
|         .split('\n') | ||||
|         .filter(x => x !== ''); | ||||
|     return inputs; | ||||
| } | ||||
| exports.getMultilineInput = getMultilineInput; | ||||
| /** | ||||
|  * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. | ||||
|  * Support boolean input list: `true | True | TRUE | false | False | FALSE` . | ||||
|  * The return value is also in boolean type. | ||||
|  * ref: https://yaml.org/spec/1.2/spec.html#id2804923
 | ||||
|  * | ||||
|  * @param     name     name of the input to get | ||||
|  * @param     options  optional. See InputOptions. | ||||
|  * @returns   boolean | ||||
|  */ | ||||
| function getBooleanInput(name, options) { | ||||
|     const trueValue = ['true', 'True', 'TRUE']; | ||||
|     const falseValue = ['false', 'False', 'FALSE']; | ||||
|     const val = getInput(name, options); | ||||
|     if (trueValue.includes(val)) | ||||
|         return true; | ||||
|     if (falseValue.includes(val)) | ||||
|         return false; | ||||
|     throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + | ||||
|         `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); | ||||
| } | ||||
| exports.getBooleanInput = getBooleanInput; | ||||
| /** | ||||
|  * Sets the value of an output. | ||||
|  * | ||||
| @ -4767,6 +4160,7 @@ exports.getInput = getInput; | ||||
|  */ | ||||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | ||||
| function setOutput(name, value) { | ||||
|     process.stdout.write(os.EOL); | ||||
|     command_1.issueCommand('set-output', { name }, value); | ||||
| } | ||||
| exports.setOutput = setOutput; | ||||
| @ -4813,19 +4207,30 @@ exports.debug = debug; | ||||
| /** | ||||
|  * Adds an error issue | ||||
|  * @param message error issue message. Errors will be converted to string via toString() | ||||
|  * @param properties optional properties to add to the annotation. | ||||
|  */ | ||||
| function error(message) { | ||||
|     command_1.issue('error', message instanceof Error ? message.toString() : message); | ||||
| function error(message, properties = {}) { | ||||
|     command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.error = error; | ||||
| /** | ||||
|  * Adds an warning issue | ||||
|  * Adds a warning issue | ||||
|  * @param message warning issue message. Errors will be converted to string via toString() | ||||
|  * @param properties optional properties to add to the annotation. | ||||
|  */ | ||||
| function warning(message) { | ||||
|     command_1.issue('warning', message instanceof Error ? message.toString() : message); | ||||
| function warning(message, properties = {}) { | ||||
|     command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.warning = warning; | ||||
| /** | ||||
|  * Adds a notice issue | ||||
|  * @param message notice issue message. Errors will be converted to string via toString() | ||||
|  * @param properties optional properties to add to the annotation. | ||||
|  */ | ||||
| function notice(message, properties = {}) { | ||||
|     command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); | ||||
| } | ||||
| exports.notice = notice; | ||||
| /** | ||||
|  * Writes info to log with console.log. | ||||
|  * @param message info message | ||||
| @ -4898,6 +4303,17 @@ function getState(name) { | ||||
|     return process.env[`STATE_${name}`] || ''; | ||||
| } | ||||
| exports.getState = getState; | ||||
| function getIDToken(aud) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         return yield oidc_utils_1.OidcClient.getIDToken(aud); | ||||
|     }); | ||||
| } | ||||
| exports.getIDToken = getIDToken; | ||||
| /** | ||||
|  * Markdown summary exports | ||||
|  */ | ||||
| var markdown_summary_1 = __nccwpck_require__(8042); | ||||
| Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return markdown_summary_1.markdownSummary; } })); | ||||
| //# sourceMappingURL=core.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| @ -4908,14 +4324,27 @@ exports.getState = getState; | ||||
| "use strict"; | ||||
| 
 | ||||
| // For internal use, subject to change.
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||||
|     result["default"] = mod; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.issueCommand = void 0; | ||||
| // We use any as a valid input type
 | ||||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| @ -4938,6 +4367,376 @@ exports.issueCommand = issueCommand; | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 8042: | ||||
| /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; | ||||
| const os_1 = __nccwpck_require__(2037); | ||||
| const fs_1 = __nccwpck_require__(7147); | ||||
| const { access, appendFile, writeFile } = fs_1.promises; | ||||
| exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; | ||||
| exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-markdown-summary'; | ||||
| class MarkdownSummary { | ||||
|     constructor() { | ||||
|         this._buffer = ''; | ||||
|     } | ||||
|     /** | ||||
|      * Finds the summary file path from the environment, rejects if env var is not found or file does not exist | ||||
|      * Also checks r/w permissions. | ||||
|      * | ||||
|      * @returns step summary file path | ||||
|      */ | ||||
|     filePath() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             if (this._filePath) { | ||||
|                 return this._filePath; | ||||
|             } | ||||
|             const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; | ||||
|             if (!pathFromEnv) { | ||||
|                 throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports markdown summaries.`); | ||||
|             } | ||||
|             try { | ||||
|                 yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); | ||||
|             } | ||||
|             catch (_a) { | ||||
|                 throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); | ||||
|             } | ||||
|             this._filePath = pathFromEnv; | ||||
|             return this._filePath; | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Wraps content in an HTML tag, adding any HTML attributes | ||||
|      * | ||||
|      * @param {string} tag HTML tag to wrap | ||||
|      * @param {string | null} content content within the tag | ||||
|      * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add | ||||
|      * | ||||
|      * @returns {string} content wrapped in HTML element | ||||
|      */ | ||||
|     wrap(tag, content, attrs = {}) { | ||||
|         const htmlAttrs = Object.entries(attrs) | ||||
|             .map(([key, value]) => ` ${key}="${value}"`) | ||||
|             .join(''); | ||||
|         if (!content) { | ||||
|             return `<${tag}${htmlAttrs}>`; | ||||
|         } | ||||
|         return `<${tag}${htmlAttrs}>${content}</${tag}>`; | ||||
|     } | ||||
|     /** | ||||
|      * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. | ||||
|      * | ||||
|      * @param {SummaryWriteOptions} [options] (optional) options for write operation | ||||
|      * | ||||
|      * @returns {Promise<MarkdownSummary>} markdown summary instance | ||||
|      */ | ||||
|     write(options) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); | ||||
|             const filePath = yield this.filePath(); | ||||
|             const writeFunc = overwrite ? writeFile : appendFile; | ||||
|             yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); | ||||
|             return this.emptyBuffer(); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Clears the summary buffer and wipes the summary file | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     clear() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.emptyBuffer().write({ overwrite: true }); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Returns the current summary buffer as a string | ||||
|      * | ||||
|      * @returns {string} string of summary buffer | ||||
|      */ | ||||
|     stringify() { | ||||
|         return this._buffer; | ||||
|     } | ||||
|     /** | ||||
|      * If the summary buffer is empty | ||||
|      * | ||||
|      * @returns {boolen} true if the buffer is empty | ||||
|      */ | ||||
|     isEmptyBuffer() { | ||||
|         return this._buffer.length === 0; | ||||
|     } | ||||
|     /** | ||||
|      * Resets the summary buffer without writing to summary file | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     emptyBuffer() { | ||||
|         this._buffer = ''; | ||||
|         return this; | ||||
|     } | ||||
|     /** | ||||
|      * Adds raw text to the summary buffer | ||||
|      * | ||||
|      * @param {string} text content to add | ||||
|      * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addRaw(text, addEOL = false) { | ||||
|         this._buffer += text; | ||||
|         return addEOL ? this.addEOL() : this; | ||||
|     } | ||||
|     /** | ||||
|      * Adds the operating system-specific end-of-line marker to the buffer | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addEOL() { | ||||
|         return this.addRaw(os_1.EOL); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML codeblock to the summary buffer | ||||
|      * | ||||
|      * @param {string} code content to render within fenced code block | ||||
|      * @param {string} lang (optional) language to syntax highlight code | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addCodeBlock(code, lang) { | ||||
|         const attrs = Object.assign({}, (lang && { lang })); | ||||
|         const element = this.wrap('pre', this.wrap('code', code), attrs); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML list to the summary buffer | ||||
|      * | ||||
|      * @param {string[]} items list of items to render | ||||
|      * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addList(items, ordered = false) { | ||||
|         const tag = ordered ? 'ol' : 'ul'; | ||||
|         const listItems = items.map(item => this.wrap('li', item)).join(''); | ||||
|         const element = this.wrap(tag, listItems); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML table to the summary buffer | ||||
|      * | ||||
|      * @param {SummaryTableCell[]} rows table rows | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addTable(rows) { | ||||
|         const tableBody = rows | ||||
|             .map(row => { | ||||
|             const cells = row | ||||
|                 .map(cell => { | ||||
|                 if (typeof cell === 'string') { | ||||
|                     return this.wrap('td', cell); | ||||
|                 } | ||||
|                 const { header, data, colspan, rowspan } = cell; | ||||
|                 const tag = header ? 'th' : 'td'; | ||||
|                 const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); | ||||
|                 return this.wrap(tag, data, attrs); | ||||
|             }) | ||||
|                 .join(''); | ||||
|             return this.wrap('tr', cells); | ||||
|         }) | ||||
|             .join(''); | ||||
|         const element = this.wrap('table', tableBody); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds a collapsable HTML details element to the summary buffer | ||||
|      * | ||||
|      * @param {string} label text for the closed state | ||||
|      * @param {string} content collapsable content | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addDetails(label, content) { | ||||
|         const element = this.wrap('details', this.wrap('summary', label) + content); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML image tag to the summary buffer | ||||
|      * | ||||
|      * @param {string} src path to the image you to embed | ||||
|      * @param {string} alt text description of the image | ||||
|      * @param {SummaryImageOptions} options (optional) addition image attributes | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addImage(src, alt, options) { | ||||
|         const { width, height } = options || {}; | ||||
|         const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); | ||||
|         const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML section heading element | ||||
|      * | ||||
|      * @param {string} text heading text | ||||
|      * @param {number | string} [level=1] (optional) the heading level, default: 1 | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addHeading(text, level) { | ||||
|         const tag = `h${level}`; | ||||
|         const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) | ||||
|             ? tag | ||||
|             : 'h1'; | ||||
|         const element = this.wrap(allowedTag, text); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML thematic break (<hr>) to the summary buffer | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addSeparator() { | ||||
|         const element = this.wrap('hr', null); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML line break (<br>) to the summary buffer | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addBreak() { | ||||
|         const element = this.wrap('br', null); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML blockquote to the summary buffer | ||||
|      * | ||||
|      * @param {string} text quote text | ||||
|      * @param {string} cite (optional) citation url | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addQuote(text, cite) { | ||||
|         const attrs = Object.assign({}, (cite && { cite })); | ||||
|         const element = this.wrap('blockquote', text, attrs); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
|     /** | ||||
|      * Adds an HTML anchor tag to the summary buffer | ||||
|      * | ||||
|      * @param {string} text link text/content | ||||
|      * @param {string} href hyperlink | ||||
|      * | ||||
|      * @returns {MarkdownSummary} markdown summary instance | ||||
|      */ | ||||
|     addLink(text, href) { | ||||
|         const element = this.wrap('a', text, { href }); | ||||
|         return this.addRaw(element).addEOL(); | ||||
|     } | ||||
| } | ||||
| // singleton export
 | ||||
| exports.markdownSummary = new MarkdownSummary(); | ||||
| //# sourceMappingURL=markdown-summary.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 8041: | ||||
| /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.OidcClient = void 0; | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const auth_1 = __nccwpck_require__(3702); | ||||
| const core_1 = __nccwpck_require__(2186); | ||||
| class OidcClient { | ||||
|     static createHttpClient(allowRetry = true, maxRetry = 10) { | ||||
|         const requestOptions = { | ||||
|             allowRetries: allowRetry, | ||||
|             maxRetries: maxRetry | ||||
|         }; | ||||
|         return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); | ||||
|     } | ||||
|     static getRequestToken() { | ||||
|         const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; | ||||
|         if (!token) { | ||||
|             throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); | ||||
|         } | ||||
|         return token; | ||||
|     } | ||||
|     static getIDTokenUrl() { | ||||
|         const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; | ||||
|         if (!runtimeUrl) { | ||||
|             throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); | ||||
|         } | ||||
|         return runtimeUrl; | ||||
|     } | ||||
|     static getCall(id_token_url) { | ||||
|         var _a; | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const httpclient = OidcClient.createHttpClient(); | ||||
|             const res = yield httpclient | ||||
|                 .getJson(id_token_url) | ||||
|                 .catch(error => { | ||||
|                 throw new Error(`Failed to get ID Token. \n 
 | ||||
|         Error Code : ${error.statusCode}\n  | ||||
|         Error Message: ${error.result.message}`);
 | ||||
|             }); | ||||
|             const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; | ||||
|             if (!id_token) { | ||||
|                 throw new Error('Response json body do not have ID Token field'); | ||||
|             } | ||||
|             return id_token; | ||||
|         }); | ||||
|     } | ||||
|     static getIDToken(audience) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             try { | ||||
|                 // New ID Token is requested from action service
 | ||||
|                 let id_token_url = OidcClient.getIDTokenUrl(); | ||||
|                 if (audience) { | ||||
|                     const encodedAudience = encodeURIComponent(audience); | ||||
|                     id_token_url = `${id_token_url}&audience=${encodedAudience}`; | ||||
|                 } | ||||
|                 core_1.debug(`ID token url is ${id_token_url}`); | ||||
|                 const id_token = yield OidcClient.getCall(id_token_url); | ||||
|                 core_1.setSecret(id_token); | ||||
|                 return id_token; | ||||
|             } | ||||
|             catch (error) { | ||||
|                 throw new Error(`Error message: ${error.message}`); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.OidcClient = OidcClient; | ||||
| //# sourceMappingURL=oidc-utils.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 5278: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| @ -4946,6 +4745,7 @@ exports.issueCommand = issueCommand; | ||||
| // We use any as a valid input type
 | ||||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.toCommandProperties = exports.toCommandValue = void 0; | ||||
| /** | ||||
|  * Sanitizes an input into a string so it can be passed into issueCommand safely | ||||
|  * @param input input to sanitize into a string | ||||
| @ -4960,6 +4760,26 @@ function toCommandValue(input) { | ||||
|     return JSON.stringify(input); | ||||
| } | ||||
| exports.toCommandValue = toCommandValue; | ||||
| /** | ||||
|  * | ||||
|  * @param annotationProperties | ||||
|  * @returns The command properties to send with the actual annotation command | ||||
|  * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646
 | ||||
|  */ | ||||
| function toCommandProperties(annotationProperties) { | ||||
|     if (!Object.keys(annotationProperties).length) { | ||||
|         return {}; | ||||
|     } | ||||
|     return { | ||||
|         title: annotationProperties.title, | ||||
|         file: annotationProperties.file, | ||||
|         line: annotationProperties.startLine, | ||||
|         endLine: annotationProperties.endLine, | ||||
|         col: annotationProperties.startColumn, | ||||
|         endColumn: annotationProperties.endColumn | ||||
|     }; | ||||
| } | ||||
| exports.toCommandProperties = toCommandProperties; | ||||
| //# sourceMappingURL=utils.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| @ -6884,6 +6704,72 @@ class SearchState { | ||||
| exports.SearchState = SearchState; | ||||
| //# sourceMappingURL=internal-search-state.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 3702: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| class BasicCredentialHandler { | ||||
|     constructor(username, password) { | ||||
|         this.username = username; | ||||
|         this.password = password; | ||||
|     } | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + | ||||
|                 Buffer.from(this.username + ':' + this.password).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BasicCredentialHandler = BasicCredentialHandler; | ||||
| class BearerCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = 'Bearer ' + this.token; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.BearerCredentialHandler = BearerCredentialHandler; | ||||
| class PersonalAccessTokenCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         options.headers['Authorization'] = | ||||
|             'Basic ' + Buffer.from('PAT:' + this.token).toString('base64'); | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication(response) { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication(httpClient, requestInfo, objs) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 9925: | ||||
| @ -6892,7 +6778,6 @@ exports.SearchState = SearchState; | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const url = __nccwpck_require__(7310); | ||||
| const http = __nccwpck_require__(3685); | ||||
| const https = __nccwpck_require__(5687); | ||||
| const pm = __nccwpck_require__(6443); | ||||
| @ -6941,7 +6826,7 @@ var MediaTypes; | ||||
|  * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|  */ | ||||
| function getProxyUrl(serverUrl) { | ||||
|     let proxyUrl = pm.getProxyUrl(url.parse(serverUrl)); | ||||
|     let proxyUrl = pm.getProxyUrl(new URL(serverUrl)); | ||||
|     return proxyUrl ? proxyUrl.href : ''; | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| @ -6960,6 +6845,15 @@ const HttpResponseRetryCodes = [ | ||||
| const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; | ||||
| const ExponentialBackoffCeiling = 10; | ||||
| const ExponentialBackoffTimeSlice = 5; | ||||
| class HttpClientError extends Error { | ||||
|     constructor(message, statusCode) { | ||||
|         super(message); | ||||
|         this.name = 'HttpClientError'; | ||||
|         this.statusCode = statusCode; | ||||
|         Object.setPrototypeOf(this, HttpClientError.prototype); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientError = HttpClientError; | ||||
| class HttpClientResponse { | ||||
|     constructor(message) { | ||||
|         this.message = message; | ||||
| @ -6978,7 +6872,7 @@ class HttpClientResponse { | ||||
| } | ||||
| exports.HttpClientResponse = HttpClientResponse; | ||||
| function isHttps(requestUrl) { | ||||
|     let parsedUrl = url.parse(requestUrl); | ||||
|     let parsedUrl = new URL(requestUrl); | ||||
|     return parsedUrl.protocol === 'https:'; | ||||
| } | ||||
| exports.isHttps = isHttps; | ||||
| @ -7083,7 +6977,7 @@ class HttpClient { | ||||
|         if (this._disposed) { | ||||
|             throw new Error('Client has already been disposed.'); | ||||
|         } | ||||
|         let parsedUrl = url.parse(requestUrl); | ||||
|         let parsedUrl = new URL(requestUrl); | ||||
|         let info = this._prepareRequest(verb, parsedUrl, headers); | ||||
|         // Only perform retries on reads since writes may not be idempotent.
 | ||||
|         let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1 | ||||
| @ -7122,7 +7016,7 @@ class HttpClient { | ||||
|                     // if there's no location to redirect to, we won't
 | ||||
|                     break; | ||||
|                 } | ||||
|                 let parsedRedirectUrl = url.parse(redirectUrl); | ||||
|                 let parsedRedirectUrl = new URL(redirectUrl); | ||||
|                 if (parsedUrl.protocol == 'https:' && | ||||
|                     parsedUrl.protocol != parsedRedirectUrl.protocol && | ||||
|                     !this._allowRedirectDowngrade) { | ||||
| @ -7238,7 +7132,7 @@ class HttpClient { | ||||
|      * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|      */ | ||||
|     getAgent(serverUrl) { | ||||
|         let parsedUrl = url.parse(serverUrl); | ||||
|         let parsedUrl = new URL(serverUrl); | ||||
|         return this._getAgent(parsedUrl); | ||||
|     } | ||||
|     _prepareRequest(method, requestUrl, headers) { | ||||
| @ -7311,7 +7205,9 @@ class HttpClient { | ||||
|                 maxSockets: maxSockets, | ||||
|                 keepAlive: this._keepAlive, | ||||
|                 proxy: { | ||||
|                     proxyAuth: proxyUrl.auth, | ||||
|                     ...((proxyUrl.username || proxyUrl.password) && { | ||||
|                         proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` | ||||
|                     }), | ||||
|                     host: proxyUrl.hostname, | ||||
|                     port: proxyUrl.port | ||||
|                 } | ||||
| @ -7406,12 +7302,8 @@ class HttpClient { | ||||
|                 else { | ||||
|                     msg = 'Failed request: (' + statusCode + ')'; | ||||
|                 } | ||||
|                 let err = new Error(msg); | ||||
|                 // attach statusCode and body obj (if available) to the error object
 | ||||
|                 err['statusCode'] = statusCode; | ||||
|                 if (response.result) { | ||||
|                     err['result'] = response.result; | ||||
|                 } | ||||
|                 let err = new HttpClientError(msg, statusCode); | ||||
|                 err.result = response.result; | ||||
|                 reject(err); | ||||
|             } | ||||
|             else { | ||||
| @ -7426,12 +7318,11 @@ exports.HttpClient = HttpClient; | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 6443: | ||||
| /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const url = __nccwpck_require__(7310); | ||||
| function getProxyUrl(reqUrl) { | ||||
|     let usingSsl = reqUrl.protocol === 'https:'; | ||||
|     let proxyUrl; | ||||
| @ -7446,7 +7337,7 @@ function getProxyUrl(reqUrl) { | ||||
|         proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY']; | ||||
|     } | ||||
|     if (proxyVar) { | ||||
|         proxyUrl = url.parse(proxyVar); | ||||
|         proxyUrl = new URL(proxyVar); | ||||
|     } | ||||
|     return proxyUrl; | ||||
| } | ||||
| @ -63974,7 +63865,7 @@ const utils_1 = __nccwpck_require__(1314); | ||||
| const semver = __importStar(__nccwpck_require__(1383)); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const tc = __importStar(__nccwpck_require__(7784)); | ||||
| function findPyPyVersion(versionSpec, architecture) { | ||||
| function findPyPyVersion(versionSpec, architecture, updateEnvironment) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         let resolvedPyPyVersion = ''; | ||||
|         let resolvedPythonVersion = ''; | ||||
| @ -63993,10 +63884,12 @@ function findPyPyVersion(versionSpec, architecture) { | ||||
|         const binaryExtension = utils_1.IS_WINDOWS ? '.exe' : ''; | ||||
|         const pythonPath = path.join(utils_1.IS_WINDOWS ? installDir : _binDir, `python${binaryExtension}`); | ||||
|         const pythonLocation = pypyInstall.getPyPyBinaryPath(installDir); | ||||
|         core.exportVariable('pythonLocation', installDir); | ||||
|         core.exportVariable('PKG_CONFIG_PATH', pythonLocation + '/lib/pkgconfig'); | ||||
|         core.addPath(pythonLocation); | ||||
|         core.addPath(_binDir); | ||||
|         if (updateEnvironment) { | ||||
|             core.exportVariable('pythonLocation', installDir); | ||||
|             core.exportVariable('PKG_CONFIG_PATH', pythonLocation + '/lib/pkgconfig'); | ||||
|             core.addPath(pythonLocation); | ||||
|             core.addPath(_binDir); | ||||
|         } | ||||
|         core.setOutput('python-version', 'pypy' + resolvedPyPyVersion.trim()); | ||||
|         core.setOutput('python-path', pythonPath); | ||||
|         return { resolvedPyPyVersion, resolvedPythonVersion }; | ||||
| @ -64128,7 +64021,7 @@ function binDir(installDir) { | ||||
|         return path.join(installDir, 'bin'); | ||||
|     } | ||||
| } | ||||
| function useCpythonVersion(version, architecture) { | ||||
| function useCpythonVersion(version, architecture, updateEnvironment) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         const desugaredVersionSpec = desugarDevVersion(version); | ||||
|         const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec); | ||||
| @ -64149,33 +64042,35 @@ function useCpythonVersion(version, architecture) { | ||||
|                 `The list of all available versions can be found here: ${installer.MANIFEST_URL}` | ||||
|             ].join(os.EOL)); | ||||
|         } | ||||
|         core.exportVariable('pythonLocation', installDir); | ||||
|         core.exportVariable('PKG_CONFIG_PATH', installDir + '/lib/pkgconfig'); | ||||
|         if (utils_1.IS_LINUX) { | ||||
|             const libPath = process.env.LD_LIBRARY_PATH | ||||
|                 ? `:${process.env.LD_LIBRARY_PATH}` | ||||
|                 : ''; | ||||
|             const pyLibPath = path.join(installDir, 'lib'); | ||||
|             if (!libPath.split(':').includes(pyLibPath)) { | ||||
|                 core.exportVariable('LD_LIBRARY_PATH', pyLibPath + libPath); | ||||
|             } | ||||
|         } | ||||
|         const _binDir = binDir(installDir); | ||||
|         const binaryExtension = utils_1.IS_WINDOWS ? '.exe' : ''; | ||||
|         const pythonPath = path.join(utils_1.IS_WINDOWS ? installDir : _binDir, `python${binaryExtension}`); | ||||
|         core.addPath(installDir); | ||||
|         core.addPath(_binDir); | ||||
|         if (utils_1.IS_WINDOWS) { | ||||
|             // Add --user directory
 | ||||
|             // `installDir` from tool cache should look like $RUNNER_TOOL_CACHE/Python/<semantic version>/x64/
 | ||||
|             // So if `findLocalTool` succeeded above, we must have a conformant `installDir`
 | ||||
|             const version = path.basename(path.dirname(installDir)); | ||||
|             const major = semver.major(version); | ||||
|             const minor = semver.minor(version); | ||||
|             const userScriptsDir = path.join(process.env['APPDATA'] || '', 'Python', `Python${major}${minor}`, 'Scripts'); | ||||
|             core.addPath(userScriptsDir); | ||||
|         if (updateEnvironment) { | ||||
|             core.exportVariable('pythonLocation', installDir); | ||||
|             core.exportVariable('PKG_CONFIG_PATH', installDir + '/lib/pkgconfig'); | ||||
|             if (utils_1.IS_LINUX) { | ||||
|                 const libPath = process.env.LD_LIBRARY_PATH | ||||
|                     ? `:${process.env.LD_LIBRARY_PATH}` | ||||
|                     : ''; | ||||
|                 const pyLibPath = path.join(installDir, 'lib'); | ||||
|                 if (!libPath.split(':').includes(pyLibPath)) { | ||||
|                     core.exportVariable('LD_LIBRARY_PATH', pyLibPath + libPath); | ||||
|                 } | ||||
|             } | ||||
|             core.addPath(installDir); | ||||
|             core.addPath(_binDir); | ||||
|             if (utils_1.IS_WINDOWS) { | ||||
|                 // Add --user directory
 | ||||
|                 // `installDir` from tool cache should look like $RUNNER_TOOL_CACHE/Python/<semantic version>/x64/
 | ||||
|                 // So if `findLocalTool` succeeded above, we must have a conformant `installDir`
 | ||||
|                 const version = path.basename(path.dirname(installDir)); | ||||
|                 const major = semver.major(version); | ||||
|                 const minor = semver.minor(version); | ||||
|                 const userScriptsDir = path.join(process.env['APPDATA'] || '', 'Python', `Python${major}${minor}`, 'Scripts'); | ||||
|                 core.addPath(userScriptsDir); | ||||
|             } | ||||
|             // On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
 | ||||
|         } | ||||
|         // On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
 | ||||
|         const installed = versionFromPath(installDir); | ||||
|         core.setOutput('python-version', installed); | ||||
|         core.setOutput('python-path', pythonPath); | ||||
| @ -64576,13 +64471,14 @@ function run() { | ||||
|             if (version) { | ||||
|                 let pythonVersion; | ||||
|                 const arch = core.getInput('architecture') || os.arch(); | ||||
|                 const updateEnvironment = core.getBooleanInput('update-environment'); | ||||
|                 if (isPyPyVersion(version)) { | ||||
|                     const installed = yield finderPyPy.findPyPyVersion(version, arch); | ||||
|                     const installed = yield finderPyPy.findPyPyVersion(version, arch, updateEnvironment); | ||||
|                     pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; | ||||
|                     core.info(`Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`); | ||||
|                 } | ||||
|                 else { | ||||
|                     const installed = yield finder.useCpythonVersion(version, arch); | ||||
|                     const installed = yield finder.useCpythonVersion(version, arch, updateEnvironment); | ||||
|                     pythonVersion = installed.version; | ||||
|                     core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); | ||||
|                 } | ||||
|  | ||||
							
								
								
									
										48
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										48
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -10,7 +10,7 @@ | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "@actions/cache": "^2.0.2", | ||||
|         "@actions/core": "^1.2.3", | ||||
|         "@actions/core": "^1.7.0", | ||||
|         "@actions/exec": "^1.1.0", | ||||
|         "@actions/glob": "^0.2.0", | ||||
|         "@actions/io": "^1.0.2", | ||||
| @ -55,14 +55,6 @@ | ||||
|         "minimatch": "^3.0.4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/cache/node_modules/@actions/http-client": { | ||||
|       "version": "1.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", | ||||
|       "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", | ||||
|       "dependencies": { | ||||
|         "tunnel": "0.0.6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/cache/node_modules/semver": { | ||||
|       "version": "6.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", | ||||
| @ -72,9 +64,12 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/core": { | ||||
|       "version": "1.2.6", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", | ||||
|       "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" | ||||
|       "version": "1.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.7.0.tgz", | ||||
|       "integrity": "sha512-7fPSS7yKOhTpgLMbw7lBLc1QJWvJBBAgyTX2PEhagWcKK8t0H8AKCoPMfnrHqIm5cRYH4QFPqD1/ruhuUE7YcQ==", | ||||
|       "dependencies": { | ||||
|         "@actions/http-client": "^1.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/exec": { | ||||
|       "version": "1.1.0", | ||||
| @ -94,9 +89,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/http-client": { | ||||
|       "version": "1.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz", | ||||
|       "integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==", | ||||
|       "version": "1.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", | ||||
|       "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", | ||||
|       "dependencies": { | ||||
|         "tunnel": "0.0.6" | ||||
|       } | ||||
| @ -11361,14 +11356,6 @@ | ||||
|             "minimatch": "^3.0.4" | ||||
|           } | ||||
|         }, | ||||
|         "@actions/http-client": { | ||||
|           "version": "1.0.11", | ||||
|           "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", | ||||
|           "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", | ||||
|           "requires": { | ||||
|             "tunnel": "0.0.6" | ||||
|           } | ||||
|         }, | ||||
|         "semver": { | ||||
|           "version": "6.3.0", | ||||
|           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", | ||||
| @ -11377,9 +11364,12 @@ | ||||
|       } | ||||
|     }, | ||||
|     "@actions/core": { | ||||
|       "version": "1.2.6", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", | ||||
|       "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" | ||||
|       "version": "1.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.7.0.tgz", | ||||
|       "integrity": "sha512-7fPSS7yKOhTpgLMbw7lBLc1QJWvJBBAgyTX2PEhagWcKK8t0H8AKCoPMfnrHqIm5cRYH4QFPqD1/ruhuUE7YcQ==", | ||||
|       "requires": { | ||||
|         "@actions/http-client": "^1.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "@actions/exec": { | ||||
|       "version": "1.1.0", | ||||
| @ -11399,9 +11389,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "@actions/http-client": { | ||||
|       "version": "1.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz", | ||||
|       "integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==", | ||||
|       "version": "1.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", | ||||
|       "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", | ||||
|       "requires": { | ||||
|         "tunnel": "0.0.6" | ||||
|       } | ||||
|  | ||||
| @ -24,7 +24,7 @@ | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@actions/cache": "^2.0.2", | ||||
|     "@actions/core": "^1.2.3", | ||||
|     "@actions/core": "^1.7.0", | ||||
|     "@actions/exec": "^1.1.0", | ||||
|     "@actions/glob": "^0.2.0", | ||||
|     "@actions/io": "^1.0.2", | ||||
|  | ||||
| @ -20,7 +20,8 @@ interface IPyPyVersionSpec { | ||||
| 
 | ||||
| export async function findPyPyVersion( | ||||
|   versionSpec: string, | ||||
|   architecture: string | ||||
|   architecture: string, | ||||
|   updateEnvironment: boolean | ||||
| ): Promise<{resolvedPyPyVersion: string; resolvedPythonVersion: string}> { | ||||
|   let resolvedPyPyVersion = ''; | ||||
|   let resolvedPythonVersion = ''; | ||||
| @ -54,10 +55,12 @@ export async function findPyPyVersion( | ||||
|     `python${binaryExtension}` | ||||
|   ); | ||||
|   const pythonLocation = pypyInstall.getPyPyBinaryPath(installDir); | ||||
|   core.exportVariable('pythonLocation', installDir); | ||||
|   core.exportVariable('PKG_CONFIG_PATH', pythonLocation + '/lib/pkgconfig'); | ||||
|   core.addPath(pythonLocation); | ||||
|   core.addPath(_binDir); | ||||
|   if (updateEnvironment) { | ||||
|     core.exportVariable('pythonLocation', installDir); | ||||
|     core.exportVariable('PKG_CONFIG_PATH', pythonLocation + '/lib/pkgconfig'); | ||||
|     core.addPath(pythonLocation); | ||||
|     core.addPath(_binDir); | ||||
|   } | ||||
|   core.setOutput('python-version', 'pypy' + resolvedPyPyVersion.trim()); | ||||
|   core.setOutput('python-path', pythonPath); | ||||
| 
 | ||||
|  | ||||
| @ -32,7 +32,8 @@ function binDir(installDir: string): string { | ||||
| 
 | ||||
| export async function useCpythonVersion( | ||||
|   version: string, | ||||
|   architecture: string | ||||
|   architecture: string, | ||||
|   updateEnvironment: boolean | ||||
| ): Promise<InstalledVersion> { | ||||
|   const desugaredVersionSpec = desugarDevVersion(version); | ||||
|   const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec); | ||||
| @ -69,46 +70,47 @@ export async function useCpythonVersion( | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   core.exportVariable('pythonLocation', installDir); | ||||
|   core.exportVariable('PKG_CONFIG_PATH', installDir + '/lib/pkgconfig'); | ||||
| 
 | ||||
|   if (IS_LINUX) { | ||||
|     const libPath = process.env.LD_LIBRARY_PATH | ||||
|       ? `:${process.env.LD_LIBRARY_PATH}` | ||||
|       : ''; | ||||
|     const pyLibPath = path.join(installDir, 'lib'); | ||||
| 
 | ||||
|     if (!libPath.split(':').includes(pyLibPath)) { | ||||
|       core.exportVariable('LD_LIBRARY_PATH', pyLibPath + libPath); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   const _binDir = binDir(installDir); | ||||
|   const binaryExtension = IS_WINDOWS ? '.exe' : ''; | ||||
|   const pythonPath = path.join( | ||||
|     IS_WINDOWS ? installDir : _binDir, | ||||
|     `python${binaryExtension}` | ||||
|   ); | ||||
|   core.addPath(installDir); | ||||
|   core.addPath(_binDir); | ||||
|   if (updateEnvironment) { | ||||
|     core.exportVariable('pythonLocation', installDir); | ||||
|     core.exportVariable('PKG_CONFIG_PATH', installDir + '/lib/pkgconfig'); | ||||
| 
 | ||||
|   if (IS_WINDOWS) { | ||||
|     // Add --user directory
 | ||||
|     // `installDir` from tool cache should look like $RUNNER_TOOL_CACHE/Python/<semantic version>/x64/
 | ||||
|     // So if `findLocalTool` succeeded above, we must have a conformant `installDir`
 | ||||
|     const version = path.basename(path.dirname(installDir)); | ||||
|     const major = semver.major(version); | ||||
|     const minor = semver.minor(version); | ||||
|     if (IS_LINUX) { | ||||
|       const libPath = process.env.LD_LIBRARY_PATH | ||||
|         ? `:${process.env.LD_LIBRARY_PATH}` | ||||
|         : ''; | ||||
|       const pyLibPath = path.join(installDir, 'lib'); | ||||
| 
 | ||||
|     const userScriptsDir = path.join( | ||||
|       process.env['APPDATA'] || '', | ||||
|       'Python', | ||||
|       `Python${major}${minor}`, | ||||
|       'Scripts' | ||||
|     ); | ||||
|     core.addPath(userScriptsDir); | ||||
|       if (!libPath.split(':').includes(pyLibPath)) { | ||||
|         core.exportVariable('LD_LIBRARY_PATH', pyLibPath + libPath); | ||||
|       } | ||||
|     } | ||||
|     core.addPath(installDir); | ||||
|     core.addPath(_binDir); | ||||
| 
 | ||||
|     if (IS_WINDOWS) { | ||||
|       // Add --user directory
 | ||||
|       // `installDir` from tool cache should look like $RUNNER_TOOL_CACHE/Python/<semantic version>/x64/
 | ||||
|       // So if `findLocalTool` succeeded above, we must have a conformant `installDir`
 | ||||
|       const version = path.basename(path.dirname(installDir)); | ||||
|       const major = semver.major(version); | ||||
|       const minor = semver.minor(version); | ||||
| 
 | ||||
|       const userScriptsDir = path.join( | ||||
|         process.env['APPDATA'] || '', | ||||
|         'Python', | ||||
|         `Python${major}${minor}`, | ||||
|         'Scripts' | ||||
|       ); | ||||
|       core.addPath(userScriptsDir); | ||||
|     } | ||||
|     // On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
 | ||||
|   } | ||||
|   // On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
 | ||||
| 
 | ||||
|   const installed = versionFromPath(installDir); | ||||
|   core.setOutput('python-version', installed); | ||||
|  | ||||
| @ -64,14 +64,23 @@ async function run() { | ||||
|     if (version) { | ||||
|       let pythonVersion: string; | ||||
|       const arch: string = core.getInput('architecture') || os.arch(); | ||||
|       const updateEnvironment = core.getBooleanInput('update-environment'); | ||||
|       if (isPyPyVersion(version)) { | ||||
|         const installed = await finderPyPy.findPyPyVersion(version, arch); | ||||
|         const installed = await finderPyPy.findPyPyVersion( | ||||
|           version, | ||||
|           arch, | ||||
|           updateEnvironment | ||||
|         ); | ||||
|         pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; | ||||
|         core.info( | ||||
|           `Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})` | ||||
|         ); | ||||
|       } else { | ||||
|         const installed = await finder.useCpythonVersion(version, arch); | ||||
|         const installed = await finder.useCpythonVersion( | ||||
|           version, | ||||
|           arch, | ||||
|           updateEnvironment | ||||
|         ); | ||||
|         pythonVersion = installed.version; | ||||
|         core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); | ||||
|       } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user